diff options
807 files changed, 34691 insertions, 20206 deletions
@@ -203,6 +203,10 @@ ScummVM Team Filippos Karapetis Joost Peters + Toltecs: + Benjamin Haisch + Filippos Karapetis + Tony: Arnaud Boutonne Paul Gilbert @@ -411,6 +415,9 @@ Other contributions Basque: Mikel Iturbe Urretxa + Belarusian: + Ivan Lukyanov + Catalan: Jordi Vilalta Prat @@ -420,6 +427,9 @@ Other contributions Danish: Steffen Nyeland + Finnish: + Toni Saarela + French: Thierry Crozat @@ -1,5 +1,5 @@ ScummVM -Copyright (C) 2001-2012 by the following: +Copyright (C) 2001-2013 by the following: If you have contributed to this project then you deserve to be on this list. Contact us (see: AUTHORS) and we'll add you. diff --git a/Makefile.common b/Makefile.common index 2a92ba441c..bfbfd67fb8 100644 --- a/Makefile.common +++ b/Makefile.common @@ -265,6 +265,9 @@ endif ifdef ENABLE_TOON DIST_FILES_ENGINEDATA+=toon.dat endif +ifdef ENABLE_WINTERMUTE +DIST_FILES_ENGINEDATA+=wintermute.zip +endif DIST_FILES_ENGINEDATA:=$(addprefix $(srcdir)/dists/engine-data/,$(DIST_FILES_ENGINEDATA)) # pred.dic is currently only used for the AGI engine @@ -2,6 +2,11 @@ For a more comprehensive changelog of the latest experimental code, see: https://github.com/scummvm/scummvm/commits/ 1.6.0 (????-??-??) + New Games: + - Added support for 3 Skulls of the Toltecs. + - Added support for Eye of the Beholder. + - Added support for Eye of the Beholder II: The Legend of Darkmoon. + General: - Added a new save/load chooser based on a grid of thumbnails. This is only supported for resolutions bigger than 640x400. The old chooser is still @@ -9,16 +14,58 @@ For a more comprehensive changelog of the latest experimental code, see: select the old one as default too. - Rewrote VideoDecoder subsystem. - Added Galician translation. + - Added Finnish translation. + - Added Belarusian translation. + - Using the mouse wheel on a slider widget now changes the value by the + smallest possible amount. This is more predictable than the old behaviour, + which was to change the value by "one pixel" which would sometimes not + change it at all. + - Updated MT-32 emulation code to latest munt project snapshot. + - Added FluidSynth settings dialog, mainly for reverb and chorus settings. Cine: - Improved audio support for Amiga and AtariST versions of Future Wars. Now music fades out slowly instead of stopping immediately. Sound effects are now properly panned, when requested by the game. + Drascula: + - Resolved multiple UI issues with the original save/load screen. + - Added advanced savegame functionality, including savegame timestamps and + thumbnails and the ability to load and delete savegames from the launcher. + It's now possible to use the ScummvM save/load dialogs. + - The F7 key (previously unmapped) now always shows the ScummVM load screen. + The F10 key displays either the original save/load screen, or the ScummVM + save screen, if the user has selected to use the ScummVM save/load + dialogs. + + Dreamweb: + - Now that the game is freeware, there is a small extra help text showing + the available commands in the in-game terminals when the player uses the + 'help' command. Previously, players needed to consult the manual for the + available commands. Since this reference to the manual is a form of copy + protection, this extra line can be toggled by the ScummVM copy protection + command line option. + + Groovie: + - Simplified the movie speed options, and added a custom option for The 7th + Guest. Movie options are now "normal" and "fast", with the latter changing + the movie speed in T7G to match the faster movie speed of the iOS version. + The game entry might need to be readded in the launcher for the new setting + to appear. + + SAGA: + - Added music support for the Macintosh version of I Have No Mouth and, I + Must Scream. + SCUMM: - Implemented Monkey Island 2 Macintosh's audio driver. Now we properly support its sample based audio output. The same output is also used for the m68k Macintosh version of Indiana Jones and the Fate of Atlantis. + - Improved music support for the Macintosh version of Monkey Island 1. It + now uses the original instruments, rather than approximating them with + General MIDI instruments, and should sound a lot closer to the original. + - Added sound and music support for the Macintosh version of Loom. + - Handle double-clicking in the Macintosh version of Loom. 1.5.0 (2012-07-27) New Games: @@ -264,10 +264,14 @@ Other Games: Discworld 2: Missing Presumed ...!? [dw2] Dragon History [draci] Drascula: The Vampire Strikes Back [drascula] + Eye of the Beholder [eob] + Eye of the Beholder II: The Legend of + Darkmoon [eob2] Flight of the Amazon Queen [queen] Future Wars [fw] Inherit the Earth: Quest for the Orb [ite] Nippon Safes Inc. [nippon] + Lands of Lore: The Throne of Chaos [lol] The Legend of Kyrandia [kyra1] The Legend of Kyrandia: The Hand of Fate [kyra2] The Legend of Kyrandia: Malcolm's Revenge [kyra3] @@ -384,21 +388,24 @@ entering any answer. Chances are that it will work. ScummVM will skip copy protection in the following games: - * Maniac Mansion - * Zak McKracken and the Alien Mindbenders - * Loom (EGA) - * The Secret of Monkey Island (VGA) - * Monkey Island 2: LeChuck's Revenge * Beneath a Steel Sky -- bypassed with kind permission from Revolution Software. + * Dreamweb + -- a list of available commands in the in-game terminals is now shown + when the player uses the 'help' command * Inherit the Earth: Quest for the Orb (Floppy version) -- bypassed with kind permission from Wyrmkeep Entertainment, since it was bypassed in all CD releases of the game. + * Loom (EGA DOS) + * Maniac Mansion + * Monkey Island 2: LeChuck's Revenge * Simon the Sorcerer 1 (Floppy version) * Simon the Sorcerer 2 (Floppy version) -- bypassed with kind permission from Adventure Soft, since it was bypassed in all CD releases of the game. + * The Secret of Monkey Island (VGA) * Waxworks + * Zak McKracken and the Alien Mindbenders 3.2) Commodore64 games notes: @@ -2033,9 +2040,10 @@ The following keywords are recognized: super2xsai, supereagle, advmame2x, advmame3x, hq2x, hq3x, tv2x, dotmatrix) - confirm_exit bool Ask for confirmation by the user before quitting - (SDL backend only). - console bool Enable the console window (default: enabled) (Windows only). + confirm_exit bool Ask for confirmation by the user before + quitting (SDL backend only). + console bool Enable the console window (default: enabled) + (Windows only). cdrom number Number of CD-ROM unit to use for audio. If negative, don't even try to access the CD-ROM. joystick_num number Number of joystick device to use for input @@ -2063,7 +2071,8 @@ The following keywords are recognized: supported by some MIDI drivers.) copy_protection bool Enable copy protection in certain games, in - those cases where ScummVM disables it by default. + those cases where ScummVM disables it by + default. demo_mode bool Start demo in Maniac Mansion alt_intro bool Use alternative intro for CD versions of Beneath a Steel Sky and Flight of the Amazon @@ -2124,8 +2133,9 @@ Lands of Lore: The Throne of Chaos adds the following non-standard keywords: Space Quest IV CD adds the following non-standard keyword: - silver_cursors bool If true, an alternate set of silver mouse cursors - is used instead of the original golden ones + silver_cursors bool If true, an alternate set of silver mouse + cursors is used instead of the original golden + ones Simon the Sorcerer 1 and 2 add the following non-standard keywords: @@ -2134,19 +2144,32 @@ Simon the Sorcerer 1 and 2 add the following non-standard keywords: The Legend of Kyrandia adds the following non-standard keyword: - walkspeed int The walk speed (0-4) + walkspeed number The walk speed (0-4) + +The Legend of Kyrandia: The Hand of Fate adds the following non-standard +keyword: + + walkspeed number The walk speed (3 or 5, resp. fast or + slow) The Legend of Kyrandia: Malcolm's Revenge adds the following non-standard keywords: + walkspeed number The walk speed (3 or 5, resp. fast or + slow) studio_audience bool If true, applause and cheering sounds are heard whenever Malcolm makes a joke skip_support bool If true, the player can skip text and cutscenes - helium_mode bool If true, people sound like they've inhaled Helium + helium_mode bool If true, people sound like they've inhaled + Helium The 7th Guest adds the following non-standard keyword: - t7g_speed string Video playback speed (normal, tweaked, im_an_ios) + fast_movie_speed bool If true, movies are played at an increased + speed, matching the speed of the iOS version. + Movies without sound are still played at their + normal speed, to avoid music synchronization + issues 8.2) Custom game options that can be toggled via the GUI diff --git a/audio/decoders/adpcm.cpp b/audio/decoders/adpcm.cpp index 2fe509e1f3..f069ee3417 100644 --- a/audio/decoders/adpcm.cpp +++ b/audio/decoders/adpcm.cpp @@ -268,7 +268,6 @@ static const int MSADPCMAdaptationTable[] = { 768, 614, 512, 409, 307, 230, 230, 230 }; - int16 MS_ADPCMStream::decodeMS(ADPCMChannelStatus *c, byte code) { int32 predictor; @@ -290,40 +289,42 @@ int16 MS_ADPCMStream::decodeMS(ADPCMChannelStatus *c, byte code) { int MS_ADPCMStream::readBuffer(int16 *buffer, const int numSamples) { int samples; byte data; - int i = 0; - - samples = 0; + int i; - while (samples < numSamples && !_stream->eos() && _stream->pos() < _endpos) { - if (_blockPos[0] == _blockAlign) { - // read block header - for (i = 0; i < _channels; i++) { - _status.ch[i].predictor = CLIP(_stream->readByte(), (byte)0, (byte)6); - _status.ch[i].coeff1 = MSADPCMAdaptCoeff1[_status.ch[i].predictor]; - _status.ch[i].coeff2 = MSADPCMAdaptCoeff2[_status.ch[i].predictor]; - } + for (samples = 0; samples < numSamples && !endOfData(); samples++) { + if (_decodedSampleCount == 0) { + if (_blockPos[0] == _blockAlign) { + // read block header + for (i = 0; i < _channels; i++) { + _status.ch[i].predictor = CLIP(_stream->readByte(), (byte)0, (byte)6); + _status.ch[i].coeff1 = MSADPCMAdaptCoeff1[_status.ch[i].predictor]; + _status.ch[i].coeff2 = MSADPCMAdaptCoeff2[_status.ch[i].predictor]; + } - for (i = 0; i < _channels; i++) - _status.ch[i].delta = _stream->readSint16LE(); + for (i = 0; i < _channels; i++) + _status.ch[i].delta = _stream->readSint16LE(); - for (i = 0; i < _channels; i++) - _status.ch[i].sample1 = _stream->readSint16LE(); + for (i = 0; i < _channels; i++) + _status.ch[i].sample1 = _stream->readSint16LE(); - for (i = 0; i < _channels; i++) - buffer[samples++] = _status.ch[i].sample2 = _stream->readSint16LE(); + for (i = 0; i < _channels; i++) + _decodedSamples[_decodedSampleCount++] = _status.ch[i].sample2 = _stream->readSint16LE(); - for (i = 0; i < _channels; i++) - buffer[samples++] = _status.ch[i].sample1; + for (i = 0; i < _channels; i++) + _decodedSamples[_decodedSampleCount++] = _status.ch[i].sample1; - _blockPos[0] = _channels * 7; + _blockPos[0] = _channels * 7; + } else { + data = _stream->readByte(); + _blockPos[0]++; + _decodedSamples[_decodedSampleCount++] = decodeMS(&_status.ch[0], (data >> 4) & 0x0f); + _decodedSamples[_decodedSampleCount++] = decodeMS(&_status.ch[_channels - 1], data & 0x0f); + } } - for (; samples < numSamples && _blockPos[0] < _blockAlign && !_stream->eos() && _stream->pos() < _endpos; samples += 2) { - data = _stream->readByte(); - _blockPos[0]++; - buffer[samples] = decodeMS(&_status.ch[0], (data >> 4) & 0x0f); - buffer[samples + 1] = decodeMS(&_status.ch[_channels - 1], data & 0x0f); - } + // (1 - (count - 1)) ensures that _decodedSamples acts as a FIFO of depth 2 + buffer[samples] = _decodedSamples[1 - (_decodedSampleCount - 1)]; + _decodedSampleCount--; } return samples; diff --git a/audio/decoders/adpcm_intern.h b/audio/decoders/adpcm_intern.h index 3b8d8c74d0..66a1aa605f 100644 --- a/audio/decoders/adpcm_intern.h +++ b/audio/decoders/adpcm_intern.h @@ -206,12 +206,19 @@ public: if (blockAlign == 0) error("MS_ADPCMStream(): blockAlign isn't specified for MS ADPCM"); memset(&_status, 0, sizeof(_status)); + _decodedSampleCount = 0; } + virtual bool endOfData() const { return (_stream->eos() || _stream->pos() >= _endpos) && (_decodedSampleCount == 0); } + virtual int readBuffer(int16 *buffer, const int numSamples); protected: int16 decodeMS(ADPCMChannelStatus *c, byte); + +private: + uint8 _decodedSampleCount; + int16 _decodedSamples[4]; }; // Duck DK3 IMA ADPCM Decoder diff --git a/audio/decoders/aiff.h b/audio/decoders/aiff.h index afcdb6ae6c..0d96e73c26 100644 --- a/audio/decoders/aiff.h +++ b/audio/decoders/aiff.h @@ -48,7 +48,7 @@ class SeekableAudioStream; * successful. In that case, the stream's seek position will be set to the * start of the audio data, and size, rate and flags contain information * necessary for playback. Currently this function only supports uncompressed - * raw PCM data as well as IMA ADPCM. + * raw PCM. */ extern bool loadAIFFFromStream(Common::SeekableReadStream &stream, int &size, int &rate, byte &flags); diff --git a/audio/decoders/quicktime.cpp b/audio/decoders/quicktime.cpp index 0588650ec6..787b547495 100644 --- a/audio/decoders/quicktime.cpp +++ b/audio/decoders/quicktime.cpp @@ -134,7 +134,7 @@ void QuickTimeAudioDecoder::init() { _audioTracks.push_back(new QuickTimeAudioTrack(this, _tracks[i])); } -Common::QuickTimeParser::SampleDesc *QuickTimeAudioDecoder::readSampleDesc(Track *track, uint32 format) { +Common::QuickTimeParser::SampleDesc *QuickTimeAudioDecoder::readSampleDesc(Track *track, uint32 format, uint32 descSize) { if (track->codecType == CODEC_TYPE_AUDIO) { debug(0, "Audio Codec FourCC: \'%s\'", tag2str(format)); diff --git a/audio/decoders/quicktime_intern.h b/audio/decoders/quicktime_intern.h index f1ab037d89..bb5ff0cf5c 100644 --- a/audio/decoders/quicktime_intern.h +++ b/audio/decoders/quicktime_intern.h @@ -131,7 +131,7 @@ protected: }; // Common::QuickTimeParser API - virtual Common::QuickTimeParser::SampleDesc *readSampleDesc(Track *track, uint32 format); + virtual Common::QuickTimeParser::SampleDesc *readSampleDesc(Track *track, uint32 format, uint32 descSize); void init(); diff --git a/audio/fmopl.h b/audio/fmopl.h index 323cc3d028..ad1794d873 100644 --- a/audio/fmopl.h +++ b/audio/fmopl.h @@ -129,7 +129,9 @@ public: /** * Function to directly write to a specific OPL register. - * This writes to *both* chips for a Dual OPL2. + * This writes to *both* chips for a Dual OPL2. We allow + * writing to secondary OPL registers by using register + * values >= 0x100. * * @param r hardware register number to write to * @param v value, which will be written diff --git a/audio/mididrv.h b/audio/mididrv.h index fb3e29bd60..56b4a265cb 100644 --- a/audio/mididrv.h +++ b/audio/mididrv.h @@ -194,7 +194,9 @@ public: enum { // PROP_TIMEDIV = 1, PROP_OLD_ADLIB = 2, - PROP_CHANNEL_MASK = 3 + PROP_CHANNEL_MASK = 3, + // HACK: Not so nice, but our SCUMM AdLib code is in audio/ + PROP_SCUMM_OPL3 = 4 }; /** diff --git a/audio/midiparser.h b/audio/midiparser.h index a4dbf174e1..bb9749b97f 100644 --- a/audio/midiparser.h +++ b/audio/midiparser.h @@ -394,6 +394,7 @@ public: static MidiParser *createParser_SMF(); static MidiParser *createParser_XMIDI(XMidiCallbackProc proc = defaultXMidiCallback, void *refCon = 0); + static MidiParser *createParser_QT(); static void timerCallback(void *data) { ((MidiParser *) data)->onTimer(); } }; diff --git a/audio/midiparser_qt.cpp b/audio/midiparser_qt.cpp new file mode 100644 index 0000000000..6214d28f95 --- /dev/null +++ b/audio/midiparser_qt.cpp @@ -0,0 +1,496 @@ +/* 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. + * + */ + +#include "audio/midiparser_qt.h" +#include "common/debug.h" +#include "common/memstream.h" + +bool MidiParser_QT::loadMusic(byte *data, uint32 size) { + if (size < 8) + return false; + + Common::SeekableReadStream *stream = new Common::MemoryReadStream(data, size, DisposeAfterUse::NO); + + // Attempt to detect what format we have + bool result; + if (READ_BE_UINT32(data + 4) == MKTAG('m', 'u', 's', 'i')) + result = loadFromTune(stream); + else + result = loadFromContainerStream(stream); + + if (!result) { + delete stream; + return false; + } + + return true; +} + +void MidiParser_QT::unloadMusic() { + MidiParser::unloadMusic(); + close(); + + // Unlike those lesser formats, we *do* hold track data + for (uint i = 0; i < _trackInfo.size(); i++) + free(_trackInfo[i].data); + + _trackInfo.clear(); +} + +bool MidiParser_QT::loadFromTune(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse) { + unloadMusic(); + + // a tune starts off with a sample description + stream->readUint32BE(); // header size + + if (stream->readUint32BE() != MKTAG('m', 'u', 's', 'i')) + return false; + + stream->readUint32BE(); // reserved + stream->readUint16BE(); // reserved + stream->readUint16BE(); // index + + stream->readUint32BE(); // flags, ignore + + MIDITrackInfo trackInfo; + trackInfo.size = stream->size() - stream->pos(); + assert(trackInfo.size > 0); + + trackInfo.data = (byte *)malloc(trackInfo.size); + stream->read(trackInfo.data, trackInfo.size); + + trackInfo.timeScale = 600; // the default + _trackInfo.push_back(trackInfo); + + initCommon(); + return true; +} + +bool MidiParser_QT::loadFromContainerStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse) { + unloadMusic(); + + if (!parseStream(stream, disposeAfterUse)) + return false; + + initFromContainerTracks(); + return true; +} + +bool MidiParser_QT::loadFromContainerFile(const Common::String &fileName) { + unloadMusic(); + + if (!parseFile(fileName)) + return false; + + initFromContainerTracks(); + return true; +} + +void MidiParser_QT::parseNextEvent(EventInfo &info) { + uint32 delta = 0; + + while (_queuedEvents.empty()) + delta += readNextEvent(); + + info = _queuedEvents.pop(); + info.delta = delta; +} + +uint32 MidiParser_QT::readNextEvent() { + if (_position._playPos >= _trackInfo[_activeTrack].data + _trackInfo[_activeTrack].size) { + // Manually insert end of track when we reach the end + EventInfo info; + info.event = 0xFF; + info.ext.type = 0x2F; + _queuedEvents.push(info); + return 0; + } + + uint32 control = readUint32(); + + switch (control >> 28) { + case 0x0: + case 0x1: + // Rest + // We handle this by recursively adding up all the rests into the + // next event's delta + return readNextEvent() + (control & 0xFFFFFF); + case 0x2: + case 0x3: + // Note event + handleNoteEvent((control >> 24) & 0x1F, ((control >> 18) & 0x3F) + 32, (control >> 11) & 0x7F, control & 0x7FF); + break; + case 0x4: + case 0x5: + // Controller + handleControllerEvent((control >> 16) & 0xFF, (control >> 24) & 0x1F, (control >> 8) & 0xFF, control & 0xFF); + break; + case 0x6: + case 0x7: + // Marker + // Used for editing only, so we don't need to care about this + break; + case 0x9: { + // Extended note event + uint32 extra = readUint32(); + handleNoteEvent((control >> 16) & 0xFFF, (control >> 8) & 0xFF, (extra >> 22) & 0x7F, extra & 0x3FFFFF); + break; + } + case 0xA: { + // Extended controller + uint32 extra = readUint32(); + handleControllerEvent((extra >> 16) & 0x3FFF, (control >> 16) & 0xFFF, (extra >> 8) & 0xFF, extra & 0xFF); + break; + } + case 0xB: + // Knob + error("Encountered knob event in QuickTime MIDI"); + break; + case 0x8: + case 0xC: + case 0xD: + case 0xE: + // Reserved + readUint32(); + break; + case 0xF: + // General + handleGeneralEvent(control); + break; + } + + return 0; +} + +void MidiParser_QT::handleNoteEvent(uint32 part, byte pitch, byte velocity, uint32 length) { + byte channel = getChannel(part); + + EventInfo info; + info.event = 0x90 | channel; + info.basic.param1 = pitch; + info.basic.param2 = velocity; + info.length = (velocity == 0) ? 0 : length; + _queuedEvents.push(info); +} + +void MidiParser_QT::handleControllerEvent(uint32 control, uint32 part, byte intPart, byte fracPart) { + byte channel = getChannel(part); + EventInfo info; + + if (control == 0) { + // "Bank select" + // QuickTime docs don't list this, but IHNM Mac calls this anyway + // We have to ignore this. + return; + } else if (control == 32) { + // Pitch bend + info.event = 0xE0 | channel; + + // Actually an 8.8 fixed point number + int16 value = (int16)((intPart << 8) | fracPart); + + if (value < -0x200 || value > 0x1FF) { + warning("QuickTime MIDI pitch bend value (%d) out of range, clipping", value); + value = CLIP<int16>(value, -0x200, 0x1FF); + } + + // Now convert the value to 'normal' MIDI values + value += 0x200; + value *= 16; + + // param1 holds the low 7 bits, param2 holds the high 7 bits + info.basic.param1 = value & 0x7F; + info.basic.param2 = value >> 7; + + _partMap[part].pitchBend = value; + } else { + // Regular controller + info.event = 0xB0 | channel; + info.basic.param1 = control; + info.basic.param2 = intPart; + + // TODO: Parse more controls to hold their status + switch (control) { + case 7: + _partMap[part].volume = intPart; + break; + case 10: + _partMap[part].pan = intPart; + break; + } + } + + _queuedEvents.push(info); +} + +void MidiParser_QT::handleGeneralEvent(uint32 control) { + uint32 part = (control >> 16) & 0xFFF; + uint32 dataSize = ((control & 0xFFFF) - 2) * 4; + byte subType = READ_BE_UINT16(_position._playPos + dataSize) & 0x3FFF; + + switch (subType) { + case 1: + // Note Request + // Currently we're only using the GM number from the request + assert(dataSize == 84); + + // We have to remap channels because GM needs percussion to be on the + // percussion channel but QuickTime can have that anywhere. + definePart(part, READ_BE_UINT32(_position._playPos + 80)); + break; + case 5: // Tune Difference + case 8: // MIDI Channel + case 10: // No-op + case 11: // Used Notes + // Should be safe to skip these + break; + default: + warning("Unhandled general event %d", subType); + } + + _position._playPos += dataSize + 4; +} + +void MidiParser_QT::definePart(uint32 part, uint32 instrument) { + if (_partMap.contains(part)) + warning("QuickTime MIDI part %d being redefined", part); + + PartStatus partStatus; + partStatus.instrument = instrument; + partStatus.volume = 127; + partStatus.pan = 64; + partStatus.pitchBend = 0x2000; + _partMap[part] = partStatus; +} + +byte MidiParser_QT::getChannel(uint32 part) { + // If we already mapped it, just go with it + if (!_channelMap.contains(part)) { + byte newChannel = findFreeChannel(part); + _channelMap[part] = newChannel; + setupPart(part); + } + + return _channelMap[part]; +} + +byte MidiParser_QT::findFreeChannel(uint32 part) { + if (_partMap[part].instrument != 0x4001) { + // Normal Instrument -> First Free Channel + if (allChannelsAllocated()) + deallocateFreeChannel(); + + for (int i = 0; i < 16; i++) + if (i != 9 && !isChannelAllocated(i)) // 9 is reserved for Percussion + return i; + + // Can't actually get here + } + + // Drum Kit -> Percussion Channel + deallocateChannel(9); + return 9; +} + +void MidiParser_QT::deallocateFreeChannel() { + for (int i = 0; i < 16; i++) { + if (i != 9 && !_activeNotes[i]) { + // TODO: Improve this by looking for the channel with the longest + // time since the last note. + deallocateChannel(i); + return; + } + } + + error("Exceeded QuickTime MIDI channel polyphony"); +} + +void MidiParser_QT::deallocateChannel(byte channel) { + for (ChannelMap::iterator it = _channelMap.begin(); it != _channelMap.end(); it++) { + if (it->_value == channel) { + _channelMap.erase(it); + return; + } + } +} + +bool MidiParser_QT::isChannelAllocated(byte channel) const { + for (ChannelMap::const_iterator it = _channelMap.begin(); it != _channelMap.end(); it++) + if (it->_value == channel) + return true; + + return false; +} + +bool MidiParser_QT::allChannelsAllocated() const { + // Less than 15? We definitely have room + if (_channelMap.size() < 15) + return false; + + // 15? One of the allocated channels might be the percussion one + if (_channelMap.size() == 15) + for (ChannelMap::const_iterator it = _channelMap.begin(); it != _channelMap.end(); it++) + if (it->_value == 9) + return false; + + // 16 -> definitely all allocated + return true; +} + +void MidiParser_QT::setupPart(uint32 part) { + PartStatus &status = _partMap[part]; + byte channel = _channelMap[part]; + EventInfo info; + + // First, the program change + if (channel != 9) { + // 9 is always percussion + info.event = 0xC0 | channel; + info.basic.param1 = status.instrument; + _queuedEvents.push(info); + } + + // Volume + info.event = 0xB0 | channel; + info.basic.param1 = 7; + info.basic.param2 = status.volume; + _queuedEvents.push(info); + + // Pan + info.event = 0xB0 | channel; + info.basic.param1 = 10; + info.basic.param2 = status.pan; + _queuedEvents.push(info); + + // Pitch Bend + info.event = 0xE0 | channel; + info.basic.param1 = status.pitchBend & 0x7F; + info.basic.param2 = status.pitchBend >> 7; + _queuedEvents.push(info); +} + +void MidiParser_QT::resetTracking() { + MidiParser::resetTracking(); + _channelMap.clear(); + _queuedEvents.clear(); + _partMap.clear(); +} + +Common::QuickTimeParser::SampleDesc *MidiParser_QT::readSampleDesc(Track *track, uint32 format, uint32 descSize) { + if (track->codecType == CODEC_TYPE_MIDI) { + debug(0, "MIDI Codec FourCC '%s'", tag2str(format)); + + _fd->readUint32BE(); // flags, ignore + descSize -= 4; + + MIDISampleDesc *entry = new MIDISampleDesc(track, format); + entry->_requestSize = descSize; + entry->_requestData = (byte *)malloc(descSize); + _fd->read(entry->_requestData, descSize); + return entry; + } + + return 0; +} + +MidiParser_QT::MIDISampleDesc::MIDISampleDesc(Common::QuickTimeParser::Track *parentTrack, uint32 codecTag) : + Common::QuickTimeParser::SampleDesc(parentTrack, codecTag) { +} + +void MidiParser_QT::initFromContainerTracks() { + const Common::Array<Common::QuickTimeParser::Track *> &tracks = Common::QuickTimeParser::_tracks; + + for (uint32 i = 0; i < tracks.size(); i++) { + if (tracks[i]->codecType == CODEC_TYPE_MIDI) { + assert(tracks[i]->sampleDescs.size() == 1); + + if (tracks[i]->editCount != 1) + warning("Unhandled QuickTime MIDI edit lists, things may go awry"); + + MIDITrackInfo trackInfo; + trackInfo.data = readWholeTrack(tracks[i], trackInfo.size); + trackInfo.timeScale = tracks[i]->timeScale; + _trackInfo.push_back(trackInfo); + } + } + + initCommon(); +} + +void MidiParser_QT::initCommon() { + // Now we have all our info needed in _trackInfo from whatever container + // form, we can fill in the MidiParser tracks. + + _numTracks = _trackInfo.size(); + assert(_numTracks > 0); + + for (uint32 i = 0; i < _trackInfo.size(); i++) + MidiParser::_tracks[i] = _trackInfo[i].data; + + _ppqn = _trackInfo[0].timeScale; + resetTracking(); + setTempo(1000000); + setTrack(0); +} + +byte *MidiParser_QT::readWholeTrack(Common::QuickTimeParser::Track *track, uint32 &trackSize) { + // This just goes through all chunks and appends them together + + Common::MemoryWriteStreamDynamic output; + uint32 curSample = 0; + + // Read in the note request data first + MIDISampleDesc *entry = (MIDISampleDesc *)track->sampleDescs[0]; + output.write(entry->_requestData, entry->_requestSize); + + for (uint i = 0; i < track->chunkCount; i++) { + _fd->seek(track->chunkOffsets[i]); + + uint32 sampleCount = 0; + + for (uint32 j = 0; j < track->sampleToChunkCount; j++) + if (i >= track->sampleToChunk[j].first) + sampleCount = track->sampleToChunk[j].count; + + for (uint32 j = 0; j < sampleCount; j++, curSample++) { + uint32 size = (track->sampleSize != 0) ? track->sampleSize : track->sampleSizes[curSample]; + + byte *data = new byte[size]; + _fd->read(data, size); + output.write(data, size); + delete[] data; + } + } + + trackSize = output.size(); + return output.getData(); +} + +uint32 MidiParser_QT::readUint32() { + uint32 value = READ_BE_UINT32(_position._playPos); + _position._playPos += 4; + return value; +} + +MidiParser *MidiParser::createParser_QT() { + return new MidiParser_QT(); +} diff --git a/audio/midiparser_qt.h b/audio/midiparser_qt.h new file mode 100644 index 0000000000..d6d0f40a48 --- /dev/null +++ b/audio/midiparser_qt.h @@ -0,0 +1,134 @@ +/* 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. + * + */ + +#ifndef AUDIO_MIDIPARSER_QT_H +#define AUDIO_MIDIPARSER_QT_H + +#include "audio/midiparser.h" +#include "common/array.h" +#include "common/hashmap.h" +#include "common/queue.h" +#include "common/quicktime.h" + +/** + * The QuickTime Music version of MidiParser. + * + * QuickTime Music is actually a superset of MIDI. It has its own custom + * instruments and supports more than 15 non-percussion channels. It also + * has custom control changes and a more advanced pitch bend (which we + * convert to GM pitch bend as best as possible). We then use the fallback + * GM instrument that each QuickTime instrument definition has to provide. + * + * Furthermore, Apple's documentation on this is terrible. You know + * documentation is bad when it contradicts itself three times on the same + * subject (like about setting the GM instrument field to percussion). + * + * This is as close to a proper QuickTime Music parser as we can currently + * implement using our MidiParser interface. + */ +class MidiParser_QT : public MidiParser, public Common::QuickTimeParser { +public: + MidiParser_QT() {} + ~MidiParser_QT() {} + + // MidiParser + bool loadMusic(byte *data, uint32 size); + void unloadMusic(); + + /** + * Load the MIDI from a 'Tune' resource + */ + bool loadFromTune(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES); + + /** + * Load the MIDI from a QuickTime stream + */ + bool loadFromContainerStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES); + + /** + * Load the MIDI from a QuickTime file + */ + bool loadFromContainerFile(const Common::String &fileName); + +protected: + // MidiParser + void parseNextEvent(EventInfo &info); + void resetTracking(); + + // QuickTimeParser + SampleDesc *readSampleDesc(Track *track, uint32 format, uint32 descSize); + +private: + struct MIDITrackInfo { + byte *data; + uint32 size; + uint32 timeScale; + }; + + struct PartStatus { + uint32 instrument; + byte volume; + byte pan; + uint16 pitchBend; + }; + + class MIDISampleDesc : public SampleDesc { + public: + MIDISampleDesc(Common::QuickTimeParser::Track *parentTrack, uint32 codecTag); + ~MIDISampleDesc() {} + + byte *_requestData; + uint32 _requestSize; + }; + + uint32 readNextEvent(); + void handleGeneralEvent(uint32 control); + void handleControllerEvent(uint32 control, uint32 part, byte intPart, byte fracPart); + void handleNoteEvent(uint32 part, byte pitch, byte velocity, uint32 length); + + void definePart(uint32 part, uint32 instrument); + void setupPart(uint32 part); + + byte getChannel(uint32 part); + bool isChannelAllocated(byte channel) const; + byte findFreeChannel(uint32 part); + void deallocateFreeChannel(); + void deallocateChannel(byte channel); + bool allChannelsAllocated() const; + + byte *readWholeTrack(Common::QuickTimeParser::Track *track, uint32 &trackSize); + + Common::Array<MIDITrackInfo> _trackInfo; + Common::Queue<EventInfo> _queuedEvents; + + typedef Common::HashMap<uint, PartStatus> PartMap; + PartMap _partMap; + + typedef Common::HashMap<uint, byte> ChannelMap; + ChannelMap _channelMap; + + void initFromContainerTracks(); + void initCommon(); + uint32 readUint32(); +}; + +#endif diff --git a/audio/mods/maxtrax.cpp b/audio/mods/maxtrax.cpp index 8ed51ae5c3..a2d470cdbf 100644 --- a/audio/mods/maxtrax.cpp +++ b/audio/mods/maxtrax.cpp @@ -105,7 +105,7 @@ inline uint32 pow2Fixed(int32 val) { } #endif -} // End of namespace +} // End of anonymous namespace namespace Audio { @@ -211,7 +211,7 @@ void MaxTrax::interrupt() { goto endOfEventLoop; case 0xA0: // SPECIAL - switch (curEvent->stopTime >> 8){ + switch (curEvent->stopTime >> 8) { case 0x01: // SPECIAL_SYNC _playerCtx.syncCallBack(curEvent->stopTime & 0xFF); break; @@ -1032,6 +1032,6 @@ void MaxTrax::outPutEvent(const Event &ev, int num) {} void MaxTrax::outPutScore(const Score &sc, int num) {} #endif // #ifndef NDEBUG -} // End of namespace Audio +} // End of namespace Audio #endif // #if defined(AUDIO_MODS_MAXTRAX_H) diff --git a/audio/mods/maxtrax.h b/audio/mods/maxtrax.h index ffb176c241..8288aef186 100644 --- a/audio/mods/maxtrax.h +++ b/audio/mods/maxtrax.h @@ -214,6 +214,6 @@ private: static void outPutEvent(const Event &ev, int num = -1); static void outPutScore(const Score &sc, int num = -1); }; -} // End of namespace Audio +} // End of namespace Audio #endif // !defined(AUDIO_MODS_MAXTRAX_H) diff --git a/audio/mods/tfmx.cpp b/audio/mods/tfmx.cpp index 2957529afc..5829ab5fda 100644 --- a/audio/mods/tfmx.cpp +++ b/audio/mods/tfmx.cpp @@ -1095,7 +1095,7 @@ int Tfmx::doSfx(uint16 sfxIndex, bool unlockChannel) { return -1; } -} // End of namespace Audio +} // End of namespace Audio // some debugging functions #if 0 diff --git a/audio/mods/tfmx.h b/audio/mods/tfmx.h index ebe1172278..a8852d7963 100644 --- a/audio/mods/tfmx.h +++ b/audio/mods/tfmx.h @@ -273,6 +273,6 @@ private: void noteCommand(uint8 note, uint8 param1, uint8 param2, uint8 param3); }; -} // End of namespace Audio +} // End of namespace Audio #endif // !defined(AUDIO_MODS_TFMX_H) diff --git a/audio/module.mk b/audio/module.mk index e3aa0aaa81..4e1c031c83 100644 --- a/audio/module.mk +++ b/audio/module.mk @@ -4,6 +4,7 @@ MODULE_OBJS := \ audiostream.o \ fmopl.o \ mididrv.o \ + midiparser_qt.o \ midiparser_smf.o \ midiparser_xmidi.o \ midiparser.o \ diff --git a/audio/softsynth/adlib.cpp b/audio/softsynth/adlib.cpp index 32a5f4a910..0cadea7f22 100644 --- a/audio/softsynth/adlib.cpp +++ b/audio/softsynth/adlib.cpp @@ -32,7 +32,13 @@ #include "common/translation.h" #ifdef DEBUG_ADLIB -static int tick; +static int g_tick; +#endif + +// Only include OPL3 when we actually have an AdLib emulator builtin, which +// supports OPL3. +#ifndef DISABLE_DOSBOX_OPL +#define ENABLE_OPL3 #endif class MidiDriver_ADLIB; @@ -52,21 +58,21 @@ struct InstrumentExtra { } PACKED_STRUCT; struct AdLibInstrument { - byte mod_characteristic; - byte mod_scalingOutputLevel; - byte mod_attackDecay; - byte mod_sustainRelease; - byte mod_waveformSelect; - byte car_characteristic; - byte car_scalingOutputLevel; - byte car_attackDecay; - byte car_sustainRelease; - byte car_waveformSelect; + byte modCharacteristic; + byte modScalingOutputLevel; + byte modAttackDecay; + byte modSustainRelease; + byte modWaveformSelect; + byte carCharacteristic; + byte carScalingOutputLevel; + byte carAttackDecay; + byte carSustainRelease; + byte carWaveformSelect; byte feedback; - byte flags_a; - InstrumentExtra extra_a; - byte flags_b; - InstrumentExtra extra_b; + byte flagsA; + InstrumentExtra extraA; + byte flagsB; + InstrumentExtra extraB; byte duration; } PACKED_STRUCT; #include "common/pack-end.h" @@ -77,16 +83,20 @@ class AdLibPart : public MidiChannel { protected: // AdLibPart *_prev, *_next; AdLibVoice *_voice; - int16 _pitchbend; - byte _pitchbend_factor; - int8 _transpose_eff; - byte _vol_eff; - int8 _detune_eff; - byte _modwheel; + int16 _pitchBend; + byte _pitchBendFactor; + //int8 _transposeEff; + byte _volEff; + int8 _detuneEff; + byte _modWheel; bool _pedal; byte _program; - byte _pri_eff; - AdLibInstrument _part_instr; + byte _priEff; + byte _pan; + AdLibInstrument _partInstr; +#ifdef ENABLE_OPL3 + AdLibInstrument _partInstrSecondary; +#endif protected: MidiDriver_ADLIB *_owner; @@ -99,21 +109,25 @@ protected: public: AdLibPart() { _voice = 0; - _pitchbend = 0; - _pitchbend_factor = 2; - _transpose_eff = 0; - _vol_eff = 0; - _detune_eff = 0; - _modwheel = 0; + _pitchBend = 0; + _pitchBendFactor = 2; + //_transposeEff = 0; + _volEff = 0; + _detuneEff = 0; + _modWheel = 0; _pedal = 0; _program = 0; - _pri_eff = 0; + _priEff = 0; + _pan = 64; _owner = 0; _allocated = false; _channel = 0; - memset(&_part_instr, 0, sizeof(_part_instr)); + memset(&_partInstr, 0, sizeof(_partInstr)); +#ifdef ENABLE_OPL3 + memset(&_partInstrSecondary, 0, sizeof(_partInstrSecondary)); +#endif } MidiDriver *device(); @@ -132,7 +146,7 @@ public: void controlChange(byte control, byte value); void modulationWheel(byte value); void volume(byte value); - void panPosition(byte value) { return; } // Not supported + void panPosition(byte value); void pitchBendFactor(byte value); void detune(byte value); void priority(byte value); @@ -162,7 +176,6 @@ public: void noteOff(byte note); void noteOn(byte note, byte velocity); void programChange(byte program) { } - void pitchBend(int16 bend) { } // Control Change messages void modulationWheel(byte value) { } @@ -181,26 +194,26 @@ private: struct Struct10 { byte active; - int16 cur_val; + int16 curVal; int16 count; - uint16 max_value; - int16 start_value; + uint16 maxValue; + int16 startValue; byte loop; - byte table_a[4]; - byte table_b[4]; + byte tableA[4]; + byte tableB[4]; int8 unk3; - int8 modwheel; - int8 modwheel_last; - uint16 speed_lo_max; - uint16 num_steps; - int16 speed_hi; + int8 modWheel; + int8 modWheelLast; + uint16 speedLoMax; + uint16 numSteps; + int16 speedHi; int8 direction; - uint16 speed_lo; - uint16 speed_lo_counter; + uint16 speedLo; + uint16 speedLoCounter; }; struct Struct11 { - int16 modify_val; + int16 modifyVal; byte param, flag0x40, flag0x10; Struct10 *s10; }; @@ -208,11 +221,11 @@ struct Struct11 { struct AdLibVoice { AdLibPart *_part; AdLibVoice *_next, *_prev; - byte _waitforpedal; + byte _waitForPedal; byte _note; byte _channel; - byte _twochan; - byte _vol_1, _vol_2; + byte _twoChan; + byte _vol1, _vol2; int16 _duration; Struct10 _s10a; @@ -220,26 +233,34 @@ struct AdLibVoice { Struct10 _s10b; Struct11 _s11b; +#ifdef ENABLE_OPL3 + byte _secTwoChan; + byte _secVol1, _secVol2; +#endif + AdLibVoice() { memset(this, 0, sizeof(AdLibVoice)); } }; struct AdLibSetParams { - byte a, b, c, d; + byte registerBase; + byte shift; + byte mask; + byte inversion; }; -static const byte channel_mappings[9] = { +static const byte g_operator1Offsets[9] = { 0, 1, 2, 8, 9, 10, 16, 17, 18 }; -static const byte channel_mappings_2[9] = { +static const byte g_operator2Offsets[9] = { 3, 4, 5, 11, 12, 13, 19, 20, 21 }; -static const AdLibSetParams adlib_setparam_table[] = { +static const AdLibSetParams g_setParamTable[] = { {0x40, 0, 63, 63}, // level {0xE0, 2, 0, 0}, // unused {0x40, 6, 192, 0}, // level key scaling @@ -257,21 +278,21 @@ static const AdLibSetParams adlib_setparam_table[] = { {0xC0, 1, 14, 0} // feedback }; -static const byte param_table_1[16] = { +static const byte g_paramTable1[16] = { 29, 28, 27, 0, 3, 4, 7, 8, 13, 16, 17, 20, 21, 30, 31, 0 }; -static const uint16 maxval_table[16] = { +static const uint16 g_maxValTable[16] = { 0x2FF, 0x1F, 0x7, 0x3F, 0x0F, 0x0F, 0x0F, 0x3, 0x3F, 0x0F, 0x0F, 0x0F, 0x3, 0x3E, 0x1F, 0 }; -static const uint16 num_steps_table[] = { +static const uint16 g_numStepsTable[] = { 1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, @@ -282,7 +303,7 @@ static const uint16 num_steps_table[] = { 600, 860, 1200, 1600 }; -static const byte note_to_f_num[] = { +static const byte g_noteFrequencies[] = { 90, 91, 92, 92, 93, 94, 94, 95, 96, 96, 97, 98, 98, 99, 100, 101, 101, 102, 103, 104, 104, 105, 106, 107, @@ -303,188 +324,530 @@ static const byte note_to_f_num[] = { 242, 243, 245, 247, 249, 251, 252, 254 }; -static const AdLibInstrument map_gm_to_fm[128] = { +static const AdLibInstrument g_gmInstruments[128] = { // 0x00 -{ 0xC2, 0xC5, 0x2B, 0x99, 0x58, 0xC2, 0x1F, 0x1E, 0xC8, 0x7C, 0x0A, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x23 }, -{ 0x22, 0x53, 0x0E, 0x8A, 0x30, 0x14, 0x06, 0x1D, 0x7A, 0x5C, 0x06, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0x06, 0x00, 0x1C, 0x79, 0x40, 0x02, 0x00, 0x4B, 0x79, 0x58, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xC2, 0x89, 0x2A, 0x89, 0x49, 0xC2, 0x16, 0x1C, 0xB8, 0x7C, 0x04, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x23 }, -{ 0xC2, 0x17, 0x3D, 0x6A, 0x00, 0xC4, 0x2E, 0x2D, 0xC9, 0x20, 0x00, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0x06, 0x1E, 0x1C, 0x99, 0x00, 0x02, 0x3A, 0x4C, 0x79, 0x00, 0x0C, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0x84, 0x40, 0x3B, 0x5A, 0x6F, 0x81, 0x0E, 0x3B, 0x5A, 0x7F, 0x0B, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0x84, 0x40, 0x3B, 0x5A, 0x63, 0x81, 0x00, 0x3B, 0x5A, 0x7F, 0x01, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0x8C, 0x80, 0x05, 0xEA, 0x59, 0x82, 0x0A, 0x3C, 0xAA, 0x64, 0x07, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0x85, 0x40, 0x0D, 0xEC, 0x71, 0x84, 0x58, 0x3E, 0xCB, 0x7C, 0x01, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0x8A, 0xC0, 0x0C, 0xDC, 0x50, 0x88, 0x58, 0x3D, 0xDA, 0x7C, 0x01, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xC9, 0x40, 0x2B, 0x78, 0x42, 0xC2, 0x04, 0x4C, 0x8A, 0x7C, 0x00, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x1A }, -{ 0x2A, 0x0E, 0x17, 0x89, 0x28, 0x22, 0x0C, 0x1B, 0x09, 0x70, 0x0A, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE7, 0x9B, 0x08, 0x08, 0x26, 0xE2, 0x06, 0x0A, 0x08, 0x70, 0x0A, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xC5, 0x05, 0x00, 0xFC, 0x40, 0x84, 0x00, 0x00, 0xDC, 0x50, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0x86, 0x40, 0x5D, 0x5A, 0x41, 0x81, 0x00, 0x0B, 0x5A, 0x7F, 0x00, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, + { 0xC2, 0xC5, 0x2B, 0x99, 0x58, 0xC2, 0x1F, 0x1E, 0xC8, 0x7C, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x23 }, + { 0x22, 0x53, 0x0E, 0x8A, 0x30, 0x14, 0x06, 0x1D, 0x7A, 0x5C, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x06, 0x00, 0x1C, 0x79, 0x40, 0x02, 0x00, 0x4B, 0x79, 0x58, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xC2, 0x89, 0x2A, 0x89, 0x49, 0xC2, 0x16, 0x1C, 0xB8, 0x7C, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x23 }, + { 0xC2, 0x17, 0x3D, 0x6A, 0x00, 0xC4, 0x2E, 0x2D, 0xC9, 0x20, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x06, 0x1E, 0x1C, 0x99, 0x00, 0x02, 0x3A, 0x4C, 0x79, 0x00, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x84, 0x40, 0x3B, 0x5A, 0x6F, 0x81, 0x0E, 0x3B, 0x5A, 0x7F, 0x0B, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x84, 0x40, 0x3B, 0x5A, 0x63, 0x81, 0x00, 0x3B, 0x5A, 0x7F, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x8C, 0x80, 0x05, 0xEA, 0x59, 0x82, 0x0A, 0x3C, 0xAA, 0x64, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x85, 0x40, 0x0D, 0xEC, 0x71, 0x84, 0x58, 0x3E, 0xCB, 0x7C, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x8A, 0xC0, 0x0C, 0xDC, 0x50, 0x88, 0x58, 0x3D, 0xDA, 0x7C, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xC9, 0x40, 0x2B, 0x78, 0x42, 0xC2, 0x04, 0x4C, 0x8A, 0x7C, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x1A }, + { 0x2A, 0x0E, 0x17, 0x89, 0x28, 0x22, 0x0C, 0x1B, 0x09, 0x70, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE7, 0x9B, 0x08, 0x08, 0x26, 0xE2, 0x06, 0x0A, 0x08, 0x70, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xC5, 0x05, 0x00, 0xFC, 0x40, 0x84, 0x00, 0x00, 0xDC, 0x50, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x86, 0x40, 0x5D, 0x5A, 0x41, 0x81, 0x00, 0x0B, 0x5A, 0x7F, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, // 0x10 -{ 0xED, 0x00, 0x7B, 0xC8, 0x40, 0xE1, 0x99, 0x4A, 0xE9, 0x7E, 0x07, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE8, 0x4F, 0x3A, 0xD7, 0x7C, 0xE2, 0x97, 0x49, 0xF9, 0x7D, 0x05, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE1, 0x10, 0x2F, 0xF7, 0x7D, 0xF3, 0x45, 0x8F, 0xC7, 0x62, 0x07, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0x01, 0x8C, 0x9F, 0xDA, 0x70, 0xE4, 0x50, 0x9F, 0xDA, 0x6A, 0x09, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0x08, 0xD5, 0x9D, 0xA5, 0x45, 0xE2, 0x3F, 0x9F, 0xD6, 0x49, 0x07, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE5, 0x0F, 0x7D, 0xB8, 0x2E, 0xA2, 0x0F, 0x7C, 0xC7, 0x61, 0x04, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xF2, 0x2A, 0x9F, 0xDB, 0x01, 0xE1, 0x04, 0x8F, 0xD7, 0x62, 0x0A, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE4, 0x88, 0x9C, 0x50, 0x64, 0xE2, 0x18, 0x70, 0xC4, 0x7C, 0x0B, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0x02, 0xA3, 0x0D, 0xDA, 0x01, 0xC2, 0x35, 0x5D, 0x58, 0x00, 0x06, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x18 }, -{ 0x42, 0x55, 0x3E, 0xEB, 0x24, 0xD4, 0x08, 0x0D, 0xA9, 0x71, 0x04, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x18 }, -{ 0xC2, 0x00, 0x2B, 0x17, 0x51, 0xC2, 0x1E, 0x4D, 0x97, 0x7C, 0x00, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x19 }, -{ 0xC6, 0x01, 0x2D, 0xA7, 0x44, 0xC2, 0x06, 0x0E, 0xA7, 0x79, 0x06, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xC2, 0x0C, 0x06, 0x06, 0x55, 0xC2, 0x3F, 0x09, 0x86, 0x7D, 0x0A, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x0A }, -{ 0xC2, 0x2E, 0x4F, 0x77, 0x00, 0xC4, 0x08, 0x0E, 0x98, 0x59, 0x0A, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xC2, 0x30, 0x4F, 0xCA, 0x01, 0xC4, 0x0D, 0x0E, 0xB8, 0x7F, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xC4, 0x29, 0x4F, 0xCA, 0x03, 0xC8, 0x0D, 0x0C, 0xB7, 0x7D, 0x00, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x0B }, + { 0xED, 0x00, 0x7B, 0xC8, 0x40, 0xE1, 0x99, 0x4A, 0xE9, 0x7E, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE8, 0x4F, 0x3A, 0xD7, 0x7C, 0xE2, 0x97, 0x49, 0xF9, 0x7D, 0x05, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE1, 0x10, 0x2F, 0xF7, 0x7D, 0xF3, 0x45, 0x8F, 0xC7, 0x62, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x01, 0x8C, 0x9F, 0xDA, 0x70, 0xE4, 0x50, 0x9F, 0xDA, 0x6A, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x08, 0xD5, 0x9D, 0xA5, 0x45, 0xE2, 0x3F, 0x9F, 0xD6, 0x49, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE5, 0x0F, 0x7D, 0xB8, 0x2E, 0xA2, 0x0F, 0x7C, 0xC7, 0x61, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xF2, 0x2A, 0x9F, 0xDB, 0x01, 0xE1, 0x04, 0x8F, 0xD7, 0x62, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE4, 0x88, 0x9C, 0x50, 0x64, 0xE2, 0x18, 0x70, 0xC4, 0x7C, 0x0B, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x02, 0xA3, 0x0D, 0xDA, 0x01, 0xC2, 0x35, 0x5D, 0x58, 0x00, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x18 }, + { 0x42, 0x55, 0x3E, 0xEB, 0x24, 0xD4, 0x08, 0x0D, 0xA9, 0x71, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x18 }, + { 0xC2, 0x00, 0x2B, 0x17, 0x51, 0xC2, 0x1E, 0x4D, 0x97, 0x7C, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x19 }, + { 0xC6, 0x01, 0x2D, 0xA7, 0x44, 0xC2, 0x06, 0x0E, 0xA7, 0x79, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xC2, 0x0C, 0x06, 0x06, 0x55, 0xC2, 0x3F, 0x09, 0x86, 0x7D, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0A }, + { 0xC2, 0x2E, 0x4F, 0x77, 0x00, 0xC4, 0x08, 0x0E, 0x98, 0x59, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xC2, 0x30, 0x4F, 0xCA, 0x01, 0xC4, 0x0D, 0x0E, 0xB8, 0x7F, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xC4, 0x29, 0x4F, 0xCA, 0x03, 0xC8, 0x0D, 0x0C, 0xB7, 0x7D, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0B }, // 0x20 -{ 0xC2, 0x40, 0x3C, 0x96, 0x58, 0xC4, 0xDE, 0x0E, 0xC7, 0x7C, 0x00, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x20 }, -{ 0x31, 0x13, 0x2D, 0xD7, 0x3C, 0xE2, 0x18, 0x2E, 0xB8, 0x7C, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0x22, 0x86, 0x0D, 0xD7, 0x50, 0xE4, 0x18, 0x5E, 0xB8, 0x7C, 0x06, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x28 }, -{ 0xF2, 0x0A, 0x0D, 0xD7, 0x40, 0xE4, 0x1F, 0x5E, 0xB8, 0x7C, 0x0A, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xF2, 0x09, 0x4B, 0xD6, 0x48, 0xE4, 0x1F, 0x1C, 0xB8, 0x7C, 0x0A, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x28 }, -{ 0x62, 0x11, 0x0C, 0xE6, 0x3C, 0xE4, 0x1F, 0x0C, 0xC8, 0x7C, 0x0A, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE2, 0x12, 0x3D, 0xE6, 0x34, 0xE4, 0x1F, 0x7D, 0xB8, 0x7C, 0x0A, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE2, 0x13, 0x3D, 0xE6, 0x34, 0xE4, 0x1F, 0x5D, 0xB8, 0x7D, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xA2, 0x40, 0x5D, 0xBA, 0x3F, 0xE2, 0x00, 0x8F, 0xD8, 0x79, 0x00, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE2, 0x40, 0x3D, 0xDA, 0x3B, 0xE1, 0x00, 0x7E, 0xD8, 0x7A, 0x04, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0x62, 0x00, 0x6D, 0xFA, 0x5D, 0xE2, 0x00, 0x8F, 0xC8, 0x79, 0x04, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE1, 0x00, 0x4E, 0xDB, 0x4A, 0xE3, 0x18, 0x6F, 0xE9, 0x7E, 0x00, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE1, 0x00, 0x4E, 0xDB, 0x66, 0xE2, 0x00, 0x7F, 0xE9, 0x7E, 0x06, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0x02, 0x0F, 0x66, 0xAA, 0x51, 0x02, 0x64, 0x29, 0xF9, 0x7C, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x04 }, -{ 0x16, 0x4A, 0x04, 0xBA, 0x39, 0xC2, 0x58, 0x2D, 0xCA, 0x7C, 0x0A, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x03 }, -{ 0x02, 0x00, 0x01, 0x7A, 0x79, 0x02, 0x3F, 0x28, 0xEA, 0x7C, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x02 }, + { 0xC2, 0x40, 0x3C, 0x96, 0x58, 0xC4, 0xDE, 0x0E, 0xC7, 0x7C, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x20 }, + { 0x31, 0x13, 0x2D, 0xD7, 0x3C, 0xE2, 0x18, 0x2E, 0xB8, 0x7C, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x22, 0x86, 0x0D, 0xD7, 0x50, 0xE4, 0x18, 0x5E, 0xB8, 0x7C, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x28 }, + { 0xF2, 0x0A, 0x0D, 0xD7, 0x40, 0xE4, 0x1F, 0x5E, 0xB8, 0x7C, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xF2, 0x09, 0x4B, 0xD6, 0x48, 0xE4, 0x1F, 0x1C, 0xB8, 0x7C, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x28 }, + { 0x62, 0x11, 0x0C, 0xE6, 0x3C, 0xE4, 0x1F, 0x0C, 0xC8, 0x7C, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x12, 0x3D, 0xE6, 0x34, 0xE4, 0x1F, 0x7D, 0xB8, 0x7C, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x13, 0x3D, 0xE6, 0x34, 0xE4, 0x1F, 0x5D, 0xB8, 0x7D, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xA2, 0x40, 0x5D, 0xBA, 0x3F, 0xE2, 0x00, 0x8F, 0xD8, 0x79, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x40, 0x3D, 0xDA, 0x3B, 0xE1, 0x00, 0x7E, 0xD8, 0x7A, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x62, 0x00, 0x6D, 0xFA, 0x5D, 0xE2, 0x00, 0x8F, 0xC8, 0x79, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE1, 0x00, 0x4E, 0xDB, 0x4A, 0xE3, 0x18, 0x6F, 0xE9, 0x7E, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE1, 0x00, 0x4E, 0xDB, 0x66, 0xE2, 0x00, 0x7F, 0xE9, 0x7E, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x02, 0x0F, 0x66, 0xAA, 0x51, 0x02, 0x64, 0x29, 0xF9, 0x7C, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 }, + { 0x16, 0x4A, 0x04, 0xBA, 0x39, 0xC2, 0x58, 0x2D, 0xCA, 0x7C, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 }, + { 0x02, 0x00, 0x01, 0x7A, 0x79, 0x02, 0x3F, 0x28, 0xEA, 0x7C, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, // 0x30 -{ 0x62, 0x53, 0x9C, 0xBA, 0x31, 0x62, 0x5B, 0xAD, 0xC9, 0x55, 0x04, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xF2, 0x40, 0x6E, 0xDA, 0x49, 0xE2, 0x13, 0x8F, 0xF9, 0x7D, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE2, 0x40, 0x8F, 0xFA, 0x50, 0xF2, 0x04, 0x7F, 0xFA, 0x7D, 0x0A, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE4, 0xA0, 0xCE, 0x5B, 0x02, 0xE2, 0x32, 0x7F, 0xFB, 0x3D, 0x04, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE6, 0x80, 0x9C, 0x99, 0x42, 0xE2, 0x04, 0x7D, 0x78, 0x60, 0x04, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xEA, 0xA0, 0xAC, 0x67, 0x02, 0xE2, 0x00, 0x7C, 0x7A, 0x7C, 0x06, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE7, 0x94, 0xAD, 0xB7, 0x03, 0xE2, 0x00, 0x7C, 0xBA, 0x7C, 0x00, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xC3, 0x3F, 0x4B, 0xE9, 0x7E, 0xC1, 0x3F, 0x9B, 0xF9, 0x7F, 0x0B, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x06 }, -{ 0xB2, 0x20, 0xAD, 0xE9, 0x00, 0x62, 0x05, 0x8F, 0xC8, 0x68, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xF2, 0x00, 0x8F, 0xFB, 0x50, 0xF6, 0x47, 0x8F, 0xE9, 0x68, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xF2, 0x00, 0xAF, 0x88, 0x58, 0xF2, 0x54, 0x6E, 0xC9, 0x7C, 0x0A, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xF2, 0x2A, 0x9F, 0x98, 0x01, 0xE2, 0x84, 0x4E, 0x78, 0x6C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE2, 0x02, 0x9F, 0xB8, 0x48, 0x22, 0x89, 0x9F, 0xE8, 0x7C, 0x00, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE2, 0x2A, 0x7F, 0xB8, 0x01, 0xE4, 0x00, 0x0D, 0xC5, 0x7C, 0x0C, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE4, 0x28, 0x8E, 0xE8, 0x01, 0xF2, 0x00, 0x4D, 0xD6, 0x7D, 0x0C, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0x62, 0x23, 0x8F, 0xEA, 0x00, 0xF2, 0x00, 0x5E, 0xD9, 0x7C, 0x0C, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, + { 0x62, 0x53, 0x9C, 0xBA, 0x31, 0x62, 0x5B, 0xAD, 0xC9, 0x55, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xF2, 0x40, 0x6E, 0xDA, 0x49, 0xE2, 0x13, 0x8F, 0xF9, 0x7D, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x40, 0x8F, 0xFA, 0x50, 0xF2, 0x04, 0x7F, 0xFA, 0x7D, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE4, 0xA0, 0xCE, 0x5B, 0x02, 0xE2, 0x32, 0x7F, 0xFB, 0x3D, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE6, 0x80, 0x9C, 0x99, 0x42, 0xE2, 0x04, 0x7D, 0x78, 0x60, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xEA, 0xA0, 0xAC, 0x67, 0x02, 0xE2, 0x00, 0x7C, 0x7A, 0x7C, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE7, 0x94, 0xAD, 0xB7, 0x03, 0xE2, 0x00, 0x7C, 0xBA, 0x7C, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xC3, 0x3F, 0x4B, 0xE9, 0x7E, 0xC1, 0x3F, 0x9B, 0xF9, 0x7F, 0x0B, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 }, + { 0xB2, 0x20, 0xAD, 0xE9, 0x00, 0x62, 0x05, 0x8F, 0xC8, 0x68, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xF2, 0x00, 0x8F, 0xFB, 0x50, 0xF6, 0x47, 0x8F, 0xE9, 0x68, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xF2, 0x00, 0xAF, 0x88, 0x58, 0xF2, 0x54, 0x6E, 0xC9, 0x7C, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xF2, 0x2A, 0x9F, 0x98, 0x01, 0xE2, 0x84, 0x4E, 0x78, 0x6C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x02, 0x9F, 0xB8, 0x48, 0x22, 0x89, 0x9F, 0xE8, 0x7C, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x2A, 0x7F, 0xB8, 0x01, 0xE4, 0x00, 0x0D, 0xC5, 0x7C, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE4, 0x28, 0x8E, 0xE8, 0x01, 0xF2, 0x00, 0x4D, 0xD6, 0x7D, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x62, 0x23, 0x8F, 0xEA, 0x00, 0xF2, 0x00, 0x5E, 0xD9, 0x7C, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, // 0x40 -{ 0xB4, 0x26, 0x6E, 0x98, 0x01, 0x62, 0x00, 0x7D, 0xC8, 0x7D, 0x00, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE2, 0x2E, 0x20, 0xD9, 0x01, 0xF2, 0x0F, 0x90, 0xF8, 0x78, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE4, 0x28, 0x7E, 0xF8, 0x01, 0xE2, 0x23, 0x8E, 0xE8, 0x7D, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xB8, 0x28, 0x9E, 0x98, 0x01, 0x62, 0x00, 0x3D, 0xC8, 0x7D, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0x62, 0x00, 0x8E, 0xC9, 0x3D, 0xE6, 0x00, 0x7E, 0xD8, 0x68, 0x0A, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE2, 0x00, 0x5F, 0xF9, 0x48, 0xE6, 0x98, 0x8F, 0xF8, 0x7D, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0x62, 0x0C, 0x6E, 0xD8, 0x3D, 0x2A, 0x06, 0x7D, 0xD8, 0x58, 0x04, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE4, 0x00, 0x7E, 0x89, 0x38, 0xE6, 0x84, 0x80, 0xF8, 0x68, 0x0C, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE4, 0x80, 0x6C, 0xD9, 0x30, 0xE2, 0x00, 0x8D, 0xC8, 0x7C, 0x00, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE2, 0x80, 0x88, 0x48, 0x40, 0xE2, 0x0A, 0x7D, 0xA8, 0x7C, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE4, 0x00, 0x77, 0xC5, 0x54, 0xE2, 0x00, 0x9E, 0xD7, 0x70, 0x06, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE4, 0x80, 0x86, 0xB9, 0x64, 0xE2, 0x05, 0x9F, 0xD7, 0x78, 0x0A, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE2, 0x00, 0x68, 0x68, 0x56, 0xE2, 0x08, 0x9B, 0xB3, 0x7C, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE4, 0x00, 0xA6, 0x87, 0x41, 0xE2, 0x0A, 0x7E, 0xC9, 0x7C, 0x06, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE4, 0x80, 0x9A, 0xB8, 0x48, 0xE2, 0x00, 0x9E, 0xF9, 0x60, 0x09, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE2, 0x80, 0x8E, 0x64, 0x68, 0xE2, 0x28, 0x6F, 0x73, 0x7C, 0x01, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, + { 0xB4, 0x26, 0x6E, 0x98, 0x01, 0x62, 0x00, 0x7D, 0xC8, 0x7D, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x2E, 0x20, 0xD9, 0x01, 0xF2, 0x0F, 0x90, 0xF8, 0x78, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE4, 0x28, 0x7E, 0xF8, 0x01, 0xE2, 0x23, 0x8E, 0xE8, 0x7D, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xB8, 0x28, 0x9E, 0x98, 0x01, 0x62, 0x00, 0x3D, 0xC8, 0x7D, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x62, 0x00, 0x8E, 0xC9, 0x3D, 0xE6, 0x00, 0x7E, 0xD8, 0x68, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x00, 0x5F, 0xF9, 0x48, 0xE6, 0x98, 0x8F, 0xF8, 0x7D, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x62, 0x0C, 0x6E, 0xD8, 0x3D, 0x2A, 0x06, 0x7D, 0xD8, 0x58, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE4, 0x00, 0x7E, 0x89, 0x38, 0xE6, 0x84, 0x80, 0xF8, 0x68, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE4, 0x80, 0x6C, 0xD9, 0x30, 0xE2, 0x00, 0x8D, 0xC8, 0x7C, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x80, 0x88, 0x48, 0x40, 0xE2, 0x0A, 0x7D, 0xA8, 0x7C, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE4, 0x00, 0x77, 0xC5, 0x54, 0xE2, 0x00, 0x9E, 0xD7, 0x70, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE4, 0x80, 0x86, 0xB9, 0x64, 0xE2, 0x05, 0x9F, 0xD7, 0x78, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x00, 0x68, 0x68, 0x56, 0xE2, 0x08, 0x9B, 0xB3, 0x7C, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE4, 0x00, 0xA6, 0x87, 0x41, 0xE2, 0x0A, 0x7E, 0xC9, 0x7C, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE4, 0x80, 0x9A, 0xB8, 0x48, 0xE2, 0x00, 0x9E, 0xF9, 0x60, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x80, 0x8E, 0x64, 0x68, 0xE2, 0x28, 0x6F, 0x73, 0x7C, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, // 0x50 -{ 0xE8, 0x00, 0x7D, 0x99, 0x54, 0xE6, 0x80, 0x80, 0xF8, 0x7C, 0x0C, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE6, 0x00, 0x9F, 0xB9, 0x6D, 0xE1, 0x00, 0x8F, 0xC8, 0x7D, 0x02, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE4, 0x00, 0x09, 0x68, 0x4A, 0xE2, 0x2B, 0x9E, 0xF3, 0x7C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xC4, 0x00, 0x99, 0xE8, 0x3B, 0xE2, 0x25, 0x6F, 0x93, 0x7C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE6, 0x00, 0x6F, 0xDA, 0x69, 0xE2, 0x05, 0x2F, 0xD8, 0x6A, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xEC, 0x60, 0x9D, 0xC7, 0x00, 0xE2, 0x21, 0x7F, 0xC9, 0x7C, 0x06, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE3, 0x00, 0x0F, 0xF7, 0x7D, 0xE1, 0x3F, 0x0F, 0xA7, 0x01, 0x0D, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE4, 0xA9, 0x0F, 0xA8, 0x02, 0xE2, 0x3C, 0x5F, 0xDA, 0x3C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE8, 0x40, 0x0D, 0x89, 0x7D, 0xE2, 0x17, 0x7E, 0xD9, 0x7C, 0x07, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE1, 0x00, 0xDF, 0x8A, 0x56, 0xE2, 0x5E, 0xCF, 0xBA, 0x7E, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE2, 0x00, 0x0B, 0x68, 0x60, 0xE2, 0x01, 0x9E, 0xB8, 0x7C, 0x0A, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xEA, 0x00, 0xAE, 0xAB, 0x49, 0xE2, 0x00, 0xAE, 0xBA, 0x6C, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xEB, 0x80, 0x8C, 0xCB, 0x3A, 0xE2, 0x86, 0xAF, 0xCA, 0x7C, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE5, 0x40, 0xDB, 0x3B, 0x3C, 0xE2, 0x80, 0xBE, 0xCA, 0x71, 0x00, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE4, 0x00, 0x9E, 0xAA, 0x3D, 0xE1, 0x43, 0x0F, 0xBA, 0x7E, 0x04, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE7, 0x40, 0xEC, 0xCA, 0x44, 0xE2, 0x03, 0xBF, 0xBA, 0x66, 0x02, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, + { 0xE8, 0x00, 0x7D, 0x99, 0x54, 0xE6, 0x80, 0x80, 0xF8, 0x7C, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE6, 0x00, 0x9F, 0xB9, 0x6D, 0xE1, 0x00, 0x8F, 0xC8, 0x7D, 0x02, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE4, 0x00, 0x09, 0x68, 0x4A, 0xE2, 0x2B, 0x9E, 0xF3, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xC4, 0x00, 0x99, 0xE8, 0x3B, 0xE2, 0x25, 0x6F, 0x93, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE6, 0x00, 0x6F, 0xDA, 0x69, 0xE2, 0x05, 0x2F, 0xD8, 0x6A, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xEC, 0x60, 0x9D, 0xC7, 0x00, 0xE2, 0x21, 0x7F, 0xC9, 0x7C, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE3, 0x00, 0x0F, 0xF7, 0x7D, 0xE1, 0x3F, 0x0F, 0xA7, 0x01, 0x0D, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE4, 0xA9, 0x0F, 0xA8, 0x02, 0xE2, 0x3C, 0x5F, 0xDA, 0x3C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE8, 0x40, 0x0D, 0x89, 0x7D, 0xE2, 0x17, 0x7E, 0xD9, 0x7C, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE1, 0x00, 0xDF, 0x8A, 0x56, 0xE2, 0x5E, 0xCF, 0xBA, 0x7E, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x00, 0x0B, 0x68, 0x60, 0xE2, 0x01, 0x9E, 0xB8, 0x7C, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xEA, 0x00, 0xAE, 0xAB, 0x49, 0xE2, 0x00, 0xAE, 0xBA, 0x6C, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xEB, 0x80, 0x8C, 0xCB, 0x3A, 0xE2, 0x86, 0xAF, 0xCA, 0x7C, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE5, 0x40, 0xDB, 0x3B, 0x3C, 0xE2, 0x80, 0xBE, 0xCA, 0x71, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE4, 0x00, 0x9E, 0xAA, 0x3D, 0xE1, 0x43, 0x0F, 0xBA, 0x7E, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE7, 0x40, 0xEC, 0xCA, 0x44, 0xE2, 0x03, 0xBF, 0xBA, 0x66, 0x02, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, // 0x60 -{ 0xEA, 0x00, 0x68, 0xB8, 0x48, 0xE2, 0x0A, 0x8E, 0xB8, 0x7C, 0x0C, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0x61, 0x00, 0xBE, 0x99, 0x7E, 0xE3, 0x40, 0xCF, 0xCA, 0x7D, 0x09, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xCD, 0x00, 0x0B, 0x00, 0x48, 0xC2, 0x58, 0x0C, 0x00, 0x7C, 0x0C, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x1C }, -{ 0xE2, 0x00, 0x0E, 0x00, 0x52, 0xE2, 0x58, 0x5F, 0xD0, 0x7D, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xCC, 0x00, 0x7D, 0xDA, 0x40, 0xC2, 0x00, 0x5E, 0x9B, 0x58, 0x0C, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE9, 0xC0, 0xEE, 0xD8, 0x43, 0xE2, 0x05, 0xDD, 0xAA, 0x70, 0x06, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xDA, 0x00, 0x8F, 0xAC, 0x4A, 0x22, 0x05, 0x8D, 0x8A, 0x75, 0x02, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0x62, 0x8A, 0xCB, 0x7A, 0x74, 0xE6, 0x56, 0xAF, 0xDB, 0x70, 0x02, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xC2, 0x41, 0xAC, 0x5B, 0x5B, 0xC2, 0x80, 0x0D, 0xCB, 0x7D, 0x0A, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x12 }, -{ 0x75, 0x00, 0x0E, 0xCB, 0x5A, 0xE2, 0x1E, 0x0A, 0xC9, 0x7D, 0x0A, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x10 }, -{ 0x41, 0x00, 0x0E, 0xEA, 0x53, 0xC2, 0x00, 0x08, 0xCA, 0x7C, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x07 }, -{ 0xC1, 0x40, 0x0C, 0x59, 0x6A, 0xC2, 0x80, 0x3C, 0xAB, 0x7C, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x0D }, -{ 0x4B, 0x00, 0x0A, 0xF5, 0x61, 0xC2, 0x19, 0x0C, 0xE9, 0x7C, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x07 }, -{ 0x62, 0x00, 0x7F, 0xD8, 0x54, 0xEA, 0x00, 0x8F, 0xD8, 0x7D, 0x0A, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE1, 0x00, 0x7F, 0xD9, 0x56, 0xE1, 0x00, 0x8F, 0xD8, 0x7E, 0x06, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0xE1, 0x00, 0x7F, 0xD9, 0x56, 0xE1, 0x00, 0x8F, 0xD8, 0x7E, 0x06, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, + { 0xEA, 0x00, 0x68, 0xB8, 0x48, 0xE2, 0x0A, 0x8E, 0xB8, 0x7C, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x61, 0x00, 0xBE, 0x99, 0x7E, 0xE3, 0x40, 0xCF, 0xCA, 0x7D, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xCD, 0x00, 0x0B, 0x00, 0x48, 0xC2, 0x58, 0x0C, 0x00, 0x7C, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x1C }, + { 0xE2, 0x00, 0x0E, 0x00, 0x52, 0xE2, 0x58, 0x5F, 0xD0, 0x7D, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xCC, 0x00, 0x7D, 0xDA, 0x40, 0xC2, 0x00, 0x5E, 0x9B, 0x58, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE9, 0xC0, 0xEE, 0xD8, 0x43, 0xE2, 0x05, 0xDD, 0xAA, 0x70, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xDA, 0x00, 0x8F, 0xAC, 0x4A, 0x22, 0x05, 0x8D, 0x8A, 0x75, 0x02, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x62, 0x8A, 0xCB, 0x7A, 0x74, 0xE6, 0x56, 0xAF, 0xDB, 0x70, 0x02, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xC2, 0x41, 0xAC, 0x5B, 0x5B, 0xC2, 0x80, 0x0D, 0xCB, 0x7D, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x12 }, + { 0x75, 0x00, 0x0E, 0xCB, 0x5A, 0xE2, 0x1E, 0x0A, 0xC9, 0x7D, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x10 }, + { 0x41, 0x00, 0x0E, 0xEA, 0x53, 0xC2, 0x00, 0x08, 0xCA, 0x7C, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 }, + { 0xC1, 0x40, 0x0C, 0x59, 0x6A, 0xC2, 0x80, 0x3C, 0xAB, 0x7C, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0D }, + { 0x4B, 0x00, 0x0A, 0xF5, 0x61, 0xC2, 0x19, 0x0C, 0xE9, 0x7C, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 }, + { 0x62, 0x00, 0x7F, 0xD8, 0x54, 0xEA, 0x00, 0x8F, 0xD8, 0x7D, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE1, 0x00, 0x7F, 0xD9, 0x56, 0xE1, 0x00, 0x8F, 0xD8, 0x7E, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE1, 0x00, 0x7F, 0xD9, 0x56, 0xE1, 0x00, 0x8F, 0xD8, 0x7E, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, // 0x70 -{ 0xCF, 0x40, 0x09, 0xEA, 0x54, 0xC4, 0x00, 0x0C, 0xDB, 0x64, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x02 }, -{ 0xCF, 0x40, 0x0C, 0xAA, 0x54, 0xC4, 0x00, 0x18, 0xF9, 0x64, 0x0C, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x02 }, -{ 0xC9, 0x0E, 0x88, 0xD9, 0x3E, 0xC2, 0x08, 0x1A, 0xEA, 0x6C, 0x0C, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x05 }, -{ 0x03, 0x00, 0x15, 0x00, 0x64, 0x02, 0x00, 0x08, 0x00, 0x7C, 0x09, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x02 }, -{ 0x01, 0x00, 0x47, 0xD7, 0x6C, 0x01, 0x3F, 0x0C, 0xFB, 0x7C, 0x0A, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x04 }, -{ 0x00, 0x00, 0x36, 0x67, 0x7C, 0x01, 0x3F, 0x0E, 0xFA, 0x7C, 0x00, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x05 }, -{ 0x02, 0x00, 0x36, 0x68, 0x7C, 0x01, 0x3F, 0x0E, 0xFA, 0x7C, 0x00, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x05 }, -{ 0xCB, 0x00, 0xAF, 0x00, 0x7E, 0xC0, 0x00, 0xC0, 0x06, 0x7F, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x0F }, -{ 0x05, 0x0D, 0x80, 0xA6, 0x7F, 0x0B, 0x38, 0xA9, 0xD8, 0x00, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x04 }, -{ 0x0F, 0x00, 0x90, 0xFA, 0x68, 0x06, 0x00, 0xA7, 0x39, 0x54, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x06 }, -{ 0xC9, 0x15, 0xDD, 0xFF, 0x7C, 0x00, 0x00, 0xE7, 0xFC, 0x6C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x38 }, -{ 0x48, 0x3C, 0x30, 0xF6, 0x03, 0x0A, 0x38, 0x97, 0xE8, 0x00, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x04 }, -{ 0x07, 0x80, 0x0B, 0xC8, 0x65, 0x02, 0x3F, 0x0C, 0xEA, 0x7C, 0x0F, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x05 }, -{ 0x00, 0x21, 0x66, 0x40, 0x03, 0x00, 0x3F, 0x47, 0x00, 0x00, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x02 }, -{ 0x08, 0x00, 0x0B, 0x3C, 0x7C, 0x08, 0x3F, 0x06, 0xF3, 0x00, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x02 }, -{ 0x00, 0x3F, 0x4C, 0xFB, 0x00, 0x00, 0x3F, 0x0A, 0xE9, 0x7C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x05 } + { 0xCF, 0x40, 0x09, 0xEA, 0x54, 0xC4, 0x00, 0x0C, 0xDB, 0x64, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0xCF, 0x40, 0x0C, 0xAA, 0x54, 0xC4, 0x00, 0x18, 0xF9, 0x64, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0xC9, 0x0E, 0x88, 0xD9, 0x3E, 0xC2, 0x08, 0x1A, 0xEA, 0x6C, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 }, + { 0x03, 0x00, 0x15, 0x00, 0x64, 0x02, 0x00, 0x08, 0x00, 0x7C, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0x01, 0x00, 0x47, 0xD7, 0x6C, 0x01, 0x3F, 0x0C, 0xFB, 0x7C, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 }, + { 0x00, 0x00, 0x36, 0x67, 0x7C, 0x01, 0x3F, 0x0E, 0xFA, 0x7C, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 }, + { 0x02, 0x00, 0x36, 0x68, 0x7C, 0x01, 0x3F, 0x0E, 0xFA, 0x7C, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 }, + { 0xCB, 0x00, 0xAF, 0x00, 0x7E, 0xC0, 0x00, 0xC0, 0x06, 0x7F, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0F }, + { 0x05, 0x0D, 0x80, 0xA6, 0x7F, 0x0B, 0x38, 0xA9, 0xD8, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 }, + { 0x0F, 0x00, 0x90, 0xFA, 0x68, 0x06, 0x00, 0xA7, 0x39, 0x54, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 }, + { 0xC9, 0x15, 0xDD, 0xFF, 0x7C, 0x00, 0x00, 0xE7, 0xFC, 0x6C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x38 }, + { 0x48, 0x3C, 0x30, 0xF6, 0x03, 0x0A, 0x38, 0x97, 0xE8, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 }, + { 0x07, 0x80, 0x0B, 0xC8, 0x65, 0x02, 0x3F, 0x0C, 0xEA, 0x7C, 0x0F, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 }, + { 0x00, 0x21, 0x66, 0x40, 0x03, 0x00, 0x3F, 0x47, 0x00, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0x08, 0x00, 0x0B, 0x3C, 0x7C, 0x08, 0x3F, 0x06, 0xF3, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0x00, 0x3F, 0x4C, 0xFB, 0x00, 0x00, 0x3F, 0x0A, 0xE9, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 } }; -static AdLibInstrument gm_percussion_to_fm[39] = { -{ 0x1A, 0x3F, 0x15, 0x05, 0x7C, 0x02, 0x21, 0x2B, 0xE4, 0x7C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x06 }, -{ 0x11, 0x12, 0x04, 0x07, 0x7C, 0x02, 0x23, 0x0B, 0xE5, 0x7C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x05 }, -{ 0x0A, 0x3F, 0x0B, 0x01, 0x7C, 0x1F, 0x1C, 0x46, 0xD0, 0x7C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x01 }, -{ 0x00, 0x3F, 0x0F, 0x00, 0x7C, 0x10, 0x12, 0x07, 0x00, 0x7C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x02 }, -{ 0x0F, 0x3F, 0x0B, 0x00, 0x7C, 0x1F, 0x0F, 0x19, 0xD0, 0x7C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x02 }, -{ 0x00, 0x3F, 0x1F, 0x00, 0x7E, 0x1F, 0x16, 0x07, 0x00, 0x7C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x03 }, -{ 0x12, 0x3F, 0x05, 0x06, 0x7C, 0x03, 0x1F, 0x4A, 0xD9, 0x7C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x03 }, -{ 0xCF, 0x7F, 0x08, 0xFF, 0x7E, 0x00, 0xC7, 0x2D, 0xF7, 0x73, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x02 }, -{ 0x12, 0x3F, 0x05, 0x06, 0x7C, 0x43, 0x21, 0x0C, 0xE9, 0x7C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x03 }, -{ 0xCF, 0x7F, 0x08, 0xCF, 0x7E, 0x00, 0x45, 0x2A, 0xF8, 0x4B, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x0C }, -{ 0x12, 0x3F, 0x06, 0x17, 0x7C, 0x03, 0x27, 0x0B, 0xE9, 0x7C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x03 }, -{ 0xCF, 0x7F, 0x08, 0xCD, 0x7E, 0x00, 0x40, 0x1A, 0x69, 0x63, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x0C }, -{ 0x13, 0x3F, 0x05, 0x06, 0x7C, 0x03, 0x17, 0x0A, 0xD9, 0x7C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x03 }, -{ 0x15, 0x3F, 0x05, 0x06, 0x7C, 0x03, 0x21, 0x0C, 0xE9, 0x7C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x03 }, -{ 0xCF, 0x3F, 0x2B, 0xFB, 0x7E, 0xC0, 0x1E, 0x1A, 0xCA, 0x7F, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x10 }, -{ 0x17, 0x3F, 0x04, 0x09, 0x7C, 0x03, 0x22, 0x0D, 0xE9, 0x7C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x03 }, -{ 0xCF, 0x3F, 0x0F, 0x5E, 0x7C, 0xC6, 0x13, 0x00, 0xCA, 0x7F, 0x04, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x03 }, -{ 0xCF, 0x3F, 0x7E, 0x9D, 0x7C, 0xC8, 0xC0, 0x0A, 0xBA, 0x74, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x06 }, -{ 0xCF, 0x3F, 0x4D, 0x9F, 0x7C, 0xC6, 0x00, 0x08, 0xDA, 0x5B, 0x04, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x04 }, -{ 0xCF, 0x3F, 0x5D, 0xAA, 0x7A, 0xC0, 0xA4, 0x67, 0x99, 0x7C, 0x0A, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x02 }, -{ 0xCF, 0x3F, 0x4A, 0xFD, 0x7C, 0xCF, 0x00, 0x59, 0xEA, 0x7C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x02 }, -{ 0x0F, 0x18, 0x0A, 0xFA, 0x57, 0x06, 0x07, 0x06, 0x39, 0x7C, 0x0A, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x02 }, -{ 0xCF, 0x3F, 0x2B, 0xFC, 0x7C, 0xCC, 0xC6, 0x0B, 0xEA, 0x7F, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x10 }, -{ 0x05, 0x1A, 0x04, 0x00, 0x7C, 0x12, 0x10, 0x0C, 0xEA, 0x7C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x07 }, -{ 0x04, 0x19, 0x04, 0x00, 0x7C, 0x12, 0x10, 0x2C, 0xEA, 0x7C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x04 }, -{ 0x04, 0x0A, 0x04, 0x00, 0x6C, 0x01, 0x07, 0x0D, 0xFA, 0x74, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x07 }, -{ 0x15, 0x14, 0x05, 0x00, 0x7D, 0x01, 0x07, 0x5C, 0xE9, 0x7C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x05 }, -{ 0x10, 0x10, 0x05, 0x08, 0x7C, 0x01, 0x08, 0x0D, 0xEA, 0x7C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x05 }, -{ 0x11, 0x00, 0x06, 0x87, 0x7F, 0x02, 0x40, 0x09, 0x59, 0x68, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x08 }, -{ 0x13, 0x26, 0x04, 0x6A, 0x7F, 0x01, 0x00, 0x08, 0x5A, 0x7C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x08 }, -{ 0xCF, 0x4E, 0x0C, 0xAA, 0x50, 0xC4, 0x00, 0x18, 0xF9, 0x54, 0x04, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x02 }, -{ 0xCF, 0x4E, 0x0C, 0xAA, 0x50, 0xC3, 0x00, 0x18, 0xF8, 0x54, 0x04, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x02 }, -{ 0xCB, 0x3F, 0x8F, 0x00, 0x7E, 0xC5, 0x00, 0x98, 0xD6, 0x5F, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x0D }, -{ 0x0C, 0x18, 0x87, 0xB3, 0x7F, 0x19, 0x10, 0x55, 0x75, 0x7C, 0x0E, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x02 }, -{ 0x05, 0x11, 0x15, 0x00, 0x64, 0x02, 0x08, 0x08, 0x00, 0x5C, 0x09, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x02 }, -{ 0x04, 0x08, 0x15, 0x00, 0x48, 0x01, 0x08, 0x08, 0x00, 0x60, 0x08, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x02 }, -{ 0xDA, 0x00, 0x53, 0x30, 0x68, 0x07, 0x1E, 0x49, 0xC4, 0x7E, 0x03, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 }, -{ 0x1C, 0x00, 0x07, 0xBC, 0x6C, 0x0C, 0x14, 0x0B, 0x6A, 0x7E, 0x0B, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x03 }, -{ 0x0A, 0x0E, 0x7F, 0x00, 0x7D, 0x13, 0x20, 0x28, 0x03, 0x7C, 0x06, 0, { 0,0,0,0,0,0,0,0 }, 0, { 0,0,0,0,0,0,0,0 }, 0x00 } +static AdLibInstrument g_gmPercussionInstruments[39] = { + { 0x1A, 0x3F, 0x15, 0x05, 0x7C, 0x02, 0x21, 0x2B, 0xE4, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 }, + { 0x11, 0x12, 0x04, 0x07, 0x7C, 0x02, 0x23, 0x0B, 0xE5, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 }, + { 0x0A, 0x3F, 0x0B, 0x01, 0x7C, 0x1F, 0x1C, 0x46, 0xD0, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x01 }, + { 0x00, 0x3F, 0x0F, 0x00, 0x7C, 0x10, 0x12, 0x07, 0x00, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0x0F, 0x3F, 0x0B, 0x00, 0x7C, 0x1F, 0x0F, 0x19, 0xD0, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0x00, 0x3F, 0x1F, 0x00, 0x7E, 0x1F, 0x16, 0x07, 0x00, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 }, + { 0x12, 0x3F, 0x05, 0x06, 0x7C, 0x03, 0x1F, 0x4A, 0xD9, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 }, + { 0xCF, 0x7F, 0x08, 0xFF, 0x7E, 0x00, 0xC7, 0x2D, 0xF7, 0x73, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0x12, 0x3F, 0x05, 0x06, 0x7C, 0x43, 0x21, 0x0C, 0xE9, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 }, + { 0xCF, 0x7F, 0x08, 0xCF, 0x7E, 0x00, 0x45, 0x2A, 0xF8, 0x4B, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0C }, + { 0x12, 0x3F, 0x06, 0x17, 0x7C, 0x03, 0x27, 0x0B, 0xE9, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 }, + { 0xCF, 0x7F, 0x08, 0xCD, 0x7E, 0x00, 0x40, 0x1A, 0x69, 0x63, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0C }, + { 0x13, 0x3F, 0x05, 0x06, 0x7C, 0x03, 0x17, 0x0A, 0xD9, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 }, + { 0x15, 0x3F, 0x05, 0x06, 0x7C, 0x03, 0x21, 0x0C, 0xE9, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 }, + { 0xCF, 0x3F, 0x2B, 0xFB, 0x7E, 0xC0, 0x1E, 0x1A, 0xCA, 0x7F, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x10 }, + { 0x17, 0x3F, 0x04, 0x09, 0x7C, 0x03, 0x22, 0x0D, 0xE9, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 }, + { 0xCF, 0x3F, 0x0F, 0x5E, 0x7C, 0xC6, 0x13, 0x00, 0xCA, 0x7F, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 }, + { 0xCF, 0x3F, 0x7E, 0x9D, 0x7C, 0xC8, 0xC0, 0x0A, 0xBA, 0x74, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 }, + { 0xCF, 0x3F, 0x4D, 0x9F, 0x7C, 0xC6, 0x00, 0x08, 0xDA, 0x5B, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 }, + { 0xCF, 0x3F, 0x5D, 0xAA, 0x7A, 0xC0, 0xA4, 0x67, 0x99, 0x7C, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0xCF, 0x3F, 0x4A, 0xFD, 0x7C, 0xCF, 0x00, 0x59, 0xEA, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0x0F, 0x18, 0x0A, 0xFA, 0x57, 0x06, 0x07, 0x06, 0x39, 0x7C, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0xCF, 0x3F, 0x2B, 0xFC, 0x7C, 0xCC, 0xC6, 0x0B, 0xEA, 0x7F, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x10 }, + { 0x05, 0x1A, 0x04, 0x00, 0x7C, 0x12, 0x10, 0x0C, 0xEA, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 }, + { 0x04, 0x19, 0x04, 0x00, 0x7C, 0x12, 0x10, 0x2C, 0xEA, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 }, + { 0x04, 0x0A, 0x04, 0x00, 0x6C, 0x01, 0x07, 0x0D, 0xFA, 0x74, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 }, + { 0x15, 0x14, 0x05, 0x00, 0x7D, 0x01, 0x07, 0x5C, 0xE9, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 }, + { 0x10, 0x10, 0x05, 0x08, 0x7C, 0x01, 0x08, 0x0D, 0xEA, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 }, + { 0x11, 0x00, 0x06, 0x87, 0x7F, 0x02, 0x40, 0x09, 0x59, 0x68, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x08 }, + { 0x13, 0x26, 0x04, 0x6A, 0x7F, 0x01, 0x00, 0x08, 0x5A, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x08 }, + { 0xCF, 0x4E, 0x0C, 0xAA, 0x50, 0xC4, 0x00, 0x18, 0xF9, 0x54, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0xCF, 0x4E, 0x0C, 0xAA, 0x50, 0xC3, 0x00, 0x18, 0xF8, 0x54, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0xCB, 0x3F, 0x8F, 0x00, 0x7E, 0xC5, 0x00, 0x98, 0xD6, 0x5F, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0D }, + { 0x0C, 0x18, 0x87, 0xB3, 0x7F, 0x19, 0x10, 0x55, 0x75, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0x05, 0x11, 0x15, 0x00, 0x64, 0x02, 0x08, 0x08, 0x00, 0x5C, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0x04, 0x08, 0x15, 0x00, 0x48, 0x01, 0x08, 0x08, 0x00, 0x60, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0xDA, 0x00, 0x53, 0x30, 0x68, 0x07, 0x1E, 0x49, 0xC4, 0x7E, 0x03, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x1C, 0x00, 0x07, 0xBC, 0x6C, 0x0C, 0x14, 0x0B, 0x6A, 0x7E, 0x0B, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 }, + { 0x0A, 0x0E, 0x7F, 0x00, 0x7D, 0x13, 0x20, 0x28, 0x03, 0x7C, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }; -static const byte gm_percussion_lookup[128] = { +#ifdef ENABLE_OPL3 +static const AdLibInstrument g_gmInstrumentsOPL3[128][2] = { + { { 0xC2, 0xC2, 0x0A, 0x6B, 0xA0, 0xC2, 0x08, 0x0D, 0x88, 0xC8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x23 }, + { 0x02, 0x00, 0x0C, 0x78, 0x61, 0x04, 0x4C, 0x0B, 0x9A, 0xC8, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x23 } }, + { { 0x22, 0x53, 0x0E, 0x8A, 0x60, 0x14, 0x06, 0x1D, 0x7A, 0xB8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x22, 0x5A, 0x0E, 0x8A, 0x40, 0x14, 0x2F, 0x0E, 0x7A, 0x88, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0x06, 0x00, 0x1C, 0x79, 0x70, 0x02, 0x00, 0x4B, 0x79, 0xA8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x06, 0x00, 0x1A, 0x79, 0x60, 0x02, 0x00, 0x4C, 0xA9, 0xC8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xC2, 0x80, 0x0B, 0x89, 0x90, 0xC2, 0x06, 0x1B, 0xA8, 0xB0, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x23 }, + { 0x04, 0x28, 0x5D, 0xB8, 0x01, 0x02, 0x00, 0x3C, 0x70, 0x88, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xC2, 0x17, 0x3D, 0x6A, 0x00, 0xC4, 0x2E, 0x2D, 0xC9, 0x40, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xC2, 0x17, 0x3D, 0x6A, 0x00, 0xC4, 0x2E, 0x2D, 0xC9, 0x40, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0x06, 0x1E, 0x1C, 0x99, 0x00, 0x02, 0x3A, 0x4C, 0x79, 0x00, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x06, 0x1E, 0x1C, 0x99, 0x00, 0x02, 0x3A, 0x4C, 0x79, 0x00, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0x84, 0x40, 0x3B, 0x5A, 0x63, 0x81, 0x00, 0x3B, 0x5A, 0xD3, 0x0B, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x87, 0x40, 0x3A, 0x5A, 0x94, 0x82, 0x04, 0x3D, 0x59, 0xAC, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0x84, 0x40, 0x3B, 0x5A, 0xC3, 0x81, 0x00, 0x3B, 0x5A, 0xFB, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x84, 0x40, 0x3B, 0x5A, 0xC3, 0x81, 0x00, 0x3B, 0x5A, 0xFB, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0x8C, 0x80, 0x05, 0xEA, 0xA9, 0x82, 0x04, 0x3D, 0xAA, 0xB0, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x8C, 0x80, 0x06, 0x98, 0xA9, 0x86, 0x10, 0x36, 0x7A, 0xFD, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0x85, 0x40, 0x0D, 0xEC, 0xE1, 0x84, 0x58, 0x3E, 0xCB, 0xF8, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x84, 0x40, 0x0D, 0xEB, 0xE0, 0x84, 0x48, 0x3E, 0xCA, 0xC0, 0x05, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0x8A, 0xC0, 0x0C, 0xDC, 0xA0, 0x88, 0x58, 0x3D, 0xDA, 0xF8, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x8A, 0xC0, 0x0C, 0xDC, 0xA0, 0x88, 0x58, 0x3D, 0xDA, 0xF8, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xC9, 0x40, 0x2B, 0x78, 0x8A, 0xC2, 0x0A, 0x4C, 0x8A, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x1A }, + { 0xCA, 0x40, 0x47, 0xCA, 0xB4, 0xC2, 0x00, 0x57, 0x8A, 0xB8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x1A } }, + { { 0x2A, 0x0E, 0x17, 0x89, 0x50, 0x22, 0x0C, 0x1B, 0x09, 0xE0, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x2A, 0x1A, 0x19, 0x8A, 0x00, 0x22, 0x38, 0x0B, 0x0A, 0x00, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE7, 0x9B, 0x08, 0x08, 0x4A, 0xE2, 0x06, 0x0A, 0x08, 0xE0, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE7, 0x9B, 0x08, 0x08, 0x4A, 0xE2, 0x2F, 0x0A, 0x08, 0x68, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xC5, 0x0A, 0x05, 0xDC, 0xB8, 0x84, 0x06, 0x00, 0xEC, 0xC0, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x09, 0x10, 0x04, 0x5B, 0xA5, 0x02, 0x08, 0x00, 0xEC, 0x70, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0x86, 0x40, 0x5D, 0x5A, 0x81, 0x81, 0x00, 0x0B, 0x5A, 0xFB, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x86, 0x40, 0x5D, 0x5A, 0x81, 0x81, 0x00, 0x0B, 0x5A, 0xFB, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xED, 0x0F, 0x5B, 0xC8, 0xC8, 0xE2, 0x9F, 0x4A, 0xE9, 0xF9, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE6, 0x40, 0x0A, 0xA7, 0x64, 0xE2, 0x8B, 0x6A, 0x79, 0xB1, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE8, 0x4F, 0x3A, 0xD7, 0xF8, 0xE2, 0x97, 0x49, 0xF9, 0xF9, 0x05, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xC9, 0x02, 0x16, 0x9A, 0xAB, 0xC4, 0x15, 0x46, 0xBA, 0xF8, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE1, 0x08, 0x2F, 0xF7, 0xE1, 0xF3, 0x42, 0x8F, 0xC7, 0xC2, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE3, 0x00, 0x2D, 0xF7, 0xC1, 0xE4, 0x40, 0x7F, 0xC7, 0xD2, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0x01, 0x8C, 0x9F, 0xDA, 0xE8, 0xE4, 0x50, 0x9F, 0xDA, 0xF2, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x02, 0x80, 0x9F, 0xDA, 0x00, 0xE3, 0x50, 0x9F, 0xD9, 0xFA, 0x03, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0x08, 0xD5, 0x9D, 0xA5, 0x89, 0xE2, 0x3F, 0x9F, 0xD6, 0x91, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x08, 0xD5, 0x9D, 0xA5, 0x89, 0xE2, 0x3F, 0x9F, 0xD6, 0x91, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE5, 0x0F, 0x7D, 0xB8, 0x5A, 0xA2, 0x0C, 0x7C, 0xC7, 0xC1, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x06, 0x4C, 0xAC, 0x56, 0x31, 0x02, 0x08, 0x8D, 0x46, 0xDC, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xF2, 0x2A, 0x9F, 0xDB, 0x01, 0xE1, 0x04, 0x8F, 0xD7, 0xC2, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xF2, 0x00, 0x9F, 0xDB, 0xA9, 0xE1, 0x00, 0x8F, 0xD7, 0xBA, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE4, 0x88, 0x9C, 0x50, 0xC8, 0xE2, 0x18, 0x70, 0xC4, 0xF8, 0x0B, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE6, 0x00, 0x9C, 0x50, 0xB0, 0xE4, 0x00, 0x70, 0xC4, 0xA0, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0x02, 0xA3, 0x0D, 0xDA, 0x01, 0xC2, 0x35, 0x5D, 0x58, 0x00, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x18 }, + { 0x02, 0xA3, 0x0D, 0xDA, 0x01, 0xC2, 0x35, 0x5D, 0x58, 0x00, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x18 } }, + { { 0x42, 0x53, 0x3E, 0xEB, 0x48, 0xD4, 0x05, 0x1D, 0xA9, 0xC9, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x18 }, + { 0x42, 0x54, 0x6F, 0xEB, 0x61, 0xD4, 0x02, 0x2E, 0xA9, 0xC8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x18 } }, + { { 0xC2, 0x00, 0x59, 0x17, 0xB1, 0xC2, 0x1E, 0x6D, 0x98, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x19 }, + { 0xC2, 0x00, 0x08, 0xB3, 0x99, 0xC2, 0x06, 0x2B, 0x58, 0xFA, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x19 } }, + { { 0xC6, 0x01, 0x2D, 0xA7, 0x88, 0xC2, 0x08, 0x0E, 0xA7, 0xC1, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xC4, 0x00, 0x2D, 0xA7, 0x91, 0xC2, 0x02, 0x0E, 0xA7, 0xD1, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xC2, 0x0C, 0x06, 0x06, 0xA9, 0xC2, 0x3F, 0x08, 0xB8, 0xF9, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0A }, + { 0xC1, 0x00, 0x68, 0x50, 0xB8, 0xC2, 0x00, 0x48, 0x84, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0A } }, + { { 0xC2, 0x2E, 0x4F, 0x77, 0x00, 0xC4, 0x08, 0x0E, 0x98, 0xB1, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xC2, 0x2F, 0x6F, 0x79, 0x00, 0xC8, 0x0F, 0x5E, 0x98, 0xB9, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xC2, 0x30, 0x4F, 0xCA, 0x01, 0xC4, 0x0D, 0x0E, 0xB8, 0xFB, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xC2, 0x30, 0x4F, 0xCA, 0x01, 0xC4, 0x0D, 0x0E, 0xB8, 0xFB, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xC4, 0x29, 0x4F, 0xCA, 0x03, 0xC8, 0x0D, 0x0C, 0xB7, 0xF9, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0B }, + { 0xC4, 0x29, 0x4F, 0xCA, 0x03, 0xC8, 0x0D, 0x0C, 0xB7, 0xF9, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0B } }, + { { 0xC2, 0x41, 0x3D, 0x96, 0x88, 0xC4, 0xCA, 0x0E, 0xC7, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x20 }, + { 0xC2, 0x04, 0x58, 0xC9, 0x90, 0xC2, 0x94, 0x2C, 0xB9, 0xF0, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x20 } }, + { { 0x31, 0x13, 0x2D, 0xD7, 0x78, 0xE2, 0x18, 0x2E, 0xB8, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x31, 0x13, 0x2D, 0xD7, 0x78, 0xE2, 0x18, 0x2E, 0xB8, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0x22, 0x86, 0x0D, 0xD7, 0xA0, 0xE4, 0x18, 0x5E, 0xB8, 0xF8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x28 }, + { 0x22, 0x86, 0x0D, 0xD7, 0xA0, 0xE4, 0x18, 0x5E, 0xB8, 0xF8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x28 } }, + { { 0xF2, 0x0A, 0x0D, 0xD7, 0x80, 0xE4, 0x1F, 0x5E, 0xB8, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xD2, 0x06, 0x9A, 0xD7, 0xA0, 0xC2, 0x1F, 0x59, 0xB8, 0xF8, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xF2, 0x09, 0x4B, 0xD6, 0x90, 0xE4, 0x1F, 0x1C, 0xB8, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x28 }, + { 0xF2, 0x09, 0x4B, 0xD6, 0x90, 0xE4, 0x1F, 0x1C, 0xB8, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x28 } }, + { { 0x62, 0x11, 0x0C, 0xE6, 0x78, 0xE4, 0x1F, 0x0C, 0xC8, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x62, 0x11, 0x0C, 0xE6, 0x78, 0xE4, 0x1F, 0x0C, 0xC8, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE2, 0x12, 0x3D, 0xE6, 0x68, 0xE4, 0x1F, 0x7D, 0xB8, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x12, 0x3D, 0xE6, 0x68, 0xE4, 0x1F, 0x7D, 0xB8, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE2, 0x13, 0x3D, 0xE6, 0x68, 0xE4, 0x1F, 0x5D, 0xB8, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x13, 0x3D, 0xE6, 0x68, 0xE4, 0x1F, 0x5D, 0xB8, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xA2, 0x40, 0x5D, 0xBA, 0x7B, 0xE2, 0x00, 0x8F, 0xD8, 0xF1, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xA2, 0x40, 0x5D, 0xBA, 0x7B, 0xE2, 0x00, 0x8F, 0xD8, 0xF1, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE2, 0x40, 0x3D, 0xDA, 0x73, 0xE1, 0x00, 0x7E, 0xD8, 0xF2, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x40, 0x3D, 0xDA, 0x73, 0xE1, 0x00, 0x7E, 0xD8, 0xF2, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0x62, 0x00, 0x6D, 0xFA, 0xB9, 0xE2, 0x00, 0x8F, 0xC8, 0xF1, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x62, 0x00, 0x6D, 0xFA, 0xB9, 0xE2, 0x00, 0x8F, 0xC8, 0xF1, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE1, 0x00, 0x4E, 0xDB, 0x92, 0xE3, 0x18, 0x6F, 0xE9, 0xFA, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE1, 0x00, 0x4E, 0xDB, 0xCA, 0xE2, 0x00, 0x6F, 0xE9, 0xFA, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE1, 0x00, 0x4E, 0xDB, 0xCA, 0xE2, 0x00, 0x7F, 0xE9, 0xFA, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE1, 0x00, 0x4E, 0xDB, 0xCA, 0xE2, 0x00, 0x7F, 0xE9, 0xFA, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0x02, 0x0F, 0x66, 0xAA, 0xA1, 0x02, 0x64, 0x29, 0xF9, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 }, + { 0x02, 0x00, 0x65, 0xAA, 0xF1, 0x02, 0x4A, 0x28, 0xF9, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 } }, + { { 0x16, 0x4A, 0x04, 0xBA, 0x71, 0xC2, 0x48, 0x2E, 0xCA, 0xF0, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 }, + { 0x14, 0xC0, 0x66, 0x08, 0x90, 0xC2, 0x48, 0x2C, 0x0A, 0xA0, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 } }, + { { 0x02, 0x0A, 0x01, 0x7A, 0xB1, 0x02, 0x12, 0x2A, 0xEA, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x02, 0x06, 0x75, 0x05, 0xB1, 0x01, 0x3F, 0x28, 0xEA, 0xF9, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x16 } }, + { { 0x62, 0x53, 0x9C, 0xBA, 0x61, 0x62, 0x5A, 0xAD, 0xCA, 0xC1, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xF2, 0x40, 0x9F, 0x8A, 0x98, 0xE2, 0x11, 0x7F, 0xB8, 0xFA, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xF2, 0x40, 0x6E, 0xDA, 0x91, 0xE2, 0x13, 0x8F, 0xF9, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xF2, 0x40, 0x6E, 0xDA, 0x91, 0xE2, 0x13, 0x8F, 0xF9, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE2, 0x40, 0x8F, 0xFA, 0xA0, 0xF2, 0x04, 0x7F, 0xFA, 0xF9, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x40, 0x8F, 0xFA, 0xA0, 0xF2, 0x04, 0x7F, 0xFA, 0xF9, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE4, 0xA0, 0xCE, 0x5B, 0x02, 0xE2, 0x32, 0x7F, 0xFB, 0x79, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE4, 0xA0, 0xCE, 0x5B, 0x02, 0xE2, 0x32, 0x7F, 0xFB, 0x79, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE6, 0x80, 0x9C, 0x99, 0x82, 0xE2, 0x04, 0x8D, 0x78, 0xC0, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE0, 0x44, 0x8A, 0xA9, 0x5B, 0xE1, 0x06, 0x8D, 0x79, 0xBA, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE8, 0xA0, 0xAC, 0x67, 0x02, 0xE2, 0x06, 0x7C, 0x7A, 0xF8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xEA, 0xA0, 0xAC, 0x67, 0x02, 0xE2, 0x00, 0x7C, 0x7A, 0xF8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE7, 0x94, 0xAD, 0xB7, 0x03, 0xE2, 0x00, 0x7C, 0xBA, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE7, 0x94, 0xAD, 0xB7, 0x03, 0xE2, 0x00, 0x7C, 0xBA, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xC3, 0x3F, 0x4B, 0xE9, 0xFA, 0xC1, 0x3F, 0x9B, 0xF9, 0xFB, 0x0B, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 }, + { 0xC3, 0x3F, 0x4B, 0xE9, 0xFA, 0xC1, 0x3F, 0x9B, 0xF9, 0xFB, 0x0B, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 } }, + { { 0xB2, 0x20, 0xAD, 0xE9, 0x00, 0x62, 0x05, 0x8F, 0xC8, 0xD0, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xB2, 0x25, 0xAD, 0xE9, 0x00, 0x62, 0x00, 0x8F, 0xC8, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xF2, 0x02, 0xAF, 0xFB, 0x90, 0xF6, 0x54, 0x8F, 0xE9, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x00, 0x9F, 0xFA, 0xB0, 0xF2, 0x58, 0x7F, 0xEA, 0xF8, 0x02, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xF2, 0x00, 0xAF, 0x88, 0xA8, 0xF2, 0x46, 0x6E, 0xC9, 0xE0, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xD2, 0x00, 0x7B, 0x88, 0xA8, 0xD2, 0x4C, 0x69, 0xE9, 0xF8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xF2, 0x2A, 0x9F, 0x98, 0x01, 0xE2, 0x8F, 0x4E, 0x78, 0xC0, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xD2, 0x02, 0x85, 0x89, 0xC8, 0xD2, 0x94, 0x77, 0x49, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE2, 0x02, 0x9F, 0xB8, 0x90, 0x22, 0x8A, 0x9F, 0xE8, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xC2, 0x00, 0x86, 0xB8, 0x98, 0x02, 0x8F, 0x89, 0xE8, 0xF9, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE2, 0x2A, 0x7F, 0xB8, 0x01, 0xE4, 0x00, 0x0D, 0xC5, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x2A, 0x7F, 0xB8, 0x01, 0xE4, 0x00, 0x0D, 0xC5, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE4, 0x28, 0x8E, 0xE8, 0x01, 0xF2, 0x00, 0x4D, 0xD6, 0xF9, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE4, 0x28, 0x8E, 0xE8, 0x01, 0xF2, 0x00, 0x4D, 0xD6, 0xF9, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0x62, 0x23, 0x8F, 0xEA, 0x00, 0xF2, 0x00, 0x5E, 0xD9, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x62, 0x23, 0x8F, 0xEA, 0x00, 0xF2, 0x00, 0x5E, 0xD9, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xB4, 0x26, 0x6E, 0x98, 0x01, 0x62, 0x00, 0x7D, 0xC8, 0xF9, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xB4, 0x26, 0x6E, 0x98, 0x01, 0x62, 0x00, 0x7D, 0xC8, 0xF9, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE2, 0x2E, 0x20, 0xD9, 0x01, 0xF2, 0x1A, 0x90, 0xF8, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xD2, 0x10, 0x69, 0x18, 0xCF, 0xD4, 0x14, 0x5B, 0x04, 0xFD, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE4, 0x28, 0x7E, 0xF8, 0x01, 0xE2, 0x23, 0x8E, 0xE8, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE4, 0x28, 0x7E, 0xF8, 0x01, 0xE2, 0x23, 0x8E, 0xE8, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xB8, 0x28, 0x9E, 0x98, 0x01, 0x62, 0x00, 0x3D, 0xC8, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xB8, 0x28, 0x9E, 0x98, 0x01, 0x62, 0x00, 0x3D, 0xC8, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0x62, 0x00, 0x8E, 0xC9, 0x79, 0xE6, 0x00, 0x7E, 0xD8, 0xD0, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x62, 0x00, 0x8E, 0xC9, 0x79, 0xE6, 0x00, 0x7E, 0xD8, 0xD0, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE2, 0x00, 0x5F, 0xF9, 0x88, 0xE4, 0x9E, 0x8F, 0xF8, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xC2, 0x00, 0x97, 0xF9, 0x90, 0xC9, 0x80, 0x69, 0x98, 0xA0, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0x62, 0x0C, 0x6E, 0xD8, 0x79, 0x2A, 0x09, 0x7D, 0xD8, 0xC0, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x02, 0x04, 0x8A, 0xD8, 0x80, 0x0C, 0x12, 0x85, 0xD8, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE4, 0x00, 0x7E, 0x89, 0x70, 0xE6, 0x8F, 0x80, 0xF8, 0xF0, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xC4, 0x00, 0x67, 0x59, 0x70, 0xC6, 0x8A, 0x77, 0xA8, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE4, 0x80, 0x6C, 0xD9, 0x60, 0xE2, 0x00, 0x8D, 0xC8, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE4, 0x80, 0x6C, 0xD9, 0x60, 0xE2, 0x00, 0x8D, 0xC8, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE2, 0x80, 0x88, 0x48, 0x98, 0xE2, 0x1E, 0x8E, 0xC9, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xF2, 0x40, 0xA8, 0xB9, 0x80, 0xE2, 0x0C, 0x89, 0x09, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE4, 0x00, 0x77, 0xC5, 0xA8, 0xE2, 0x00, 0x9E, 0xD7, 0xE0, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE4, 0x00, 0x77, 0xC5, 0xA8, 0xE2, 0x00, 0x9E, 0xD7, 0xE0, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE4, 0x80, 0x86, 0xB9, 0xA8, 0xE2, 0x14, 0x9F, 0xD7, 0xB0, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xC2, 0x80, 0x94, 0x09, 0x78, 0xC2, 0x00, 0x97, 0x97, 0xF8, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE2, 0x00, 0x68, 0x68, 0xAA, 0xE2, 0x0A, 0x9B, 0xB3, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xC2, 0x00, 0x86, 0x68, 0xA0, 0xC2, 0x00, 0x77, 0x47, 0xE0, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE4, 0x00, 0xA6, 0x87, 0x81, 0xE2, 0x0A, 0x7E, 0xC9, 0xF8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x00, 0x89, 0x40, 0x79, 0xE2, 0x00, 0x7E, 0xC9, 0x90, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE4, 0x80, 0xAA, 0xB8, 0x90, 0xE2, 0x00, 0x9E, 0xF9, 0xC0, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE6, 0x80, 0x9D, 0xB8, 0x51, 0xE2, 0x00, 0x9E, 0xF9, 0xA0, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE2, 0x80, 0x8E, 0x64, 0xD0, 0xE2, 0x28, 0x6F, 0x73, 0xF8, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x80, 0x8E, 0x64, 0xD0, 0xE2, 0x28, 0x6F, 0x73, 0xF8, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE8, 0x00, 0x7D, 0x99, 0xA8, 0xE6, 0x80, 0x80, 0xF8, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE8, 0x00, 0x7D, 0x99, 0xA8, 0xE6, 0x80, 0x80, 0xF8, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE6, 0x00, 0x9F, 0xB9, 0xD9, 0xE1, 0x00, 0x8F, 0xC8, 0xF9, 0x02, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE6, 0x00, 0x9F, 0xB9, 0xD9, 0xE1, 0x00, 0x8F, 0xC8, 0xF9, 0x02, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE4, 0x00, 0x09, 0x68, 0x92, 0xE2, 0x2B, 0x9E, 0xF3, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE4, 0x00, 0x09, 0x68, 0x92, 0xE2, 0x2B, 0x9E, 0xF3, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xC4, 0x00, 0x99, 0xE8, 0x73, 0xE2, 0x25, 0x6F, 0x93, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xC4, 0x00, 0x99, 0xE8, 0x73, 0xE2, 0x25, 0x6F, 0x93, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE6, 0x00, 0x6F, 0xDA, 0xC9, 0xE2, 0x05, 0x2F, 0xD8, 0xAA, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x00, 0x4F, 0xDA, 0xC8, 0xE2, 0x00, 0x0F, 0xD8, 0xD0, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xEC, 0x60, 0x9D, 0xC7, 0x00, 0xE2, 0x21, 0x7F, 0xC9, 0xF8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xEC, 0x60, 0x9D, 0xC7, 0x00, 0xE2, 0x21, 0x7F, 0xC9, 0xF8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE3, 0x00, 0x0F, 0xF7, 0xF9, 0xE1, 0x3F, 0x0F, 0xA7, 0x01, 0x0D, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE3, 0x00, 0x0F, 0xF7, 0xF9, 0xE1, 0x3F, 0x0F, 0xA7, 0x01, 0x0D, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE4, 0xA9, 0x0F, 0xA8, 0x02, 0xE2, 0x3C, 0x5F, 0xDA, 0x78, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE4, 0xA9, 0x0F, 0xA8, 0x02, 0xE2, 0x3C, 0x5F, 0xDA, 0x78, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE8, 0x40, 0x0D, 0x89, 0xF9, 0xE2, 0x17, 0x7E, 0xD9, 0xF8, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE8, 0x40, 0x0D, 0x89, 0xF9, 0xE2, 0x17, 0x7E, 0xD9, 0xF8, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE1, 0x00, 0xDF, 0x8A, 0xAA, 0xE2, 0x5E, 0xCF, 0xBA, 0xFA, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE1, 0x00, 0xDF, 0x8A, 0xAA, 0xE2, 0x5E, 0xCF, 0xBA, 0xFA, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE2, 0x00, 0x0B, 0x68, 0xC0, 0xE2, 0x01, 0x9E, 0xB8, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x00, 0x0B, 0x68, 0xC0, 0xE2, 0x01, 0x9E, 0xB8, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xEA, 0x00, 0xAE, 0xAB, 0x91, 0xE2, 0x00, 0xAE, 0xBA, 0xD8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xEA, 0x00, 0xAE, 0xAB, 0x91, 0xE2, 0x00, 0xAE, 0xBA, 0xD8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xEB, 0x80, 0x8C, 0xCB, 0x72, 0xE2, 0x86, 0xAF, 0xCA, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xEB, 0xC3, 0x9C, 0xCB, 0xA2, 0xE2, 0x4C, 0xAE, 0xCA, 0xFA, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE5, 0x40, 0xDB, 0x3B, 0x78, 0xE2, 0x80, 0xBE, 0xCA, 0xE1, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x80, 0x8E, 0xCB, 0xC0, 0xE2, 0x90, 0xAE, 0xCA, 0xFB, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE4, 0x00, 0x9E, 0xAA, 0x79, 0xE1, 0x43, 0x0F, 0xBA, 0xFA, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE4, 0x00, 0x9E, 0xAA, 0x79, 0xE1, 0x43, 0x0F, 0xBA, 0xFA, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE7, 0x40, 0xEB, 0xCA, 0x80, 0xE2, 0x03, 0xBF, 0xBA, 0xC2, 0x02, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE3, 0x80, 0xDB, 0xCA, 0x40, 0xE2, 0x08, 0xDF, 0xBA, 0xC1, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xEA, 0x00, 0x68, 0xB8, 0x90, 0xE2, 0x0A, 0x8E, 0xB8, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xEA, 0x00, 0x68, 0xB8, 0x90, 0xE2, 0x0A, 0x8E, 0xB8, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0x61, 0x00, 0xBE, 0x99, 0xFA, 0xE3, 0x40, 0xCF, 0xCA, 0xF9, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x62, 0x00, 0xCE, 0x9A, 0xA8, 0xE2, 0x45, 0xCF, 0xCA, 0xA0, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xCD, 0x00, 0x0B, 0x00, 0x90, 0xC2, 0x58, 0x0C, 0x00, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x1C }, + { 0xCD, 0x00, 0x0B, 0x00, 0x90, 0xC2, 0x58, 0x0C, 0x00, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x1C } }, + { { 0xE2, 0x00, 0x0E, 0x00, 0xA2, 0xE2, 0x58, 0x5F, 0xD0, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE2, 0x00, 0x0E, 0x00, 0xA2, 0xE2, 0x58, 0x5F, 0xD0, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xEC, 0x00, 0x7D, 0xDA, 0x80, 0xE2, 0x00, 0x5E, 0x9B, 0xA8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE6, 0x0A, 0x4C, 0xC9, 0x60, 0xE2, 0x07, 0x0C, 0x7A, 0xB8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE9, 0xC0, 0xEE, 0xD8, 0x83, 0xE2, 0x05, 0xDD, 0xAA, 0xE0, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xED, 0x48, 0xDE, 0xD8, 0xB4, 0xE1, 0x00, 0xDD, 0xAA, 0xA9, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xDA, 0x00, 0x8F, 0xAC, 0x92, 0x22, 0x05, 0x8D, 0x8A, 0xE9, 0x02, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xEF, 0x00, 0x8C, 0xAA, 0x67, 0x25, 0x00, 0x9D, 0xAB, 0xC1, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0x62, 0x82, 0xCB, 0x7A, 0xD8, 0xE6, 0x56, 0xAF, 0xDB, 0xE0, 0x02, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x62, 0x84, 0xBB, 0xAA, 0xCA, 0xCF, 0x41, 0xAC, 0xDA, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xC2, 0x41, 0xAC, 0xBB, 0xBB, 0xC2, 0x85, 0x0E, 0xCB, 0xF9, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x12 }, + { 0xC2, 0x03, 0x6A, 0x5B, 0xA4, 0xC2, 0x0D, 0x2A, 0xBB, 0xFC, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x12 } }, + { { 0x75, 0x00, 0x0E, 0xBB, 0xB2, 0xE2, 0x1E, 0x0A, 0xA9, 0xF9, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x10 }, + { 0x62, 0x00, 0x04, 0x9A, 0xE8, 0xE2, 0x00, 0x0A, 0x48, 0xFD, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x10 } }, + { { 0x41, 0x00, 0x0E, 0xEA, 0xA3, 0xC2, 0x00, 0x08, 0xCA, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 }, + { 0x41, 0x00, 0x0E, 0xEA, 0xA3, 0xC2, 0x00, 0x08, 0xCA, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 } }, + { { 0xC1, 0x40, 0x0C, 0x59, 0xD2, 0xC2, 0x80, 0x3C, 0xAB, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0D }, + { 0xC1, 0x40, 0x0C, 0x59, 0xD2, 0xC2, 0x80, 0x3C, 0xAB, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0D } }, + { { 0x4B, 0x00, 0x0A, 0xF5, 0xC1, 0xC2, 0x19, 0x0C, 0xE9, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 }, + { 0x4B, 0x00, 0x0A, 0xF5, 0xC1, 0xC2, 0x19, 0x0C, 0xE9, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 } }, + { { 0x62, 0x00, 0x7F, 0xD8, 0xA8, 0xEA, 0x00, 0x8F, 0xD8, 0xF9, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x62, 0x00, 0x7F, 0xD8, 0xA8, 0xEA, 0x00, 0x8F, 0xD8, 0xF9, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE1, 0x00, 0x7F, 0xD9, 0xAA, 0xE1, 0x00, 0x8F, 0xD8, 0xFA, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE1, 0x00, 0x7F, 0xD9, 0xAA, 0xE1, 0x00, 0x8F, 0xD8, 0xFA, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xE1, 0x00, 0x7F, 0xD9, 0xAA, 0xE1, 0x00, 0x8F, 0xD8, 0xFA, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xE1, 0x00, 0x7F, 0xD9, 0xAA, 0xE1, 0x00, 0x8F, 0xD8, 0xFA, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0xCF, 0x40, 0x09, 0xEA, 0xA8, 0xC4, 0x00, 0x0C, 0xDB, 0xC8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0xCF, 0x40, 0x09, 0xEA, 0xA8, 0xC4, 0x00, 0x0C, 0xDB, 0xC8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } }, + { { 0xCF, 0x40, 0x0C, 0xAA, 0xA8, 0xC4, 0x00, 0x18, 0xF9, 0xC8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0xCF, 0x40, 0x0C, 0xAA, 0xA8, 0xC4, 0x00, 0x18, 0xF9, 0xC8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } }, + { { 0xC9, 0x0C, 0x88, 0xD9, 0x6A, 0xC2, 0x14, 0x3A, 0xEA, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 }, + { 0xC5, 0x00, 0x98, 0xD9, 0x92, 0xC1, 0x16, 0x6E, 0xF9, 0xE8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 } }, + { { 0x03, 0x00, 0x15, 0x00, 0xC8, 0x02, 0x00, 0x08, 0x00, 0xF8, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0x03, 0x00, 0x15, 0x00, 0xC8, 0x02, 0x00, 0x08, 0x00, 0xF8, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } }, + { { 0x01, 0x0C, 0x44, 0xE6, 0xE8, 0x01, 0x3F, 0x0C, 0xEA, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 }, + { 0x02, 0x3F, 0x05, 0x08, 0xF8, 0x03, 0x3F, 0x3C, 0xF9, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 } }, + { { 0x00, 0x00, 0x36, 0x67, 0xF8, 0x01, 0x3F, 0x0E, 0xFA, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 }, + { 0x00, 0x00, 0x36, 0x67, 0xF8, 0x01, 0x3F, 0x0E, 0xFA, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 } }, + { { 0x02, 0x00, 0x36, 0x68, 0xF8, 0x01, 0x3F, 0x0E, 0xFA, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 }, + { 0x02, 0x00, 0x36, 0x68, 0xF8, 0x01, 0x3F, 0x0E, 0xFA, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 } }, + { { 0xCB, 0x00, 0xAF, 0x00, 0xFA, 0xC0, 0x00, 0xC0, 0x06, 0xFB, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0F }, + { 0xCB, 0x00, 0xAF, 0x00, 0xFA, 0xC0, 0x00, 0xC0, 0x06, 0xFB, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0F } }, + { { 0x05, 0x0D, 0x80, 0xA6, 0xFB, 0x0B, 0x38, 0xA9, 0xD8, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 }, + { 0x05, 0x0D, 0x80, 0xA6, 0xFB, 0x0B, 0x38, 0xA9, 0xD8, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 } }, + { { 0x0F, 0x00, 0x90, 0xFA, 0xD0, 0x06, 0x00, 0xA7, 0x39, 0xA8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 }, + { 0x0F, 0x00, 0x90, 0xFA, 0xD0, 0x06, 0x00, 0xA7, 0x39, 0xA8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 } }, + { { 0xC9, 0x15, 0xDD, 0xFF, 0xF8, 0x00, 0x00, 0xE7, 0xFC, 0xD8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x38 }, + { 0xC9, 0x15, 0xDD, 0xFF, 0xF8, 0x00, 0x00, 0xE7, 0xFC, 0xD8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x38 } }, + { { 0x48, 0x3C, 0x30, 0xF6, 0x03, 0x0A, 0x38, 0x97, 0xE8, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 }, + { 0x48, 0x3C, 0x30, 0xF6, 0x03, 0x0A, 0x38, 0x97, 0xE8, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 } }, + { { 0x07, 0x80, 0x0B, 0xC8, 0xC9, 0x02, 0x3F, 0x0C, 0xEA, 0xF8, 0x0F, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 }, + { 0x07, 0x80, 0x0B, 0xC8, 0xC9, 0x02, 0x3F, 0x0C, 0xEA, 0xF8, 0x0F, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 } }, + { { 0x00, 0x21, 0x66, 0x40, 0x03, 0x00, 0x3F, 0x47, 0x00, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0x00, 0x21, 0x66, 0x40, 0x03, 0x00, 0x3F, 0x47, 0x00, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } }, + { { 0x08, 0x00, 0x0B, 0x3C, 0xF8, 0x08, 0x3F, 0x06, 0xF3, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0x08, 0x00, 0x0B, 0x3C, 0xF8, 0x08, 0x3F, 0x06, 0xF3, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } }, + { { 0x00, 0x3F, 0x4C, 0xFB, 0x00, 0x00, 0x3F, 0x0A, 0xE9, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 }, + { 0x00, 0x3F, 0x4C, 0xFB, 0x00, 0x00, 0x3F, 0x0A, 0xE9, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 } } +}; + +static const AdLibInstrument g_gmPercussionInstrumentsOPL3[39][2] = { + { { 0x1A, 0x3F, 0x15, 0x05, 0xF8, 0x02, 0x21, 0x2B, 0xE4, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 }, + { 0x11, 0x18, 0x15, 0x00, 0xF8, 0x12, 0x00, 0x2B, 0x03, 0xF8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 } }, + { { 0x11, 0x12, 0x04, 0x07, 0xF8, 0x02, 0x18, 0x0B, 0xE5, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 }, + { 0x11, 0x28, 0x06, 0x04, 0xF8, 0x02, 0x1E, 0x1B, 0x02, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 } }, + { { 0x0A, 0x3F, 0x0B, 0x01, 0xF8, 0x1F, 0x13, 0x46, 0xD0, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x01 }, + { 0x04, 0x18, 0x06, 0x01, 0xB0, 0x10, 0x00, 0x07, 0x00, 0x90, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x01 } }, + { { 0x00, 0x3F, 0x0F, 0x00, 0xF8, 0x10, 0x0A, 0x07, 0x00, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0x02, 0x14, 0x04, 0x00, 0xC0, 0x11, 0x08, 0x07, 0x00, 0xC6, 0x02, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } }, + { { 0x0F, 0x3F, 0x0B, 0x00, 0xF8, 0x1F, 0x07, 0x19, 0xD0, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0x0E, 0x32, 0x76, 0x03, 0xF8, 0x1F, 0x0F, 0x77, 0xD4, 0xFC, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } }, + { { 0x00, 0x3F, 0x1F, 0x00, 0xFA, 0x1F, 0x0C, 0x07, 0x00, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 }, + { 0x07, 0x11, 0x13, 0x00, 0xA0, 0x13, 0x00, 0x07, 0x00, 0xC8, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 } }, + { { 0x12, 0x3F, 0x05, 0x06, 0xF8, 0x03, 0x16, 0x4A, 0xD9, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 }, + { 0x02, 0x22, 0x05, 0xB6, 0xF8, 0x04, 0x0A, 0x59, 0x03, 0xF8, 0x0B, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 } }, + { { 0xCF, 0x7F, 0x08, 0xFF, 0xFA, 0x00, 0xC0, 0x2D, 0xF7, 0xE3, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0xD2, 0x7F, 0x04, 0x0F, 0xFA, 0x10, 0xCD, 0x24, 0x07, 0xFB, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } }, + { { 0x12, 0x3F, 0x05, 0x06, 0xF8, 0x43, 0x17, 0x0C, 0xE9, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 }, + { 0x12, 0x13, 0x09, 0x96, 0xF8, 0x44, 0x0A, 0x07, 0x03, 0xF8, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 } }, + { { 0xCF, 0x7F, 0x08, 0xCF, 0xFA, 0x00, 0x40, 0x2A, 0xF8, 0x8B, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0C }, + { 0xCF, 0x7F, 0x05, 0x07, 0xFA, 0x00, 0x40, 0x25, 0x08, 0xC3, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0C } }, + { { 0x12, 0x3F, 0x06, 0x17, 0xF8, 0x03, 0x1D, 0x0B, 0xE9, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 }, + { 0x12, 0x1A, 0x08, 0x96, 0xF8, 0x44, 0x00, 0x08, 0x03, 0xF8, 0x05, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 } }, + { { 0xCF, 0x7F, 0x08, 0xCD, 0xFA, 0x00, 0x40, 0x1A, 0x69, 0xB3, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0C }, + { 0xCD, 0x3F, 0x36, 0x05, 0xFC, 0x0F, 0x47, 0x46, 0x06, 0xDF, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0C } }, + { { 0x13, 0x3F, 0x05, 0x06, 0xF8, 0x03, 0x0D, 0x0A, 0xD9, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 }, + { 0x12, 0x14, 0x09, 0x96, 0xF8, 0x44, 0x02, 0x07, 0x03, 0xF8, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 } }, + { { 0x15, 0x3F, 0x05, 0x06, 0xF8, 0x03, 0x16, 0x0C, 0xE9, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 }, + { 0x12, 0x00, 0x07, 0x96, 0xE8, 0x44, 0x02, 0x08, 0x03, 0xF8, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 } }, + { { 0xCF, 0x3F, 0x2B, 0xFB, 0xFA, 0xC0, 0x16, 0x1A, 0xCA, 0xFB, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x10 }, + { 0xCF, 0x3F, 0x2B, 0xFB, 0xFA, 0xC0, 0x1E, 0x1A, 0xCA, 0xFB, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x10 } }, + { { 0x17, 0x3F, 0x04, 0x09, 0xF8, 0x03, 0x18, 0x0D, 0xE9, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 }, + { 0x12, 0x00, 0x07, 0x96, 0xF8, 0x44, 0x02, 0x08, 0xF9, 0xF8, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 } }, + { { 0xCF, 0x3F, 0x0F, 0x5E, 0xF8, 0xC6, 0x0C, 0x00, 0xCA, 0xFB, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 }, + { 0xCF, 0x3F, 0x04, 0x57, 0xF8, 0xC5, 0x13, 0x06, 0x05, 0xFF, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 } }, + { { 0xCF, 0x3F, 0x7E, 0x9D, 0xF8, 0xC8, 0xC0, 0x0A, 0xBA, 0xD0, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 }, + { 0xCF, 0x3F, 0x77, 0x09, 0xF8, 0xC2, 0xC0, 0x08, 0xB5, 0xEA, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 } }, + { { 0xCF, 0x3F, 0x4D, 0x9F, 0xF8, 0xC6, 0x00, 0x08, 0xDA, 0xAB, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 }, + { 0xCF, 0x3F, 0x47, 0x06, 0xF8, 0xCD, 0x00, 0x07, 0x05, 0xB3, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 } }, + { { 0xCF, 0x3F, 0x5D, 0xAA, 0xF2, 0xC0, 0x8A, 0x67, 0x99, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0xCF, 0x3F, 0x9A, 0x69, 0xF8, 0xCF, 0x88, 0x88, 0x48, 0xFA, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } }, + { { 0xCF, 0x3F, 0x4A, 0xFD, 0xF8, 0xCF, 0x00, 0x59, 0xEA, 0xD8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0xCF, 0x3F, 0x48, 0x06, 0xF8, 0xCF, 0x00, 0x54, 0x04, 0xF9, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } }, + { { 0x0F, 0x18, 0x0A, 0xFA, 0xAB, 0x06, 0x06, 0x06, 0x39, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0x03, 0x18, 0x04, 0x09, 0xAC, 0x05, 0x07, 0x08, 0x07, 0xF8, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } }, + { { 0xCF, 0x3F, 0x2B, 0xFC, 0xF8, 0xCC, 0xC4, 0x0B, 0xEA, 0xFB, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x10 }, + { 0xCF, 0x3F, 0x25, 0x06, 0xF8, 0xCC, 0xD7, 0x05, 0x02, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x10 } }, + { { 0x05, 0x1A, 0x04, 0x00, 0xF8, 0x12, 0x08, 0x0C, 0xEA, 0xE0, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 }, + { 0x01, 0x00, 0x09, 0x08, 0x40, 0x13, 0x00, 0x2A, 0x0A, 0xD8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 } }, + { { 0x04, 0x19, 0x04, 0x00, 0xF8, 0x12, 0x08, 0x2C, 0xEA, 0xE0, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 }, + { 0x04, 0x00, 0x07, 0x08, 0x40, 0x12, 0x00, 0x29, 0x08, 0xE0, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 } }, + { { 0x04, 0x0A, 0x04, 0x00, 0xD8, 0x01, 0x02, 0x0D, 0xFA, 0xE0, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 }, + { 0x04, 0x00, 0x03, 0x09, 0x93, 0x02, 0x00, 0x28, 0x09, 0xE8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 } }, + { { 0x15, 0x14, 0x05, 0x00, 0xF9, 0x01, 0x03, 0x5C, 0xE9, 0xD8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 }, + { 0x05, 0x00, 0x03, 0x03, 0x49, 0x02, 0x00, 0x58, 0x08, 0xE0, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 } }, + { { 0x10, 0x10, 0x05, 0x08, 0xF8, 0x01, 0x03, 0x0D, 0xEA, 0xE8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 }, + { 0x10, 0x00, 0x0C, 0x0C, 0x48, 0x02, 0x00, 0x08, 0xB9, 0xE0, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 } }, + { { 0x11, 0x00, 0x06, 0x87, 0xFB, 0x02, 0x40, 0x09, 0x59, 0xC0, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x08 }, + { 0x15, 0x00, 0x04, 0x87, 0xFB, 0x02, 0x40, 0x09, 0x59, 0xD0, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x08 } }, + { { 0x13, 0x26, 0x04, 0x6A, 0xFB, 0x01, 0x00, 0x08, 0x5A, 0xE0, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x08 }, + { 0x12, 0x26, 0x03, 0x6A, 0xFB, 0x02, 0x00, 0x06, 0x5A, 0xC0, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x08 } }, + { { 0xCF, 0x4D, 0x0C, 0xAA, 0xA0, 0xC4, 0x00, 0x18, 0xF9, 0x90, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0xCF, 0x4E, 0x05, 0xA6, 0xA0, 0xC6, 0x00, 0x16, 0xF8, 0x60, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } }, + { { 0xCF, 0x4D, 0x0C, 0xAA, 0xA0, 0xC3, 0x00, 0x18, 0xF8, 0x98, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0xCF, 0x4E, 0x06, 0xAA, 0xA0, 0xC5, 0x00, 0x19, 0xF9, 0x90, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } }, + { { 0xCB, 0x3F, 0x8F, 0x00, 0xFA, 0xC5, 0x06, 0x98, 0xD6, 0xBB, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0D }, + { 0xC0, 0x00, 0xF0, 0x00, 0x00, 0xC0, 0x00, 0xF0, 0x00, 0x00, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0D } }, + { { 0x0C, 0x18, 0x87, 0xB3, 0xFB, 0x19, 0x0B, 0x55, 0x75, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0x0C, 0x18, 0x87, 0xB3, 0xFB, 0x1B, 0x10, 0x57, 0x75, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } }, + { { 0x05, 0x11, 0x15, 0x00, 0xC8, 0x02, 0x00, 0x08, 0x00, 0xA8, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0x02, 0x11, 0x13, 0x00, 0xC8, 0x02, 0x00, 0x05, 0x00, 0x80, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } }, + { { 0x04, 0x08, 0x15, 0x00, 0x90, 0x01, 0x00, 0x08, 0x00, 0xC0, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 }, + { 0x03, 0x08, 0x14, 0x00, 0x90, 0x02, 0x00, 0x07, 0x00, 0xA8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } }, + { { 0xDA, 0x00, 0x53, 0x30, 0xC0, 0x07, 0x10, 0x49, 0xC4, 0xDA, 0x03, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0xD2, 0x00, 0x56, 0x30, 0x90, 0x06, 0x00, 0x46, 0x56, 0x62, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }, + { { 0x1C, 0x00, 0x07, 0xBC, 0xC8, 0x0C, 0x0A, 0x0B, 0x6A, 0xF2, 0x0B, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 }, + { 0x18, 0x00, 0x07, 0xBC, 0x88, 0x09, 0x00, 0x0B, 0x6A, 0xBA, 0x0B, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 } }, + { { 0x0A, 0x0E, 0x7F, 0x00, 0xF9, 0x13, 0x16, 0x28, 0x03, 0xF8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }, + { 0x01, 0x0E, 0x54, 0x00, 0xF9, 0x15, 0x03, 0x27, 0x03, 0xF8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } } +}; +#endif + +static const byte g_gmPercussionInstrumentMap[128] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, @@ -495,9 +858,9 @@ static const byte gm_percussion_lookup[128] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; -static byte lookup_table[64][32]; +static byte g_volumeLookupTable[64][32]; -static const byte volume_table[] = { +static const byte g_volumeTable[] = { 0, 4, 7, 11, 13, 16, 18, 20, 22, 24, 26, 27, @@ -516,7 +879,7 @@ static const byte volume_table[] = { 62, 63, 63, 63 }; -static int lookup_volume(int a, int b) { +static int lookupVolume(int a, int b) { if (b == 0) return 0; @@ -529,32 +892,32 @@ static int lookup_volume(int a, int b) { if (b < 0) { if (a < 0) { - return lookup_table[-a][-b]; + return g_volumeLookupTable[-a][-b]; } else { - return -lookup_table[a][-b]; + return -g_volumeLookupTable[a][-b]; } } else { if (a < 0) { - return -lookup_table[-a][b]; + return -g_volumeLookupTable[-a][b]; } else { - return lookup_table[a][b]; + return g_volumeLookupTable[a][b]; } } } -static void create_lookup_table() { +static void createLookupTable() { int i, j; int sum; for (i = 0; i < 64; i++) { sum = i; for (j = 0; j < 32; j++) { - lookup_table[i][j] = sum >> 5; + g_volumeLookupTable[i][j] = sum >> 5; sum += i; } } for (i = 0; i < 64; i++) - lookup_table[i][0] = 0; + g_volumeLookupTable[i][0] = 0; } //////////////////////////////////////// @@ -584,58 +947,75 @@ public: // AudioStream API - bool isStereo() const { return false; } + bool isStereo() const { return _opl->isStereo(); } int getRate() const { return _mixer->getOutputRate(); } private: - bool _scummSmallHeader; // FIXME: This flag controls a special mode for SCUMM V3 games + bool _scummSmallHeader; // FIXME: This flag controls a special mode for SCUMM V3 games +#ifdef ENABLE_OPL3 + bool _opl3Mode; +#endif - FM_OPL *_opl; - byte *_adlib_reg_cache; + OPL::OPL *_opl; + byte *_regCache; +#ifdef ENABLE_OPL3 + byte *_regCacheSecondary; +#endif - int _adlib_timer_counter; + int _timerCounter; - uint16 channel_table_2[9]; - int _voice_index; - int _timer_p; - int _timer_q; - uint16 curnote_table[9]; + uint16 _channelTable2[9]; + int _voiceIndex; + int _timerIncrease; + int _timerThreshold; + uint16 _curNotTable[9]; AdLibVoice _voices[9]; AdLibPart _parts[32]; AdLibPercussionChannel _percussion; void generateSamples(int16 *buf, int len); void onTimer(); - void part_key_on(AdLibPart *part, AdLibInstrument *instr, byte note, byte velocity); - void part_key_off(AdLibPart *part, byte note); - - void adlib_key_off(int chan); - void adlib_note_on(int chan, byte note, int mod); - void adlib_note_on_ex(int chan, byte note, int mod); - int adlib_get_reg_value_param(int chan, byte data); - void adlib_setup_channel(int chan, AdLibInstrument *instr, byte vol_1, byte vol_2); - byte adlib_get_reg_value(byte reg) { - return _adlib_reg_cache[reg]; - } - void adlib_set_param(int channel, byte param, int value); - void adlib_key_onoff(int channel); - void adlib_write(byte reg, byte value); - void adlib_playnote(int channel, int note); - - AdLibVoice *allocate_voice(byte pri); - - void mc_off(AdLibVoice *voice); - - static void link_mc(AdLibPart *part, AdLibVoice *voice); - void mc_inc_stuff(AdLibVoice *voice, Struct10 *s10, Struct11 *s11); - void mc_init_stuff(AdLibVoice *voice, Struct10 *s10, Struct11 *s11, byte flags, - InstrumentExtra *ie); - - void struct10_init(Struct10 *s10, InstrumentExtra *ie); - static byte struct10_ontimer(Struct10 *s10, Struct11 *s11); - static void struct10_setup(Struct10 *s10); - static int random_nr(int a); - void mc_key_on(AdLibVoice *voice, AdLibInstrument *instr, byte note, byte velocity); + void partKeyOn(AdLibPart *part, const AdLibInstrument *instr, byte note, byte velocity, const AdLibInstrument *second, byte pan); + void partKeyOff(AdLibPart *part, byte note); + + void adlibKeyOff(int chan); + void adlibNoteOn(int chan, byte note, int mod); + void adlibNoteOnEx(int chan, byte note, int mod); + int adlibGetRegValueParam(int chan, byte data); + void adlibSetupChannel(int chan, const AdLibInstrument *instr, byte vol1, byte vol2); +#ifdef ENABLE_OPL3 + void adlibSetupChannelSecondary(int chan, const AdLibInstrument *instr, byte vol1, byte vol2, byte pan); +#endif + byte adlibGetRegValue(byte reg) { + return _regCache[reg]; + } +#ifdef ENABLE_OPL3 + byte adlibGetRegValueSecondary(byte reg) { + return _regCacheSecondary[reg]; + } +#endif + void adlibSetParam(int channel, byte param, int value, bool primary = true); + void adlibKeyOnOff(int channel); + void adlibWrite(byte reg, byte value); +#ifdef ENABLE_OPL3 + void adlibWriteSecondary(byte reg, byte value); +#endif + void adlibPlayNote(int channel, int note); + + AdLibVoice *allocateVoice(byte pri); + + void mcOff(AdLibVoice *voice); + + static void linkMc(AdLibPart *part, AdLibVoice *voice); + void mcIncStuff(AdLibVoice *voice, Struct10 *s10, Struct11 *s11); + void mcInitStuff(AdLibVoice *voice, Struct10 *s10, Struct11 *s11, byte flags, + const InstrumentExtra *ie); + + void struct10Init(Struct10 *s10, const InstrumentExtra *ie); + static byte struct10OnTimer(Struct10 *s10, Struct11 *s11); + static void struct10Setup(Struct10 *s10); + static int randomNr(int a); + void mcKeyOn(AdLibVoice *voice, const AdLibInstrument *instr, byte note, byte velocity, const AdLibInstrument *second, byte pan); }; // MidiChannel method implementations @@ -643,7 +1023,7 @@ private: void AdLibPart::init(MidiDriver_ADLIB *owner, byte channel) { _owner = owner; _channel = channel; - _pri_eff = 127; + _priEff = 127; programChange(0); } @@ -657,41 +1037,64 @@ void AdLibPart::send(uint32 b) { void AdLibPart::noteOff(byte note) { #ifdef DEBUG_ADLIB - debug(6, "%10d: noteOff(%d)", tick, note); + debug(6, "%10d: noteOff(%d)", g_tick, note); #endif - _owner->part_key_off(this, note); + _owner->partKeyOff(this, note); } void AdLibPart::noteOn(byte note, byte velocity) { #ifdef DEBUG_ADLIB - debug(6, "%10d: noteOn(%d,%d)", tick, note, velocity); + debug(6, "%10d: noteOn(%d,%d)", g_tick, note, velocity); +#endif + _owner->partKeyOn(this, &_partInstr, note, velocity, +#ifdef ENABLE_OPL3 + &_partInstrSecondary, +#else + NULL, #endif - _owner->part_key_on(this, &_part_instr, note, velocity); + _pan); } void AdLibPart::programChange(byte program) { if (program > 127) return; -/* + /* uint i; uint count = 0; - for (i = 0; i < ARRAYSIZE(map_gm_to_fm[0]); ++i) - count += map_gm_to_fm[program][i]; + for (i = 0; i < ARRAYSIZE(g_gmInstruments[0]); ++i) + count += g_gmInstruments[program][i]; if (!count) warning("No AdLib instrument defined for GM program %d", (int)program); -*/ + */ _program = program; - memcpy(&_part_instr, &map_gm_to_fm[program], sizeof(AdLibInstrument)); +#ifdef ENABLE_OPL3 + if (!_owner->_opl3Mode) { +#endif + memcpy(&_partInstr, &g_gmInstruments[program], sizeof(AdLibInstrument)); +#ifdef ENABLE_OPL3 + } else { + memcpy(&_partInstr, &g_gmInstrumentsOPL3[program][0], sizeof(AdLibInstrument)); + memcpy(&_partInstrSecondary, &g_gmInstrumentsOPL3[program][1], sizeof(AdLibInstrument)); + } +#endif } void AdLibPart::pitchBend(int16 bend) { AdLibVoice *voice; - _pitchbend = bend; + _pitchBend = bend; for (voice = _voice; voice; voice = voice->_next) { - _owner->adlib_note_on(voice->_channel, voice->_note + _transpose_eff, - (_pitchbend * _pitchbend_factor >> 6) + _detune_eff); +#ifdef ENABLE_OPL3 + if (!_owner->_opl3Mode) { +#endif + _owner->adlibNoteOn(voice->_channel, voice->_note/* + _transposeEff*/, + (_pitchBend * _pitchBendFactor >> 6) + _detuneEff); +#ifdef ENABLE_OPL3 + } else { + _owner->adlibNoteOn(voice->_channel, voice->_note, _pitchBend >> 1); + } +#endif } } @@ -699,75 +1102,137 @@ void AdLibPart::controlChange(byte control, byte value) { switch (control) { case 0: case 32: - break; // Bank select. Not supported - case 1: modulationWheel(value); break; - case 7: volume(value); break; - case 10: break; // Pan position. Not supported. - case 16: pitchBendFactor(value); break; - case 17: detune(value); break; - case 18: priority(value); break; - case 64: sustain(value > 0); break; - case 91: break; // Effects level. Not supported. - case 93: break; // Chorus level. Not supported. - case 119: break; // Unknown, used in Simon the Sorcerer 2 - case 121: // reset all controllers + // Bank select. Not supported + break; + case 1: + modulationWheel(value); + break; + case 7: + volume(value); + break; + case 10: + panPosition(value); + break; + case 16: + pitchBendFactor(value); + break; + case 17: + detune(value); + break; + case 18: + priority(value); + break; + case 64: + sustain(value > 0); + break; + case 91: + // Effects level. Not supported. + break; + case 93: + // Chorus level. Not supported. + break; + case 119: + // Unknown, used in Simon the Sorcerer 2 + break; + case 121: + // reset all controllers modulationWheel(0); pitchBendFactor(0); detune(0); sustain(0); break; - case 123: allNotesOff(); break; + case 123: + allNotesOff(); + break; default: - warning("AdLib: Unknown control change message %d (%d)", (int) control, (int)value); + warning("AdLib: Unknown control change message %d (%d)", (int)control, (int)value); } } void AdLibPart::modulationWheel(byte value) { AdLibVoice *voice; - _modwheel = value; + _modWheel = value; for (voice = _voice; voice; voice = voice->_next) { if (voice->_s10a.active && voice->_s11a.flag0x40) - voice->_s10a.modwheel = _modwheel >> 2; + voice->_s10a.modWheel = _modWheel >> 2; if (voice->_s10b.active && voice->_s11b.flag0x40) - voice->_s10b.modwheel = _modwheel >> 2; + voice->_s10b.modWheel = _modWheel >> 2; } } void AdLibPart::volume(byte value) { AdLibVoice *voice; - _vol_eff = value; + _volEff = value; for (voice = _voice; voice; voice = voice->_next) { - _owner->adlib_set_param(voice->_channel, 0, volume_table[lookup_table[voice->_vol_2][_vol_eff >> 2]]); - if (voice->_twochan) { - _owner->adlib_set_param(voice->_channel, 13, volume_table[lookup_table[voice->_vol_1][_vol_eff >> 2]]); +#ifdef ENABLE_OPL3 + if (!_owner->_opl3Mode) { +#endif + _owner->adlibSetParam(voice->_channel, 0, g_volumeTable[g_volumeLookupTable[voice->_vol2][_volEff >> 2]]); + if (voice->_twoChan) { + _owner->adlibSetParam(voice->_channel, 13, g_volumeTable[g_volumeLookupTable[voice->_vol1][_volEff >> 2]]); + } +#ifdef ENABLE_OPL3 + } else { + _owner->adlibSetParam(voice->_channel, 0, g_volumeTable[((voice->_vol2 + 1) * _volEff) >> 7], true); + _owner->adlibSetParam(voice->_channel, 0, g_volumeTable[((voice->_secVol2 + 1) * _volEff) >> 7], false); + if (voice->_twoChan) { + _owner->adlibSetParam(voice->_channel, 13, g_volumeTable[((voice->_vol1 + 1) * _volEff) >> 7], true); + } + if (voice->_secTwoChan) { + _owner->adlibSetParam(voice->_channel, 13, g_volumeTable[((voice->_secVol1 + 1) * _volEff) >> 7], false); + } } +#endif } } +void AdLibPart::panPosition(byte value) { + _pan = value; +} + void AdLibPart::pitchBendFactor(byte value) { +#ifdef ENABLE_OPL3 + // Not supported in OPL3 mode. + if (_owner->_opl3Mode) { + return; + } +#endif + AdLibVoice *voice; - _pitchbend_factor = value; + _pitchBendFactor = value; for (voice = _voice; voice; voice = voice->_next) { - _owner->adlib_note_on(voice->_channel, voice->_note + _transpose_eff, - (_pitchbend * _pitchbend_factor >> 6) + _detune_eff); + _owner->adlibNoteOn(voice->_channel, voice->_note/* + _transposeEff*/, + (_pitchBend * _pitchBendFactor >> 6) + _detuneEff); } } void AdLibPart::detune(byte value) { + // Sam&Max's OPL3 driver uses this for a completly different purpose. It + // is related to voice allocation. We ignore this for now. + // TODO: We probably need to look how the interpreter side of Sam&Max's + // iMuse version handles all this too. Implementing the driver side here + // would be not that hard. +#ifdef ENABLE_OPL3 + if (_owner->_opl3Mode) { + //_maxNotes = value; + return; + } +#endif + AdLibVoice *voice; - _detune_eff = value; + _detuneEff = value; for (voice = _voice; voice; voice = voice->_next) { - _owner->adlib_note_on(voice->_channel, voice->_note + _transpose_eff, - (_pitchbend * _pitchbend_factor >> 6) + _detune_eff); + _owner->adlibNoteOn(voice->_channel, voice->_note/* + _transposeEff*/, + (_pitchBend * _pitchBendFactor >> 6) + _detuneEff); } } void AdLibPart::priority(byte value) { - _pri_eff = value; + _priEff = value; } void AdLibPart::sustain(bool value) { @@ -776,20 +1241,29 @@ void AdLibPart::sustain(bool value) { _pedal = value; if (!value) { for (voice = _voice; voice; voice = voice->_next) { - if (voice->_waitforpedal) - _owner->mc_off(voice); + if (voice->_waitForPedal) + _owner->mcOff(voice); } } } void AdLibPart::allNotesOff() { while (_voice) - _owner->mc_off(_voice); + _owner->mcOff(_voice); } void AdLibPart::sysEx_customInstrument(uint32 type, const byte *instr) { + // Sam&Max allows for instrument overwrites, but we will not support it + // until we can find any track actually using it. +#ifdef ENABLE_OPL3 + if (_owner->_opl3Mode) { + warning("AdLibPart::sysEx_customInstrument: Used in OPL3 mode"); + return; + } +#endif + if (type == 'ADL ') { - memcpy(&_part_instr, instr, sizeof(AdLibInstrument)); + memcpy(&_partInstr, instr, sizeof(AdLibInstrument)); } } @@ -803,8 +1277,8 @@ AdLibPercussionChannel::~AdLibPercussionChannel() { void AdLibPercussionChannel::init(MidiDriver_ADLIB *owner, byte channel) { AdLibPart::init(owner, channel); - _pri_eff = 0; - _vol_eff = 127; + _priEff = 0; + _volEff = 127; // Initialize the custom instruments data memset(_notes, 0, sizeof(_notes)); @@ -812,33 +1286,49 @@ void AdLibPercussionChannel::init(MidiDriver_ADLIB *owner, byte channel) { } void AdLibPercussionChannel::noteOff(byte note) { - // Jamieson630: Unless I run into a specific instrument that - // may require a key off, I'm going to ignore this message. - // The rationale is that a percussion instrument should - // fade out of its own accord, and the AdLib instrument - // definitions used should follow this rule. Since - // percussion voices are allocated at the lowest priority - // anyway, we know that "hanging" percussion sounds will - // not prevent later musical instruments (or even other - // percussion sounds) from playing. -/* - _owner->part_key_off(this, note); -*/ + if (_customInstruments[note]) { + note = _notes[note]; + } + + // This used to ignore note off events, since the builtin percussion + // instrument data has a duration value, which causes the percussion notes + // to stop automatically. This is not the case for (Groovie's) custom + // percussion instruments though. Also the OPL3 driver of Sam&Max actually + // does not handle the duration value, so we need it there too. + _owner->partKeyOff(this, note); } void AdLibPercussionChannel::noteOn(byte note, byte velocity) { - AdLibInstrument *inst = NULL; + const AdLibInstrument *inst = NULL; + const AdLibInstrument *sec = NULL; // The custom instruments have priority over the default mapping - inst = _customInstruments[note]; - if (inst) - note = _notes[note]; + // We do not support custom instruments in OPL3 mode though. +#ifdef ENABLE_OPL3 + if (!_owner->_opl3Mode) { +#endif + inst = _customInstruments[note]; + if (inst) + note = _notes[note]; +#ifdef ENABLE_OPL3 + } +#endif if (!inst) { - // Use the default GM to FM mapping as a fallback as a fallback - byte key = gm_percussion_lookup[note]; - if (key != 0xFF) - inst = &gm_percussion_to_fm[key]; + // Use the default GM to FM mapping as a fallback + byte key = g_gmPercussionInstrumentMap[note]; + if (key != 0xFF) { +#ifdef ENABLE_OPL3 + if (!_owner->_opl3Mode) { +#endif + inst = &g_gmPercussionInstruments[key]; +#ifdef ENABLE_OPL3 + } else { + inst = &g_gmPercussionInstrumentsOPL3[key][0]; + sec = &g_gmPercussionInstrumentsOPL3[key][1]; + } +#endif + } } if (!inst) { @@ -846,10 +1336,18 @@ void AdLibPercussionChannel::noteOn(byte note, byte velocity) { return; } - _owner->part_key_on(this, inst, note, velocity); + _owner->partKeyOn(this, inst, note, velocity, sec, _pan); } void AdLibPercussionChannel::sysEx_customInstrument(uint32 type, const byte *instr) { + // We do not allow custom instruments in OPL3 mode right now. +#ifdef ENABLE_OPL3 + if (_owner->_opl3Mode) { + warning("AdLibPercussionChannel::sysEx_customInstrument: Used in OPL3 mode"); + return; + } +#endif + if (type == 'ADLP') { byte note = instr[0]; _notes[note] = instr[1]; @@ -861,16 +1359,16 @@ void AdLibPercussionChannel::sysEx_customInstrument(uint32 type, const byte *ins } // Save the new instrument data - _customInstruments[note]->mod_characteristic = instr[2]; - _customInstruments[note]->mod_scalingOutputLevel = instr[3]; - _customInstruments[note]->mod_attackDecay = instr[4]; - _customInstruments[note]->mod_sustainRelease = instr[5]; - _customInstruments[note]->mod_waveformSelect = instr[6]; - _customInstruments[note]->car_characteristic = instr[7]; - _customInstruments[note]->car_scalingOutputLevel = instr[8]; - _customInstruments[note]->car_attackDecay = instr[9]; - _customInstruments[note]->car_sustainRelease = instr[10]; - _customInstruments[note]->car_waveformSelect = instr[11]; + _customInstruments[note]->modCharacteristic = instr[2]; + _customInstruments[note]->modScalingOutputLevel = instr[3]; + _customInstruments[note]->modAttackDecay = instr[4]; + _customInstruments[note]->modSustainRelease = instr[5]; + _customInstruments[note]->modWaveformSelect = instr[6]; + _customInstruments[note]->carCharacteristic = instr[7]; + _customInstruments[note]->carScalingOutputLevel = instr[8]; + _customInstruments[note]->carAttackDecay = instr[9]; + _customInstruments[note]->carSustainRelease = instr[10]; + _customInstruments[note]->carWaveformSelect = instr[11]; _customInstruments[note]->feedback = instr[12]; } } @@ -882,21 +1380,28 @@ MidiDriver_ADLIB::MidiDriver_ADLIB(Audio::Mixer *mixer) uint i; _scummSmallHeader = false; +#ifdef ENABLE_OPL3 + _opl3Mode = false; +#endif - _adlib_reg_cache = 0; + _regCache = 0; +#ifdef ENABLE_OPL3 + _regCacheSecondary = 0; +#endif - _adlib_timer_counter = 0; - _voice_index = 0; - for (i = 0; i < ARRAYSIZE(curnote_table); ++i) { - curnote_table[i] = 0; + _timerCounter = 0; + _voiceIndex = -1; + for (i = 0; i < ARRAYSIZE(_curNotTable); ++i) { + _curNotTable[i] = 0; } for (i = 0; i < ARRAYSIZE(_parts); ++i) { _parts[i].init(this, i + ((i >= 9) ? 1 : 0)); } _percussion.init(this, 9); - _timer_p = 0xD69; - _timer_q = 0x411B; + _timerIncrease = 0xD69; + _timerThreshold = 0x411B; + _opl = 0; } int MidiDriver_ADLIB::open() { @@ -914,14 +1419,37 @@ int MidiDriver_ADLIB::open() { voice->_s11b.s10 = &voice->_s10a; } - _adlib_reg_cache = (byte *)calloc(256, 1); + // Try to use OPL3 when requested. +#ifdef ENABLE_OPL3 + if (_opl3Mode) { + _opl = OPL::Config::create(OPL::Config::kOpl3); + } - _opl = makeAdLibOPL(getRate()); + // Initialize plain OPL2 when no OPL3 is intiailized already. + if (!_opl) { +#endif + _opl = OPL::Config::create(); +#ifdef ENABLE_OPL3 + _opl3Mode = false; + } +#endif + _opl->init(getRate()); - adlib_write(1, 0x20); - adlib_write(8, 0x40); - adlib_write(0xBD, 0x00); - create_lookup_table(); + _regCache = (byte *)calloc(256, 1); + + adlibWrite(8, 0x40); + adlibWrite(0xBD, 0x00); +#ifdef ENABLE_OPL3 + if (!_opl3Mode) { +#endif + adlibWrite(1, 0x20); + createLookupTable(); +#ifdef ENABLE_OPL3 + } else { + _regCacheSecondary = (byte *)calloc(256, 1); + adlibWriteSecondary(5, 1); + } +#endif _mixer->playStream(Audio::Mixer::kPlainSoundType, &_mixerSoundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); @@ -938,14 +1466,17 @@ void MidiDriver_ADLIB::close() { uint i; for (i = 0; i < ARRAYSIZE(_voices); ++i) { if (_voices[i]._part) - mc_off(&_voices[i]); + mcOff(&_voices[i]); } // Turn off the OPL emulation - OPLDestroy(_opl); -// YM3812Shutdown(); + delete _opl; + _opl = 0; - free(_adlib_reg_cache); + free(_regCache); +#ifdef ENABLE_OPL3 + free(_regCacheSecondary); +#endif } void MidiDriver_ADLIB::send(uint32 b) { @@ -954,9 +1485,9 @@ void MidiDriver_ADLIB::send(uint32 b) { void MidiDriver_ADLIB::send(byte chan, uint32 b) { //byte param3 = (byte) ((b >> 24) & 0xFF); - byte param2 = (byte) ((b >> 16) & 0xFF); - byte param1 = (byte) ((b >> 8) & 0xFF); - byte cmd = (byte) (b & 0xF0); + byte param2 = (byte)((b >> 16) & 0xFF); + byte param1 = (byte)((b >> 8) & 0xFF); + byte cmd = (byte)(b & 0xF0); AdLibPart *part; if (chan == 9) @@ -997,29 +1528,42 @@ void MidiDriver_ADLIB::send(byte chan, uint32 b) { uint32 MidiDriver_ADLIB::property(int prop, uint32 param) { switch (prop) { - case PROP_OLD_ADLIB: // Older games used a different operator volume algorithm - _scummSmallHeader = (param > 0); - if (_scummSmallHeader) { - _timer_p = 473; - _timer_q = 1000; - } else { - _timer_p = 0xD69; - _timer_q = 0x411B; - } - return 1; + case PROP_OLD_ADLIB: // Older games used a different operator volume algorithm + _scummSmallHeader = (param > 0); + if (_scummSmallHeader) { + _timerIncrease = 473; + _timerThreshold = 1000; + } else { + _timerIncrease = 0xD69; + _timerThreshold = 0x411B; + } + return 1; + + case PROP_SCUMM_OPL3: // Sam&Max OPL3 support. +#ifdef ENABLE_OPL3 + _opl3Mode = (param > 0); +#endif + return 1; } return 0; } void MidiDriver_ADLIB::setPitchBendRange(byte channel, uint range) { +#ifdef ENABLE_OPL3 + // Not supported in OPL3 mode. + if (_opl3Mode) { + return; + } +#endif + AdLibVoice *voice; AdLibPart *part = &_parts[channel]; - part->_pitchbend_factor = range; + part->_pitchBendFactor = range; for (voice = part->_voice; voice; voice = voice->_next) { - adlib_note_on(voice->_channel, voice->_note + part->_transpose_eff, - (part->_pitchbend * part->_pitchbend_factor >> 6) + part->_detune_eff); + adlibNoteOn(voice->_channel, voice->_note/* + part->_transposeEff*/, + (part->_pitchBend * part->_pitchBendFactor >> 6) + part->_detuneEff); } } @@ -1043,54 +1587,77 @@ MidiChannel *MidiDriver_ADLIB::allocateChannel() { // All the code brought over from IMuseAdLib -void MidiDriver_ADLIB::adlib_write(byte reg, byte value) { - if (_adlib_reg_cache[reg] == value) +void MidiDriver_ADLIB::adlibWrite(byte reg, byte value) { + if (_regCache[reg] == value) { return; + } #ifdef DEBUG_ADLIB - debug(6, "%10d: adlib_write[%x] = %x", tick, reg, value); + debug(6, "%10d: adlibWrite[%x] = %x", g_tick, reg, value); #endif - _adlib_reg_cache[reg] = value; + _regCache[reg] = value; - OPLWriteReg(_opl, reg, value); + _opl->writeReg(reg, value); } +#ifdef ENABLE_OPL3 +void MidiDriver_ADLIB::adlibWriteSecondary(byte reg, byte value) { + assert(_opl3Mode); + + if (_regCacheSecondary[reg] == value) { + return; + } +#ifdef DEBUG_ADLIB + debug(6, "%10d: adlibWriteSecondary[%x] = %x", g_tick, reg, value); +#endif + _regCacheSecondary[reg] = value; + + _opl->writeReg(reg | 0x100, value); +} +#endif + void MidiDriver_ADLIB::generateSamples(int16 *data, int len) { - memset(data, 0, sizeof(int16) * len); - YM3812UpdateOne(_opl, data, len); + if (_opl->isStereo()) { + len *= 2; + } + _opl->readBuffer(data, len); } void MidiDriver_ADLIB::onTimer() { - AdLibVoice *voice; - int i; - - _adlib_timer_counter += _timer_p; - while (_adlib_timer_counter >= _timer_q) { - _adlib_timer_counter -= _timer_q; + _timerCounter += _timerIncrease; + while (_timerCounter >= _timerThreshold) { + _timerCounter -= _timerThreshold; #ifdef DEBUG_ADLIB - tick++; + g_tick++; #endif - voice = _voices; - for (i = 0; i != ARRAYSIZE(_voices); i++, voice++) { - if (!voice->_part) - continue; - if (voice->_duration && (voice->_duration -= 0x11) <= 0) { - mc_off(voice); - return; - } - if (voice->_s10a.active) { - mc_inc_stuff(voice, &voice->_s10a, &voice->_s11a); - } - if (voice->_s10b.active) { - mc_inc_stuff(voice, &voice->_s10b, &voice->_s11b); + // Sam&Max's OPL3 driver does not have any timer handling like this. +#ifdef ENABLE_OPL3 + if (!_opl3Mode) { +#endif + AdLibVoice *voice = _voices; + for (int i = 0; i != ARRAYSIZE(_voices); i++, voice++) { + if (!voice->_part) + continue; + if (voice->_duration && (voice->_duration -= 0x11) <= 0) { + mcOff(voice); + return; + } + if (voice->_s10a.active) { + mcIncStuff(voice, &voice->_s10a, &voice->_s11a); + } + if (voice->_s10b.active) { + mcIncStuff(voice, &voice->_s10b, &voice->_s11b); + } } +#ifdef ENABLE_OPL3 } +#endif } } -void MidiDriver_ADLIB::mc_off(AdLibVoice *voice) { +void MidiDriver_ADLIB::mcOff(AdLibVoice *voice) { AdLibVoice *tmp; - adlib_key_off(voice->_channel); + adlibKeyOff(voice->_channel); tmp = voice->_prev; @@ -1103,57 +1670,62 @@ void MidiDriver_ADLIB::mc_off(AdLibVoice *voice) { voice->_part = NULL; } -void MidiDriver_ADLIB::mc_inc_stuff(AdLibVoice *voice, Struct10 *s10, Struct11 *s11) { +void MidiDriver_ADLIB::mcIncStuff(AdLibVoice *voice, Struct10 *s10, Struct11 *s11) { byte code; AdLibPart *part = voice->_part; - code = struct10_ontimer(s10, s11); + code = struct10OnTimer(s10, s11); if (code & 1) { switch (s11->param) { case 0: - voice->_vol_2 = s10->start_value + s11->modify_val; + voice->_vol2 = s10->startValue + s11->modifyVal; if (!_scummSmallHeader) { - adlib_set_param(voice->_channel, 0, - volume_table[lookup_table[voice->_vol_2] - [part->_vol_eff >> 2]]); + adlibSetParam(voice->_channel, 0, + g_volumeTable[g_volumeLookupTable[voice->_vol2] + [part->_volEff >> 2]]); } else { - adlib_set_param(voice->_channel, 0, voice->_vol_2); + adlibSetParam(voice->_channel, 0, voice->_vol2); } break; case 13: - voice->_vol_1 = s10->start_value + s11->modify_val; - if (voice->_twochan && !_scummSmallHeader) { - adlib_set_param(voice->_channel, 13, - volume_table[lookup_table[voice->_vol_1] - [part->_vol_eff >> 2]]); + voice->_vol1 = s10->startValue + s11->modifyVal; + if (voice->_twoChan && !_scummSmallHeader) { + adlibSetParam(voice->_channel, 13, + g_volumeTable[g_volumeLookupTable[voice->_vol1] + [part->_volEff >> 2]]); } else { - adlib_set_param(voice->_channel, 13, voice->_vol_1); + adlibSetParam(voice->_channel, 13, voice->_vol1); } break; case 30: - s11->s10->modwheel = (char)s11->modify_val; + s11->s10->modWheel = (char)s11->modifyVal; break; case 31: - s11->s10->unk3 = (char)s11->modify_val; + s11->s10->unk3 = (char)s11->modifyVal; break; default: - adlib_set_param(voice->_channel, s11->param, - s10->start_value + s11->modify_val); + adlibSetParam(voice->_channel, s11->param, + s10->startValue + s11->modifyVal); break; } } if (code & 2 && s11->flag0x10) - adlib_key_onoff(voice->_channel); + adlibKeyOnOff(voice->_channel); } -void MidiDriver_ADLIB::adlib_key_off(int chan){ +void MidiDriver_ADLIB::adlibKeyOff(int chan) { byte reg = chan + 0xB0; - adlib_write(reg, adlib_get_reg_value(reg) & ~0x20); + adlibWrite(reg, adlibGetRegValue(reg) & ~0x20); +#ifdef ENABLE_OPL3 + if (_opl3Mode) { + adlibWriteSecondary(reg, adlibGetRegValueSecondary(reg) & ~0x20); + } +#endif } -byte MidiDriver_ADLIB::struct10_ontimer(Struct10 *s10, Struct11 *s11) { +byte MidiDriver_ADLIB::struct10OnTimer(Struct10 *s10, Struct11 *s11) { byte result = 0; int i; @@ -1162,51 +1734,54 @@ byte MidiDriver_ADLIB::struct10_ontimer(Struct10 *s10, Struct11 *s11) { return 0; } - i = s10->cur_val + s10->speed_hi; - s10->speed_lo_counter += s10->speed_lo; - if (s10->speed_lo_counter >= s10->speed_lo_max) { - s10->speed_lo_counter -= s10->speed_lo_max; + i = s10->curVal + s10->speedHi; + s10->speedLoCounter += s10->speedLo; + if (s10->speedLoCounter >= s10->speedLoMax) { + s10->speedLoCounter -= s10->speedLoMax; i += s10->direction; } - if (s10->cur_val != i || s10->modwheel != s10->modwheel_last) { - s10->cur_val = i; - s10->modwheel_last = s10->modwheel; - i = lookup_volume(i, s10->modwheel_last); - if (i != s11->modify_val) { - s11->modify_val = i; + if (s10->curVal != i || s10->modWheel != s10->modWheelLast) { + s10->curVal = i; + s10->modWheelLast = s10->modWheel; + i = lookupVolume(i, s10->modWheelLast); + if (i != s11->modifyVal) { + s11->modifyVal = i; result = 1; } } - if (!--s10->num_steps) { + if (!--s10->numSteps) { s10->active++; if (s10->active > 4) { if (s10->loop) { s10->active = 1; result |= 2; - struct10_setup(s10); + struct10Setup(s10); } else { s10->active = 0; } } else { - struct10_setup(s10); + struct10Setup(s10); } } return result; } -void MidiDriver_ADLIB::adlib_set_param(int channel, byte param, int value) { +void MidiDriver_ADLIB::adlibSetParam(int channel, byte param, int value, bool primary) { const AdLibSetParams *as; byte reg; assert(channel >= 0 && channel < 9); +#ifdef ENABLE_OPL3 + assert(!_opl3Mode || (param == 0 || param == 13)); +#endif if (param <= 12) { - reg = channel_mappings_2[channel]; + reg = g_operator2Offsets[channel]; } else if (param <= 25) { param -= 13; - reg = channel_mappings[channel]; + reg = g_operator1Offsets[channel]; } else if (param <= 27) { param -= 13; reg = channel; @@ -1216,54 +1791,66 @@ void MidiDriver_ADLIB::adlib_set_param(int channel, byte param, int value) { else value -= 383; value <<= 4; - channel_table_2[channel] = value; - adlib_playnote(channel, curnote_table[channel] + value); + _channelTable2[channel] = value; + adlibPlayNote(channel, _curNotTable[channel] + value); return; } else { return; } - as = &adlib_setparam_table[param]; - if (as->d) - value = as->d - value; - reg += as->a; - adlib_write(reg, (adlib_get_reg_value(reg) & ~as->c) | (((byte)value) << as->b)); + as = &g_setParamTable[param]; + if (as->inversion) + value = as->inversion - value; + reg += as->registerBase; +#ifdef ENABLE_OPL3 + if (primary) { +#endif + adlibWrite(reg, (adlibGetRegValue(reg) & ~as->mask) | (((byte)value) << as->shift)); +#ifdef ENABLE_OPL3 + } else { + adlibWriteSecondary(reg, (adlibGetRegValueSecondary(reg) & ~as->mask) | (((byte)value) << as->shift)); + } +#endif } -void MidiDriver_ADLIB::adlib_key_onoff(int channel) { +void MidiDriver_ADLIB::adlibKeyOnOff(int channel) { +#ifdef ENABLE_OPL3 + assert(!_opl3Mode); +#endif + byte val; byte reg = channel + 0xB0; assert(channel >= 0 && channel < 9); - val = adlib_get_reg_value(reg); - adlib_write(reg, val & ~0x20); - adlib_write(reg, val | 0x20); + val = adlibGetRegValue(reg); + adlibWrite(reg, val & ~0x20); + adlibWrite(reg, val | 0x20); } -void MidiDriver_ADLIB::struct10_setup(Struct10 *s10) { +void MidiDriver_ADLIB::struct10Setup(Struct10 *s10) { int b, c, d, e, f, g, h; byte t; b = s10->unk3; f = s10->active - 1; - t = s10->table_a[f]; - e = num_steps_table[lookup_table[t & 0x7F][b]]; + t = s10->tableA[f]; + e = g_numStepsTable[g_volumeLookupTable[t & 0x7F][b]]; if (t & 0x80) { - e = random_nr(e); + e = randomNr(e); } if (e == 0) e++; - s10->num_steps = s10->speed_lo_max = e; + s10->numSteps = s10->speedLoMax = e; if (f != 2) { - c = s10->max_value; - g = s10->start_value; - t = s10->table_b[f]; - d = lookup_volume(c, (t & 0x7F) - 31); + c = s10->maxValue; + g = s10->startValue; + t = s10->tableB[f]; + d = lookupVolume(c, (t & 0x7F) - 31); if (t & 0x80) { - d = random_nr(d); + d = randomNr(d); } if (d + g > c) { h = c - g; @@ -1272,12 +1859,12 @@ void MidiDriver_ADLIB::struct10_setup(Struct10 *s10) { if (d + g < 0) h = -g; } - h -= s10->cur_val; + h -= s10->curVal; } else { h = 0; } - s10->speed_hi = h / e; + s10->speedHi = h / e; if (h < 0) { h = -h; s10->direction = -1; @@ -1285,11 +1872,11 @@ void MidiDriver_ADLIB::struct10_setup(Struct10 *s10) { s10->direction = 1; } - s10->speed_lo = h % e; - s10->speed_lo_counter = 0; + s10->speedLo = h % e; + s10->speedLoCounter = 0; } -void MidiDriver_ADLIB::adlib_playnote(int channel, int note) { +void MidiDriver_ADLIB::adlibPlayNote(int channel, int note) { byte old, oct, notex; int note2; int i; @@ -1304,7 +1891,7 @@ void MidiDriver_ADLIB::adlib_playnote(int channel, int note) { oct <<= 2; notex = note2 % 12 + 3; - old = adlib_get_reg_value(channel + 0xB0); + old = adlibGetRegValue(channel + 0xB0); if (old & 0x20) { old &= ~0x20; if (oct > old) { @@ -1321,58 +1908,58 @@ void MidiDriver_ADLIB::adlib_playnote(int channel, int note) { } i = (notex << 3) + ((note >> 4) & 0x7); - adlib_write(channel + 0xA0, note_to_f_num[i]); - adlib_write(channel + 0xB0, oct | 0x20); + adlibWrite(channel + 0xA0, g_noteFrequencies[i]); + adlibWrite(channel + 0xB0, oct | 0x20); } -int MidiDriver_ADLIB::random_nr(int a) { - static byte _rand_seed = 1; - if (_rand_seed & 1) { - _rand_seed >>= 1; - _rand_seed ^= 0xB8; +int MidiDriver_ADLIB::randomNr(int a) { + static byte _randSeed = 1; + if (_randSeed & 1) { + _randSeed >>= 1; + _randSeed ^= 0xB8; } else { - _rand_seed >>= 1; + _randSeed >>= 1; } - return _rand_seed * a >> 8; + return _randSeed * a >> 8; } -void MidiDriver_ADLIB::part_key_off(AdLibPart *part, byte note) { +void MidiDriver_ADLIB::partKeyOff(AdLibPart *part, byte note) { AdLibVoice *voice; for (voice = part->_voice; voice; voice = voice->_next) { if (voice->_note == note) { if (part->_pedal) - voice->_waitforpedal = true; + voice->_waitForPedal = true; else - mc_off(voice); + mcOff(voice); } } } -void MidiDriver_ADLIB::part_key_on(AdLibPart *part, AdLibInstrument *instr, byte note, byte velocity) { +void MidiDriver_ADLIB::partKeyOn(AdLibPart *part, const AdLibInstrument *instr, byte note, byte velocity, const AdLibInstrument *second, byte pan) { AdLibVoice *voice; - voice = allocate_voice(part->_pri_eff); + voice = allocateVoice(part->_priEff); if (!voice) return; - link_mc(part, voice); - mc_key_on(voice, instr, note, velocity); + linkMc(part, voice); + mcKeyOn(voice, instr, note, velocity, second, pan); } -AdLibVoice *MidiDriver_ADLIB::allocate_voice(byte pri) { +AdLibVoice *MidiDriver_ADLIB::allocateVoice(byte pri) { AdLibVoice *ac, *best = NULL; int i; for (i = 0; i < 9; i++) { - if (++_voice_index >= 9) - _voice_index = 0; - ac = &_voices[_voice_index]; + if (++_voiceIndex >= 9) + _voiceIndex = 0; + ac = &_voices[_voiceIndex]; if (!ac->_part) return ac; if (!ac->_next) { - if (ac->_part->_pri_eff <= pri) { - pri = ac->_part->_pri_eff; + if (ac->_part->_priEff <= pri) { + pri = ac->_part->_priEff; best = ac; } } @@ -1383,11 +1970,11 @@ AdLibVoice *MidiDriver_ADLIB::allocate_voice(byte pri) { return NULL; if (best) - mc_off(best); + mcOff(best); return best; } -void MidiDriver_ADLIB::link_mc(AdLibPart *part, AdLibVoice *voice) { +void MidiDriver_ADLIB::linkMc(AdLibPart *part, AdLibVoice *voice) { voice->_part = part; voice->_next = (AdLibVoice *)part->_voice; part->_voice = voice; @@ -1397,153 +1984,229 @@ void MidiDriver_ADLIB::link_mc(AdLibPart *part, AdLibVoice *voice) { voice->_next->_prev = voice; } -void MidiDriver_ADLIB::mc_key_on(AdLibVoice *voice, AdLibInstrument *instr, byte note, byte velocity) { +void MidiDriver_ADLIB::mcKeyOn(AdLibVoice *voice, const AdLibInstrument *instr, byte note, byte velocity, const AdLibInstrument *second, byte pan) { AdLibPart *part = voice->_part; - int c; - byte vol_1, vol_2; + byte vol1, vol2; +#ifdef ENABLE_OPL3 + byte secVol1 = 0, secVol2 = 0; +#endif - voice->_twochan = instr->feedback & 1; + voice->_twoChan = instr->feedback & 1; voice->_note = note; - voice->_waitforpedal = false; + voice->_waitForPedal = false; voice->_duration = instr->duration; if (voice->_duration != 0) voice->_duration *= 63; - if (!_scummSmallHeader) - vol_1 = (instr->mod_scalingOutputLevel & 0x3F) + lookup_table[velocity >> 1][instr->mod_waveformSelect >> 2]; - else - vol_1 = 0x3f - (instr->mod_scalingOutputLevel & 0x3F); - if (vol_1 > 0x3F) - vol_1 = 0x3F; - voice->_vol_1 = vol_1; - - if (!_scummSmallHeader) - vol_2 = (instr->car_scalingOutputLevel & 0x3F) + lookup_table[velocity >> 1][instr->car_waveformSelect >> 2]; - else - vol_2 = 0x3f - (instr->car_scalingOutputLevel & 0x3F); - if (vol_2 > 0x3F) - vol_2 = 0x3F; - voice->_vol_2 = vol_2; + if (!_scummSmallHeader) { +#ifdef ENABLE_OPL3 + if (_opl3Mode) + vol1 = (instr->modScalingOutputLevel & 0x3F) + (velocity * ((instr->modWaveformSelect >> 3) + 1)) / 64; + else +#endif + vol1 = (instr->modScalingOutputLevel & 0x3F) + g_volumeLookupTable[velocity >> 1][instr->modWaveformSelect >> 2]; + } else { + vol1 = 0x3f - (instr->modScalingOutputLevel & 0x3F); + } + if (vol1 > 0x3F) + vol1 = 0x3F; + voice->_vol1 = vol1; - c = part->_vol_eff >> 2; + if (!_scummSmallHeader) { +#ifdef ENABLE_OPL3 + if (_opl3Mode) + vol2 = (instr->carScalingOutputLevel & 0x3F) + (velocity * ((instr->carWaveformSelect >> 3) + 1)) / 64; + else +#endif + vol2 = (instr->carScalingOutputLevel & 0x3F) + g_volumeLookupTable[velocity >> 1][instr->carWaveformSelect >> 2]; + } else { + vol2 = 0x3f - (instr->carScalingOutputLevel & 0x3F); + } + if (vol2 > 0x3F) + vol2 = 0x3F; + voice->_vol2 = vol2; + +#ifdef ENABLE_OPL3 + if (_opl3Mode) { + voice->_secTwoChan = second->feedback & 1; + secVol1 = (second->modScalingOutputLevel & 0x3F) + (velocity * ((second->modWaveformSelect >> 3) + 1)) / 64; + if (secVol1 > 0x3F) { + secVol1 = 0x3F; + } + voice->_secVol1 = secVol1; + secVol2 = (second->carScalingOutputLevel & 0x3F) + (velocity * ((second->carWaveformSelect >> 3) + 1)) / 64; + if (secVol2 > 0x3F) { + secVol2 = 0x3F; + } + voice->_secVol2 = secVol2; + } +#endif if (!_scummSmallHeader) { - vol_2 = volume_table[lookup_table[vol_2][c]]; - if (voice->_twochan) - vol_1 = volume_table[lookup_table[vol_1][c]]; +#ifdef ENABLE_OPL3 + if (!_opl3Mode) { +#endif + int c = part->_volEff >> 2; + vol2 = g_volumeTable[g_volumeLookupTable[vol2][c]]; + if (voice->_twoChan) + vol1 = g_volumeTable[g_volumeLookupTable[vol1][c]]; +#ifdef ENABLE_OPL3 + } else { + vol2 = g_volumeTable[((vol2 + 1) * part->_volEff) >> 7]; + secVol2 = g_volumeTable[((secVol2 + 1) * part->_volEff) >> 7]; + if (voice->_twoChan) + vol1 = g_volumeTable[((vol1 + 1) * part->_volEff) >> 7]; + if (voice->_secTwoChan) + secVol1 = g_volumeTable[((secVol1 + 1) * part->_volEff) >> 7]; + } +#endif } - adlib_setup_channel(voice->_channel, instr, vol_1, vol_2); - adlib_note_on_ex(voice->_channel, part->_transpose_eff + note, part->_detune_eff + (part->_pitchbend * part->_pitchbend_factor >> 6)); + adlibSetupChannel(voice->_channel, instr, vol1, vol2); +#ifdef ENABLE_OPL3 + if (!_opl3Mode) { +#endif + adlibNoteOnEx(voice->_channel, /*part->_transposeEff + */note, part->_detuneEff + (part->_pitchBend * part->_pitchBendFactor >> 6)); - if (instr->flags_a & 0x80) { - mc_init_stuff(voice, &voice->_s10a, &voice->_s11a, instr->flags_a, &instr->extra_a); - } else { - voice->_s10a.active = 0; - } + if (instr->flagsA & 0x80) { + mcInitStuff(voice, &voice->_s10a, &voice->_s11a, instr->flagsA, &instr->extraA); + } else { + voice->_s10a.active = 0; + } - if (instr->flags_b & 0x80) { - mc_init_stuff(voice, &voice->_s10b, &voice->_s11b, instr->flags_b, &instr->extra_b); + if (instr->flagsB & 0x80) { + mcInitStuff(voice, &voice->_s10b, &voice->_s11b, instr->flagsB, &instr->extraB); + } else { + voice->_s10b.active = 0; + } +#ifdef ENABLE_OPL3 } else { - voice->_s10b.active = 0; + adlibSetupChannelSecondary(voice->_channel, second, secVol1, secVol2, pan); + adlibNoteOnEx(voice->_channel, note, part->_pitchBend >> 1); } +#endif } -void MidiDriver_ADLIB::adlib_setup_channel(int chan, AdLibInstrument *instr, byte vol_1, byte vol_2) { - byte channel; - +void MidiDriver_ADLIB::adlibSetupChannel(int chan, const AdLibInstrument *instr, byte vol1, byte vol2) { assert(chan >= 0 && chan < 9); - channel = channel_mappings[chan]; - adlib_write(channel + 0x20, instr->mod_characteristic); - adlib_write(channel + 0x40, (instr->mod_scalingOutputLevel | 0x3F) - vol_1 ); - adlib_write(channel + 0x60, 0xff & (~instr->mod_attackDecay)); - adlib_write(channel + 0x80, 0xff & (~instr->mod_sustainRelease)); - adlib_write(channel + 0xE0, instr->mod_waveformSelect); - - channel = channel_mappings_2[chan]; - adlib_write(channel + 0x20, instr->car_characteristic); - adlib_write(channel + 0x40, (instr->car_scalingOutputLevel | 0x3F) - vol_2 ); - adlib_write(channel + 0x60, 0xff & (~instr->car_attackDecay)); - adlib_write(channel + 0x80, 0xff & (~instr->car_sustainRelease)); - adlib_write(channel + 0xE0, instr->car_waveformSelect); - - adlib_write((byte)chan + 0xC0, instr->feedback); + byte channel = g_operator1Offsets[chan]; + adlibWrite(channel + 0x20, instr->modCharacteristic); + adlibWrite(channel + 0x40, (instr->modScalingOutputLevel | 0x3F) - vol1); + adlibWrite(channel + 0x60, 0xff & (~instr->modAttackDecay)); + adlibWrite(channel + 0x80, 0xff & (~instr->modSustainRelease)); + adlibWrite(channel + 0xE0, instr->modWaveformSelect); + + channel = g_operator2Offsets[chan]; + adlibWrite(channel + 0x20, instr->carCharacteristic); + adlibWrite(channel + 0x40, (instr->carScalingOutputLevel | 0x3F) - vol2); + adlibWrite(channel + 0x60, 0xff & (~instr->carAttackDecay)); + adlibWrite(channel + 0x80, 0xff & (~instr->carSustainRelease)); + adlibWrite(channel + 0xE0, instr->carWaveformSelect); + + adlibWrite((byte)chan + 0xC0, instr->feedback +#ifdef ENABLE_OPL3 + | (_opl3Mode ? 0x30 : 0) +#endif + ); } -void MidiDriver_ADLIB::adlib_note_on_ex(int chan, byte note, int mod) { - int code; +#ifdef ENABLE_OPL3 +void MidiDriver_ADLIB::adlibSetupChannelSecondary(int chan, const AdLibInstrument *instr, byte vol1, byte vol2, byte pan) { assert(chan >= 0 && chan < 9); - code = (note << 7) + mod; - curnote_table[chan] = code; - channel_table_2[chan] = 0; - adlib_playnote(chan, code); + assert(_opl3Mode); + + byte channel = g_operator1Offsets[chan]; + adlibWriteSecondary(channel + 0x20, instr->modCharacteristic); + adlibWriteSecondary(channel + 0x40, (instr->modScalingOutputLevel | 0x3F) - vol1); + adlibWriteSecondary(channel + 0x60, 0xff & (~instr->modAttackDecay)); + adlibWriteSecondary(channel + 0x80, 0xff & (~instr->modSustainRelease)); + adlibWriteSecondary(channel + 0xE0, instr->modWaveformSelect); + + channel = g_operator2Offsets[chan]; + adlibWriteSecondary(channel + 0x20, instr->carCharacteristic); + adlibWriteSecondary(channel + 0x40, (instr->carScalingOutputLevel | 0x3F) - vol2); + adlibWriteSecondary(channel + 0x60, 0xff & (~instr->carAttackDecay)); + adlibWriteSecondary(channel + 0x80, 0xff & (~instr->carSustainRelease)); + adlibWriteSecondary(channel + 0xE0, instr->carWaveformSelect); + + // The original uses the following (strange) behavior: +#if 0 + if (instr->feedback | (pan > 64)) { + adlibWriteSecondary((byte)chan + 0xC0, 0x20); + } else { + adlibWriteSecondary((byte)chan + 0xC0, 0x10); + } +#else + adlibWriteSecondary((byte)chan + 0xC0, instr->feedback | ((pan > 64) ? 0x20 : 0x10)); +#endif } +#endif -void MidiDriver_ADLIB::mc_init_stuff(AdLibVoice *voice, Struct10 *s10, - Struct11 *s11, byte flags, InstrumentExtra *ie) { +void MidiDriver_ADLIB::mcInitStuff(AdLibVoice *voice, Struct10 *s10, + Struct11 *s11, byte flags, const InstrumentExtra *ie) { AdLibPart *part = voice->_part; - s11->modify_val = 0; + s11->modifyVal = 0; s11->flag0x40 = flags & 0x40; s10->loop = flags & 0x20; s11->flag0x10 = flags & 0x10; - s11->param = param_table_1[flags & 0xF]; - s10->max_value = maxval_table[flags & 0xF]; + s11->param = g_paramTable1[flags & 0xF]; + s10->maxValue = g_maxValTable[flags & 0xF]; s10->unk3 = 31; if (s11->flag0x40) { - s10->modwheel = part->_modwheel >> 2; + s10->modWheel = part->_modWheel >> 2; } else { - s10->modwheel = 31; + s10->modWheel = 31; } switch (s11->param) { case 0: - s10->start_value = voice->_vol_2; + s10->startValue = voice->_vol2; break; case 13: - s10->start_value = voice->_vol_1; + s10->startValue = voice->_vol1; break; case 30: - s10->start_value = 31; - s11->s10->modwheel = 0; + s10->startValue = 31; + s11->s10->modWheel = 0; break; case 31: - s10->start_value = 0; + s10->startValue = 0; s11->s10->unk3 = 0; break; default: - s10->start_value = adlib_get_reg_value_param(voice->_channel, s11->param); + s10->startValue = adlibGetRegValueParam(voice->_channel, s11->param); } - struct10_init(s10, ie); + struct10Init(s10, ie); } -void MidiDriver_ADLIB::struct10_init(Struct10 *s10, InstrumentExtra *ie) { +void MidiDriver_ADLIB::struct10Init(Struct10 *s10, const InstrumentExtra *ie) { s10->active = 1; if (!_scummSmallHeader) { - s10->cur_val = 0; + s10->curVal = 0; } else { - s10->cur_val = s10->start_value; - s10->start_value = 0; + s10->curVal = s10->startValue; + s10->startValue = 0; } - s10->modwheel_last = 31; + s10->modWheelLast = 31; s10->count = ie->a; if (s10->count) s10->count *= 63; - s10->table_a[0] = ie->b; - s10->table_a[1] = ie->d; - s10->table_a[2] = ie->f; - s10->table_a[3] = ie->g; + s10->tableA[0] = ie->b; + s10->tableA[1] = ie->d; + s10->tableA[2] = ie->f; + s10->tableA[3] = ie->g; - s10->table_b[0] = ie->c; - s10->table_b[1] = ie->e; - s10->table_b[2] = 0; - s10->table_b[3] = ie->h; + s10->tableB[0] = ie->c; + s10->tableB[1] = ie->e; + s10->tableB[2] = 0; + s10->tableB[3] = ie->h; - struct10_setup(s10); + struct10Setup(s10); } -int MidiDriver_ADLIB::adlib_get_reg_value_param(int chan, byte param) { +int MidiDriver_ADLIB::adlibGetRegValueParam(int chan, byte param) { const AdLibSetParams *as; byte val; byte channel; @@ -1551,10 +2214,10 @@ int MidiDriver_ADLIB::adlib_get_reg_value_param(int chan, byte param) { assert(chan >= 0 && chan < 9); if (param <= 12) { - channel = channel_mappings_2[chan]; + channel = g_operator2Offsets[chan]; } else if (param <= 25) { param -= 13; - channel = channel_mappings[chan]; + channel = g_operator1Offsets[chan]; } else if (param <= 27) { param -= 13; channel = chan; @@ -1566,24 +2229,52 @@ int MidiDriver_ADLIB::adlib_get_reg_value_param(int chan, byte param) { return 0; } - as = &adlib_setparam_table[param]; - val = adlib_get_reg_value(channel + as->a); - val &= as->c; - val >>= as->b; - if (as->d) - val = as->d - val; + as = &g_setParamTable[param]; + val = adlibGetRegValue(channel + as->registerBase); + val &= as->mask; + val >>= as->shift; + if (as->inversion) + val = as->inversion - val; return val; } -void MidiDriver_ADLIB::adlib_note_on(int chan, byte note, int mod) { - int code; +void MidiDriver_ADLIB::adlibNoteOn(int chan, byte note, int mod) { +#ifdef ENABLE_OPL3 + if (_opl3Mode) { + adlibNoteOnEx(chan, note, mod); + return; + } +#endif + assert(chan >= 0 && chan < 9); - code = (note << 7) + mod; - curnote_table[chan] = code; - adlib_playnote(chan, (int16) channel_table_2[chan] + code); + int code = (note << 7) + mod; + _curNotTable[chan] = code; + adlibPlayNote(chan, (int16)_channelTable2[chan] + code); } +void MidiDriver_ADLIB::adlibNoteOnEx(int chan, byte note, int mod) { + assert(chan >= 0 && chan < 9); + +#ifdef ENABLE_OPL3 + if (_opl3Mode) { + const int noteAdjusted = note + (mod >> 8) - 7; + const int pitchAdjust = (mod >> 5) & 7; + + adlibWrite(0xA0 + chan, g_noteFrequencies[(noteAdjusted % 12) * 8 + pitchAdjust + 6 * 8]); + adlibWriteSecondary(0xA0 + chan, g_noteFrequencies[(noteAdjusted % 12) * 8 + pitchAdjust + 6 * 8]); + adlibWrite(0xB0 + chan, (CLIP(noteAdjusted / 12, 0, 7) << 2) | 0x20); + adlibWriteSecondary(0xB0 + chan, (CLIP(noteAdjusted / 12, 0, 7) << 2) | 0x20); + } else { +#endif + int code = (note << 7) + mod; + _curNotTable[chan] = code; + _channelTable2[chan] = 0; + adlibPlayNote(chan, code); +#ifdef ENABLE_OPL3 + } +#endif +} // Plugin interface diff --git a/audio/softsynth/fluidsynth.cpp b/audio/softsynth/fluidsynth.cpp index 2451336784..518e260175 100644 --- a/audio/softsynth/fluidsynth.cpp +++ b/audio/softsynth/fluidsynth.cpp @@ -127,12 +127,54 @@ int MidiDriver_FluidSynth::open() { _synth = new_fluid_synth(_settings); - // In theory, this ought to reduce CPU load... but it doesn't make any - // noticeable difference for me, so disable it for now. + if (ConfMan.getBool("fluidsynth_chorus_activate")) { + fluid_synth_set_chorus_on(_synth, 1); + + int chorusNr = ConfMan.getInt("fluidsynth_chorus_nr"); + double chorusLevel = (double)ConfMan.getInt("fluidsynth_chorus_level") / 100.0; + double chorusSpeed = (double)ConfMan.getInt("fluidsynth_chorus_speed") / 100.0; + double chorusDepthMs = (double)ConfMan.getInt("fluidsynth_chorus_depth") / 10.0; + + Common::String chorusWaveForm = ConfMan.get("fluidsynth_chorus_waveform"); + int chorusType = FLUID_CHORUS_MOD_SINE; + if (chorusWaveForm == "sine") { + chorusType = FLUID_CHORUS_MOD_SINE; + } else { + chorusType = FLUID_CHORUS_MOD_TRIANGLE; + } + + fluid_synth_set_chorus(_synth, chorusNr, chorusLevel, chorusSpeed, chorusDepthMs, chorusType); + } else { + fluid_synth_set_chorus_on(_synth, 0); + } + + if (ConfMan.getBool("fluidsynth_reverb_activate")) { + fluid_synth_set_reverb_on(_synth, 1); + + double reverbRoomSize = (double)ConfMan.getInt("fluidsynth_reverb_roomsize") / 100.0; + double reverbDamping = (double)ConfMan.getInt("fluidsynth_reverb_damping") / 100.0; + int reverbWidth = ConfMan.getInt("fluidsynth_reverb_width"); + double reverbLevel = (double)ConfMan.getInt("fluidsynth_reverb_level") / 100.0; + + fluid_synth_set_reverb(_synth, reverbRoomSize, reverbDamping, reverbWidth, reverbLevel); + } else { + fluid_synth_set_reverb_on(_synth, 0); + } + + Common::String interpolation = ConfMan.get("fluidsynth_misc_interpolation"); + int interpMethod = FLUID_INTERP_4THORDER; + + if (interpolation == "none") { + interpMethod = FLUID_INTERP_NONE; + } else if (interpolation == "linear") { + interpMethod = FLUID_INTERP_LINEAR; + } else if (interpolation == "4th") { + interpMethod = FLUID_INTERP_4THORDER; + } else if (interpolation == "7th") { + interpMethod = FLUID_INTERP_7THORDER; + } - // fluid_synth_set_interp_method(_synth, -1, FLUID_INTERP_LINEAR); - // fluid_synth_set_reverb_on(_synth, 0); - // fluid_synth_set_chorus_on(_synth, 0); + fluid_synth_set_interp_method(_synth, -1, interpMethod); const char *soundfont = ConfMan.get("soundfont").c_str(); diff --git a/audio/softsynth/fmtowns_pc98/towns_midi.cpp b/audio/softsynth/fmtowns_pc98/towns_midi.cpp index b8203944c0..46b1a6406d 100644 --- a/audio/softsynth/fmtowns_pc98/towns_midi.cpp +++ b/audio/softsynth/fmtowns_pc98/towns_midi.cpp @@ -147,17 +147,10 @@ private: TownsMidiOutputChannel *_out; uint8 *_instrument; - uint8 _prg; uint8 _chanIndex; - uint8 _effectLevel; uint8 _priority; - uint8 _ctrlVolume; uint8 _tl; - uint8 _pan; - uint8 _panEff; - uint8 _percS; int8 _transpose; - uint8 _fld_1f; int8 _detune; int8 _modWheel; uint8 _sustain; @@ -659,9 +652,8 @@ const uint16 TownsMidiOutputChannel::_freqLSB[] = { 0x055B, 0x055B, 0x055B, 0x055B, 0x055B, 0x055B, 0x055B, 0x055B }; -TownsMidiInputChannel::TownsMidiInputChannel(MidiDriver_TOWNS *driver, int chanIndex) : MidiChannel(), _driver(driver), _out(0), _prg(0), _chanIndex(chanIndex), - _effectLevel(0), _priority(0), _ctrlVolume(0), _tl(0), _pan(0), _panEff(0), _transpose(0), _percS(0), _pitchBendFactor(0), _pitchBend(0), _sustain(0), _freqLSB(0), - _fld_1f(0), _detune(0), _modWheel(0), _allocated(false) { +TownsMidiInputChannel::TownsMidiInputChannel(MidiDriver_TOWNS *driver, int chanIndex) : MidiChannel(), _driver(driver), _out(0), _chanIndex(chanIndex), + _priority(0), _tl(0), _transpose(0), _pitchBendFactor(0), _pitchBend(0), _sustain(0), _freqLSB(0), _detune(0), _modWheel(0), _allocated(false) { _instrument = new uint8[30]; memset(_instrument, 0, 30); } diff --git a/audio/softsynth/mt32.cpp b/audio/softsynth/mt32.cpp index 186118262f..d9744924aa 100644 --- a/audio/softsynth/mt32.cpp +++ b/audio/softsynth/mt32.cpp @@ -25,6 +25,7 @@ #ifdef USE_MT32EMU #include "audio/softsynth/mt32/mt32emu.h" +#include "audio/softsynth/mt32/ROMInfo.h" #include "audio/softsynth/emumidi.h" #include "audio/musicplugin.h" @@ -47,6 +48,50 @@ #include "graphics/palette.h" #include "graphics/font.h" +#include "gui/message.h" + +namespace MT32Emu { + +class ReportHandlerScummVM : public ReportHandler { +friend class Synth; + +public: + virtual ~ReportHandlerScummVM() {} + +protected: + + // Callback for debug messages, in vprintf() format + void printDebug(const char *fmt, va_list list) { + debug(4, fmt, list); + } + + // Callbacks for reporting various errors and information + void onErrorControlROM() { + GUI::MessageDialog dialog("MT32emu: Init Error - Missing or invalid Control ROM image", "OK"); + dialog.runModal(); + error("MT32emu: Init Error - Missing or invalid Control ROM image"); + } + void onErrorPCMROM() { + GUI::MessageDialog dialog("MT32emu: Init Error - Missing PCM ROM image", "OK"); + dialog.runModal(); + error("MT32emu: Init Error - Missing PCM ROM image"); + } + void showLCDMessage(const char *message) { + g_system->displayMessageOnOSD(message); + } + void onDeviceReset() {} + void onDeviceReconfig() {} + void onNewReverbMode(Bit8u /* mode */) {} + void onNewReverbTime(Bit8u /* time */) {} + void onNewReverbLevel(Bit8u /* level */) {} + void onPartStateChanged(int /* partNum */, bool /* isActive */) {} + void onPolyStateChanged(int /* partNum */) {} + void onPartialStateChanged(int /* partialNum */, int /* oldPartialPhase */, int /* newPartialPhase */) {} + void onProgramChanged(int /* partNum */, char * /* patchName */) {} +}; + +} // end of namespace MT32Emu + class MidiChannel_MT32 : public MidiChannel_MPU401 { void effectLevel(byte value) { } void chorusLevel(byte value) { } @@ -57,6 +102,10 @@ private: MidiChannel_MT32 _midiChannels[16]; uint16 _channelMask; MT32Emu::Synth *_synth; + MT32Emu::ReportHandlerScummVM *_reportHandler; + const MT32Emu::ROMImage *_controlROM, *_pcmROM; + Common::File *_controlFile, *_pcmFile; + void deleteMuntStructures(); int _outputRate; @@ -84,149 +133,6 @@ public: int getRate() const { return _outputRate; } }; -static int eatSystemEvents() { - Common::Event event; - Common::EventManager *eventMan = g_system->getEventManager(); - while (eventMan->pollEvent(event)) { - switch (event.type) { - case Common::EVENT_QUIT: - return 1; - default: - break; - } - } - return 0; -} - -static void drawProgress(float progress) { - const Graphics::Font &font(*FontMan.getFontByUsage(Graphics::FontManager::kGUIFont)); - Graphics::Surface *screen = g_system->lockScreen(); - - assert(screen); - assert(screen->pixels); - - Graphics::PixelFormat screenFormat = g_system->getScreenFormat(); - - int16 w = g_system->getWidth() / 7 * 5; - int16 h = font.getFontHeight(); - int16 x = g_system->getWidth() / 7; - int16 y = g_system->getHeight() / 2 - h / 2; - - Common::Rect r(x, y, x + w, y + h); - - uint32 col; - - if (screenFormat.bytesPerPixel > 1) - col = screenFormat.RGBToColor(0, 171, 0); - else - col = 1; - - screen->frameRect(r, col); - - r.grow(-1); - r.setWidth(uint16(progress * w)); - - if (screenFormat.bytesPerPixel > 1) - col = screenFormat.RGBToColor(171, 0, 0); - else - col = 2; - - screen->fillRect(r, col); - - g_system->unlockScreen(); - g_system->updateScreen(); -} - -static void drawMessage(int offset, const Common::String &text) { - const Graphics::Font &font(*FontMan.getFontByUsage(Graphics::FontManager::kGUIFont)); - Graphics::Surface *screen = g_system->lockScreen(); - - assert(screen); - assert(screen->pixels); - - Graphics::PixelFormat screenFormat = g_system->getScreenFormat(); - - uint16 h = font.getFontHeight(); - uint16 y = g_system->getHeight() / 2 - h / 2 + offset * (h + 1); - - uint32 col; - - if (screenFormat.bytesPerPixel > 1) - col = screenFormat.RGBToColor(0, 0, 0); - else - col = 0; - - Common::Rect r(0, y, screen->w, y + h); - screen->fillRect(r, col); - - if (screenFormat.bytesPerPixel > 1) - col = screenFormat.RGBToColor(0, 171, 0); - else - col = 1; - - font.drawString(screen, text, 0, y, screen->w, col, Graphics::kTextAlignCenter); - - g_system->unlockScreen(); - g_system->updateScreen(); -} - -static Common::File *MT32_OpenFile(void *userData, const char *filename) { - Common::File *file = new Common::File(); - if (!file->open(filename)) { - delete file; - return NULL; - } - return file; -} - -static void MT32_PrintDebug(void *userData, const char *fmt, va_list list) { - if (((MidiDriver_MT32 *)userData)->_initializing) { - char buf[512]; - - vsnprintf(buf, 512, fmt, list); - buf[70] = 0; // Truncate to a reasonable length - - drawMessage(1, buf); - } - - //vdebug(0, fmt, list); // FIXME: Use a higher debug level -} - -static int MT32_Report(void *userData, MT32Emu::ReportType type, const void *reportData) { - switch (type) { - case MT32Emu::ReportType_lcdMessage: - g_system->displayMessageOnOSD((const char *)reportData); - break; - case MT32Emu::ReportType_errorControlROM: - error("Failed to load MT32_CONTROL.ROM"); - break; - case MT32Emu::ReportType_errorPCMROM: - error("Failed to load MT32_PCM.ROM"); - break; - case MT32Emu::ReportType_progressInit: - if (((MidiDriver_MT32 *)userData)->_initializing) { - drawProgress(*((const float *)reportData)); - return eatSystemEvents(); - } - break; - case MT32Emu::ReportType_availableSSE: - debug(1, "MT32emu: SSE is available"); - break; - case MT32Emu::ReportType_usingSSE: - debug(1, "MT32emu: using SSE"); - break; - case MT32Emu::ReportType_available3DNow: - debug(1, "MT32emu: 3DNow! is available"); - break; - case MT32Emu::ReportType_using3DNow: - debug(1, "MT32emu: using 3DNow!"); - break; - default: - break; - } - return 0; -} - //////////////////////////////////////// // // MidiDriver_MT32 @@ -239,6 +145,7 @@ MidiDriver_MT32::MidiDriver_MT32(Audio::Mixer *mixer) : MidiDriver_Emulated(mixe for (i = 0; i < ARRAYSIZE(_midiChannels); ++i) { _midiChannels[i].init(this, i); } + _reportHandler = NULL; _synth = NULL; // A higher baseFreq reduces the length used in generateSamples(), // and means that the timer callback will be called more often. @@ -252,30 +159,35 @@ MidiDriver_MT32::MidiDriver_MT32(Audio::Mixer *mixer) : MidiDriver_Emulated(mixe } MidiDriver_MT32::~MidiDriver_MT32() { + deleteMuntStructures(); +} + +void MidiDriver_MT32::deleteMuntStructures() { delete _synth; + _synth = NULL; + delete _reportHandler; + _reportHandler = NULL; + + if (_controlROM) + MT32Emu::ROMImage::freeROMImage(_controlROM); + _controlROM = NULL; + if (_pcmROM) + MT32Emu::ROMImage::freeROMImage(_pcmROM); + _pcmROM = NULL; + + delete _controlFile; + _controlFile = NULL; + delete _pcmFile; + _pcmFile = NULL; } int MidiDriver_MT32::open() { - MT32Emu::SynthProperties prop; - if (_isOpen) return MERR_ALREADY_OPEN; MidiDriver_Emulated::open(); - - memset(&prop, 0, sizeof(prop)); - prop.sampleRate = getRate(); - prop.useReverb = true; - prop.useDefaultReverb = false; - prop.reverbType = 0; - prop.reverbTime = 5; - prop.reverbLevel = 3; - prop.userData = this; - prop.printDebug = MT32_PrintDebug; - prop.report = MT32_Report; - prop.openFile = MT32_OpenFile; - - _synth = new MT32Emu::Synth(); + _reportHandler = new MT32Emu::ReportHandlerScummVM(); + _synth = new MT32Emu::Synth(_reportHandler); Graphics::PixelFormat screenFormat = g_system->getScreenFormat(); @@ -290,8 +202,16 @@ int MidiDriver_MT32::open() { } _initializing = true; - drawMessage(-1, _s("Initializing MT-32 Emulator")); - if (!_synth->open(prop)) + debug(4, _s("Initializing MT-32 Emulator")); + _controlFile = new Common::File(); + if (!_controlFile->open("MT32_CONTROL.ROM") && !_controlFile->open("CM32L_CONTROL.ROM")) + error("Error opening MT32_CONTROL.ROM / CM32L_CONTROL.ROM"); + _pcmFile = new Common::File(); + if (!_pcmFile->open("MT32_PCM.ROM") && !_pcmFile->open("CM32L_PCM.ROM")) + error("Error opening MT32_PCM.ROM / CM32L_PCM.ROM"); + _controlROM = MT32Emu::ROMImage::makeROMImage(_controlFile); + _pcmROM = MT32Emu::ROMImage::makeROMImage(_pcmFile); + if (!_synth->open(*_controlROM, *_pcmROM)) return MERR_DEVICE_NOT_AVAILABLE; double gain = (double)ConfMan.getInt("midi_gain") / 100.0; @@ -352,8 +272,7 @@ void MidiDriver_MT32::close() { _mixer->stopHandle(_mixerSoundHandle); _synth->close(); - delete _synth; - _synth = NULL; + deleteMuntStructures(); } void MidiDriver_MT32::generateSamples(int16 *data, int len) { diff --git a/audio/softsynth/mt32/AReverbModel.cpp b/audio/softsynth/mt32/AReverbModel.cpp index 4ee6c87943..595b286a31 100644 --- a/audio/softsynth/mt32/AReverbModel.cpp +++ b/audio/softsynth/mt32/AReverbModel.cpp @@ -1,5 +1,5 @@ /* Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009 Dean Beeler, Jerome Fisher - * Copyright (C) 2011 Dean Beeler, Jerome Fisher, Sergey V. Mikayev + * Copyright (C) 2011, 2012 Dean Beeler, Jerome Fisher, Sergey V. Mikayev * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by @@ -16,64 +16,97 @@ */ #include "mt32emu.h" -#include "AReverbModel.h" - -using namespace MT32Emu; - -// Default reverb settings for modes 0-2 - -static const unsigned int NUM_ALLPASSES = 6; -static const unsigned int NUM_DELAYS = 5; -static const Bit32u MODE_0_ALLPASSES[] = {729, 78, 394, 994, 1250, 1889}; -static const Bit32u MODE_0_DELAYS[] = {846, 4, 1819, 778, 346}; -static const float MODE_0_TIMES[] = {0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.9f}; -static const float MODE_0_LEVELS[] = {0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 1.01575f}; +#if MT32EMU_USE_REVERBMODEL == 1 -static const Bit32u MODE_1_ALLPASSES[] = {176, 809, 1324, 1258}; -static const Bit32u MODE_1_DELAYS[] = {2262, 124, 974, 2516, 356}; -static const float MODE_1_TIMES[] = {0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.95f}; -static const float MODE_1_LEVELS[] = {0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 1.01575f}; - -static const Bit32u MODE_2_ALLPASSES[] = {78, 729, 994, 389}; -static const Bit32u MODE_2_DELAYS[] = {846, 4, 1819, 778, 346}; -static const float MODE_2_TIMES[] = {0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f}; -static const float MODE_2_LEVELS[] = {0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f}; - -const AReverbSettings AReverbModel::REVERB_MODE_0_SETTINGS = {MODE_0_ALLPASSES, MODE_0_DELAYS, MODE_0_TIMES, MODE_0_LEVELS, 0.687770909f, 0.5f, 0.5f}; -const AReverbSettings AReverbModel::REVERB_MODE_1_SETTINGS = {MODE_1_ALLPASSES, MODE_1_DELAYS, MODE_1_TIMES, MODE_1_LEVELS, 0.712025098f, 0.375f, 0.625f}; -const AReverbSettings AReverbModel::REVERB_MODE_2_SETTINGS = {MODE_2_ALLPASSES, MODE_2_DELAYS, MODE_2_TIMES, MODE_2_LEVELS, 0.939522749f, 0.0f, 0.0f}; +#include "AReverbModel.h" -RingBuffer::RingBuffer(Bit32u newsize) { - index = 0; - size = newsize; +// Analysing of state of reverb RAM address lines gives exact sizes of the buffers of filters used. This also indicates that +// the reverb model implemented in the real devices consists of three series allpass filters preceded by a non-feedback comb (or a delay with a LPF) +// and followed by three parallel comb filters + +namespace MT32Emu { + +// Because LA-32 chip makes it's output available to process by the Boss chip with a significant delay, +// the Boss chip puts to the buffer the LA32 dry output when it is ready and performs processing of the _previously_ latched data. +// Of course, the right way would be to use a dedicated variable for this, but our reverb model is way higher level, +// so we can simply increase the input buffer size. +static const Bit32u PROCESS_DELAY = 1; + +// Default reverb settings for modes 0-2. These correspond to CM-32L / LAPC-I "new" reverb settings. MT-32 reverb is a bit different. +// Found by tracing reverb RAM data lines (thanks go to Lord_Nightmare & balrog). + +static const Bit32u NUM_ALLPASSES = 3; +static const Bit32u NUM_COMBS = 4; // Well, actually there are 3 comb filters, but the entrance LPF + delay can be perfectly processed via a comb here. + +static const Bit32u MODE_0_ALLPASSES[] = {994, 729, 78}; +static const Bit32u MODE_0_COMBS[] = {705 + PROCESS_DELAY, 2349, 2839, 3632}; +static const Bit32u MODE_0_OUTL[] = {2349, 141, 1960}; +static const Bit32u MODE_0_OUTR[] = {1174, 1570, 145}; +static const Bit32u MODE_0_COMB_FACTOR[] = {0x3C, 0x60, 0x60, 0x60}; +static const Bit32u MODE_0_COMB_FEEDBACK[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x48, 0x60, 0x78, 0x80, 0x88, 0x90, 0x98, + 0x28, 0x48, 0x60, 0x78, 0x80, 0x88, 0x90, 0x98, + 0x28, 0x48, 0x60, 0x78, 0x80, 0x88, 0x90, 0x98}; +static const Bit32u MODE_0_LEVELS[] = {10*1, 10*3, 10*5, 10*7, 11*9, 11*12, 11*15, 13*15}; +static const Bit32u MODE_0_LPF_AMP = 6; + +static const Bit32u MODE_1_ALLPASSES[] = {1324, 809, 176}; +static const Bit32u MODE_1_COMBS[] = {961 + PROCESS_DELAY, 2619, 3545, 4519}; +static const Bit32u MODE_1_OUTL[] = {2618, 1760, 4518}; +static const Bit32u MODE_1_OUTR[] = {1300, 3532, 2274}; +static const Bit32u MODE_1_COMB_FACTOR[] = {0x30, 0x60, 0x60, 0x60}; +static const Bit32u MODE_1_COMB_FEEDBACK[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x48, 0x60, 0x70, 0x78, 0x80, 0x90, 0x98, + 0x28, 0x48, 0x60, 0x78, 0x80, 0x88, 0x90, 0x98, + 0x28, 0x48, 0x60, 0x78, 0x80, 0x88, 0x90, 0x98}; +static const Bit32u MODE_1_LEVELS[] = {10*1, 10*3, 11*5, 11*7, 11*9, 11*12, 11*15, 14*15}; +static const Bit32u MODE_1_LPF_AMP = 6; + +static const Bit32u MODE_2_ALLPASSES[] = {969, 644, 157}; +static const Bit32u MODE_2_COMBS[] = {116 + PROCESS_DELAY, 2259, 2839, 3539}; +static const Bit32u MODE_2_OUTL[] = {2259, 718, 1769}; +static const Bit32u MODE_2_OUTR[] = {1136, 2128, 1}; +static const Bit32u MODE_2_COMB_FACTOR[] = {0, 0x20, 0x20, 0x20}; +static const Bit32u MODE_2_COMB_FEEDBACK[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x58, 0x78, 0x88, 0xA0, 0xB8, 0xC0, 0xD0, + 0x30, 0x58, 0x78, 0x88, 0xA0, 0xB8, 0xC0, 0xD0, + 0x30, 0x58, 0x78, 0x88, 0xA0, 0xB8, 0xC0, 0xD0}; +static const Bit32u MODE_2_LEVELS[] = {10*1, 10*3, 11*5, 11*7, 11*9, 11*12, 12*15, 14*15}; +static const Bit32u MODE_2_LPF_AMP = 8; + +static const AReverbSettings REVERB_MODE_0_SETTINGS = {MODE_0_ALLPASSES, MODE_0_COMBS, MODE_0_OUTL, MODE_0_OUTR, MODE_0_COMB_FACTOR, MODE_0_COMB_FEEDBACK, MODE_0_LEVELS, MODE_0_LPF_AMP}; +static const AReverbSettings REVERB_MODE_1_SETTINGS = {MODE_1_ALLPASSES, MODE_1_COMBS, MODE_1_OUTL, MODE_1_OUTR, MODE_1_COMB_FACTOR, MODE_1_COMB_FEEDBACK, MODE_1_LEVELS, MODE_1_LPF_AMP}; +static const AReverbSettings REVERB_MODE_2_SETTINGS = {MODE_2_ALLPASSES, MODE_2_COMBS, MODE_2_OUTL, MODE_2_OUTR, MODE_2_COMB_FACTOR, MODE_2_COMB_FEEDBACK, MODE_2_LEVELS, MODE_2_LPF_AMP}; + +static const AReverbSettings * const REVERB_SETTINGS[] = {&REVERB_MODE_0_SETTINGS, &REVERB_MODE_1_SETTINGS, &REVERB_MODE_2_SETTINGS, &REVERB_MODE_0_SETTINGS}; + +RingBuffer::RingBuffer(const Bit32u newsize) : size(newsize), index(0) { buffer = new float[size]; } RingBuffer::~RingBuffer() { delete[] buffer; buffer = NULL; - size = 0; } float RingBuffer::next() { - index++; - if (index >= size) { + if (++index >= size) { index = 0; } return buffer[index]; } -bool RingBuffer::isEmpty() { +bool RingBuffer::isEmpty() const { if (buffer == NULL) return true; float *buf = buffer; - float total = 0; + float max = 0.001f; for (Bit32u i = 0; i < size; i++) { - total += (*buf < 0 ? -*buf : *buf); + if ((*buf < -max) || (*buf > max)) return false; buf++; } - return ((total / size) < .0002 ? true : false); + return true; } void RingBuffer::mute() { @@ -83,59 +116,66 @@ void RingBuffer::mute() { } } -AllpassFilter::AllpassFilter(Bit32u useSize) : RingBuffer(useSize) { -} - -Delay::Delay(Bit32u useSize) : RingBuffer(useSize) { -} +AllpassFilter::AllpassFilter(const Bit32u useSize) : RingBuffer(useSize) {} -float AllpassFilter::process(float in) { - // This model corresponds to the allpass filter implementation in the real CM-32L device +float AllpassFilter::process(const float in) { + // This model corresponds to the allpass filter implementation of the real CM-32L device // found from sample analysis - float out; - - out = next(); + const float bufferOut = next(); // store input - feedback / 2 - buffer[index] = in - 0.5f * out; + buffer[index] = in - 0.5f * bufferOut; // return buffer output + feedforward / 2 - return out + 0.5f * buffer[index]; + return bufferOut + 0.5f * buffer[index]; } -float Delay::process(float in) { - // Implements a very simple delay +CombFilter::CombFilter(const Bit32u useSize) : RingBuffer(useSize) {} - float out; +void CombFilter::process(const float in) { + // This model corresponds to the comb filter implementation of the real CM-32L device + // found from sample analysis + + // the previously stored value + float last = buffer[index]; - out = next(); + // prepare input + feedback + float filterIn = in + next() * feedbackFactor; - // store input - buffer[index] = in; + // store input + feedback processed by a low-pass filter + buffer[index] = filterFactor * last - filterIn; +} - // return buffer output - return out; +float CombFilter::getOutputAt(const Bit32u outIndex) const { + return buffer[(size + index - outIndex) % size]; } -AReverbModel::AReverbModel(const AReverbSettings *useSettings) : allpasses(NULL), delays(NULL), currentSettings(useSettings) { +void CombFilter::setFeedbackFactor(const float useFeedbackFactor) { + feedbackFactor = useFeedbackFactor; } +void CombFilter::setFilterFactor(const float useFilterFactor) { + filterFactor = useFilterFactor; +} + +AReverbModel::AReverbModel(const ReverbMode mode) : allpasses(NULL), combs(NULL), currentSettings(*REVERB_SETTINGS[mode]) {} + AReverbModel::~AReverbModel() { close(); } -void AReverbModel::open(unsigned int /*sampleRate*/) { - // FIXME: filter sizes must be multiplied by sample rate to 32000Hz ratio - // IIR filter values depend on sample rate as well +void AReverbModel::open() { allpasses = new AllpassFilter*[NUM_ALLPASSES]; for (Bit32u i = 0; i < NUM_ALLPASSES; i++) { - allpasses[i] = new AllpassFilter(currentSettings->allpassSizes[i]); + allpasses[i] = new AllpassFilter(currentSettings.allpassSizes[i]); } - delays = new Delay*[NUM_DELAYS]; - for (Bit32u i = 0; i < NUM_DELAYS; i++) { - delays[i] = new Delay(currentSettings->delaySizes[i]); + combs = new CombFilter*[NUM_COMBS]; + for (Bit32u i = 0; i < NUM_COMBS; i++) { + combs[i] = new CombFilter(currentSettings.combSizes[i]); + combs[i]->setFilterFactor(currentSettings.filterFactor[i] / 256.0f); } + lpfAmp = currentSettings.lpfAmp / 16.0f; mute(); } @@ -150,84 +190,80 @@ void AReverbModel::close() { delete[] allpasses; allpasses = NULL; } - if (delays != NULL) { - for (Bit32u i = 0; i < NUM_DELAYS; i++) { - if (delays[i] != NULL) { - delete delays[i]; - delays[i] = NULL; + if (combs != NULL) { + for (Bit32u i = 0; i < NUM_COMBS; i++) { + if (combs[i] != NULL) { + delete combs[i]; + combs[i] = NULL; } } - delete[] delays; - delays = NULL; + delete[] combs; + combs = NULL; } } void AReverbModel::mute() { + if (allpasses == NULL || combs == NULL) return; for (Bit32u i = 0; i < NUM_ALLPASSES; i++) { allpasses[i]->mute(); } - for (Bit32u i = 0; i < NUM_DELAYS; i++) { - delays[i]->mute(); + for (Bit32u i = 0; i < NUM_COMBS; i++) { + combs[i]->mute(); } - filterhist1 = 0; - filterhist2 = 0; - combhist = 0; } void AReverbModel::setParameters(Bit8u time, Bit8u level) { // FIXME: wetLevel definitely needs ramping when changed // Although, most games don't set reverb level during MIDI playback - decayTime = currentSettings->decayTimes[time]; - wetLevel = currentSettings->wetLevels[level]; + if (combs == NULL) return; + level &= 7; + time &= 7; + for (Bit32u i = 0; i < NUM_COMBS; i++) { + combs[i]->setFeedbackFactor(currentSettings.decayTimes[(i << 3) + time] / 256.0f); + } + wetLevel = (level == 0 && time == 0) ? 0.0f : 0.5f * lpfAmp * currentSettings.wetLevels[level] / 256.0f; } bool AReverbModel::isActive() const { - bool bActive = false; for (Bit32u i = 0; i < NUM_ALLPASSES; i++) { - bActive |= !allpasses[i]->isEmpty(); + if (!allpasses[i]->isEmpty()) return true; } - for (Bit32u i = 0; i < NUM_DELAYS; i++) { - bActive |= !delays[i]->isEmpty(); + for (Bit32u i = 0; i < NUM_COMBS; i++) { + if (!combs[i]->isEmpty()) return true; } - return bActive; + return false; } void AReverbModel::process(const float *inLeft, const float *inRight, float *outLeft, float *outRight, unsigned long numSamples) { -// Three series allpass filters followed by a delay, fourth allpass filter and another delay - float dry, link, outL1, outL2, outR1, outR2; + float dry, link, outL1; for (unsigned long i = 0; i < numSamples; i++) { - dry = *inLeft + *inRight; + dry = wetLevel * (*inLeft + *inRight); - // Implementation of 2-stage IIR single-pole low-pass filter - // found at the entrance of reverb processing on real devices - filterhist1 += (dry - filterhist1) * currentSettings->filtVal; - filterhist2 += (filterhist1 - filterhist2) * currentSettings->filtVal; + // Get the last stored sample before processing in order not to loose it + link = combs[0]->getOutputAt(currentSettings.combSizes[0] - 1); - link = allpasses[0]->process(-filterhist2); - link = allpasses[1]->process(link); + combs[0]->process(-dry); - // this implements a comb filter cross-linked with the fourth allpass filter - link += combhist * decayTime; + link = allpasses[0]->process(link); + link = allpasses[1]->process(link); link = allpasses[2]->process(link); - link = delays[0]->process(link); - outL1 = link; - link = allpasses[3]->process(link); - link = delays[1]->process(link); - outR1 = link; - link = allpasses[4]->process(link); - link = delays[2]->process(link); - outL2 = link; - link = allpasses[5]->process(link); - link = delays[3]->process(link); - outR2 = link; - link = delays[4]->process(link); - - // comb filter end point - combhist = combhist * currentSettings->damp1 + link * currentSettings->damp2; - - *outLeft = (outL1 + outL2) * wetLevel; - *outRight = (outR1 + outR2) * wetLevel; + + // If the output position is equal to the comb size, get it now in order not to loose it + outL1 = 1.5f * combs[1]->getOutputAt(currentSettings.outLPositions[0] - 1); + + combs[1]->process(link); + combs[2]->process(link); + combs[3]->process(link); + + link = outL1 + 1.5f * combs[2]->getOutputAt(currentSettings.outLPositions[1]); + link += combs[3]->getOutputAt(currentSettings.outLPositions[2]); + *outLeft = link; + + link = 1.5f * combs[1]->getOutputAt(currentSettings.outRPositions[0]); + link += 1.5f * combs[2]->getOutputAt(currentSettings.outRPositions[1]); + link += combs[3]->getOutputAt(currentSettings.outRPositions[2]); + *outRight = link; inLeft++; inRight++; @@ -235,3 +271,7 @@ void AReverbModel::process(const float *inLeft, const float *inRight, float *out outRight++; } } + +} + +#endif diff --git a/audio/softsynth/mt32/AReverbModel.h b/audio/softsynth/mt32/AReverbModel.h index 3fae08c34c..be1ca4916b 100644 --- a/audio/softsynth/mt32/AReverbModel.h +++ b/audio/softsynth/mt32/AReverbModel.h @@ -1,5 +1,5 @@ /* Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009 Dean Beeler, Jerome Fisher - * Copyright (C) 2011 Dean Beeler, Jerome Fisher, Sergey V. Mikayev + * Copyright (C) 2011, 2012 Dean Beeler, Jerome Fisher, Sergey V. Mikayev * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by @@ -21,66 +21,67 @@ namespace MT32Emu { struct AReverbSettings { - const Bit32u *allpassSizes; - const Bit32u *delaySizes; - const float *decayTimes; - const float *wetLevels; - float filtVal; - float damp1; - float damp2; + const Bit32u * const allpassSizes; + const Bit32u * const combSizes; + const Bit32u * const outLPositions; + const Bit32u * const outRPositions; + const Bit32u * const filterFactor; + const Bit32u * const decayTimes; + const Bit32u * const wetLevels; + const Bit32u lpfAmp; }; class RingBuffer { protected: float *buffer; - Bit32u size; + const Bit32u size; Bit32u index; + public: - RingBuffer(Bit32u size); + RingBuffer(const Bit32u size); virtual ~RingBuffer(); float next(); - bool isEmpty(); + bool isEmpty() const; void mute(); }; class AllpassFilter : public RingBuffer { public: - AllpassFilter(Bit32u size); - float process(float in); + AllpassFilter(const Bit32u size); + float process(const float in); }; -class Delay : public RingBuffer { +class CombFilter : public RingBuffer { + float feedbackFactor; + float filterFactor; + public: - Delay(Bit32u size); - float process(float in); + CombFilter(const Bit32u size); + void process(const float in); + float getOutputAt(const Bit32u outIndex) const; + void setFeedbackFactor(const float useFeedbackFactor); + void setFilterFactor(const float useFilterFactor); }; class AReverbModel : public ReverbModel { AllpassFilter **allpasses; - Delay **delays; + CombFilter **combs; - const AReverbSettings *currentSettings; - float decayTime; + const AReverbSettings ¤tSettings; + float lpfAmp; float wetLevel; - float filterhist1, filterhist2; - float combhist; void mute(); + public: - AReverbModel(const AReverbSettings *newSettings); + AReverbModel(const ReverbMode mode); ~AReverbModel(); - void open(unsigned int sampleRate); + void open(); void close(); void setParameters(Bit8u time, Bit8u level); void process(const float *inLeft, const float *inRight, float *outLeft, float *outRight, unsigned long numSamples); bool isActive() const; - - static const AReverbSettings REVERB_MODE_0_SETTINGS; - static const AReverbSettings REVERB_MODE_1_SETTINGS; - static const AReverbSettings REVERB_MODE_2_SETTINGS; }; -// Default reverb settings for modes 0-2 - } #endif diff --git a/audio/softsynth/mt32/BReverbModel.cpp b/audio/softsynth/mt32/BReverbModel.cpp new file mode 100644 index 0000000000..2570424187 --- /dev/null +++ b/audio/softsynth/mt32/BReverbModel.cpp @@ -0,0 +1,393 @@ +/* Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009 Dean Beeler, Jerome Fisher + * Copyright (C) 2011, 2012 Dean Beeler, Jerome Fisher, Sergey V. Mikayev + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "mt32emu.h" + +#if MT32EMU_USE_REVERBMODEL == 2 + +#include "BReverbModel.h" + +// Analysing of state of reverb RAM address lines gives exact sizes of the buffers of filters used. This also indicates that +// the reverb model implemented in the real devices consists of three series allpass filters preceded by a non-feedback comb (or a delay with a LPF) +// and followed by three parallel comb filters + +namespace MT32Emu { + +// Because LA-32 chip makes it's output available to process by the Boss chip with a significant delay, +// the Boss chip puts to the buffer the LA32 dry output when it is ready and performs processing of the _previously_ latched data. +// Of course, the right way would be to use a dedicated variable for this, but our reverb model is way higher level, +// so we can simply increase the input buffer size. +static const Bit32u PROCESS_DELAY = 1; + +static const Bit32u MODE_3_ADDITIONAL_DELAY = 1; +static const Bit32u MODE_3_FEEDBACK_DELAY = 1; + +// Default reverb settings for modes 0-2. These correspond to CM-32L / LAPC-I "new" reverb settings. MT-32 reverb is a bit different. +// Found by tracing reverb RAM data lines (thanks go to Lord_Nightmare & balrog). + +static const Bit32u MODE_0_NUMBER_OF_ALLPASSES = 3; +static const Bit32u MODE_0_ALLPASSES[] = {994, 729, 78}; +static const Bit32u MODE_0_NUMBER_OF_COMBS = 4; // Well, actually there are 3 comb filters, but the entrance LPF + delay can be processed via a hacked comb. +static const Bit32u MODE_0_COMBS[] = {705 + PROCESS_DELAY, 2349, 2839, 3632}; +static const Bit32u MODE_0_OUTL[] = {2349, 141, 1960}; +static const Bit32u MODE_0_OUTR[] = {1174, 1570, 145}; +static const Bit32u MODE_0_COMB_FACTOR[] = {0xA0, 0x60, 0x60, 0x60}; +static const Bit32u MODE_0_COMB_FEEDBACK[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x48, 0x60, 0x78, 0x80, 0x88, 0x90, 0x98, + 0x28, 0x48, 0x60, 0x78, 0x80, 0x88, 0x90, 0x98, + 0x28, 0x48, 0x60, 0x78, 0x80, 0x88, 0x90, 0x98}; +static const Bit32u MODE_0_DRY_AMP[] = {0xA0, 0xA0, 0xA0, 0xA0, 0xB0, 0xB0, 0xB0, 0xD0}; +static const Bit32u MODE_0_WET_AMP[] = {0x10, 0x30, 0x50, 0x70, 0x90, 0xC0, 0xF0, 0xF0}; +static const Bit32u MODE_0_LPF_AMP = 0x60; + +static const Bit32u MODE_1_NUMBER_OF_ALLPASSES = 3; +static const Bit32u MODE_1_ALLPASSES[] = {1324, 809, 176}; +static const Bit32u MODE_1_NUMBER_OF_COMBS = 4; // Same as for mode 0 above +static const Bit32u MODE_1_COMBS[] = {961 + PROCESS_DELAY, 2619, 3545, 4519}; +static const Bit32u MODE_1_OUTL[] = {2618, 1760, 4518}; +static const Bit32u MODE_1_OUTR[] = {1300, 3532, 2274}; +static const Bit32u MODE_1_COMB_FACTOR[] = {0x80, 0x60, 0x60, 0x60}; +static const Bit32u MODE_1_COMB_FEEDBACK[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x48, 0x60, 0x70, 0x78, 0x80, 0x90, 0x98, + 0x28, 0x48, 0x60, 0x78, 0x80, 0x88, 0x90, 0x98, + 0x28, 0x48, 0x60, 0x78, 0x80, 0x88, 0x90, 0x98}; +static const Bit32u MODE_1_DRY_AMP[] = {0xA0, 0xA0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xE0}; +static const Bit32u MODE_1_WET_AMP[] = {0x10, 0x30, 0x50, 0x70, 0x90, 0xC0, 0xF0, 0xF0}; +static const Bit32u MODE_1_LPF_AMP = 0x60; + +static const Bit32u MODE_2_NUMBER_OF_ALLPASSES = 3; +static const Bit32u MODE_2_ALLPASSES[] = {969, 644, 157}; +static const Bit32u MODE_2_NUMBER_OF_COMBS = 4; // Same as for mode 0 above +static const Bit32u MODE_2_COMBS[] = {116 + PROCESS_DELAY, 2259, 2839, 3539}; +static const Bit32u MODE_2_OUTL[] = {2259, 718, 1769}; +static const Bit32u MODE_2_OUTR[] = {1136, 2128, 1}; +static const Bit32u MODE_2_COMB_FACTOR[] = {0, 0x20, 0x20, 0x20}; +static const Bit32u MODE_2_COMB_FEEDBACK[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x58, 0x78, 0x88, 0xA0, 0xB8, 0xC0, 0xD0, + 0x30, 0x58, 0x78, 0x88, 0xA0, 0xB8, 0xC0, 0xD0, + 0x30, 0x58, 0x78, 0x88, 0xA0, 0xB8, 0xC0, 0xD0}; +static const Bit32u MODE_2_DRY_AMP[] = {0xA0, 0xA0, 0xB0, 0xB0, 0xB0, 0xB0, 0xC0, 0xE0}; +static const Bit32u MODE_2_WET_AMP[] = {0x10, 0x30, 0x50, 0x70, 0x90, 0xC0, 0xF0, 0xF0}; +static const Bit32u MODE_2_LPF_AMP = 0x80; + +static const Bit32u MODE_3_NUMBER_OF_ALLPASSES = 0; +static const Bit32u MODE_3_NUMBER_OF_COMBS = 1; +static const Bit32u MODE_3_DELAY[] = {16000 + MODE_3_FEEDBACK_DELAY + PROCESS_DELAY + MODE_3_ADDITIONAL_DELAY}; +static const Bit32u MODE_3_OUTL[] = {400, 624, 960, 1488, 2256, 3472, 5280, 8000}; +static const Bit32u MODE_3_OUTR[] = {800, 1248, 1920, 2976, 4512, 6944, 10560, 16000}; +static const Bit32u MODE_3_COMB_FACTOR[] = {0x68}; +static const Bit32u MODE_3_COMB_FEEDBACK[] = {0x68, 0x60}; +static const Bit32u MODE_3_DRY_AMP[] = {0x20, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50}; +static const Bit32u MODE_3_WET_AMP[] = {0x18, 0x18, 0x28, 0x40, 0x60, 0x80, 0xA8, 0xF8}; + +static const BReverbSettings REVERB_MODE_0_SETTINGS = {MODE_0_NUMBER_OF_ALLPASSES, MODE_0_ALLPASSES, MODE_0_NUMBER_OF_COMBS, MODE_0_COMBS, MODE_0_OUTL, MODE_0_OUTR, MODE_0_COMB_FACTOR, MODE_0_COMB_FEEDBACK, MODE_0_DRY_AMP, MODE_0_WET_AMP, MODE_0_LPF_AMP}; +static const BReverbSettings REVERB_MODE_1_SETTINGS = {MODE_1_NUMBER_OF_ALLPASSES, MODE_1_ALLPASSES, MODE_1_NUMBER_OF_COMBS, MODE_1_COMBS, MODE_1_OUTL, MODE_1_OUTR, MODE_1_COMB_FACTOR, MODE_1_COMB_FEEDBACK, MODE_1_DRY_AMP, MODE_1_WET_AMP, MODE_1_LPF_AMP}; +static const BReverbSettings REVERB_MODE_2_SETTINGS = {MODE_2_NUMBER_OF_ALLPASSES, MODE_2_ALLPASSES, MODE_2_NUMBER_OF_COMBS, MODE_2_COMBS, MODE_2_OUTL, MODE_2_OUTR, MODE_2_COMB_FACTOR, MODE_2_COMB_FEEDBACK, MODE_2_DRY_AMP, MODE_2_WET_AMP, MODE_2_LPF_AMP}; +static const BReverbSettings REVERB_MODE_3_SETTINGS = {MODE_3_NUMBER_OF_ALLPASSES, NULL, MODE_3_NUMBER_OF_COMBS, MODE_3_DELAY, MODE_3_OUTL, MODE_3_OUTR, MODE_3_COMB_FACTOR, MODE_3_COMB_FEEDBACK, MODE_3_DRY_AMP, MODE_3_WET_AMP, 0}; + +static const BReverbSettings * const REVERB_SETTINGS[] = {&REVERB_MODE_0_SETTINGS, &REVERB_MODE_1_SETTINGS, &REVERB_MODE_2_SETTINGS, &REVERB_MODE_3_SETTINGS}; + +// This algorithm tries to emulate exactly Boss multiplication operation (at least this is what we see on reverb RAM data lines). +// Also LA32 is suspected to use the similar one to perform PCM interpolation and ring modulation. +static Bit32s weirdMul(Bit32s a, Bit8u addMask, Bit8u carryMask) { + Bit8u mask = 0x80; + Bit32s res = 0; + for (int i = 0; i < 8; i++) { + Bit32s carry = (a < 0) && (mask & carryMask) > 0 ? a & 1 : 0; + a >>= 1; + res += (mask & addMask) > 0 ? a + carry : 0; + mask >>= 1; + } + return res; +} + +RingBuffer::RingBuffer(Bit32u newsize) : size(newsize), index(0) { + buffer = new Bit16s[size]; +} + +RingBuffer::~RingBuffer() { + delete[] buffer; + buffer = NULL; +} + +Bit32s RingBuffer::next() { + if (++index >= size) { + index = 0; + } + return buffer[index]; +} + +bool RingBuffer::isEmpty() const { + if (buffer == NULL) return true; + + Bit16s *buf = buffer; + for (Bit32u i = 0; i < size; i++) { + if (*buf < -8 || *buf > 8) return false; + buf++; + } + return true; +} + +void RingBuffer::mute() { + Bit16s *buf = buffer; + for (Bit32u i = 0; i < size; i++) { + *buf++ = 0; + } +} + +AllpassFilter::AllpassFilter(const Bit32u useSize) : RingBuffer(useSize) {} + +Bit32s AllpassFilter::process(const Bit32s in) { + // This model corresponds to the allpass filter implementation of the real CM-32L device + // found from sample analysis + + Bit16s bufferOut = next(); + + // store input - feedback / 2 + buffer[index] = in - (bufferOut >> 1); + + // return buffer output + feedforward / 2 + return bufferOut + (buffer[index] >> 1); +} + +CombFilter::CombFilter(const Bit32u useSize, const Bit32u useFilterFactor) : RingBuffer(useSize), filterFactor(useFilterFactor) {} + +void CombFilter::process(const Bit32s in) { + // This model corresponds to the comb filter implementation of the real CM-32L device + + // the previously stored value + Bit32s last = buffer[index]; + + // prepare input + feedback + Bit32s filterIn = in + weirdMul(next(), feedbackFactor, 0xF0 /* Maybe 0x80 ? */); + + // store input + feedback processed by a low-pass filter + buffer[index] = weirdMul(last, filterFactor, 0x40) - filterIn; +} + +Bit32s CombFilter::getOutputAt(const Bit32u outIndex) const { + return buffer[(size + index - outIndex) % size]; +} + +void CombFilter::setFeedbackFactor(const Bit32u useFeedbackFactor) { + feedbackFactor = useFeedbackFactor; +} + +DelayWithLowPassFilter::DelayWithLowPassFilter(const Bit32u useSize, const Bit32u useFilterFactor, const Bit32u useAmp) + : CombFilter(useSize, useFilterFactor), amp(useAmp) {} + +void DelayWithLowPassFilter::process(const Bit32s in) { + // the previously stored value + Bit32s last = buffer[index]; + + // move to the next index + next(); + + // low-pass filter process + Bit32s lpfOut = weirdMul(last, filterFactor, 0xFF) + in; + + // store lpfOut multiplied by LPF amp factor + buffer[index] = weirdMul(lpfOut, amp, 0xFF); +} + +TapDelayCombFilter::TapDelayCombFilter(const Bit32u useSize, const Bit32u useFilterFactor) : CombFilter(useSize, useFilterFactor) {} + +void TapDelayCombFilter::process(const Bit32s in) { + // the previously stored value + Bit32s last = buffer[index]; + + // move to the next index + next(); + + // prepare input + feedback + // Actually, the size of the filter varies with the TIME parameter, the feedback sample is taken from the position just below the right output + Bit32s filterIn = in + weirdMul(getOutputAt(outR + MODE_3_FEEDBACK_DELAY), feedbackFactor, 0xF0); + + // store input + feedback processed by a low-pass filter + buffer[index] = weirdMul(last, filterFactor, 0xF0) - filterIn; +} + +Bit32s TapDelayCombFilter::getLeftOutput() const { + return getOutputAt(outL + PROCESS_DELAY + MODE_3_ADDITIONAL_DELAY); +} + +Bit32s TapDelayCombFilter::getRightOutput() const { + return getOutputAt(outR + PROCESS_DELAY + MODE_3_ADDITIONAL_DELAY); +} + +void TapDelayCombFilter::setOutputPositions(const Bit32u useOutL, const Bit32u useOutR) { + outL = useOutL; + outR = useOutR; +} + +BReverbModel::BReverbModel(const ReverbMode mode) + : allpasses(NULL), combs(NULL), currentSettings(*REVERB_SETTINGS[mode]), tapDelayMode(mode == REVERB_MODE_TAP_DELAY) {} + +BReverbModel::~BReverbModel() { + close(); +} + +void BReverbModel::open() { + if (currentSettings.numberOfAllpasses > 0) { + allpasses = new AllpassFilter*[currentSettings.numberOfAllpasses]; + for (Bit32u i = 0; i < currentSettings.numberOfAllpasses; i++) { + allpasses[i] = new AllpassFilter(currentSettings.allpassSizes[i]); + } + } + combs = new CombFilter*[currentSettings.numberOfCombs]; + if (tapDelayMode) { + *combs = new TapDelayCombFilter(*currentSettings.combSizes, *currentSettings.filterFactors); + } else { + combs[0] = new DelayWithLowPassFilter(currentSettings.combSizes[0], currentSettings.filterFactors[0], currentSettings.lpfAmp); + for (Bit32u i = 1; i < currentSettings.numberOfCombs; i++) { + combs[i] = new CombFilter(currentSettings.combSizes[i], currentSettings.filterFactors[i]); + } + } + mute(); +} + +void BReverbModel::close() { + if (allpasses != NULL) { + for (Bit32u i = 0; i < currentSettings.numberOfAllpasses; i++) { + if (allpasses[i] != NULL) { + delete allpasses[i]; + allpasses[i] = NULL; + } + } + delete[] allpasses; + allpasses = NULL; + } + if (combs != NULL) { + for (Bit32u i = 0; i < currentSettings.numberOfCombs; i++) { + if (combs[i] != NULL) { + delete combs[i]; + combs[i] = NULL; + } + } + delete[] combs; + combs = NULL; + } +} + +void BReverbModel::mute() { + if (allpasses != NULL) { + for (Bit32u i = 0; i < currentSettings.numberOfAllpasses; i++) { + allpasses[i]->mute(); + } + } + if (combs != NULL) { + for (Bit32u i = 0; i < currentSettings.numberOfCombs; i++) { + combs[i]->mute(); + } + } +} + +void BReverbModel::setParameters(Bit8u time, Bit8u level) { + if (combs == NULL) return; + level &= 7; + time &= 7; + if (tapDelayMode) { + TapDelayCombFilter *comb = static_cast<TapDelayCombFilter *> (*combs); + comb->setOutputPositions(currentSettings.outLPositions[time], currentSettings.outRPositions[time & 7]); + comb->setFeedbackFactor(currentSettings.feedbackFactors[((level < 3) || (time < 6)) ? 0 : 1]); + } else { + for (Bit32u i = 0; i < currentSettings.numberOfCombs; i++) { + combs[i]->setFeedbackFactor(currentSettings.feedbackFactors[(i << 3) + time]); + } + } + if (time == 0 && level == 0) { + dryAmp = wetLevel = 0; + } else { + dryAmp = currentSettings.dryAmps[level]; + wetLevel = currentSettings.wetLevels[level]; + } +} + +bool BReverbModel::isActive() const { + for (Bit32u i = 0; i < currentSettings.numberOfAllpasses; i++) { + if (!allpasses[i]->isEmpty()) return true; + } + for (Bit32u i = 0; i < currentSettings.numberOfCombs; i++) { + if (!combs[i]->isEmpty()) return true; + } + return false; +} + +void BReverbModel::process(const float *inLeft, const float *inRight, float *outLeft, float *outRight, unsigned long numSamples) { + Bit32s dry, link, outL1, outR1; + + for (unsigned long i = 0; i < numSamples; i++) { + if (tapDelayMode) { + dry = Bit32s(*inLeft * 8192.0f) + Bit32s(*inRight * 8192.0f); + } else { + dry = Bit32s(*inLeft * 8192.0f) / 2 + Bit32s(*inRight * 8192.0f) / 2; + } + + // Looks like dryAmp doesn't change in MT-32 but it does in CM-32L / LAPC-I + dry = weirdMul(dry, dryAmp, 0xFF); + + if (tapDelayMode) { + TapDelayCombFilter *comb = static_cast<TapDelayCombFilter *> (*combs); + comb->process(dry); + *outLeft = weirdMul(comb->getLeftOutput(), wetLevel, 0xFF) / 8192.0f; + *outRight = weirdMul(comb->getRightOutput(), wetLevel, 0xFF) / 8192.0f; + } else { + // Get the last stored sample before processing in order not to loose it + link = combs[0]->getOutputAt(currentSettings.combSizes[0] - 1); + + // Entrance LPF. Note, comb.process() differs a bit here. + combs[0]->process(dry); + + // This introduces reverb noise which actually makes output from the real Boss chip nondeterministic + link = link - 1; + link = allpasses[0]->process(link); + link = allpasses[1]->process(link); + link = allpasses[2]->process(link); + + // If the output position is equal to the comb size, get it now in order not to loose it + outL1 = combs[1]->getOutputAt(currentSettings.outLPositions[0] - 1); + outL1 += outL1 >> 1; + + combs[1]->process(link); + combs[2]->process(link); + combs[3]->process(link); + + link = combs[2]->getOutputAt(currentSettings.outLPositions[1]); + link += link >> 1; + link += outL1; + link += combs[3]->getOutputAt(currentSettings.outLPositions[2]); + *outLeft = weirdMul(link, wetLevel, 0xFF) / 8192.0f; + + outR1 = combs[1]->getOutputAt(currentSettings.outRPositions[0]); + outR1 += outR1 >> 1; + link = combs[2]->getOutputAt(currentSettings.outRPositions[1]); + link += link >> 1; + link += outR1; + link += combs[3]->getOutputAt(currentSettings.outRPositions[2]); + *outRight = weirdMul(link, wetLevel, 0xFF) / 8192.0f; + } + + inLeft++; + inRight++; + outLeft++; + outRight++; + } +} + +} + +#endif diff --git a/audio/softsynth/mt32/BReverbModel.h b/audio/softsynth/mt32/BReverbModel.h new file mode 100644 index 0000000000..f728d1a99c --- /dev/null +++ b/audio/softsynth/mt32/BReverbModel.h @@ -0,0 +1,112 @@ +/* Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009 Dean Beeler, Jerome Fisher + * Copyright (C) 2011, 2012 Dean Beeler, Jerome Fisher, Sergey V. Mikayev + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef MT32EMU_B_REVERB_MODEL_H +#define MT32EMU_B_REVERB_MODEL_H + +namespace MT32Emu { + +struct BReverbSettings { + const Bit32u numberOfAllpasses; + const Bit32u * const allpassSizes; + const Bit32u numberOfCombs; + const Bit32u * const combSizes; + const Bit32u * const outLPositions; + const Bit32u * const outRPositions; + const Bit32u * const filterFactors; + const Bit32u * const feedbackFactors; + const Bit32u * const dryAmps; + const Bit32u * const wetLevels; + const Bit32u lpfAmp; +}; + +class RingBuffer { +protected: + Bit16s *buffer; + const Bit32u size; + Bit32u index; + +public: + RingBuffer(const Bit32u size); + virtual ~RingBuffer(); + Bit32s next(); + bool isEmpty() const; + void mute(); +}; + +class AllpassFilter : public RingBuffer { +public: + AllpassFilter(const Bit32u size); + Bit32s process(const Bit32s in); +}; + +class CombFilter : public RingBuffer { +protected: + const Bit32u filterFactor; + Bit32u feedbackFactor; + +public: + CombFilter(const Bit32u size, const Bit32u useFilterFactor); + virtual void process(const Bit32s in); // Actually, no need to make it virtual, but for sure + Bit32s getOutputAt(const Bit32u outIndex) const; + void setFeedbackFactor(const Bit32u useFeedbackFactor); +}; + +class DelayWithLowPassFilter : public CombFilter { + Bit32u amp; + +public: + DelayWithLowPassFilter(const Bit32u useSize, const Bit32u useFilterFactor, const Bit32u useAmp); + void process(const Bit32s in); + void setFeedbackFactor(const Bit32u) {} +}; + +class TapDelayCombFilter : public CombFilter { + Bit32u outL; + Bit32u outR; + +public: + TapDelayCombFilter(const Bit32u useSize, const Bit32u useFilterFactor); + void process(const Bit32s in); + Bit32s getLeftOutput() const; + Bit32s getRightOutput() const; + void setOutputPositions(const Bit32u useOutL, const Bit32u useOutR); +}; + +class BReverbModel : public ReverbModel { + AllpassFilter **allpasses; + CombFilter **combs; + + const BReverbSettings ¤tSettings; + const bool tapDelayMode; + Bit32u dryAmp; + Bit32u wetLevel; + void mute(); + +public: + BReverbModel(const ReverbMode mode); + ~BReverbModel(); + void open(); + void close(); + void setParameters(Bit8u time, Bit8u level); + void process(const float *inLeft, const float *inRight, float *outLeft, float *outRight, unsigned long numSamples); + bool isActive() const; +}; + +} + +#endif diff --git a/audio/softsynth/mt32/DelayReverb.cpp b/audio/softsynth/mt32/DelayReverb.cpp index 89eebf0d79..bf925f8419 100644 --- a/audio/softsynth/mt32/DelayReverb.cpp +++ b/audio/softsynth/mt32/DelayReverb.cpp @@ -20,15 +20,14 @@ #include "mt32emu.h" #include "DelayReverb.h" -using namespace MT32Emu; +namespace MT32Emu { - -// CONFIRMED: The values below are found via analysis of digital samples. Checked with all time and level combinations. +// CONFIRMED: The values below are found via analysis of digital samples and tracing reverb RAM address / data lines. Checked with all time and level combinations. // Obviously: // rightDelay = (leftDelay - 2) * 2 + 2 // echoDelay = rightDelay - 1 // Leaving these separate in case it's useful for work on other reverb modes... -const Bit32u REVERB_TIMINGS[8][3]= { +static const Bit32u REVERB_TIMINGS[8][3]= { // {leftDelay, rightDelay, feedbackDelay} {402, 802, 801}, {626, 1250, 1249}, @@ -40,14 +39,16 @@ const Bit32u REVERB_TIMINGS[8][3]= { {8002, 16002, 16001} }; -const float REVERB_FADE[8] = {0.0f, -0.049400051f, -0.08220577f, -0.131861118f, -0.197344907f, -0.262956344f, -0.345162114f, -0.509508615f}; -const float REVERB_FEEDBACK67 = -0.629960524947437f; // = -EXP2F(-2 / 3) -const float REVERB_FEEDBACK = -0.682034520443118f; // = -EXP2F(-53 / 96) -const float LPF_VALUE = 0.594603558f; // = EXP2F(-0.75f) +// Reverb amp is found as dryAmp * wetAmp +static const Bit32u REVERB_AMP[8] = {0x20*0x18, 0x50*0x18, 0x50*0x28, 0x50*0x40, 0x50*0x60, 0x50*0x80, 0x50*0xA8, 0x50*0xF8}; +static const Bit32u REVERB_FEEDBACK67 = 0x60; +static const Bit32u REVERB_FEEDBACK = 0x68; +static const float LPF_VALUE = 0x68 / 256.0f; + +static const Bit32u BUFFER_SIZE = 16384; DelayReverb::DelayReverb() { buf = NULL; - sampleRate = 0; setParameters(0, 0); } @@ -55,27 +56,22 @@ DelayReverb::~DelayReverb() { delete[] buf; } -void DelayReverb::open(unsigned int newSampleRate) { - if (newSampleRate != sampleRate || buf == NULL) { - sampleRate = newSampleRate; - +void DelayReverb::open() { + if (buf == NULL) { delete[] buf; - // If we ever need a speedup, set bufSize to EXP2F(ceil(log2(bufSize))) and use & instead of % to find buf indexes - bufSize = 16384 * sampleRate / 32000; - buf = new float[bufSize]; + buf = new float[BUFFER_SIZE]; recalcParameters(); // mute buffer bufIx = 0; if (buf != NULL) { - for (unsigned int i = 0; i < bufSize; i++) { + for (unsigned int i = 0; i < BUFFER_SIZE; i++) { buf[i] = 0.0f; } } } - // FIXME: IIR filter value depends on sample rate as well } void DelayReverb::close() { @@ -92,59 +88,55 @@ void DelayReverb::setParameters(Bit8u newTime, Bit8u newLevel) { void DelayReverb::recalcParameters() { // Number of samples between impulse and eventual appearance on the left channel - delayLeft = REVERB_TIMINGS[time][0] * sampleRate / 32000; + delayLeft = REVERB_TIMINGS[time][0]; // Number of samples between impulse and eventual appearance on the right channel - delayRight = REVERB_TIMINGS[time][1] * sampleRate / 32000; + delayRight = REVERB_TIMINGS[time][1]; // Number of samples between a response and that response feeding back/echoing - delayFeedback = REVERB_TIMINGS[time][2] * sampleRate / 32000; + delayFeedback = REVERB_TIMINGS[time][2]; - if (time < 6) { - feedback = REVERB_FEEDBACK; + if (level < 3 || time < 6) { + feedback = REVERB_FEEDBACK / 256.0f; } else { - feedback = REVERB_FEEDBACK67; + feedback = REVERB_FEEDBACK67 / 256.0f; } - // Fading speed, i.e. amplitude ratio of neighbor responses - fade = REVERB_FADE[level]; + // Overall output amp + amp = (level == 0 && time == 0) ? 0.0f : REVERB_AMP[level] / 65536.0f; } void DelayReverb::process(const float *inLeft, const float *inRight, float *outLeft, float *outRight, unsigned long numSamples) { - if (buf == NULL) { - return; - } + if (buf == NULL) return; for (unsigned int sampleIx = 0; sampleIx < numSamples; sampleIx++) { // The ring buffer write index moves backwards; reads are all done with positive offsets. - Bit32u bufIxPrev = (bufIx + 1) % bufSize; - Bit32u bufIxLeft = (bufIx + delayLeft) % bufSize; - Bit32u bufIxRight = (bufIx + delayRight) % bufSize; - Bit32u bufIxFeedback = (bufIx + delayFeedback) % bufSize; + Bit32u bufIxPrev = (bufIx + 1) % BUFFER_SIZE; + Bit32u bufIxLeft = (bufIx + delayLeft) % BUFFER_SIZE; + Bit32u bufIxRight = (bufIx + delayRight) % BUFFER_SIZE; + Bit32u bufIxFeedback = (bufIx + delayFeedback) % BUFFER_SIZE; // Attenuated input samples and feedback response are directly added to the current ring buffer location - float sample = fade * (inLeft[sampleIx] + inRight[sampleIx]) + feedback * buf[bufIxFeedback]; + float lpfIn = amp * (inLeft[sampleIx] + inRight[sampleIx]) + feedback * buf[bufIxFeedback]; // Single-pole IIR filter found on real devices - buf[bufIx] = buf[bufIxPrev] + (sample - buf[bufIxPrev]) * LPF_VALUE; + buf[bufIx] = buf[bufIxPrev] * LPF_VALUE - lpfIn; outLeft[sampleIx] = buf[bufIxLeft]; outRight[sampleIx] = buf[bufIxRight]; - bufIx = (bufSize + bufIx - 1) % bufSize; + bufIx = (BUFFER_SIZE + bufIx - 1) % BUFFER_SIZE; } } bool DelayReverb::isActive() const { - // Quick hack: Return true iff all samples in the left buffer are the same and - // all samples in the right buffers are the same (within the sample output threshold). - if (buf == NULL) { - return false; - } - float last = buf[0] * 8192.0f; - for (unsigned int i = 1; i < bufSize; i++) { - float s = (buf[i] * 8192.0f); - if (fabs(s - last) > 1.0f) { - return true; - } + if (buf == NULL) return false; + + float *b = buf; + float max = 0.001f; + for (Bit32u i = 0; i < BUFFER_SIZE; i++) { + if ((*b < -max) || (*b > max)) return true; + b++; } return false; } + +} diff --git a/audio/softsynth/mt32/DelayReverb.h b/audio/softsynth/mt32/DelayReverb.h index 7c030fb839..1abb49f128 100644 --- a/audio/softsynth/mt32/DelayReverb.h +++ b/audio/softsynth/mt32/DelayReverb.h @@ -25,17 +25,14 @@ private: Bit8u time; Bit8u level; - unsigned int sampleRate; - Bit32u bufSize; Bit32u bufIx; - float *buf; Bit32u delayLeft; Bit32u delayRight; Bit32u delayFeedback; - float fade; + float amp; float feedback; void recalcParameters(); @@ -43,7 +40,7 @@ private: public: DelayReverb(); ~DelayReverb(); - void open(unsigned int sampleRate); + void open(); void close(); void setParameters(Bit8u time, Bit8u level); void process(const float *inLeft, const float *inRight, float *outLeft, float *outRight, unsigned long numSamples); diff --git a/audio/softsynth/mt32/FreeverbModel.cpp b/audio/softsynth/mt32/FreeverbModel.cpp index c11fa859d8..2ed302fddc 100644 --- a/audio/softsynth/mt32/FreeverbModel.cpp +++ b/audio/softsynth/mt32/FreeverbModel.cpp @@ -20,7 +20,7 @@ #include "freeverb.h" -using namespace MT32Emu; +namespace MT32Emu { FreeverbModel::FreeverbModel(float useScaleTuning, float useFiltVal, float useWet, Bit8u useRoom, float useDamp) { freeverb = NULL; @@ -35,9 +35,7 @@ FreeverbModel::~FreeverbModel() { delete freeverb; } -void FreeverbModel::open(unsigned int /*sampleRate*/) { - // FIXME: scaleTuning must be multiplied by sample rate to 32000Hz ratio - // IIR filter values depend on sample rate as well +void FreeverbModel::open() { if (freeverb == NULL) { freeverb = new revmodel(scaleTuning); } @@ -76,3 +74,5 @@ bool FreeverbModel::isActive() const { // FIXME: Not bothering to do this properly since we'll be replacing Freeverb soon... return false; } + +} diff --git a/audio/softsynth/mt32/FreeverbModel.h b/audio/softsynth/mt32/FreeverbModel.h index 925b2dbf96..bf1102b14a 100644 --- a/audio/softsynth/mt32/FreeverbModel.h +++ b/audio/softsynth/mt32/FreeverbModel.h @@ -32,7 +32,7 @@ class FreeverbModel : public ReverbModel { public: FreeverbModel(float useScaleTuning, float useFiltVal, float useWet, Bit8u useRoom, float useDamp); ~FreeverbModel(); - void open(unsigned int sampleRate); + void open(); void close(); void setParameters(Bit8u time, Bit8u level); void process(const float *inLeft, const float *inRight, float *outLeft, float *outRight, unsigned long numSamples); diff --git a/audio/softsynth/mt32/LA32Ramp.cpp b/audio/softsynth/mt32/LA32Ramp.cpp index 9f1f01c3c2..4e4d6b4f30 100644 --- a/audio/softsynth/mt32/LA32Ramp.cpp +++ b/audio/softsynth/mt32/LA32Ramp.cpp @@ -79,11 +79,12 @@ LA32Ramp::LA32Ramp() : void LA32Ramp::startRamp(Bit8u target, Bit8u increment) { // CONFIRMED: From sample analysis, this appears to be very accurate. - // FIXME: We could use a table for this in future if (increment == 0) { largeIncrement = 0; } else { - largeIncrement = (unsigned int)(EXP2F(((increment & 0x7F) + 24) / 8.0f) + 0.125f); + // Using integer argument here, no precision loss: + // (unsigned int)(EXP2F(((increment & 0x7F) + 24) / 8.0f) + 0.125f) + largeIncrement = (unsigned int)(EXP2I(((increment & 0x7F) + 24) << 9) + 0.125f); } descending = (increment & 0x80) != 0; if (descending) { diff --git a/audio/softsynth/mt32/Part.cpp b/audio/softsynth/mt32/Part.cpp index 75912f38a8..cd385898e1 100644 --- a/audio/softsynth/mt32/Part.cpp +++ b/audio/softsynth/mt32/Part.cpp @@ -68,18 +68,16 @@ Part::Part(Synth *useSynth, unsigned int usePartNum) { activePartialCount = 0; memset(patchCache, 0, sizeof(patchCache)); for (int i = 0; i < MT32EMU_MAX_POLY; i++) { - freePolys.push_front(new Poly(this)); + freePolys.prepend(new Poly(this)); } } Part::~Part() { - while (!activePolys.empty()) { - delete activePolys.front(); - activePolys.pop_front(); + while (!activePolys.isEmpty()) { + delete activePolys.takeFirst(); } - while (!freePolys.empty()) { - delete freePolys.front(); - freePolys.pop_front(); + while (!freePolys.isEmpty()) { + delete freePolys.takeFirst(); } } @@ -209,6 +207,7 @@ void RhythmPart::setTimbre(TimbreParam * /*timbre*/) { void Part::setTimbre(TimbreParam *timbre) { *timbreTemp = *timbre; + synth->newTimbreSet(partNum, timbre->common.name); } unsigned int RhythmPart::getAbsTimbreNum() const { @@ -245,8 +244,8 @@ void Part::backupCacheToPartials(PatchCache cache[4]) { // if so then duplicate the cached data from the part to the partial so that // we can change the part's cache without affecting the partial. // We delay this until now to avoid a copy operation with every note played - for (Common::List<Poly *>::iterator polyIt = activePolys.begin(); polyIt != activePolys.end(); polyIt++) { - (*polyIt)->backupCacheToPartials(cache); + for (Poly *poly = activePolys.getFirst(); poly != NULL; poly = poly->getNext()) { + poly->backupCacheToPartials(cache); } } @@ -445,8 +444,7 @@ void Part::abortPoly(Poly *poly) { } bool Part::abortFirstPoly(unsigned int key) { - for (Common::List<Poly *>::iterator polyIt = activePolys.begin(); polyIt != activePolys.end(); polyIt++) { - Poly *poly = *polyIt; + for (Poly *poly = activePolys.getFirst(); poly != NULL; poly = poly->getNext()) { if (poly->getKey() == key) { abortPoly(poly); return true; @@ -456,8 +454,7 @@ bool Part::abortFirstPoly(unsigned int key) { } bool Part::abortFirstPoly(PolyState polyState) { - for (Common::List<Poly *>::iterator polyIt = activePolys.begin(); polyIt != activePolys.end(); polyIt++) { - Poly *poly = *polyIt; + for (Poly *poly = activePolys.getFirst(); poly != NULL; poly = poly->getNext()) { if (poly->getState() == polyState) { abortPoly(poly); return true; @@ -474,10 +471,10 @@ bool Part::abortFirstPolyPreferHeld() { } bool Part::abortFirstPoly() { - if (activePolys.empty()) { + if (activePolys.isEmpty()) { return false; } - abortPoly(activePolys.front()); + abortPoly(activePolys.getFirst()); return true; } @@ -502,17 +499,16 @@ void Part::playPoly(const PatchCache cache[4], const MemParams::RhythmTemp *rhyt return; } - if (freePolys.empty()) { + if (freePolys.isEmpty()) { synth->printDebug("%s (%s): No free poly to play key %d (velocity %d)", name, currentInstr, midiKey, velocity); return; } - Poly *poly = freePolys.front(); - freePolys.pop_front(); + Poly *poly = freePolys.takeFirst(); if (patchTemp->patch.assignMode & 1) { // Priority to data first received - activePolys.push_front(poly); + activePolys.prepend(poly); } else { - activePolys.push_back(poly); + activePolys.append(poly); } Partial *partials[4]; @@ -537,16 +533,20 @@ void Part::playPoly(const PatchCache cache[4], const MemParams::RhythmTemp *rhyt #if MT32EMU_MONITOR_PARTIALS > 1 synth->printPartialUsage(); #endif + synth->partStateChanged(partNum, true); + synth->polyStateChanged(partNum); } void Part::allNotesOff() { // The MIDI specification states - and Mok confirms - that all notes off (0x7B) // should treat the hold pedal as usual. - for (Common::List<Poly *>::iterator polyIt = activePolys.begin(); polyIt != activePolys.end(); polyIt++) { - Poly *poly = *polyIt; - // FIXME: This has special handling of key 0 in NoteOff that Mok has not yet confirmed - // applies to AllNotesOff. - poly->noteOff(holdpedal); + for (Poly *poly = activePolys.getFirst(); poly != NULL; poly = poly->getNext()) { + // FIXME: This has special handling of key 0 in NoteOff that Mok has not yet confirmed applies to AllNotesOff. + // if (poly->canSustain() || poly->getKey() == 0) { + // FIXME: The real devices are found to be ignoring non-sustaining polys while processing AllNotesOff. Need to be confirmed. + if (poly->canSustain()) { + poly->noteOff(holdpedal); + } } } @@ -554,15 +554,13 @@ void Part::allSoundOff() { // MIDI "All sound off" (0x78) should release notes immediately regardless of the hold pedal. // This controller is not actually implemented by the synths, though (according to the docs and Mok) - // we're only using this method internally. - for (Common::List<Poly *>::iterator polyIt = activePolys.begin(); polyIt != activePolys.end(); polyIt++) { - Poly *poly = *polyIt; + for (Poly *poly = activePolys.getFirst(); poly != NULL; poly = poly->getNext()) { poly->startDecay(); } } void Part::stopPedalHold() { - for (Common::List<Poly *>::iterator polyIt = activePolys.begin(); polyIt != activePolys.end(); polyIt++) { - Poly *poly = *polyIt; + for (Poly *poly = activePolys.getFirst(); poly != NULL; poly = poly->getNext()) { poly->stopPedalHold(); } } @@ -580,8 +578,7 @@ void Part::stopNote(unsigned int key) { synth->printDebug("%s (%s): stopping key %d", name, currentInstr, key); #endif - for (Common::List<Poly *>::iterator polyIt = activePolys.begin(); polyIt != activePolys.end(); polyIt++) { - Poly *poly = *polyIt; + for (Poly *poly = activePolys.getFirst(); poly != NULL; poly = poly->getNext()) { // Generally, non-sustaining instruments ignore note off. They die away eventually anyway. // Key 0 (only used by special cases on rhythm part) reacts to note off even if non-sustaining or pedal held. if (poly->getKey() == key && (poly->canSustain() || key == 0)) { @@ -602,8 +599,7 @@ unsigned int Part::getActivePartialCount() const { unsigned int Part::getActiveNonReleasingPartialCount() const { unsigned int activeNonReleasingPartialCount = 0; - for (Common::List<Poly *>::const_iterator polyIt = activePolys.begin(); polyIt != activePolys.end(); polyIt++) { - Poly *poly = *polyIt; + for (Poly *poly = activePolys.getFirst(); poly != NULL; poly = poly->getNext()) { if (poly->getState() != POLY_Releasing) { activeNonReleasingPartialCount += poly->getActivePartialCount(); } @@ -615,7 +611,103 @@ void Part::partialDeactivated(Poly *poly) { activePartialCount--; if (!poly->isActive()) { activePolys.remove(poly); - freePolys.push_front(poly); + freePolys.prepend(poly); + synth->polyStateChanged(partNum); + } + if (activePartialCount == 0) { + synth->partStateChanged(partNum, false); + } +} + +//#define POLY_LIST_DEBUG + +PolyList::PolyList() : firstPoly(NULL), lastPoly(NULL) {} + +bool PolyList::isEmpty() const { +#ifdef POLY_LIST_DEBUG + if ((firstPoly == NULL || lastPoly == NULL) && firstPoly != lastPoly) { + printf("PolyList: desynchronised firstPoly & lastPoly pointers\n"); + } +#endif + return firstPoly == NULL && lastPoly == NULL; +} + +Poly *PolyList::getFirst() const { + return firstPoly; +} + +Poly *PolyList::getLast() const { + return lastPoly; +} + +void PolyList::prepend(Poly *poly) { +#ifdef POLY_LIST_DEBUG + if (poly->getNext() != NULL) { + printf("PolyList: Non-NULL next field in a Poly being prepended is ignored\n"); + } +#endif + poly->setNext(firstPoly); + firstPoly = poly; + if (lastPoly == NULL) { + lastPoly = poly; + } +} + +void PolyList::append(Poly *poly) { +#ifdef POLY_LIST_DEBUG + if (poly->getNext() != NULL) { + printf("PolyList: Non-NULL next field in a Poly being appended is ignored\n"); + } +#endif + poly->setNext(NULL); + if (lastPoly != NULL) { +#ifdef POLY_LIST_DEBUG + if (lastPoly->getNext() != NULL) { + printf("PolyList: Non-NULL next field in the lastPoly\n"); + } +#endif + lastPoly->setNext(poly); + } + lastPoly = poly; + if (firstPoly == NULL) { + firstPoly = poly; + } +} + +Poly *PolyList::takeFirst() { + Poly *oldFirst = firstPoly; + firstPoly = oldFirst->getNext(); + if (firstPoly == NULL) { +#ifdef POLY_LIST_DEBUG + if (lastPoly != oldFirst) { + printf("PolyList: firstPoly != lastPoly in a list with a single Poly\n"); + } +#endif + lastPoly = NULL; + } + oldFirst->setNext(NULL); + return oldFirst; +} + +void PolyList::remove(Poly * const polyToRemove) { + if (polyToRemove == firstPoly) { + takeFirst(); + return; + } + for (Poly *poly = firstPoly; poly != NULL; poly = poly->getNext()) { + if (poly->getNext() == polyToRemove) { + if (polyToRemove == lastPoly) { +#ifdef POLY_LIST_DEBUG + if (lastPoly->getNext() != NULL) { + printf("PolyList: Non-NULL next field in the lastPoly\n"); + } +#endif + lastPoly = poly; + } + poly->setNext(polyToRemove->getNext()); + polyToRemove->setNext(NULL); + break; + } } } diff --git a/audio/softsynth/mt32/Part.h b/audio/softsynth/mt32/Part.h index 5c59c6d61f..e5be41ff10 100644 --- a/audio/softsynth/mt32/Part.h +++ b/audio/softsynth/mt32/Part.h @@ -18,13 +18,27 @@ #ifndef MT32EMU_PART_H #define MT32EMU_PART_H -#include <common/list.h> - namespace MT32Emu { class PartialManager; class Synth; +class PolyList { +private: + Poly *firstPoly; + Poly *lastPoly; + +public: + PolyList(); + bool isEmpty() const; + Poly *getFirst() const; + Poly *getLast() const; + void prepend(Poly *poly); + void append(Poly *poly); + Poly *takeFirst(); + void remove(Poly * const poly); +}; + class Part { private: // Direct pointer to sysex-addressable memory dedicated to this part (valid for parts 1-8, NULL for rhythm) @@ -37,8 +51,8 @@ private: unsigned int activePartialCount; PatchCache patchCache[4]; - Common::List<Poly *> freePolys; - Common::List<Poly *> activePolys; + PolyList freePolys; + PolyList activePolys; void setPatch(const PatchParam *patch); unsigned int midiKeyToKey(unsigned int midiKey); diff --git a/audio/softsynth/mt32/Partial.cpp b/audio/softsynth/mt32/Partial.cpp index 03bec560b8..a4d1ab03fa 100644 --- a/audio/softsynth/mt32/Partial.cpp +++ b/audio/softsynth/mt32/Partial.cpp @@ -22,7 +22,7 @@ #include "mt32emu.h" #include "mmath.h" -using namespace MT32Emu; +namespace MT32Emu { #ifdef INACCURATE_SMOOTH_PAN // Mok wanted an option for smoother panning, and we love Mok. @@ -85,6 +85,7 @@ void Partial::deactivate() { pair->pair = NULL; } } + synth->partialStateChanged(this, tva->getPhase(), TVA_PHASE_DEAD); #if MT32EMU_MONITOR_PARTIALS > 2 synth->printDebug("[+%lu] [Partial %d] Deactivated", sampleNum, debugPartialNum); synth->printPartialUsage(sampleNum); @@ -133,6 +134,25 @@ void Partial::startPartial(const Part *part, Poly *usePoly, const PatchCache *us stereoVolume.leftVol = panVal / 7.0f; stereoVolume.rightVol = 1.0f - stereoVolume.leftVol; + // SEMI-CONFIRMED: From sample analysis: + // Found that timbres with 3 or 4 partials (i.e. one using two partial pairs) are mixed in two different ways. + // Either partial pairs are added or subtracted, it depends on how the partial pairs are allocated. + // It seems that partials are grouped into quarters and if the partial pairs are allocated in different quarters the subtraction happens. + // Though, this matters little for the majority of timbres, it becomes crucial for timbres which contain several partials that sound very close. + // In this case that timbre can sound totally different depending of the way it is mixed up. + // Most easily this effect can be displayed with the help of a special timbre consisting of several identical square wave partials (3 or 4). + // Say, it is 3-partial timbre. Just play any two notes simultaneously and the polys very probably are mixed differently. + // Moreover, the partial allocator retains the last partial assignment it did and all the subsequent notes will sound the same as the last released one. + // The situation is better with 4-partial timbres since then a whole quarter is assigned for each poly. However, if a 3-partial timbre broke the normal + // whole-quarter assignment or after some partials got aborted, even 4-partial timbres can be found sounding differently. + // This behaviour is also confirmed with two more special timbres: one with identical sawtooth partials, and one with PCM wave 02. + // For my personal taste, this behaviour rather enriches the sounding and should be emulated. + // Also, the current partial allocator model probably needs to be refined. + if (debugPartialNum & 8) { + stereoVolume.leftVol = -stereoVolume.leftVol; + stereoVolume.rightVol = -stereoVolume.rightVol; + } + if (patchCache->PCMPartial) { pcmNum = patchCache->pcm; if (synth->controlROMMap->pcmCount > 128) { @@ -149,7 +169,7 @@ void Partial::startPartial(const Part *part, Poly *usePoly, const PatchCache *us } // CONFIRMED: pulseWidthVal calculation is based on information from Mok - pulseWidthVal = (poly->getVelocity() - 64) * (patchCache->srcPartial.wg.pulseWidthVeloSensitivity - 7) + synth->tables.pulseWidth100To255[patchCache->srcPartial.wg.pulseWidth]; + pulseWidthVal = (poly->getVelocity() - 64) * (patchCache->srcPartial.wg.pulseWidthVeloSensitivity - 7) + Tables::getInstance().pulseWidth100To255[patchCache->srcPartial.wg.pulseWidth]; if (pulseWidthVal < 0) { pulseWidthVal = 0; } else if (pulseWidthVal > 255) { @@ -175,6 +195,7 @@ float Partial::getPCMSample(unsigned int position) { } unsigned long Partial::generateSamples(float *partialBuf, unsigned long length) { + const Tables &tables = Tables::getInstance(); if (!isActive() || alreadyOutputed) { return 0; } @@ -197,6 +218,9 @@ unsigned long Partial::generateSamples(float *partialBuf, unsigned long length) deactivate(); break; } + + Bit16u pitch = tvp->nextPitch(); + // SEMI-CONFIRMED: From sample analysis: // (1) Tested with a single partial playing PCM wave 77 with pitchCoarse 36 and no keyfollow, velocity follow, etc. // This gives results within +/- 2 at the output (before any DAC bitshifting) @@ -206,10 +230,17 @@ unsigned long Partial::generateSamples(float *partialBuf, unsigned long length) // positive amps, so negative still needs to be explored, as well as lower levels. // // Also still partially unconfirmed is the behaviour when ramping between levels, as well as the timing. + +#if MT32EMU_ACCURATE_WG == 1 float amp = EXP2F((32772 - ampRampVal / 2048) / -2048.0f); + float freq = EXP2F(pitch / 4096.0f - 16.0f) * SAMPLE_RATE; +#else + static const float ampFactor = EXP2F(32772 / -2048.0f); + float amp = EXP2I(ampRampVal >> 10) * ampFactor; - Bit16u pitch = tvp->nextPitch(); - float freq = synth->tables.pitchToFreq[pitch]; + static const float freqFactor = EXP2F(-16.0f) * SAMPLE_RATE; + float freq = EXP2I(pitch) * freqFactor; +#endif if (patchCache->PCMPartial) { // Render PCM waveform @@ -221,12 +252,18 @@ unsigned long Partial::generateSamples(float *partialBuf, unsigned long length) break; } Bit32u pcmAddr = pcmWave->addr; - float positionDelta = freq * 2048.0f / synth->myProp.sampleRate; + float positionDelta = freq * 2048.0f / SAMPLE_RATE; // Linear interpolation float firstSample = synth->pcmROMData[pcmAddr + intPCMPosition]; - float nextSample = getPCMSample(intPCMPosition + 1); - sample = firstSample + (nextSample - firstSample) * (pcmPosition - intPCMPosition); + // We observe that for partial structures with ring modulation the interpolation is not applied to the slave PCM partial. + // It's assumed that the multiplication circuitry intended to perform the interpolation on the slave PCM partial + // is borrowed by the ring modulation circuit (or the LA32 chip has a similar lack of resources assigned to each partial pair). + if (pair == NULL || mixType == 0 || structurePosition == 0) { + sample = firstSample + (getPCMSample(intPCMPosition + 1) - firstSample) * (pcmPosition - intPCMPosition); + } else { + sample = firstSample; + } float newPCMPosition = pcmPosition + positionDelta; if (pcmWave->loop) { @@ -247,8 +284,12 @@ unsigned long Partial::generateSamples(float *partialBuf, unsigned long length) // res corresponds to a value set in an LA32 register Bit8u res = patchCache->srcPartial.tvf.resonance + 1; - // EXP2F(1.0f - (32 - res) / 4.0f); - float resAmp = synth->tables.resAmpMax[res]; + float resAmp; + { + // resAmp = EXP2F(1.0f - (32 - res) / 4.0f); + static const float resAmpFactor = EXP2F(-7); + resAmp = EXP2I(res << 10) * resAmpFactor; + } // The cutoffModifier may not be supposed to be directly added to the cutoff - // it may for example need to be multiplied in some way. @@ -260,7 +301,7 @@ unsigned long Partial::generateSamples(float *partialBuf, unsigned long length) } // Wave length in samples - float waveLen = synth->myProp.sampleRate / freq; + float waveLen = SAMPLE_RATE / freq; // Init cosineLen float cosineLen = 0.5f * waveLen; @@ -268,7 +309,8 @@ unsigned long Partial::generateSamples(float *partialBuf, unsigned long length) #if MT32EMU_ACCURATE_WG == 1 cosineLen *= EXP2F((cutoffVal - 128.0f) / -16.0f); // found from sample analysis #else - cosineLen *= synth->tables.cutoffToCosineLen[Bit32u((cutoffVal - 128.0f) * 8.0f)]; + static const float cosineLenFactor = EXP2F(128.0f / -16.0f); + cosineLen *= EXP2I(Bit32u((256.0f - cutoffVal) * 256.0f)) * cosineLenFactor; #endif } @@ -279,23 +321,26 @@ unsigned long Partial::generateSamples(float *partialBuf, unsigned long length) relWavePos -= waveLen; } + // Ratio of positive segment to wave length float pulseLen = 0.5f; if (pulseWidthVal > 128) { - pulseLen += synth->tables.pulseLenFactor[pulseWidthVal - 128]; + // pulseLen = EXP2F((64 - pulseWidthVal) / 64); + static const float pulseLenFactor = EXP2F(-192 / 64); + pulseLen = EXP2I((256 - pulseWidthVal) << 6) * pulseLenFactor; } pulseLen *= waveLen; - float lLen = pulseLen - cosineLen; + float hLen = pulseLen - cosineLen; // Ignore pulsewidths too high for given freq - if (lLen < 0.0f) { - lLen = 0.0f; + if (hLen < 0.0f) { + hLen = 0.0f; } // Ignore pulsewidths too high for given freq and cutoff - float hLen = waveLen - lLen - 2 * cosineLen; - if (hLen < 0.0f) { - hLen = 0.0f; + float lLen = waveLen - hLen - 2 * cosineLen; + if (lLen < 0.0f) { + lLen = 0.0f; } // Correct resAmp for cutoff in range 50..66 @@ -303,7 +348,7 @@ unsigned long Partial::generateSamples(float *partialBuf, unsigned long length) #if MT32EMU_ACCURATE_WG == 1 resAmp *= sinf(FLOAT_PI * (cutoffVal - 128.0f) / 32.0f); #else - resAmp *= synth->tables.sinf10[Bit32u(64 * (cutoffVal - 128.0f))]; + resAmp *= tables.sinf10[Bit32u(64 * (cutoffVal - 128.0f))]; #endif } @@ -314,7 +359,7 @@ unsigned long Partial::generateSamples(float *partialBuf, unsigned long length) #if MT32EMU_ACCURATE_WG == 1 sample = -cosf(FLOAT_PI * relWavePos / cosineLen); #else - sample = -synth->tables.sinf10[Bit32u(2048.0f * relWavePos / cosineLen) + 1024]; + sample = -tables.sinf10[Bit32u(2048.0f * relWavePos / cosineLen) + 1024]; #endif } else @@ -328,7 +373,7 @@ unsigned long Partial::generateSamples(float *partialBuf, unsigned long length) #if MT32EMU_ACCURATE_WG == 1 sample = cosf(FLOAT_PI * (relWavePos - (cosineLen + hLen)) / cosineLen); #else - sample = synth->tables.sinf10[Bit32u(2048.0f * (relWavePos - (cosineLen + hLen)) / cosineLen) + 1024]; + sample = tables.sinf10[Bit32u(2048.0f * (relWavePos - (cosineLen + hLen)) / cosineLen) + 1024]; #endif } else { @@ -343,7 +388,8 @@ unsigned long Partial::generateSamples(float *partialBuf, unsigned long length) #if MT32EMU_ACCURATE_WG == 1 sample *= EXP2F(-0.125f * (128.0f - cutoffVal)); #else - sample *= synth->tables.cutoffToFilterAmp[Bit32u(cutoffVal * 8.0f)]; + static const float cutoffAttenuationFactor = EXP2F(-0.125f * 128.0f); + sample *= EXP2I(Bit32u(512.0f * cutoffVal)) * cutoffAttenuationFactor; #endif } else { @@ -363,11 +409,17 @@ unsigned long Partial::generateSamples(float *partialBuf, unsigned long length) #if MT32EMU_ACCURATE_WG == 1 resSample *= sinf(FLOAT_PI * relWavePos / cosineLen); #else - resSample *= synth->tables.sinf10[Bit32u(2048.0f * relWavePos / cosineLen) & 4095]; + resSample *= tables.sinf10[Bit32u(2048.0f * relWavePos / cosineLen) & 4095]; #endif // Resonance sine amp - float resAmpFade = EXP2F(-synth->tables.resAmpFadeFactor[res >> 2] * (relWavePos / cosineLen)); // seems to be exact + float resAmpFadeLog2 = -tables.resAmpFadeFactor[res >> 2] * (relWavePos / cosineLen); // seems to be exact +#if MT32EMU_ACCURATE_WG == 1 + float resAmpFade = EXP2F(resAmpFadeLog2); +#else + static const float resAmpFadeFactor = EXP2F(-30.0f); + float resAmpFade = (resAmpFadeLog2 < -30.0f) ? 0.0f : EXP2I(Bit32u((30.0f + resAmpFadeLog2) * 4096.0f)) * resAmpFadeFactor; +#endif // Now relWavePos set negative to the left from center of any cosine relWavePos = wavePos; @@ -388,7 +440,7 @@ unsigned long Partial::generateSamples(float *partialBuf, unsigned long length) #if MT32EMU_ACCURATE_WG == 1 resAmpFade *= 0.5f * (1.0f - cosf(FLOAT_PI * relWavePos / (0.5f * cosineLen))); #else - resAmpFade *= 0.5f * (1.0f + synth->tables.sinf10[Bit32s(2048.0f * relWavePos / (0.5f * cosineLen)) + 3072]); + resAmpFade *= 0.5f * (1.0f + tables.sinf10[Bit32s(2048.0f * relWavePos / (0.5f * cosineLen)) + 3072]); #endif } @@ -400,7 +452,7 @@ unsigned long Partial::generateSamples(float *partialBuf, unsigned long length) #if MT32EMU_ACCURATE_WG == 1 sample *= cosf(FLOAT_2PI * wavePos / waveLen); #else - sample *= synth->tables.sinf10[(Bit32u(4096.0f * wavePos / waveLen) & 4095) + 1024]; + sample *= tables.sinf10[(Bit32u(4096.0f * wavePos / waveLen) & 4095) + 1024]; #endif } @@ -516,10 +568,9 @@ bool Partial::produceOutput(float *leftBuf, float *rightBuf, unsigned long lengt } } if (numGenerated > pairNumGenerated) { - if (mixType == 1) { - mixBuffersRingMix(partialBuf + pairNumGenerated, NULL, numGenerated - pairNumGenerated); - } else { - mixBuffersRing(partialBuf + pairNumGenerated, NULL, numGenerated - pairNumGenerated); + if (mixType == 2) { + numGenerated = pairNumGenerated; + deactivate(); } } } @@ -555,3 +606,5 @@ void Partial::startDecayAll() { tvp->startDecay(); tvf->startDecay(); } + +} diff --git a/audio/softsynth/mt32/PartialManager.cpp b/audio/softsynth/mt32/PartialManager.cpp index 0a6be826d6..f8c2dbcd48 100644 --- a/audio/softsynth/mt32/PartialManager.cpp +++ b/audio/softsynth/mt32/PartialManager.cpp @@ -20,7 +20,7 @@ #include "mt32emu.h" #include "PartialManager.h" -using namespace MT32Emu; +namespace MT32Emu { PartialManager::PartialManager(Synth *useSynth, Part **useParts) { synth = useSynth; @@ -248,3 +248,5 @@ const Partial *PartialManager::getPartial(unsigned int partialNum) const { } return partialTable[partialNum]; } + +} diff --git a/audio/softsynth/mt32/Poly.cpp b/audio/softsynth/mt32/Poly.cpp index a2f00db73c..46e30c0f02 100644 --- a/audio/softsynth/mt32/Poly.cpp +++ b/audio/softsynth/mt32/Poly.cpp @@ -29,6 +29,7 @@ Poly::Poly(Part *usePart) { partials[i] = NULL; } state = POLY_Inactive; + next = NULL; } void Poly::reset(unsigned int newKey, unsigned int newVelocity, bool newSustain, Partial **newPartials) { @@ -58,6 +59,9 @@ bool Poly::noteOff(bool pedalHeld) { return false; } if (pedalHeld) { + if (state == POLY_Held) { + return false; + } state = POLY_Held; } else { startDecay(); @@ -171,4 +175,12 @@ void Poly::partialDeactivated(Partial *partial) { part->partialDeactivated(this); } +Poly *Poly::getNext() { + return next; +} + +void Poly::setNext(Poly *poly) { + next = poly; +} + } diff --git a/audio/softsynth/mt32/Poly.h b/audio/softsynth/mt32/Poly.h index cd15a776f5..e25b6d8993 100644 --- a/audio/softsynth/mt32/Poly.h +++ b/audio/softsynth/mt32/Poly.h @@ -41,6 +41,8 @@ private: Partial *partials[4]; + Poly *next; + public: Poly(Part *part); void reset(unsigned int key, unsigned int velocity, bool sustain, Partial **partials); @@ -60,6 +62,9 @@ public: bool isActive() const; void partialDeactivated(Partial *partial); + + Poly *getNext(); + void setNext(Poly *poly); }; } diff --git a/audio/softsynth/mt32/ROMInfo.cpp b/audio/softsynth/mt32/ROMInfo.cpp new file mode 100644 index 0000000000..514bc23496 --- /dev/null +++ b/audio/softsynth/mt32/ROMInfo.cpp @@ -0,0 +1,111 @@ +/* Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009 Dean Beeler, Jerome Fisher + * Copyright (C) 2011 Dean Beeler, Jerome Fisher, Sergey V. Mikayev + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +//#include <cstring> +#include "ROMInfo.h" + +namespace MT32Emu { + +// Known ROMs +static const ROMInfo CTRL_MT32_V1_04 = {65536, "5a5cb5a77d7d55ee69657c2f870416daed52dea7", ROMInfo::Control, "ctrl_mt32_1_04", "MT-32 Control v1.04", ROMInfo::Full, NULL, NULL}; +static const ROMInfo CTRL_MT32_V1_05 = {65536, "e17a3a6d265bf1fa150312061134293d2b58288c", ROMInfo::Control, "ctrl_mt32_1_05", "MT-32 Control v1.05", ROMInfo::Full, NULL, NULL}; +static const ROMInfo CTRL_MT32_V1_06 = {65536, "a553481f4e2794c10cfe597fef154eef0d8257de", ROMInfo::Control, "ctrl_mt32_1_06", "MT-32 Control v1.06", ROMInfo::Full, NULL, NULL}; +static const ROMInfo CTRL_MT32_V1_07 = {65536, "b083518fffb7f66b03c23b7eb4f868e62dc5a987", ROMInfo::Control, "ctrl_mt32_1_07", "MT-32 Control v1.07", ROMInfo::Full, NULL, NULL}; +static const ROMInfo CTRL_MT32_BLUER = {65536, "7b8c2a5ddb42fd0732e2f22b3340dcf5360edf92", ROMInfo::Control, "ctrl_mt32_bluer", "MT-32 Control BlueRidge", ROMInfo::Full, NULL, NULL}; + +static const ROMInfo CTRL_CM32L_V1_00 = {65536, "73683d585cd6948cc19547942ca0e14a0319456d", ROMInfo::Control, "ctrl_cm32l_1_00", "CM-32L/LAPC-I Control v1.00", ROMInfo::Full, NULL, NULL}; +static const ROMInfo CTRL_CM32L_V1_02 = {65536, "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", ROMInfo::Control, "ctrl_cm32l_1_02", "CM-32L/LAPC-I Control v1.02", ROMInfo::Full, NULL, NULL}; + +static const ROMInfo PCM_MT32 = {524288, "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", ROMInfo::PCM, "pcm_mt32", "MT-32 PCM ROM", ROMInfo::Full, NULL, NULL}; +static const ROMInfo PCM_CM32L = {1048576, "289cc298ad532b702461bfc738009d9ebe8025ea", ROMInfo::PCM, "pcm_cm32l", "CM-32L/CM-64/LAPC-I PCM ROM", ROMInfo::Full, NULL, NULL}; + +static const ROMInfo * const ROM_INFOS[] = { + &CTRL_MT32_V1_04, + &CTRL_MT32_V1_05, + &CTRL_MT32_V1_06, + &CTRL_MT32_V1_07, + &CTRL_MT32_BLUER, + &CTRL_CM32L_V1_00, + &CTRL_CM32L_V1_02, + &PCM_MT32, + &PCM_CM32L, + NULL}; + +const ROMInfo* ROMInfo::getROMInfo(Common::File *file) { + size_t fileSize = file->size(); + // We haven't added the SHA1 checksum code in ScummVM, as the file size + // suffices for our needs for now. + //const char *fileDigest = file->getSHA1(); + for (int i = 0; ROM_INFOS[i] != NULL; i++) { + const ROMInfo *romInfo = ROM_INFOS[i]; + if (fileSize == romInfo->fileSize /*&& !strcmp(fileDigest, romInfo->sha1Digest)*/) { + return romInfo; + } + } + return NULL; +} + +void ROMInfo::freeROMInfo(const ROMInfo *romInfo) { + (void) romInfo; +} + +static int getROMCount() { + int count; + for(count = 0; ROM_INFOS[count] != NULL; count++) { + } + return count; +} + +const ROMInfo** ROMInfo::getROMInfoList(unsigned int types, unsigned int pairTypes) { + const ROMInfo **romInfoList = new const ROMInfo*[getROMCount() + 1]; + const ROMInfo **currentROMInList = romInfoList; + for(int i = 0; ROM_INFOS[i] != NULL; i++) { + const ROMInfo *romInfo = ROM_INFOS[i]; + if ((types & (1 << romInfo->type)) && (pairTypes & (1 << romInfo->pairType))) { + *currentROMInList++ = romInfo; + } + } + *currentROMInList = NULL; + return romInfoList; +} + +void ROMInfo::freeROMInfoList(const ROMInfo **romInfoList) { + delete[] romInfoList; +} + +const ROMImage* ROMImage::makeROMImage(Common::File *file) { + ROMImage *romImage = new ROMImage; + romImage->file = file; + romImage->romInfo = ROMInfo::getROMInfo(romImage->file); + return romImage; +} + +void ROMImage::freeROMImage(const ROMImage *romImage) { + ROMInfo::freeROMInfo(romImage->romInfo); + delete romImage; +} + + +Common::File* ROMImage::getFile() const { + return file; +} + +const ROMInfo* ROMImage::getROMInfo() const { + return romInfo; +} + +} diff --git a/audio/softsynth/mt32/ROMInfo.h b/audio/softsynth/mt32/ROMInfo.h new file mode 100644 index 0000000000..2ffd2b72c6 --- /dev/null +++ b/audio/softsynth/mt32/ROMInfo.h @@ -0,0 +1,77 @@ +/* Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009 Dean Beeler, Jerome Fisher + * Copyright (C) 2011 Dean Beeler, Jerome Fisher, Sergey V. Mikayev + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef MT32EMU_ROMINFO_H +#define MT32EMU_ROMINFO_H + +//#include <cstddef> +#include "common/file.h" + +namespace MT32Emu { + +// Defines vital info about ROM file to be used by synth and applications + +struct ROMInfo { +public: + size_t fileSize; + const char *sha1Digest; + enum Type {PCM, Control, Reverb} type; + const char *shortName; + const char *description; + enum PairType {Full, FirstHalf, SecondHalf, Mux0, Mux1} pairType; + ROMInfo *pairROMInfo; + void *controlROMInfo; + + // Returns a ROMInfo struct by inspecting the size and the SHA1 hash + static const ROMInfo* getROMInfo(Common::File *file); + + // Currently no-op + static void freeROMInfo(const ROMInfo *romInfo); + + // Allows retrieving a NULL-terminated list of ROMInfos for a range of types and pairTypes + // (specified by bitmasks) + // Useful for GUI/console app to output information on what ROMs it supports + static const ROMInfo** getROMInfoList(unsigned int types, unsigned int pairTypes); + + // Frees the list of ROMInfos given + static void freeROMInfoList(const ROMInfo **romInfos); +}; + +// Synth::open() is to require a full control ROMImage and a full PCM ROMImage to work + +class ROMImage { +private: + Common::File *file; + const ROMInfo *romInfo; + +public: + + // Creates a ROMImage object given a ROMInfo and a File. Keeps a reference + // to the File and ROMInfo given, which must be freed separately by the user + // after the ROMImage is freed + static const ROMImage* makeROMImage(Common::File *file); + + // Must only be done after all Synths using the ROMImage are deleted + static void freeROMImage(const ROMImage *romImage); + + Common::File *getFile() const; + const ROMInfo *getROMInfo() const; +}; + +} + +#endif diff --git a/audio/softsynth/mt32/Synth.cpp b/audio/softsynth/mt32/Synth.cpp index 7a1b5c2275..7f4ba44999 100644 --- a/audio/softsynth/mt32/Synth.cpp +++ b/audio/softsynth/mt32/Synth.cpp @@ -27,8 +27,10 @@ #include "mmath.h" #include "PartialManager.h" -#if MT32EMU_USE_AREVERBMODEL == 1 +#if MT32EMU_USE_REVERBMODEL == 1 #include "AReverbModel.h" +#elif MT32EMU_USE_REVERBMODEL == 2 +#include "BReverbModel.h" #else #include "FreeverbModel.h" #endif @@ -36,7 +38,7 @@ namespace MT32Emu { -const ControlROMMap ControlROMMaps[7] = { +static const ControlROMMap ControlROMMaps[7] = { // ID IDc IDbytes PCMmap PCMc tmbrA tmbrAO, tmbrAC tmbrB tmbrBO, tmbrBC tmbrR trC rhythm rhyC rsrv panpot prog rhyMax patMax sysMax timMax {0x4014, 22, "\000 ver1.04 14 July 87 ", 0x3000, 128, 0x8000, 0x0000, false, 0xC000, 0x4000, false, 0x3200, 30, 0x73A6, 85, 0x57C7, 0x57E2, 0x57D0, 0x5252, 0x525E, 0x526E, 0x520A}, {0x4014, 22, "\000 ver1.05 06 Aug, 87 ", 0x3000, 128, 0x8000, 0x0000, false, 0xC000, 0x4000, false, 0x3200, 30, 0x7414, 85, 0x57C7, 0x57E2, 0x57D0, 0x5252, 0x525E, 0x526E, 0x520A}, @@ -140,22 +142,36 @@ Bit8u Synth::calcSysexChecksum(const Bit8u *data, Bit32u len, Bit8u checksum) { return checksum; } -Synth::Synth() { +Synth::Synth(ReportHandler *useReportHandler) { isOpen = false; reverbEnabled = true; reverbOverridden = false; -#if MT32EMU_USE_AREVERBMODEL == 1 - reverbModels[0] = new AReverbModel(&AReverbModel::REVERB_MODE_0_SETTINGS); - reverbModels[1] = new AReverbModel(&AReverbModel::REVERB_MODE_1_SETTINGS); - reverbModels[2] = new AReverbModel(&AReverbModel::REVERB_MODE_2_SETTINGS); + if (useReportHandler == NULL) { + reportHandler = new ReportHandler; + isDefaultReportHandler = true; + } else { + reportHandler = useReportHandler; + isDefaultReportHandler = false; + } + +#if MT32EMU_USE_REVERBMODEL == 1 + reverbModels[REVERB_MODE_ROOM] = new AReverbModel(REVERB_MODE_ROOM); + reverbModels[REVERB_MODE_HALL] = new AReverbModel(REVERB_MODE_HALL); + reverbModels[REVERB_MODE_PLATE] = new AReverbModel(REVERB_MODE_PLATE); + reverbModels[REVERB_MODE_TAP_DELAY] = new DelayReverb(); +#elif MT32EMU_USE_REVERBMODEL == 2 + reverbModels[REVERB_MODE_ROOM] = new BReverbModel(REVERB_MODE_ROOM); + reverbModels[REVERB_MODE_HALL] = new BReverbModel(REVERB_MODE_HALL); + reverbModels[REVERB_MODE_PLATE] = new BReverbModel(REVERB_MODE_PLATE); + reverbModels[REVERB_MODE_TAP_DELAY] = new BReverbModel(REVERB_MODE_TAP_DELAY); #else - reverbModels[0] = new FreeverbModel(0.76f, 0.687770909f, 0.63f, 0, 0.5f); - reverbModels[1] = new FreeverbModel(2.0f, 0.712025098f, 0.86f, 1, 0.5f); - reverbModels[2] = new FreeverbModel(0.4f, 0.939522749f, 0.38f, 2, 0.05f); + reverbModels[REVERB_MODE_ROOM] = new FreeverbModel(0.76f, 0.687770909f, 0.63f, 0, 0.5f); + reverbModels[REVERB_MODE_HALL] = new FreeverbModel(2.0f, 0.712025098f, 0.86f, 1, 0.5f); + reverbModels[REVERB_MODE_PLATE] = new FreeverbModel(0.4f, 0.939522749f, 0.38f, 2, 0.05f); + reverbModels[REVERB_MODE_TAP_DELAY] = new DelayReverb(); #endif - reverbModels[3] = new DelayReverb(); reverbModel = NULL; setDACInputMode(DACInputMode_NICE); setOutputGain(1.0f); @@ -170,31 +186,49 @@ Synth::~Synth() { for (int i = 0; i < 4; i++) { delete reverbModels[i]; } + if (isDefaultReportHandler) { + delete reportHandler; + } +} + +void ReportHandler::showLCDMessage(const char *data) { + printf("WRITE-LCD: %s", data); + printf("\n"); +} + +void ReportHandler::printDebug(const char *fmt, va_list list) { + vprintf(fmt, list); + printf("\n"); } -int Synth::report(ReportType type, const void *data) { - if (myProp.report != NULL) { - return myProp.report(myProp.userData, type, data); +void Synth::partStateChanged(int partNum, bool isPartActive) { + reportHandler->onPartStateChanged(partNum, isPartActive); +} + +void Synth::polyStateChanged(int partNum) { + reportHandler->onPolyStateChanged(partNum); +} + +void Synth::partialStateChanged(const Partial * const partial, int oldPartialPhase, int newPartialPhase) { + for (int i = 0; i < MT32EMU_MAX_PARTIALS; i++) { + if (getPartial(i) == partial) { + reportHandler->onPartialStateChanged(i, oldPartialPhase, newPartialPhase); + break; + } } - return 0; } -unsigned int Synth::getSampleRate() const { - return myProp.sampleRate; +void Synth::newTimbreSet(int partNum, char patchName[]) { + reportHandler->onProgramChanged(partNum, patchName); } void Synth::printDebug(const char *fmt, ...) { va_list ap; va_start(ap, fmt); - if (myProp.printDebug != NULL) { - myProp.printDebug(myProp.userData, fmt, ap); - } else { #if MT32EMU_DEBUG_SAMPLESTAMPS > 0 - printf("[%u] ", renderedSampleCount); + reportHandler->printDebug("[%u] ", renderedSampleCount); #endif - vprintf(fmt, ap); - printf("\n"); - } + reportHandler->printDebug(fmt, ap); va_end(ap); } @@ -244,80 +278,60 @@ void Synth::setReverbOutputGain(float newReverbOutputGain) { reverbOutputGain = newReverbOutputGain; } -Common::File *Synth::openFile(const char *filename) { - if (myProp.openFile != NULL) { - return myProp.openFile(myProp.userData, filename); - } - char pathBuf[2048]; - if (myProp.baseDir != NULL) { - strcpy(&pathBuf[0], myProp.baseDir); - strcat(&pathBuf[0], filename); - filename = pathBuf; - } - Common::File *file = new Common::File(); - if (!file->open(filename)) { - delete file; - return NULL; - } - return file; -} - -void Synth::closeFile(Common::File *file) { - if (myProp.closeFile != NULL) { - myProp.closeFile(myProp.userData, file); - } else { - file->close(); - delete file; - } -} - -LoadResult Synth::loadControlROM(const char *filename) { - Common::File *file = openFile(filename); // ROM File - if (file == NULL) { - return LoadResult_NotFound; - } - size_t fileSize = file->size(); - if (fileSize != CONTROL_ROM_SIZE) { - printDebug("Control ROM file %s size mismatch: %i", filename, fileSize); +bool Synth::loadControlROM(const ROMImage &controlROMImage) { + if (&controlROMImage == NULL) return false; + Common::File *file = controlROMImage.getFile(); + const ROMInfo *controlROMInfo = controlROMImage.getROMInfo(); + if ((controlROMInfo == NULL) + || (controlROMInfo->type != ROMInfo::Control) + || (controlROMInfo->pairType != ROMInfo::Full)) { + return false; } +#if MT32EMU_MONITOR_INIT + printDebug("Found Control ROM: %s, %s", controlROMInfo->shortName, controlROMInfo->description); +#endif file->read(controlROMData, CONTROL_ROM_SIZE); - if (file->err()) { - closeFile(file); - return LoadResult_Unreadable; - } - closeFile(file); // Control ROM successfully loaded, now check whether it's a known type controlROMMap = NULL; for (unsigned int i = 0; i < sizeof(ControlROMMaps) / sizeof(ControlROMMaps[0]); i++) { if (memcmp(&controlROMData[ControlROMMaps[i].idPos], ControlROMMaps[i].idBytes, ControlROMMaps[i].idLen) == 0) { controlROMMap = &ControlROMMaps[i]; - return LoadResult_OK; + return true; } } - printDebug("%s does not match a known control ROM type", filename); - return LoadResult_Invalid; +#if MT32EMU_MONITOR_INIT + printDebug("Control ROM failed to load"); +#endif + return false; } -LoadResult Synth::loadPCMROM(const char *filename) { - Common::File *file = openFile(filename); // ROM File - if (file == NULL) { - return LoadResult_NotFound; +bool Synth::loadPCMROM(const ROMImage &pcmROMImage) { + if (&pcmROMImage == NULL) return false; + Common::File *file = pcmROMImage.getFile(); + const ROMInfo *pcmROMInfo = pcmROMImage.getROMInfo(); + if ((pcmROMInfo == NULL) + || (pcmROMInfo->type != ROMInfo::PCM) + || (pcmROMInfo->pairType != ROMInfo::Full)) { + return false; } +#if MT32EMU_MONITOR_INIT + printDebug("Found PCM ROM: %s, %s", pcmROMInfo->shortName, pcmROMInfo->description); +#endif size_t fileSize = file->size(); - if (fileSize < (size_t)(2 * pcmROMSize)) { - printDebug("PCM ROM file is too short (expected %d, got %d)", 2 * pcmROMSize, fileSize); - closeFile(file); - return LoadResult_Invalid; - } - if (file->err()) { - closeFile(file); - return LoadResult_Unreadable; + if (fileSize != (2 * pcmROMSize)) { +#if MT32EMU_MONITOR_INIT + printDebug("PCM ROM file has wrong size (expected %d, got %d)", 2 * pcmROMSize, fileSize); +#endif + return false; } - LoadResult rc = LoadResult_OK; - for (int i = 0; i < pcmROMSize; i++) { - Bit8u s = file->readByte(); - Bit8u c = file->readByte(); + + byte *buffer = new byte[file->size()]; + file->read(buffer, file->size()); + const byte *fileData = buffer; + for (size_t i = 0; i < pcmROMSize; i++) { + Bit8u s = *(fileData++); + Bit8u c = *(fileData++); int order[16] = {0, 9, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 8}; @@ -343,16 +357,18 @@ LoadResult Synth::loadPCMROM(const char *filename) { pcmROMData[i] = lin; } - closeFile(file); - return rc; + + delete[] buffer; + + return true; } bool Synth::initPCMList(Bit16u mapAddress, Bit16u count) { ControlROMPCMStruct *tps = (ControlROMPCMStruct *)&controlROMData[mapAddress]; for (int i = 0; i < count; i++) { - int rAddr = tps[i].pos * 0x800; - int rLenExp = (tps[i].len & 0x70) >> 4; - int rLen = 0x800 << rLenExp; + size_t rAddr = tps[i].pos * 0x800; + size_t rLenExp = (tps[i].len & 0x70) >> 4; + size_t rLen = 0x800 << rLenExp; if (rAddr + rLen > pcmROMSize) { printDebug("Control ROM error: Wave map entry %d points to invalid PCM address 0x%04X, length 0x%04X", i, rAddr, rLen); return false; @@ -414,26 +430,19 @@ bool Synth::initTimbres(Bit16u mapAddress, Bit16u offset, int count, int startTi return true; } -bool Synth::open(SynthProperties &useProp) { +bool Synth::open(const ROMImage &controlROMImage, const ROMImage &pcmROMImage) { if (isOpen) { return false; } prerenderReadIx = prerenderWriteIx = 0; - myProp = useProp; #if MT32EMU_MONITOR_INIT printDebug("Initialising Constant Tables"); #endif - tables.init(); #if !MT32EMU_REDUCE_REVERB_MEMORY for (int i = 0; i < 4; i++) { reverbModels[i]->open(useProp.sampleRate); } #endif - if (useProp.baseDir != NULL) { - char *baseDirCopy = new char[strlen(useProp.baseDir) + 1]; - strcpy(baseDirCopy, useProp.baseDir); - myProp.baseDir = baseDirCopy; - } // This is to help detect bugs memset(&mt32ram, '?', sizeof(mt32ram)); @@ -441,12 +450,10 @@ bool Synth::open(SynthProperties &useProp) { #if MT32EMU_MONITOR_INIT printDebug("Loading Control ROM"); #endif - if (loadControlROM("CM32L_CONTROL.ROM") != LoadResult_OK) { - if (loadControlROM("MT32_CONTROL.ROM") != LoadResult_OK) { - printDebug("Init Error - Missing or invalid MT32_CONTROL.ROM"); - //report(ReportType_errorControlROM, &errno); - return false; - } + if (!loadControlROM(controlROMImage)) { + printDebug("Init Error - Missing or invalid Control ROM image"); + reportHandler->onErrorControlROM(); + return false; } initMemoryRegions(); @@ -460,12 +467,10 @@ bool Synth::open(SynthProperties &useProp) { #if MT32EMU_MONITOR_INIT printDebug("Loading PCM ROM"); #endif - if (loadPCMROM("CM32L_PCM.ROM") != LoadResult_OK) { - if (loadPCMROM("MT32_PCM.ROM") != LoadResult_OK) { - printDebug("Init Error - Missing MT32_PCM.ROM"); - //report(ReportType_errorPCMROM, &errno); - return false; - } + if (!loadPCMROM(pcmROMImage)) { + printDebug("Init Error - Missing PCM ROM image"); + reportHandler->onErrorPCMROM(); + return false; } #if MT32EMU_MONITOR_INIT @@ -594,9 +599,6 @@ void Synth::close() { parts[i] = NULL; } - delete[] myProp.baseDir; - myProp.baseDir = NULL; - delete[] pcmWaves; delete[] pcmROMData; @@ -627,6 +629,11 @@ void Synth::playMsg(Bit32u msg) { return; } playMsgOnPart(part, code, note, velocity); + + // This ensures minimum 1-sample delay between sequential MIDI events + // Without this, a sequence of NoteOn and immediately succeeding NoteOff messages is always silent + // Technically, it's also impossible to send events through the MIDI interface faster than about each millisecond + prerender(); } void Synth::playMsgOnPart(unsigned char part, unsigned char code, unsigned char note, unsigned char velocity) { @@ -1178,7 +1185,7 @@ void Synth::writeMemoryRegion(const MemoryRegion *region, Bit32u addr, Bit32u le case MR_System: region->write(0, off, data, len); - report(ReportType_devReconfig, NULL); + reportHandler->onDeviceReconfig(); // FIXME: We haven't properly confirmed any of this behaviour // In particular, we tend to reset things such as reverb even if the write contained // the same parameters as were already set, which may be wrong. @@ -1216,7 +1223,7 @@ void Synth::writeMemoryRegion(const MemoryRegion *region, Bit32u addr, Bit32u le #if MT32EMU_MONITOR_SYSEX > 0 printDebug("WRITE-LCD: %s", buf); #endif - report(ReportType_lcdMessage, buf); + reportHandler->showLCDMessage(buf); break; case MR_Reset: reset(); @@ -1244,9 +1251,9 @@ void Synth::refreshSystemReverbParameters() { #endif return; } - report(ReportType_newReverbMode, &mt32ram.system.reverbMode); - report(ReportType_newReverbTime, &mt32ram.system.reverbTime); - report(ReportType_newReverbLevel, &mt32ram.system.reverbLevel); + reportHandler->onNewReverbMode(mt32ram.system.reverbMode); + reportHandler->onNewReverbTime(mt32ram.system.reverbTime); + reportHandler->onNewReverbLevel(mt32ram.system.reverbLevel); ReverbModel *newReverbModel = reverbModels[mt32ram.system.reverbMode]; #if MT32EMU_REDUCE_REVERB_MEMORY @@ -1254,7 +1261,7 @@ void Synth::refreshSystemReverbParameters() { if (reverbModel != NULL) { reverbModel->close(); } - newReverbModel->open(myProp.sampleRate); + newReverbModel->open(); } #endif reverbModel = newReverbModel; @@ -1309,7 +1316,7 @@ void Synth::reset() { #if MT32EMU_MONITOR_SYSEX > 0 printDebug("RESET"); #endif - report(ReportType_devReset, NULL); + reportHandler->onDeviceReset(); partialManager->deactivateAll(); mt32ram = mt32default; for (int i = 0; i < 9; i++) { diff --git a/audio/softsynth/mt32/Synth.h b/audio/softsynth/mt32/Synth.h index ccabce7282..91375c0fc0 100644 --- a/audio/softsynth/mt32/Synth.h +++ b/audio/softsynth/mt32/Synth.h @@ -26,6 +26,7 @@ class TableInitialiser; class Partial; class PartialManager; class Part; +class ROMImage; /** * Methods for emulating the connection between the LA32 and the DAC, which involves @@ -57,71 +58,6 @@ enum DACInputMode { DACInputMode_GENERATION2 }; -enum ReportType { - // Errors - ReportType_errorControlROM = 1, - ReportType_errorPCMROM, - ReportType_errorSampleRate, - - // Progress - ReportType_progressInit, - - // HW spec - ReportType_availableSSE, - ReportType_available3DNow, - ReportType_usingSSE, - ReportType_using3DNow, - - // General info - ReportType_lcdMessage, - ReportType_devReset, - ReportType_devReconfig, - ReportType_newReverbMode, - ReportType_newReverbTime, - ReportType_newReverbLevel -}; - -enum LoadResult { - LoadResult_OK, - LoadResult_NotFound, - LoadResult_Unreadable, - LoadResult_Invalid -}; - -struct SynthProperties { - // Sample rate to use in mixing - unsigned int sampleRate; - - // Deprecated - ignored. Use Synth::setReverbEnabled() instead. - bool useReverb; - // Deprecated - ignored. Use Synth::setReverbOverridden() instead. - bool useDefaultReverb; - // Deprecated - ignored. Use Synth::playSysex*() to configure reverb instead. - unsigned char reverbType; - // Deprecated - ignored. Use Synth::playSysex*() to configure reverb instead. - unsigned char reverbTime; - // Deprecated - ignored. Use Synth::playSysex*() to configure reverb instead. - unsigned char reverbLevel; - // The name of the directory in which the ROM and data files are stored (with trailing slash/backslash) - // Not used if "openFile" is set. May be NULL in any case. - const char *baseDir; - // This is used as the first argument to all callbacks - void *userData; - // Callback for reporting various errors and information. May be NULL - int (*report)(void *userData, ReportType type, const void *reportData); - // Callback for debug messages, in vprintf() format - void (*printDebug)(void *userData, const char *fmt, va_list list); - // Callback for providing an implementation of File, opened and ready for use - // May be NULL, in which case a default implementation will be used. - Common::File *(*openFile)(void *userData, const char *filename); - // Callback for closing a File. May be NULL, in which case the File will automatically be close()d/deleted. - void (*closeFile)(void *userData, Common::File *file); -}; - -// This is the specification of the Callback routine used when calling the RecalcWaveforms -// function -typedef void (*recalcStatusCallback)(int percDone); - typedef void (*FloatToBit16sFunc)(Bit16s *target, const float *source, Bit32u len, float outputGain); const Bit8u SYSEX_MANUFACTURER_ROLAND = 0x41; @@ -179,6 +115,13 @@ enum MemoryRegionType { MR_PatchTemp, MR_RhythmTemp, MR_TimbreTemp, MR_Patches, MR_Timbres, MR_System, MR_Display, MR_Reset }; +enum ReverbMode { + REVERB_MODE_ROOM, + REVERB_MODE_HALL, + REVERB_MODE_PLATE, + REVERB_MODE_TAP_DELAY +}; + class MemoryRegion { private: Synth *synth; @@ -278,7 +221,7 @@ class ReverbModel { public: virtual ~ReverbModel() {} // After construction or a close(), open() will be called at least once before any other call (with the exception of close()). - virtual void open(unsigned int sampleRate) = 0; + virtual void open() = 0; // May be called multiple times without an open() in between. virtual void close() = 0; virtual void setParameters(Bit8u time, Bit8u level) = 0; @@ -286,6 +229,32 @@ public: virtual bool isActive() const = 0; }; +class ReportHandler { +friend class Synth; + +public: + virtual ~ReportHandler() {} + +protected: + + // Callback for debug messages, in vprintf() format + virtual void printDebug(const char *fmt, va_list list); + + // Callbacks for reporting various errors and information + virtual void onErrorControlROM() {} + virtual void onErrorPCMROM() {} + virtual void showLCDMessage(const char *message); + virtual void onDeviceReset() {} + virtual void onDeviceReconfig() {} + virtual void onNewReverbMode(Bit8u /* mode */) {} + virtual void onNewReverbTime(Bit8u /* time */) {} + virtual void onNewReverbLevel(Bit8u /* level */) {} + virtual void onPartStateChanged(int /* partNum */, bool /* isActive */) {} + virtual void onPolyStateChanged(int /* partNum */) {} + virtual void onPartialStateChanged(int /* partialNum */, int /* oldPartialPhase */, int /* newPartialPhase */) {} + virtual void onProgramChanged(int /* partNum */, char * /* patchName */) {} +}; + class Synth { friend class Part; friend class RhythmPart; @@ -315,13 +284,12 @@ private: const ControlROMMap *controlROMMap; Bit8u controlROMData[CONTROL_ROM_SIZE]; float *pcmROMData; - int pcmROMSize; // This is in 16-bit samples, therefore half the number of bytes in the ROM + size_t pcmROMSize; // This is in 16-bit samples, therefore half the number of bytes in the ROM Bit8s chantable[32]; Bit32u renderedSampleCount; - Tables tables; MemParams mt32ram, mt32default; @@ -337,6 +305,9 @@ private: bool isOpen; + bool isDefaultReportHandler; + ReportHandler *reportHandler; + PartialManager *partialManager; Part *parts[9]; @@ -369,8 +340,6 @@ private: int prerenderReadIx; int prerenderWriteIx; - SynthProperties myProp; - bool prerender(); void copyPrerender(Bit16s *nonReverbLeft, Bit16s *nonReverbRight, Bit16s *reverbDryLeft, Bit16s *reverbDryRight, Bit16s *reverbWetLeft, Bit16s *reverbWetRight, Bit32u pos, Bit32u len); void checkPrerender(Bit16s *nonReverbLeft, Bit16s *nonReverbRight, Bit16s *reverbDryLeft, Bit16s *reverbDryRight, Bit16s *reverbWetLeft, Bit16s *reverbWetRight, Bit32u &pos, Bit32u &len); @@ -384,8 +353,8 @@ private: void writeMemoryRegion(const MemoryRegion *region, Bit32u addr, Bit32u len, const Bit8u *data); void readMemoryRegion(const MemoryRegion *region, Bit32u addr, Bit32u len, Bit8u *data); - LoadResult loadControlROM(const char *filename); - LoadResult loadPCMROM(const char *filename); + bool loadControlROM(const ROMImage &controlROMImage); + bool loadPCMROM(const ROMImage &pcmROMImage); bool initPCMList(Bit16u mapAddress, Bit16u count); bool initTimbres(Bit16u mapAddress, Bit16u offset, int timbreCount, int startTimbre, bool compressed); @@ -399,24 +368,25 @@ private: void refreshSystem(); void reset(); - unsigned int getSampleRate() const; - void printPartialUsage(unsigned long sampleOffset = 0); -protected: - int report(ReportType type, const void *reportData); - Common::File *openFile(const char *filename); - void closeFile(Common::File *file); + + void partStateChanged(int partNum, bool isPartActive); + void polyStateChanged(int partNum); + void partialStateChanged(const Partial * const partial, int oldPartialPhase, int newPartialPhase); + void newTimbreSet(int partNum, char patchName[]); void printDebug(const char *fmt, ...); public: static Bit8u calcSysexChecksum(const Bit8u *data, Bit32u len, Bit8u checksum); - Synth(); + // Optionally sets callbacks for reporting various errors, information and debug messages + Synth(ReportHandler *useReportHandler = NULL); ~Synth(); // Used to initialise the MT-32. Must be called before any other function. // Returns true if initialization was sucessful, otherwise returns false. - bool open(SynthProperties &useProp); + // controlROMImage and pcmROMImage represent Control and PCM ROM images for use by synth. + bool open(const ROMImage &controlROMImage, const ROMImage &pcmROMImage); // Closes the MT-32 and deallocates any memory used by the synthesizer void close(void); diff --git a/audio/softsynth/mt32/TVA.cpp b/audio/softsynth/mt32/TVA.cpp index f3e3f7bbc7..19a01cfc73 100644 --- a/audio/softsynth/mt32/TVA.cpp +++ b/audio/softsynth/mt32/TVA.cpp @@ -30,10 +30,13 @@ namespace MT32Emu { static Bit8u biasLevelToAmpSubtractionCoeff[13] = {255, 187, 137, 100, 74, 54, 40, 29, 21, 15, 10, 5, 0}; TVA::TVA(const Partial *usePartial, LA32Ramp *useAmpRamp) : - partial(usePartial), ampRamp(useAmpRamp), system_(&usePartial->getSynth()->mt32ram.system) { + partial(usePartial), ampRamp(useAmpRamp), system_(&usePartial->getSynth()->mt32ram.system), phase(TVA_PHASE_DEAD) { } void TVA::startRamp(Bit8u newTarget, Bit8u newIncrement, int newPhase) { + if (newPhase != phase) { + partial->getSynth()->partialStateChanged(partial, phase, newPhase); + } target = newTarget; phase = newPhase; ampRamp->startRamp(newTarget, newIncrement); @@ -43,6 +46,9 @@ void TVA::startRamp(Bit8u newTarget, Bit8u newIncrement, int newPhase) { } void TVA::end(int newPhase) { + if (newPhase != phase) { + partial->getSynth()->partialStateChanged(partial, phase, newPhase); + } phase = newPhase; playing = false; #if MT32EMU_MONITOR_TVA >= 1 @@ -154,7 +160,7 @@ void TVA::reset(const Part *newPart, const TimbreParam::PartialParam *newPartial playing = true; - Tables *tables = &partial->getSynth()->tables; + const Tables *tables = &Tables::getInstance(); int key = partial->getPoly()->getKey(); int velocity = partial->getPoly()->getVelocity(); @@ -215,7 +221,7 @@ void TVA::recalcSustain() { return; } // We're sustaining. Recalculate all the values - Tables *tables = &partial->getSynth()->tables; + const Tables *tables = &Tables::getInstance(); int newTarget = calcBasicAmp(tables, partial, system_, partialParam, patchTemp, rhythmTemp, biasAmpSubtraction, veloAmpSubtraction, part->getExpression()); newTarget += partialParam->tva.envLevel[3]; // Since we're in TVA_PHASE_SUSTAIN at this point, we know that target has been reached and an interrupt fired, so we can rely on it being the current amp. @@ -241,7 +247,7 @@ int TVA::getPhase() const { } void TVA::nextPhase() { - Tables *tables = &partial->getSynth()->tables; + const Tables *tables = &Tables::getInstance(); if (phase >= TVA_PHASE_DEAD || !playing) { partial->getSynth()->printDebug("TVA::nextPhase(): Shouldn't have got here with phase %d, playing=%s", phase, playing ? "true" : "false"); @@ -274,7 +280,7 @@ void TVA::nextPhase() { } int newTarget; - int newIncrement = 0; + int newIncrement = 0; // Initialised to please compilers int envPointIndex = phase; if (!allLevelsZeroFromNowOn) { diff --git a/audio/softsynth/mt32/TVF.cpp b/audio/softsynth/mt32/TVF.cpp index 80b592ea67..47c4917632 100644 --- a/audio/softsynth/mt32/TVF.cpp +++ b/audio/softsynth/mt32/TVF.cpp @@ -117,7 +117,7 @@ void TVF::reset(const TimbreParam::PartialParam *newPartialParam, unsigned int b unsigned int key = partial->getPoly()->getKey(); unsigned int velocity = partial->getPoly()->getVelocity(); - Tables *tables = &partial->getSynth()->tables; + const Tables *tables = &Tables::getInstance(); baseCutoff = calcBaseCutoff(newPartialParam, basePitch, key); #if MT32EMU_MONITOR_TVF >= 1 @@ -179,7 +179,7 @@ void TVF::startDecay() { } void TVF::nextPhase() { - Tables *tables = &partial->getSynth()->tables; + const Tables *tables = &Tables::getInstance(); int newPhase = phase + 1; switch (newPhase) { diff --git a/audio/softsynth/mt32/TVP.cpp b/audio/softsynth/mt32/TVP.cpp index 0b339e8d71..5dc4ca6b66 100644 --- a/audio/softsynth/mt32/TVP.cpp +++ b/audio/softsynth/mt32/TVP.cpp @@ -47,12 +47,11 @@ static Bit16u keyToPitchTable[] = { TVP::TVP(const Partial *usePartial) : partial(usePartial), system_(&usePartial->getSynth()->mt32ram.system) { - unsigned int sampleRate = usePartial->getSynth()->myProp.sampleRate; // We want to do processing 4000 times per second. FIXME: This is pretty arbitrary. - maxCounter = sampleRate / 4000; + maxCounter = SAMPLE_RATE / 4000; // The timer runs at 500kHz. We only need to bother updating it every maxCounter samples, before we do processing. // This is how much to increment it by every maxCounter samples. - processTimerIncrement = 500000 * maxCounter / sampleRate; + processTimerIncrement = 500000 * maxCounter / SAMPLE_RATE; } static Bit16s keyToPitch(unsigned int key) { @@ -171,9 +170,14 @@ void TVP::updatePitch() { if (newPitch < 0) { newPitch = 0; } + +// Note: Temporary #ifdef until we have proper "quirk" configuration +// This is about right emulation of MT-32 GEN0 quirk exploited in Colonel's Bequest timbre "Lightning" +#ifndef MT32EMU_QUIRK_PITCH_ENVELOPE_OVERFLOW_MT32 if (newPitch > 59392) { newPitch = 59392; } +#endif pitch = (Bit16u)newPitch; // FIXME: We're doing this here because that's what the CM-32L does - we should probably move this somewhere more appropriate in future. diff --git a/audio/softsynth/mt32/Tables.cpp b/audio/softsynth/mt32/Tables.cpp index c9bd40b7a4..5353a74079 100644 --- a/audio/softsynth/mt32/Tables.cpp +++ b/audio/softsynth/mt32/Tables.cpp @@ -22,18 +22,14 @@ #include "mt32emu.h" #include "mmath.h" -using namespace MT32Emu; +namespace MT32Emu { -Tables::Tables() { - initialised = false; +const Tables &Tables::getInstance() { + static const Tables instance; + return instance; } -void Tables::init() { - if (initialised) { - return; - } - initialised = true; - +Tables::Tables() { int lf; for (lf = 0; lf <= 100; lf++) { // CONFIRMED:KG: This matches a ROM table found by Mok @@ -76,31 +72,9 @@ void Tables::init() { //synth->printDebug("%d: %d", i, pulseWidth100To255[i]); } - // Ratio of negative segment to wave length - for (int i = 0; i < 128; i++) { - // Formula determined from sample analysis. - float pt = 0.5f / 127.0f * i; - pulseLenFactor[i] = (1.241857812f - pt) * pt; // seems to be 2 ^ (5 / 16) = 1.241857812f - } - - for (int i = 0; i < 65536; i++) { - // Aka (slightly slower): EXP2F(pitchVal / 4096.0f - 16.0f) * 32000.0f - pitchToFreq[i] = EXP2F(i / 4096.0f - 1.034215715f); - } - - // found from sample analysis - for (int i = 0; i < 1024; i++) { - cutoffToCosineLen[i] = EXP2F(i / -128.0f); - } - - // found from sample analysis - for (int i = 0; i < 1024; i++) { - cutoffToFilterAmp[i] = EXP2F(-0.125f * (128.0f - i / 8.0f)); - } - - // found from sample analysis - for (int i = 0; i < 32; i++) { - resAmpMax[i] = EXP2F(1.0f - (32 - i) / 4.0f); + // The LA32 chip presumably has such a table inside as the internal computaions seem to be performed using fixed point math with 12-bit fractions + for (int i = 0; i < 4096; i++) { + exp2[i] = EXP2F(i / 4096.0f); } // found from sample analysis @@ -117,3 +91,5 @@ void Tables::init() { sinf10[i] = sin(FLOAT_PI * i / 2048.0f); } } + +} diff --git a/audio/softsynth/mt32/Tables.h b/audio/softsynth/mt32/Tables.h index a2b5ff5d56..c3e80e7e9b 100644 --- a/audio/softsynth/mt32/Tables.h +++ b/audio/softsynth/mt32/Tables.h @@ -20,14 +20,23 @@ namespace MT32Emu { +// Sample rate to use in mixing. With the progress of development, we've found way too many thing dependent. +// In order to achieve further advance in emulation accuracy, sample rate made fixed throughout the emulator. +// The output from the synth is supposed to be resampled to convert the sample rate. +const unsigned int SAMPLE_RATE = 32000; + const int MIDDLEC = 60; class Synth; class Tables { - bool initialised; +private: + Tables(); + Tables(Tables &); public: + static const Tables &getInstance(); + // Constant LUTs // CONFIRMED: This is used to convert several parameters to amp-modifying values in the TVA envelope: @@ -47,16 +56,9 @@ public: // CONFIRMED: Bit8u pulseWidth100To255[101]; - float pulseLenFactor[128]; - float pitchToFreq[65536]; - float cutoffToCosineLen[1024]; - float cutoffToFilterAmp[1024]; - float resAmpMax[32]; + float exp2[4096]; float resAmpFadeFactor[8]; float sinf10[5120]; - - Tables(); - void init(); }; } diff --git a/audio/softsynth/mt32/mmath.h b/audio/softsynth/mt32/mmath.h index 226d73e27e..25c79d57a9 100644 --- a/audio/softsynth/mt32/mmath.h +++ b/audio/softsynth/mt32/mmath.h @@ -52,6 +52,10 @@ static inline float EXP2F(float x) { #endif } +static inline float EXP2I(unsigned int i) { + return float(1 << (i >> 12)) * Tables::getInstance().exp2[i & 0x0FFF]; +} + static inline float EXP10F(float x) { return exp(FLOAT_LN_10 * x); } diff --git a/audio/softsynth/mt32/module.mk b/audio/softsynth/mt32/module.mk index 995e450076..ed6b0d33ed 100644 --- a/audio/softsynth/mt32/module.mk +++ b/audio/softsynth/mt32/module.mk @@ -2,6 +2,7 @@ MODULE := audio/softsynth/mt32 MODULE_OBJS := \ AReverbModel.o \ + BReverbModel.o \ DelayReverb.o \ FreeverbModel.o \ LA32Ramp.o \ @@ -9,6 +10,7 @@ MODULE_OBJS := \ Partial.o \ PartialManager.o \ Poly.o \ + ROMInfo.o \ Synth.o \ TVA.o \ TVF.o \ diff --git a/audio/softsynth/mt32/mt32emu.h b/audio/softsynth/mt32/mt32emu.h index 091819b95c..ae5f4955b1 100644 --- a/audio/softsynth/mt32/mt32emu.h +++ b/audio/softsynth/mt32/mt32emu.h @@ -59,13 +59,18 @@ #define MT32EMU_MONITOR_TVA 0 #define MT32EMU_MONITOR_TVF 0 - -// 0: Use LUTs to speedup WG -// 1: Use precise float math +// The WG algorithm involves dozens of transcendent maths, e.g. exponents and trigonometry. +// Unfortunately, the majority of systems perform such computations inefficiently, +// standard math libs and FPUs make no optimisations for single precision floats, +// and use no LUTs to speedup computing internal taylor series. Though, there're rare exceptions, +// and there's a hope it will become common soon. +// So, this is the crucial point of speed optimisations. We have now eliminated all the transcendent maths +// within the critical path and use LUTs instead. +// Besides, since the LA32 chip is assumed to use similar LUTs inside, the overall emulation accuracy should be better. +// 0: Use LUTs to speedup WG. Most common setting. You can expect about 50% performance boost. +// 1: Use precise float math. Use this setting to achieve more accurate wave generator. If your system performs better with this setting, it is really notable. :) #define MT32EMU_ACCURATE_WG 0 -#define MT32EMU_USE_EXTINT 0 - // Configuration // The maximum number of partials playing simultaneously #define MT32EMU_MAX_PARTIALS 32 @@ -77,9 +82,10 @@ // If zero, keeps reverb buffers for all modes around all the time to avoid allocating/freeing in the critical path. #define MT32EMU_REDUCE_REVERB_MEMORY 1 -// 0: Use standard Freeverb -// 1: Use AReverb (currently not properly tuned) -#define MT32EMU_USE_AREVERBMODEL 0 +// 0: Use legacy Freeverb +// 1: Use Accurate Reverb model aka AReverb +// 2: Use Bit-perfect Boss Reverb model aka BReverb (for developers, not much practical use) +#define MT32EMU_USE_REVERBMODEL 1 namespace MT32Emu { @@ -109,6 +115,7 @@ const unsigned int MAX_PRERENDER_SAMPLES = 1024; #include "TVF.h" #include "Partial.h" #include "Part.h" +#include "ROMInfo.h" #include "Synth.h" #endif diff --git a/audio/softsynth/opl/dosbox.cpp b/audio/softsynth/opl/dosbox.cpp index e039845b8f..a1a736f9de 100644 --- a/audio/softsynth/opl/dosbox.cpp +++ b/audio/softsynth/opl/dosbox.cpp @@ -247,7 +247,7 @@ byte OPL::read(int port) { } void OPL::writeReg(int r, int v) { - byte tempReg = 0; + int tempReg = 0; switch (_type) { case Config::kOpl2: case Config::kDualOpl2: @@ -257,12 +257,27 @@ void OPL::writeReg(int r, int v) { // Backup old setup register tempReg = _reg.normal; - // We need to set the register we want to write to via port 0x388 - write(0x388, r); - // Do the real writing to the register - write(0x389, v); + // We directly allow writing to secondary OPL3 registers by using + // register values >= 0x100. + if (_type == Config::kOpl3 && r >= 0x100) { + // We need to set the register we want to write to via port 0x222, + // since we want to write to the secondary register set. + write(0x222, r); + // Do the real writing to the register + write(0x223, v); + } else { + // We need to set the register we want to write to via port 0x388 + write(0x388, r); + // Do the real writing to the register + write(0x389, v); + } + // Restore the old register - write(0x388, tempReg); + if (_type == Config::kOpl3 && tempReg >= 0x100) { + write(0x222, tempReg & ~0x100); + } else { + write(0x388, tempReg); + } break; }; } diff --git a/audio/softsynth/opl/mame.cpp b/audio/softsynth/opl/mame.cpp index c54f620a10..2db7d421b6 100644 --- a/audio/softsynth/opl/mame.cpp +++ b/audio/softsynth/opl/mame.cpp @@ -223,7 +223,7 @@ static int *ENV_CURVE; /* multiple table */ -#define ML(a) (int)(a * 2) +#define ML(a) (uint)(a * 2) static const uint MUL_TABLE[16]= { /* 1/2, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15 */ ML(0.50), ML(1.00), ML(2.00), ML(3.00), ML(4.00), ML(5.00), ML(6.00), ML(7.00), diff --git a/audio/softsynth/sid.cpp b/audio/softsynth/sid.cpp index 1ad822b86a..b6f1c87c4b 100644 --- a/audio/softsynth/sid.cpp +++ b/audio/softsynth/sid.cpp @@ -512,7 +512,7 @@ void Filter::enable_filter(bool enable) { enabled = enable; } -void Filter::reset(){ +void Filter::reset() { fc = 0; res = 0; diff --git a/backends/fs/ds/ds-fs.h b/backends/fs/ds/ds-fs.h index a6a6b97870..862f4c39d2 100644 --- a/backends/fs/ds/ds-fs.h +++ b/backends/fs/ds/ds-fs.h @@ -226,6 +226,6 @@ void std_clearerr(FILE *handle); int std_fflush(FILE *handle); int std_ferror(FILE *handle); -} // End of namespace DS +} // End of namespace DS #endif //_DS_FS_H diff --git a/backends/graphics/opengl/gltexture.cpp b/backends/graphics/opengl/gltexture.cpp index ce69dc4aab..ca674563df 100644 --- a/backends/graphics/opengl/gltexture.cpp +++ b/backends/graphics/opengl/gltexture.cpp @@ -108,9 +108,18 @@ void GLTexture::allocBuffer(GLuint w, GLuint h) { _realWidth = w; _realHeight = h; - if (w <= _textureWidth && h <= _textureHeight && !_refresh) - // Already allocated a sufficiently large buffer - return; + if (!_refresh) { + if (npot_supported && _filter == GL_LINEAR) { + // Check if we already allocated a correctly-sized buffer + // This is so we don't need to duplicate the last row/column + if (w == _textureWidth && h == _textureHeight) + return; + } else { + // Check if we already have a large enough buffer + if (w <= _textureWidth && h <= _textureHeight) + return; + } + } if (npot_supported) { _textureWidth = w; @@ -151,12 +160,37 @@ void GLTexture::updateBuffer(const void *buf, int pitch, GLuint x, GLuint y, GLu } else { // Update the texture row by row const byte *src = (const byte *)buf; + GLuint curY = y; + GLuint height = h; do { - glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, + glTexSubImage2D(GL_TEXTURE_2D, 0, x, curY, w, 1, _glFormat, _glType, src); CHECK_GL_ERROR(); - ++y; + curY++; src += pitch; - } while (--h); + } while (--height); + } + + // If we're in linear filter mode, repeat the last row/column if the real dimensions + // doesn't match the texture dimensions. + if (_filter == GL_LINEAR) { + if (_realWidth != _textureWidth && x + w == _realWidth) { + const byte *src = (const byte *)buf + (w - 1) * _bytesPerPixel; + GLuint curY = y; + GLuint height = h; + + do { + glTexSubImage2D(GL_TEXTURE_2D, 0, x + w, + curY, 1, 1, _glFormat, _glType, src); CHECK_GL_ERROR(); + + curY++; + src += pitch; + } while (--height); + } + + if (_realHeight != _textureHeight && y + h == _realHeight) { + glTexSubImage2D(GL_TEXTURE_2D, 0, x, y + h, + w, 1, _glFormat, _glType, (const byte *)buf + pitch * (h - 1)); CHECK_GL_ERROR(); + } } } @@ -177,10 +211,10 @@ void GLTexture::drawTexture(GLshort x, GLshort y, GLshort w, GLshort h) { // Calculate the screen rect where the texture will be drawn const GLshort vertices[] = { - x, y, - x + w, y, - x, y + h, - x + w, y + h, + x, y, + (GLshort)(x + w), y, + x, (GLshort)(y + h), + (GLshort)(x + w), (GLshort)(y + h), }; glVertexPointer(2, GL_SHORT, 0, vertices); CHECK_GL_ERROR(); diff --git a/backends/graphics/openglsdl/openglsdl-graphics.cpp b/backends/graphics/openglsdl/openglsdl-graphics.cpp index fed02ef22e..c5605cae87 100644 --- a/backends/graphics/openglsdl/openglsdl-graphics.cpp +++ b/backends/graphics/openglsdl/openglsdl-graphics.cpp @@ -460,6 +460,10 @@ void OpenGLSdlGraphicsManager::toggleFullScreen(int loop) { _activeFullscreenMode = -2; setFullscreenMode(!isFullscreen); } + + // HACK: We need to force a refresh here, since we change the + // fullscreen mode. + _transactionDetails.needRefresh = true; endGFXTransaction(); // Ignore resize events for the next 10 frames diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp index fb964d6951..02e58ab319 100644 --- a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp +++ b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp @@ -968,7 +968,7 @@ void SurfaceSdlGraphicsManager::internUpdateScreen() { // If the shake position changed, fill the dirty area with blackness if (_currentShakePos != _newShakePos || (_mouseNeedsRedraw && _mouseBackup.y <= _currentShakePos)) { - SDL_Rect blackrect = {0, 0, _videoMode.screenWidth * _videoMode.scaleFactor, _newShakePos * _videoMode.scaleFactor}; + SDL_Rect blackrect = {0, 0, (Uint16)(_videoMode.screenWidth * _videoMode.scaleFactor), (Uint16)(_newShakePos * _videoMode.scaleFactor)}; if (_videoMode.aspectRatioCorrection && !_overlayVisible) blackrect.h = real2Aspect(blackrect.h - 1) + 1; diff --git a/backends/midi/coreaudio.cpp b/backends/midi/coreaudio.cpp index 94262d0d92..e42b8ca313 100644 --- a/backends/midi/coreaudio.cpp +++ b/backends/midi/coreaudio.cpp @@ -102,6 +102,7 @@ public: void sysEx(const byte *msg, uint16 length); private: + void loadSoundFont(const char *soundfont); AUGraph _auGraph; AudioUnit _synth; }; @@ -171,52 +172,8 @@ int MidiDriver_CORE::open() { #endif // Load custom soundfont, if specified - if (ConfMan.hasKey("soundfont")) { - const char *soundfont = ConfMan.get("soundfont").c_str(); - - // TODO: We should really check whether the file contains an - // actual soundfont... - -#if USE_DEPRECATED_COREAUDIO_API - // Before 10.5, we need to use kMusicDeviceProperty_SoundBankFSSpec - FSRef fsref; - FSSpec fsSpec; - err = FSPathMakeRef ((const byte *)soundfont, &fsref, NULL); - - if (err == noErr) { - err = FSGetCatalogInfo (&fsref, kFSCatInfoNone, NULL, NULL, &fsSpec, NULL); - } - - if (err == noErr) { - err = AudioUnitSetProperty ( - _synth, - kMusicDeviceProperty_SoundBankFSSpec, kAudioUnitScope_Global, - 0, - &fsSpec, sizeof(fsSpec) - ); - } -#else - // kMusicDeviceProperty_SoundBankFSSpec is present on 10.6+, but broken - // kMusicDeviceProperty_SoundBankURL was added in 10.5 as a replacement - CFURLRef url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, (const UInt8 *)soundfont, strlen(soundfont), false); - - if (url) { - err = AudioUnitSetProperty ( - _synth, - kMusicDeviceProperty_SoundBankURL, kAudioUnitScope_Global, - 0, - &url, sizeof(url) - ); - - CFRelease(url); - } else { - warning("Failed to allocate CFURLRef from '%s'", soundfont); - } -#endif - - if (err != noErr) - error("Failed loading custom sound font '%s' (error %ld)", soundfont, (long)err); - } + if (ConfMan.hasKey("soundfont")) + loadSoundFont(ConfMan.get("soundfont").c_str()); #ifdef COREAUDIO_DISABLE_REVERB // Disable reverb mode, as that sucks up a lot of CPU power, which can @@ -242,6 +199,74 @@ bail: return MERR_CANNOT_CONNECT; } +void MidiDriver_CORE::loadSoundFont(const char *soundfont) { + // TODO: We should really check whether the file contains an + // actual soundfont... + + OSStatus err = 0; + +#if USE_DEPRECATED_COREAUDIO_API + FSRef fsref; + err = FSPathMakeRef((const byte *)soundfont, &fsref, NULL); + + SInt32 version; + err = Gestalt(gestaltSystemVersion, &version); + + if (err == noErr) { + if (version >= 0x1030) { + // Use kMusicDeviceProperty_SoundBankFSRef in >= 10.3 + + // HACK HACK HACK HACK SUPER HACK: Using the value of 1012 instead of + // kMusicDeviceProperty_SoundBankFSRef so this compiles with the 10.2 + // SDK (which does not have that symbol). + if (err == noErr) { + err = AudioUnitSetProperty( + _synth, + /*kMusicDeviceProperty_SoundBankFSRef*/ 1012, kAudioUnitScope_Global, + 0, + &fsref, sizeof(fsref) + ); + } + } else { + // In 10.2, only kMusicDeviceProperty_SoundBankFSSpec is available + FSSpec fsSpec; + + if (err == noErr) + err = FSGetCatalogInfo(&fsref, kFSCatInfoNone, NULL, NULL, &fsSpec, NULL); + + if (err == noErr) { + err = AudioUnitSetProperty( + _synth, + kMusicDeviceProperty_SoundBankFSSpec, kAudioUnitScope_Global, + 0, + &fsSpec, sizeof(fsSpec) + ); + } + } + } +#else + // kMusicDeviceProperty_SoundBankURL was added in 10.5 as a replacement + // In addition, the File Manager API became deprecated starting in 10.8 + CFURLRef url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, (const UInt8 *)soundfont, strlen(soundfont), false); + + if (url) { + err = AudioUnitSetProperty( + _synth, + kMusicDeviceProperty_SoundBankURL, kAudioUnitScope_Global, + 0, + &url, sizeof(url) + ); + + CFRelease(url); + } else { + warning("Failed to allocate CFURLRef from '%s'", soundfont); + } +#endif // USE_DEPRECATED_COREAUDIO_API + + if (err != noErr) + error("Failed loading custom sound font '%s' (error %ld)", soundfont, (long)err); +} + void MidiDriver_CORE::close() { MidiDriver_MPU401::close(); if (_auGraph) { diff --git a/backends/midi/seq.cpp b/backends/midi/seq.cpp index 4efad9ceae..d48b80c40b 100644 --- a/backends/midi/seq.cpp +++ b/backends/midi/seq.cpp @@ -90,9 +90,9 @@ int MidiDriver_SEQ::open() { if ((device_name == NULL) || (device < 0)) { if (device_name == NULL) - warning("Opening /dev/null (no music will be heard) "); + warning("Opening /dev/null (no music will be heard)"); else - warning("Cannot open rawmidi device %s - using /dev/null (no music will be heard) ", + warning("Cannot open rawmidi device %s - using /dev/null (no music will be heard)", device_name); device = (::open(("/dev/null"), O_RDWR, 0)); if (device < 0) @@ -145,7 +145,7 @@ void MidiDriver_SEQ::send(uint32 b) { buf[position++] = 0; break; default: - warning("MidiDriver_SEQ::send: unknown : %08x", (int)b); + warning("MidiDriver_SEQ::send: unknown: %08x", (int)b); break; } if (write(device, buf, position) == -1) diff --git a/backends/mixer/sdl/sdl-mixer.cpp b/backends/mixer/sdl/sdl-mixer.cpp index 001309a777..3c79290b50 100644 --- a/backends/mixer/sdl/sdl-mixer.cpp +++ b/backends/mixer/sdl/sdl-mixer.cpp @@ -153,7 +153,7 @@ void SdlMixerManager::suspendAudio() { int SdlMixerManager::resumeAudio() { if (!_audioSuspended) return -2; - if (SDL_OpenAudio(&_obtained, NULL) < 0){ + if (SDL_OpenAudio(&_obtained, NULL) < 0) { return -1; } SDL_PauseAudio(0); diff --git a/backends/platform/android/android.mk b/backends/platform/android/android.mk index 0651fc796e..f498c671de 100644 --- a/backends/platform/android/android.mk +++ b/backends/platform/android/android.mk @@ -50,7 +50,7 @@ JAVACFLAGS = -source 1.5 -target 1.5 ANDROID_JAR = $(ANDROID_SDK)/platforms/android-14/android.jar -PATH_BUILD = build.tmp +PATH_BUILD = ./build.tmp PATH_BUILD_ASSETS = $(PATH_BUILD)/assets PATH_BUILD_CLASSES_MAIN_TOP = $(PATH_BUILD)/classes.main PATH_BUILD_CLASSES_PLUGIN_TOP = $(PATH_BUILD)/classes.plugin @@ -128,7 +128,7 @@ $(FILE_RESOURCES_MAIN): $(FILE_MANIFEST) $(RESOURCES) $(ANDROID_JAR) $(DIST_FILE work_dir=`pwd`; \ for i in $(PATH_BUILD_ASSETS)/*.zip; do \ echo "recompress $$i"; \ - cd $$work_dir; \ + cd "$$work_dir"; \ $(RM) -rf $(PATH_BUILD_ASSETS)/tmp; \ $(MKDIR) $(PATH_BUILD_ASSETS)/tmp; \ unzip -q $$i -d $(PATH_BUILD_ASSETS)/tmp; \ diff --git a/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java b/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java index 34c6df3a3a..829a948435 100644 --- a/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java +++ b/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java @@ -160,7 +160,6 @@ public class ScummVMActivity extends Activity { "ScummVM", "--config=" + getFileStreamPath("scummvmrc").getPath(), "--path=" + Environment.getExternalStorageDirectory().getPath(), - "--gui-theme=scummmodern", "--savepath=" + savePath }); diff --git a/backends/platform/ds/arm9/source/blitters.cpp b/backends/platform/ds/arm9/source/blitters.cpp index 1e8d56615d..ef2dc9c3b8 100644 --- a/backends/platform/ds/arm9/source/blitters.cpp +++ b/backends/platform/ds/arm9/source/blitters.cpp @@ -391,4 +391,4 @@ void Rescale_320x256x1555_To_256x256x1555(u16 *dest, const u16 *src, int destStr } } -} // End of namespace DS +} // End of namespace DS diff --git a/backends/platform/ds/arm9/source/blitters.h b/backends/platform/ds/arm9/source/blitters.h index 7700b4d68d..de6e218778 100644 --- a/backends/platform/ds/arm9/source/blitters.h +++ b/backends/platform/ds/arm9/source/blitters.h @@ -35,7 +35,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 +} // End of namespace DS #else diff --git a/backends/platform/ds/arm9/source/cdaudio.cpp b/backends/platform/ds/arm9/source/cdaudio.cpp index 6612e0f2da..277e1f4ae7 100644 --- a/backends/platform/ds/arm9/source/cdaudio.cpp +++ b/backends/platform/ds/arm9/source/cdaudio.cpp @@ -536,4 +536,4 @@ bool isPlaying() { } } -} // End of namespace DS +} // End of namespace DS diff --git a/backends/platform/ds/arm9/source/cdaudio.h b/backends/platform/ds/arm9/source/cdaudio.h index fc16f2f220..8a0e0c5174 100644 --- a/backends/platform/ds/arm9/source/cdaudio.h +++ b/backends/platform/ds/arm9/source/cdaudio.h @@ -38,6 +38,6 @@ bool isPlaying(); void update(); } -} // End of namespace DS +} // End of namespace DS #endif diff --git a/backends/platform/ds/arm9/source/dsmain.cpp b/backends/platform/ds/arm9/source/dsmain.cpp index cedbdcb167..830c782b90 100644 --- a/backends/platform/ds/arm9/source/dsmain.cpp +++ b/backends/platform/ds/arm9/source/dsmain.cpp @@ -3225,7 +3225,7 @@ int main(void) { return 0; } -} // End of namespace DS +} // End of namespace DS int main() { diff --git a/backends/platform/ds/arm9/source/dsmain.h b/backends/platform/ds/arm9/source/dsmain.h index 9c0d326292..ad49ae276d 100644 --- a/backends/platform/ds/arm9/source/dsmain.h +++ b/backends/platform/ds/arm9/source/dsmain.h @@ -153,7 +153,7 @@ void* fastRamAlloc(int size); void exitGame(); -} // End of namespace DS +} // End of namespace DS diff --git a/backends/platform/ds/arm9/source/dsoptions.cpp b/backends/platform/ds/arm9/source/dsoptions.cpp index 7154d4ae3f..ac552bd826 100644 --- a/backends/platform/ds/arm9/source/dsoptions.cpp +++ b/backends/platform/ds/arm9/source/dsoptions.cpp @@ -432,4 +432,4 @@ void setOptions() { firstLoad = false; } -} // End of namespace DS +} // End of namespace DS diff --git a/backends/platform/ds/arm9/source/dsoptions.h b/backends/platform/ds/arm9/source/dsoptions.h index 9148060f4b..9949b8b7d2 100644 --- a/backends/platform/ds/arm9/source/dsoptions.h +++ b/backends/platform/ds/arm9/source/dsoptions.h @@ -78,6 +78,6 @@ protected: extern void showOptionsDialog(); extern void setOptions(); -} // End of namespace DS +} // End of namespace DS #endif diff --git a/backends/platform/ds/arm9/source/keys.cpp b/backends/platform/ds/arm9/source/keys.cpp index aec7d57bda..fdb981dfe5 100644 --- a/backends/platform/ds/arm9/source/keys.cpp +++ b/backends/platform/ds/arm9/source/keys.cpp @@ -133,4 +133,4 @@ uint32 keysUp(void) { } -} // End of 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 71c770dcd5..9d6b41c746 100644 --- a/backends/platform/ds/arm9/source/keys.h +++ b/backends/platform/ds/arm9/source/keys.h @@ -30,4 +30,4 @@ uint32 keysDownRepeat(void); void keysSetRepeat(u8 setDelay, u8 setRepeat); uint32 keysUp(void); -} // End of namespace DS +} // End of namespace DS diff --git a/backends/platform/ds/arm9/source/scummhelp.cpp b/backends/platform/ds/arm9/source/scummhelp.cpp index 112ba49d76..a3fdaacfaa 100644 --- a/backends/platform/ds/arm9/source/scummhelp.cpp +++ b/backends/platform/ds/arm9/source/scummhelp.cpp @@ -91,7 +91,7 @@ void updateStrings(byte gameId, byte version, Common::Platform platform, } -} // End of namespace DS +} // End of namespace DS diff --git a/backends/platform/ds/arm9/source/scummhelp.h b/backends/platform/ds/arm9/source/scummhelp.h index 2735727560..41fc8f9c91 100644 --- a/backends/platform/ds/arm9/source/scummhelp.h +++ b/backends/platform/ds/arm9/source/scummhelp.h @@ -31,7 +31,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 +} // End of namespace DS #endif diff --git a/backends/platform/ds/arm9/source/touchkeyboard.cpp b/backends/platform/ds/arm9/source/touchkeyboard.cpp index 581509f939..77da9cc22a 100644 --- a/backends/platform/ds/arm9/source/touchkeyboard.cpp +++ b/backends/platform/ds/arm9/source/touchkeyboard.cpp @@ -585,4 +585,4 @@ void addKeyboardEvents() { } -} // End of namespace DS +} // End of namespace DS diff --git a/backends/platform/ds/arm9/source/touchkeyboard.h b/backends/platform/ds/arm9/source/touchkeyboard.h index ae056e84da..dc20601023 100644 --- a/backends/platform/ds/arm9/source/touchkeyboard.h +++ b/backends/platform/ds/arm9/source/touchkeyboard.h @@ -46,6 +46,6 @@ void clearAutoComplete(); void setCharactersEntered(int count); void releaseAllKeys(); -} // End of namespace DS +} // End of namespace DS #endif diff --git a/backends/platform/ds/arm9/source/wordcompletion.cpp b/backends/platform/ds/arm9/source/wordcompletion.cpp index 5f3b80c474..51f93df7ff 100644 --- a/backends/platform/ds/arm9/source/wordcompletion.cpp +++ b/backends/platform/ds/arm9/source/wordcompletion.cpp @@ -198,6 +198,6 @@ bool findWordCompletions(const char *input) { } -} // End of namespace DS +} // End of namespace DS #endif diff --git a/backends/platform/ds/arm9/source/wordcompletion.h b/backends/platform/ds/arm9/source/wordcompletion.h index 3d352f657a..c355d29293 100644 --- a/backends/platform/ds/arm9/source/wordcompletion.h +++ b/backends/platform/ds/arm9/source/wordcompletion.h @@ -27,4 +27,4 @@ extern bool findWordCompletions(const char *input); extern void addAutoCompleteLine(const char *line); extern void sortAutoCompleteWordList(); -} // End of namespace DS +} // End of namespace DS diff --git a/backends/platform/iphone/osys_main.cpp b/backends/platform/iphone/osys_main.cpp index f9b2a81ce6..ed2c886213 100644 --- a/backends/platform/iphone/osys_main.cpp +++ b/backends/platform/iphone/osys_main.cpp @@ -65,6 +65,10 @@ OSystem_IPHONE::OSystem_IPHONE() : _touchpadModeEnabled = !iPhone_isHighResDevice(); _fsFactory = new POSIXFilesystemFactory(); initVideoContext(); + + memset(_gamePalette, 0, sizeof(_gamePalette)); + memset(_gamePaletteRGBA5551, 0, sizeof(_gamePaletteRGBA5551)); + memset(_mouseCursorPalette, 0, sizeof(_mouseCursorPalette)); } OSystem_IPHONE::~OSystem_IPHONE() { diff --git a/backends/platform/iphone/osys_video.mm b/backends/platform/iphone/osys_video.mm index ebe435cb25..a11bf32c54 100644 --- a/backends/platform/iphone/osys_video.mm +++ b/backends/platform/iphone/osys_video.mm @@ -148,6 +148,11 @@ void OSystem_IPHONE::setPalette(const byte *colors, uint start, uint num) { } dirtyFullScreen(); + + // Automatically update the mouse texture when the palette changes while the + // cursor palette is disabled. + if (!_mouseCursorPaletteEnabled && _mouseBuffer.format.bytesPerPixel == 1) + _mouseDirty = _mouseNeedTextureUpdate = true; } void OSystem_IPHONE::grabPalette(byte *colors, uint start, uint num) { diff --git a/backends/platform/n64/osys_n64.h b/backends/platform/n64/osys_n64.h index 249f72d8fc..bc6b3cb1a5 100644 --- a/backends/platform/n64/osys_n64.h +++ b/backends/platform/n64/osys_n64.h @@ -104,9 +104,7 @@ protected: bool _cursorPaletteDisabled; bool _dirtyPalette; - // FIXME: This must be left as "int" for now, to fix the sign-comparison problem - // there is a little more work involved than an int->uint change - int _cursorWidth, _cursorHeight; + uint _cursorWidth, _cursorHeight; int _cursorKeycolor; diff --git a/backends/platform/n64/osys_n64_base.cpp b/backends/platform/n64/osys_n64_base.cpp index 7d6f8f0b5c..1e2aca9e51 100644 --- a/backends/platform/n64/osys_n64_base.cpp +++ b/backends/platform/n64/osys_n64_base.cpp @@ -100,8 +100,8 @@ OSystem_N64::OSystem_N64() { _cursor_pal = NULL; _cursor_hic = NULL; - _cursorWidth = -1; - _cursorHeight = -1; + _cursorWidth = 0; + _cursorHeight = 0; _cursorKeycolor = -1; _mouseHotspotX = _mouseHotspotY = -1; @@ -575,19 +575,20 @@ void OSystem_N64::updateScreen() { horiz_pix_skip = skip_pixels; } - int mX = _mouseX - _mouseHotspotX; - int mY = _mouseY - _mouseHotspotY; + for (uint h = 0; h < _cursorHeight; h++) { + for (uint w = 0; w < _cursorWidth; w++) { + int posX = (_mouseX - _mouseHotspotX) + w; + int posY = (_mouseY - _mouseHotspotY) + h; - for (int h = 0; h < _cursorHeight; h++) - for (int w = 0; w < _cursorWidth; w++) { // Draw pixel - if (((mY + h) >= 0) && ((mY + h) < _mouseMaxY) && ((mX + w) >= 0) && ((mX + w) < _mouseMaxX)) { + if ((posY >= 0) && (posY < _mouseMaxY) && (posX >= 0) && (posX < _mouseMaxX)) { uint16 cursor_pixel_hic = _cursor_hic[(h * _cursorWidth) + w]; if (!(cursor_pixel_hic & 0x00001)) - mouse_framebuffer[((mY + h) * _frameBufferWidth) + ((mX + w) + _offscrPixels + horiz_pix_skip)] = cursor_pixel_hic; + mouse_framebuffer[(posY * _frameBufferWidth) + (posX + _offscrPixels + horiz_pix_skip)] = cursor_pixel_hic; } } + } } #ifndef _ENABLE_DEBUG_ @@ -724,7 +725,7 @@ void OSystem_N64::copyRectToOverlay(const void *buf, int pitch, int x, int y, in uint16 *dst = _overlayBuffer + (y * _overlayWidth + x); - if (_overlayWidth == w && pitch == _overlayWidth * sizeof(uint16)) { + if (_overlayWidth == (uint16)w && (uint16)pitch == _overlayWidth * sizeof(uint16)) { memcpy(dst, src, h * pitch); } else { do { diff --git a/backends/platform/ps2/Gs2dScreen.cpp b/backends/platform/ps2/Gs2dScreen.cpp index f93166ef67..e818305c29 100644 --- a/backends/platform/ps2/Gs2dScreen.cpp +++ b/backends/platform/ps2/Gs2dScreen.cpp @@ -102,8 +102,7 @@ int vblankEndHandler(int cause) { void createAnimThread(Gs2dScreen *screen); -Gs2dScreen::Gs2dScreen(uint16 width, uint16 height, TVMode tvMode) { - +Gs2dScreen::Gs2dScreen(uint16 width, uint16 height, TVMode mode) { _systemQuit = false; ee_sema_t newSema; newSema.init_count = 1; @@ -118,7 +117,7 @@ Gs2dScreen::Gs2dScreen(uint16 width, uint16 height, TVMode tvMode) { _vblankStartId = AddIntcHandler(INT_VBLANK_START, vblankStartHandler, 0); _vblankEndId = AddIntcHandler(INT_VBLANK_END, vblankEndHandler, 0); - _dmacId = AddDmacHandler(2, dmacHandler, 0); + _dmacId = AddDmacHandler(2, dmacHandler, 0); _dmaPipe = new DmaPipe(0x2000); @@ -139,7 +138,7 @@ Gs2dScreen::Gs2dScreen(uint16 width, uint16 height, TVMode tvMode) { _clut[1] = GS_RGBA(0xC0, 0xC0, 0xC0, 0); clearOverlay(); - if (tvMode == TV_DONT_CARE) { + if (mode == TV_DONT_CARE) { #if 1 char romver[8]; int fd = fioOpen("rom0:ROMVER", O_RDONLY); @@ -157,12 +156,12 @@ Gs2dScreen::Gs2dScreen(uint16 width, uint16 height, TVMode tvMode) { _tvMode = TV_NTSC; #endif } else - _tvMode = tvMode; + _tvMode = mode; // _tvMode = TV_NTSC; printf("Setting up %s mode\n", (_tvMode == TV_PAL) ? "PAL" : "NTSC"); - // set screen size, 640x512 for pal, 640x448 for ntsc + // set screen size, 640x512 for pal, 640x448 for ntsc _tvWidth = 640; _tvHeight = ((_tvMode == TV_PAL) ? 512 /*544*/ : 448); kFullScreen[0].z = kFullScreen[1].z = 0; @@ -186,8 +185,8 @@ Gs2dScreen::Gs2dScreen(uint16 width, uint16 height, TVMode tvMode) { _clutPtrs[MOUSE] = _clutPtrs[SCREEN] + 0x1000; // the cluts in PSMCT32 take up half a memory page each _clutPtrs[TEXT] = _clutPtrs[SCREEN] + 0x2000; _texPtrs[SCREEN] = _clutPtrs[SCREEN] + 0x3000; - _texPtrs[TEXT] = 0; // these buffers are stored in the alpha gaps of the frame buffers - _texPtrs[MOUSE] = 128 * 256 * 4; + _texPtrs[TEXT] = 0; // these buffers are stored in the alpha gaps of the frame buffers + _texPtrs[MOUSE] = 128 * 256 * 4; _texPtrs[PRINTF] = _texPtrs[MOUSE] + M_SIZE * M_SIZE * 4; _showOverlay = false; @@ -201,14 +200,14 @@ Gs2dScreen::Gs2dScreen(uint16 width, uint16 height, TVMode tvMode) { _overlayFormat.bytesPerPixel = 2; _overlayFormat.rLoss = 3; - _overlayFormat.gLoss = 3; - _overlayFormat.bLoss = 3; - _overlayFormat.aLoss = 7; + _overlayFormat.gLoss = 3; + _overlayFormat.bLoss = 3; + _overlayFormat.aLoss = 7; - _overlayFormat.rShift = 0; - _overlayFormat.gShift = 5; - _overlayFormat.bShift = 10; - _overlayFormat.aShift = 15; + _overlayFormat.rShift = 0; + _overlayFormat.gShift = 5; + _overlayFormat.bShift = 10; + _overlayFormat.aShift = 15; // setup hardware now. GS_CSR = CSR_RESET; // Reset GS @@ -249,18 +248,18 @@ Gs2dScreen::Gs2dScreen(uint16 width, uint16 height, TVMode tvMode) { createAnimTextures(); - // create anim thread - ee_thread_t animThread, thisThread; + // create animation thread + ee_thread_t animationThread, thisThread; ReferThreadStatus(GetThreadId(), &thisThread); _animStack = malloc(ANIM_STACK_SIZE); - animThread.initial_priority = thisThread.current_priority - 3; - animThread.stack = _animStack; - animThread.stack_size = ANIM_STACK_SIZE; - animThread.func = (void *)runAnimThread; - animThread.gp_reg = &_gp; + animationThread.initial_priority = thisThread.current_priority - 3; + animationThread.stack = _animStack; + animationThread.stack_size = ANIM_STACK_SIZE; + animationThread.func = (void *)runAnimThread; + animationThread.gp_reg = &_gp; - _animTid = CreateThread(&animThread); + _animTid = CreateThread(&animationThread); assert(_animTid >= 0); StartThread(_animTid, this); } @@ -268,13 +267,13 @@ Gs2dScreen::Gs2dScreen(uint16 width, uint16 height, TVMode tvMode) { void Gs2dScreen::quit(void) { _systemQuit = true; ee_thread_t statAnim; - do { // wait until thread called ExitThread() + do { // wait until thread called ExitThread() SignalSema(g_AnimSema); ReferThreadStatus(_animTid, &statAnim); } while (statAnim.status != 0x10); DeleteThread(_animTid); free(_animStack); - _dmaPipe->waitForDma(); // wait for dmac and vblank for the last time + _dmaPipe->waitForDma(); // wait for dmac and vblank for the last time while (g_DmacCmd || g_VblankCmd); sioprintf("kill handlers\n"); @@ -606,7 +605,7 @@ void Gs2dScreen::grabOverlay(byte *buf, uint16 pitch) { for (uint32 cnt = 0; cnt < _height; cnt++) { memcpy(buf, src, _width * 2); buf += pitch; - src += _width; + src += _width; } } diff --git a/backends/platform/ps2/Gs2dScreen.h b/backends/platform/ps2/Gs2dScreen.h index 005dabc809..1a70dad170 100644 --- a/backends/platform/ps2/Gs2dScreen.h +++ b/backends/platform/ps2/Gs2dScreen.h @@ -29,7 +29,6 @@ #include "backends/platform/ps2/DmaPipe.h" #include "graphics/surface.h" - enum TVMode { TV_DONT_CARE = 0, TV_PAL, @@ -41,10 +40,9 @@ enum GsInterlace { GS_INTERLACED }; - class Gs2dScreen { public: - Gs2dScreen(uint16 width, uint16 height, TVMode tvMode); + Gs2dScreen(uint16 width, uint16 height, TVMode mode); ~Gs2dScreen(void); void newScreenSize(uint16 width, uint16 height); uint8 tvMode(void); @@ -94,27 +92,26 @@ private: uint8 _curDrawBuf; uint32 _frameBufPtr[2]; // - uint32 _clutPtrs[3]; // vram pointers + uint32 _clutPtrs[3]; // vram pointers uint32 _texPtrs[4]; // Graphics::Surface _framebuffer; - /* TODO : check if we do need this */ - struct VideoState { - bool setup; + // TODO : check if we do need this + struct VideoState { + bool setup; - bool fullscreen; - bool aspectRatio; + bool fullscreen; + bool aspectRatio; - int mode; - int scaleFactor; + int mode; + int scaleFactor; - int screenWidth, screenHeight; - int overlayWidth, overlayHeight; - }; + int screenWidth, screenHeight; + int overlayWidth, overlayHeight; + }; VideoState _videoMode; - /* */ uint16 _width, _height, _pitch; int16 _mouseX, _mouseY, _hotSpotX, _hotSpotY; diff --git a/backends/platform/ps2/ps2pad.cpp b/backends/platform/ps2/ps2pad.cpp index b6afc217e6..607b614691 100644 --- a/backends/platform/ps2/ps2pad.cpp +++ b/backends/platform/ps2/ps2pad.cpp @@ -51,6 +51,9 @@ void Ps2Pad::initPad(void) { } else { if (checkPadReady(_port, _slot)) { switch (_padStatus) { + case STAT_NONE: + printf("Pad Status is None. Shouldn't happen\n"); + break; case STAT_OPEN: _padStatus = STAT_DETECT; break; diff --git a/backends/platform/sdl/macosx/appmenu_osx.mm b/backends/platform/sdl/macosx/appmenu_osx.mm index 97c7edba3e..0d2a2ab7f2 100644 --- a/backends/platform/sdl/macosx/appmenu_osx.mm +++ b/backends/platform/sdl/macosx/appmenu_osx.mm @@ -35,9 +35,8 @@ - (void)setAppleMenu:(NSMenu *)menu; @end -NSString *constructNSStringFromCString(const char* rawCString, NSStringEncoding stringEncoding) { - NSData *nsData = [NSData dataWithBytes:rawCString length:strlen(rawCString)]; - return [[NSString alloc] initWithData:nsData encoding:stringEncoding]; +NSString *constructNSStringFromCString(const char *rawCString, CFStringEncoding stringEncoding) { + return (NSString *)CFStringCreateWithCString(NULL, rawCString, stringEncoding); } void replaceApplicationMenuItems() { @@ -59,11 +58,11 @@ void replaceApplicationMenuItems() { // Get current encoding #ifdef USE_TRANSLATION - nsString = constructNSStringFromCString((TransMan.getCurrentCharset()).c_str(), NSASCIIStringEncoding); - NSStringEncoding stringEncoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef)nsString)); + nsString = constructNSStringFromCString(TransMan.getCurrentCharset().c_str(), NSASCIIStringEncoding); + CFStringEncoding stringEncoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef)nsString); [nsString release]; #else - NSStringEncoding stringEncoding = NSASCIIStringEncoding; + CFStringEncoding stringEncoding = kCFStringEncodingASCII; #endif // Add "About ScummVM" menu item diff --git a/backends/platform/sdl/macosx/macosx.cpp b/backends/platform/sdl/macosx/macosx.cpp index fb76c111f2..85342d62fd 100644 --- a/backends/platform/sdl/macosx/macosx.cpp +++ b/backends/platform/sdl/macosx/macosx.cpp @@ -39,7 +39,6 @@ #include "ApplicationServices/ApplicationServices.h" // for LSOpenFSRef #include "CoreFoundation/CoreFoundation.h" // for CF* stuff -#include "CoreServices/CoreServices.h" // for FSPathMakeRef OSystem_MacOSX::OSystem_MacOSX() : @@ -107,13 +106,9 @@ bool OSystem_MacOSX::displayLogFile() { if (_logFilePath.empty()) return false; - FSRef ref; - OSStatus err; - - err = FSPathMakeRef((const UInt8 *)_logFilePath.c_str(), &ref, NULL); - if (err == noErr) { - err = LSOpenFSRef(&ref, NULL); - } + CFURLRef url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, (const UInt8 *)_logFilePath.c_str(), _logFilePath.size(), false); + OSStatus err = LSOpenCFURLRef(url, NULL); + CFRelease(url); return err != noErr; } diff --git a/backends/platform/symbian/README b/backends/platform/symbian/README index 31bc3d8fce..58cbc7814a 100644 --- a/backends/platform/symbian/README +++ b/backends/platform/symbian/README @@ -1,7 +1,7 @@ ScummVM - ScummVM ported to EPOC/SymbianOS - Copyright (C) 2008-2012 ScummVM Team + Copyright (C) 2008-2013 ScummVM Team Copyright (C) 2003-2008 Lars 'AnotherGuest' Persson Copyright (C) 2002-2008 Jurgen 'SumthinWicked' Braam diff --git a/backends/platform/symbian/S60/ScummVM_S60.mmp.in b/backends/platform/symbian/S60/ScummVM_S60.mmp.in index 81068ba073..28bd11dec6 100644 --- a/backends/platform/symbian/S60/ScummVM_S60.mmp.in +++ b/backends/platform/symbian/S60/ScummVM_S60.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/S60/ScummVM_S60_App.mmp b/backends/platform/symbian/S60/ScummVM_S60_App.mmp index e00987e2ad..38d6f19590 100644 --- a/backends/platform/symbian/S60/ScummVM_S60_App.mmp +++ b/backends/platform/symbian/S60/ScummVM_S60_App.mmp @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/S60v3/ScummVM_A0000658_S60v3.mmp.in b/backends/platform/symbian/S60v3/ScummVM_A0000658_S60v3.mmp.in index ccf38818dc..93636aca25 100644 --- a/backends/platform/symbian/S60v3/ScummVM_A0000658_S60v3.mmp.in +++ b/backends/platform/symbian/S60v3/ScummVM_A0000658_S60v3.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/S60v3/ScummVM_S60v3.mmp.in b/backends/platform/symbian/S60v3/ScummVM_S60v3.mmp.in index 0162061284..c09934a46d 100644 --- a/backends/platform/symbian/S60v3/ScummVM_S60v3.mmp.in +++ b/backends/platform/symbian/S60v3/ScummVM_S60v3.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/S80/ScummVM_S80.mmp.in b/backends/platform/symbian/S80/ScummVM_S80.mmp.in index 7987ccd639..d9b9a5c948 100644 --- a/backends/platform/symbian/S80/ScummVM_S80.mmp.in +++ b/backends/platform/symbian/S80/ScummVM_S80.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/S80/ScummVM_S80_App.mmp b/backends/platform/symbian/S80/ScummVM_S80_App.mmp index b66bef7518..30b1c3f58b 100644 --- a/backends/platform/symbian/S80/ScummVM_S80_App.mmp +++ b/backends/platform/symbian/S80/ScummVM_S80_App.mmp @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/S90/Scummvm_S90.mmp.in b/backends/platform/symbian/S90/Scummvm_S90.mmp.in index d803ce5647..790dca14f0 100644 --- a/backends/platform/symbian/S90/Scummvm_S90.mmp.in +++ b/backends/platform/symbian/S90/Scummvm_S90.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/S90/Scummvm_S90_App.mmp b/backends/platform/symbian/S90/Scummvm_S90_App.mmp index 0d8d2b8710..cf17f103ef 100644 --- a/backends/platform/symbian/S90/Scummvm_S90_App.mmp +++ b/backends/platform/symbian/S90/Scummvm_S90_App.mmp @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/UIQ2/ScummVM.rss b/backends/platform/symbian/UIQ2/ScummVM.rss index a6ba4021e4..bfdd07e898 100644 --- a/backends/platform/symbian/UIQ2/ScummVM.rss +++ b/backends/platform/symbian/UIQ2/ScummVM.rss @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/backends/platform/symbian/UIQ3/ScummVM.rss b/backends/platform/symbian/UIQ3/ScummVM.rss index 00ed4e3b5c..b7f0a17113 100644 --- a/backends/platform/symbian/UIQ3/ScummVM.rss +++ b/backends/platform/symbian/UIQ3/ScummVM.rss @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/UIQ3/ScummVM_A0000658.rss b/backends/platform/symbian/UIQ3/ScummVM_A0000658.rss index 00ed4e3b5c..b7f0a17113 100644 --- a/backends/platform/symbian/UIQ3/ScummVM_A0000658.rss +++ b/backends/platform/symbian/UIQ3/ScummVM_A0000658.rss @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in b/backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in index 9e419ad6d9..255bc0f862 100644 --- a/backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in +++ b/backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2009 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2009 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in b/backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in index 41452127ca..83d782d1a6 100644 --- a/backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in +++ b/backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/UIQ3/scummvm_A0000658_loc.rss b/backends/platform/symbian/UIQ3/scummvm_A0000658_loc.rss index 9af9a33a75..47e7c44642 100644 --- a/backends/platform/symbian/UIQ3/scummvm_A0000658_loc.rss +++ b/backends/platform/symbian/UIQ3/scummvm_A0000658_loc.rss @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_agi.mmp.in b/backends/platform/symbian/mmp/scummvm_agi.mmp.in index 7d197f786f..892ed57732 100644 --- a/backends/platform/symbian/mmp/scummvm_agi.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_agi.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_agos.mmp.in b/backends/platform/symbian/mmp/scummvm_agos.mmp.in index 587d1f0b69..d3bc84ed51 100644 --- a/backends/platform/symbian/mmp/scummvm_agos.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_agos.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_base.mmp.in b/backends/platform/symbian/mmp/scummvm_base.mmp.in index 05cf526233..d6dfafd014 100644 --- a/backends/platform/symbian/mmp/scummvm_base.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_base.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_cine.mmp.in b/backends/platform/symbian/mmp/scummvm_cine.mmp.in index 79806eb8c2..cb7143b837 100644 --- a/backends/platform/symbian/mmp/scummvm_cine.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_cine.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_cruise.mmp.in b/backends/platform/symbian/mmp/scummvm_cruise.mmp.in index 53d52c80e7..c26e93dedc 100644 --- a/backends/platform/symbian/mmp/scummvm_cruise.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_cruise.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_draci.mmp.in b/backends/platform/symbian/mmp/scummvm_draci.mmp.in index 9a7c87c963..52f862bc6f 100644 --- a/backends/platform/symbian/mmp/scummvm_draci.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_draci.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_drascula.mmp.in b/backends/platform/symbian/mmp/scummvm_drascula.mmp.in index fcd7ce7585..9ea02fefe8 100644 --- a/backends/platform/symbian/mmp/scummvm_drascula.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_drascula.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_gob.mmp.in b/backends/platform/symbian/mmp/scummvm_gob.mmp.in index 23f110bc7d..906d54b487 100644 --- a/backends/platform/symbian/mmp/scummvm_gob.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_gob.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_groovie.mmp.in b/backends/platform/symbian/mmp/scummvm_groovie.mmp.in index 6bdeb06b10..e7f70bc110 100644 --- a/backends/platform/symbian/mmp/scummvm_groovie.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_groovie.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_hugo.mmp.in b/backends/platform/symbian/mmp/scummvm_hugo.mmp.in index 69888bb0ee..13dd7efa1e 100644 --- a/backends/platform/symbian/mmp/scummvm_hugo.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_hugo.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_kyra.mmp.in b/backends/platform/symbian/mmp/scummvm_kyra.mmp.in index 4a2a87216e..5772bfaad0 100644 --- a/backends/platform/symbian/mmp/scummvm_kyra.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_kyra.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_lastexpress.mmp.in b/backends/platform/symbian/mmp/scummvm_lastexpress.mmp.in index 27ec0b2148..b8db95ea0c 100644 --- a/backends/platform/symbian/mmp/scummvm_lastexpress.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_lastexpress.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_lure.mmp.in b/backends/platform/symbian/mmp/scummvm_lure.mmp.in index 20b938a83f..84c3eecd5e 100644 --- a/backends/platform/symbian/mmp/scummvm_lure.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_lure.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_m4.mmp.in b/backends/platform/symbian/mmp/scummvm_m4.mmp.in index fafd5e1e5f..e69b40ceb0 100644 --- a/backends/platform/symbian/mmp/scummvm_m4.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_m4.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_made.mmp.in b/backends/platform/symbian/mmp/scummvm_made.mmp.in index 4d5ab6cc33..b52d9cc6cb 100644 --- a/backends/platform/symbian/mmp/scummvm_made.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_made.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_mohawk.mmp.in b/backends/platform/symbian/mmp/scummvm_mohawk.mmp.in index 3fc7c4ca5b..5f7bd4e144 100644 --- a/backends/platform/symbian/mmp/scummvm_mohawk.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_mohawk.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_parallaction.mmp.in b/backends/platform/symbian/mmp/scummvm_parallaction.mmp.in index 05578b5994..f8ee389577 100644 --- a/backends/platform/symbian/mmp/scummvm_parallaction.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_parallaction.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_queen.mmp.in b/backends/platform/symbian/mmp/scummvm_queen.mmp.in index bfc0a2f760..f507f482f9 100644 --- a/backends/platform/symbian/mmp/scummvm_queen.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_queen.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_saga.mmp.in b/backends/platform/symbian/mmp/scummvm_saga.mmp.in index 831f02bdb6..cd158556dc 100644 --- a/backends/platform/symbian/mmp/scummvm_saga.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_saga.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_sci.mmp.in b/backends/platform/symbian/mmp/scummvm_sci.mmp.in index 705f8d0c43..5749c66e10 100644 --- a/backends/platform/symbian/mmp/scummvm_sci.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_sci.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_scumm.mmp.in b/backends/platform/symbian/mmp/scummvm_scumm.mmp.in index 6b2ad35594..c07725e002 100644 --- a/backends/platform/symbian/mmp/scummvm_scumm.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_scumm.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_sky.mmp.in b/backends/platform/symbian/mmp/scummvm_sky.mmp.in index 5fdfb56320..b5048106dc 100644 --- a/backends/platform/symbian/mmp/scummvm_sky.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_sky.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_sword1.mmp.in b/backends/platform/symbian/mmp/scummvm_sword1.mmp.in index 075968cf98..578839e8c4 100644 --- a/backends/platform/symbian/mmp/scummvm_sword1.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_sword1.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_sword2.mmp.in b/backends/platform/symbian/mmp/scummvm_sword2.mmp.in index 32ab259ee4..23a055c99c 100644 --- a/backends/platform/symbian/mmp/scummvm_sword2.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_sword2.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_teenagent.mmp.in b/backends/platform/symbian/mmp/scummvm_teenagent.mmp.in index 61c50bd307..58bfa4c337 100644 --- a/backends/platform/symbian/mmp/scummvm_teenagent.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_teenagent.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_tinsel.mmp.in b/backends/platform/symbian/mmp/scummvm_tinsel.mmp.in index 375d948190..4cdd0bd774 100644 --- a/backends/platform/symbian/mmp/scummvm_tinsel.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_tinsel.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_toon.mmp.in b/backends/platform/symbian/mmp/scummvm_toon.mmp.in index d105156107..00f84d2bec 100644 --- a/backends/platform/symbian/mmp/scummvm_toon.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_toon.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_touche.mmp.in b/backends/platform/symbian/mmp/scummvm_touche.mmp.in index 36588e051f..e59dd0cd00 100644 --- a/backends/platform/symbian/mmp/scummvm_touche.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_touche.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_tsage.mmp.in b/backends/platform/symbian/mmp/scummvm_tsage.mmp.in index fb9b075435..cd4aa158dc 100644 --- a/backends/platform/symbian/mmp/scummvm_tsage.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_tsage.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/mmp/scummvm_tucker.mmp.in b/backends/platform/symbian/mmp/scummvm_tucker.mmp.in index f8954e6d21..0ff8eb9920 100644 --- a/backends/platform/symbian/mmp/scummvm_tucker.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_tucker.mmp.in @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/res/ScummVmAif.rss b/backends/platform/symbian/res/ScummVmAif.rss index 3e7a86a3bc..fab2cadbb8 100644 --- a/backends/platform/symbian/res/ScummVmAif.rss +++ b/backends/platform/symbian/res/ScummVmAif.rss @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/res/scummvm.rss b/backends/platform/symbian/res/scummvm.rss index 361f831e3c..7e667f1cf3 100644 --- a/backends/platform/symbian/res/scummvm.rss +++ b/backends/platform/symbian/res/scummvm.rss @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/res/scummvm_A0000658.rss b/backends/platform/symbian/res/scummvm_A0000658.rss index 14d591c990..3325d72249 100644 --- a/backends/platform/symbian/res/scummvm_A0000658.rss +++ b/backends/platform/symbian/res/scummvm_A0000658.rss @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/symbian/src/ScummVm.hrh b/backends/platform/symbian/src/ScummVm.hrh index a84664f995..c43a9da118 100644 --- a/backends/platform/symbian/src/ScummVm.hrh +++ b/backends/platform/symbian/src/ScummVm.hrh @@ -2,7 +2,7 @@ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer - * Copyright (C) 2005-2012 The ScummVM project + * Copyright (C) 2005-2013 The ScummVM project * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT diff --git a/backends/platform/wii/osystem_gfx.cpp b/backends/platform/wii/osystem_gfx.cpp index fc0802dd4c..a9bcdbb8d1 100644 --- a/backends/platform/wii/osystem_gfx.cpp +++ b/backends/platform/wii/osystem_gfx.cpp @@ -609,7 +609,7 @@ void OSystem_Wii::copyRectToOverlay(const void *buf, int pitch, int x, return; uint16 *dst = _overlayPixels + (y * _overlayWidth + x); - if (_overlayWidth == w && pitch == _overlayWidth * sizeof(uint16)) { + if (_overlayWidth == (uint16)w && (uint16)pitch == _overlayWidth * sizeof(uint16)) { memcpy(dst, src, h * pitch); } else { do { diff --git a/backends/platform/wince/CEgui/GUIElement.cpp b/backends/platform/wince/CEgui/GUIElement.cpp index 241cf514f3..c8e68b87fd 100644 --- a/backends/platform/wince/CEgui/GUIElement.cpp +++ b/backends/platform/wince/CEgui/GUIElement.cpp @@ -98,19 +98,19 @@ bool GUIElement::drawn() { return _drawn; } -int GUIElement::x() { +int GUIElement::getX() { return _x; } -int GUIElement::y() { +int GUIElement::getY() { return _y; } -int GUIElement::width() { +int GUIElement::getWidth() { return _width; } -int GUIElement::height() { +int GUIElement::getHeight() { return _height; } diff --git a/backends/platform/wince/CEgui/GUIElement.h b/backends/platform/wince/CEgui/GUIElement.h index 2639de38ca..44c4b3f275 100644 --- a/backends/platform/wince/CEgui/GUIElement.h +++ b/backends/platform/wince/CEgui/GUIElement.h @@ -40,10 +40,10 @@ public: virtual bool draw(SDL_Surface *surface); virtual ~GUIElement(); void move(int x, int y); - int width(); - int height(); - int x(); - int y(); + int getWidth(); + int getHeight(); + int getX(); + int getY(); virtual bool action(int x, int y, bool pushed) = 0; bool visible(); bool drawn(); diff --git a/backends/platform/wince/CEgui/ToolbarHandler.cpp b/backends/platform/wince/CEgui/ToolbarHandler.cpp index 6f4ac317cd..f3e42e11fa 100644 --- a/backends/platform/wince/CEgui/ToolbarHandler.cpp +++ b/backends/platform/wince/CEgui/ToolbarHandler.cpp @@ -96,10 +96,10 @@ bool ToolbarHandler::draw(SDL_Surface *surface, SDL_Rect *rect) { if (_active) { bool result = _active->draw(surface); if (result) { - rect->x = _active->x(); - rect->y = _active->y(); - rect->w = _active->width(); - rect->h = _active->height(); + rect->x = _active->getX(); + rect->y = _active->getY(); + rect->w = _active->getWidth(); + rect->h = _active->getHeight(); } return result; } else diff --git a/backends/updates/macosx/macosx-updates.mm b/backends/updates/macosx/macosx-updates.mm index 741e89891c..f3b221cabf 100644 --- a/backends/updates/macosx/macosx-updates.mm +++ b/backends/updates/macosx/macosx-updates.mm @@ -59,10 +59,14 @@ MacOSXUpdateManager::MacOSXUpdateManager() { [sparkleUpdater setFeedURL:[NSURL URLWithString:feedbackURL]]; // Get current encoding - NSStringEncoding stringEncoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef)[NSString stringWithCString:(TransMan.getCurrentCharset()).c_str() encoding:NSASCIIStringEncoding])); + CFStringRef encStr = CFStringCreateWithCString(NULL, TransMan.getCurrentCharset().c_str(), kCFStringEncodingASCII); + CFStringEncoding stringEncoding = CFStringConvertIANACharSetNameToEncoding(encStr); + CFRelease(encStr); // Add "Check for Updates..." menu item - NSMenuItem *updateMenuItem = [applicationMenu insertItemWithTitle:[NSString stringWithCString:_("Check for Updates...") encoding:stringEncoding] action:@selector(checkForUpdates:) keyEquivalent:@"" atIndex:1]; + CFStringRef title = CFStringCreateWithCString(NULL, _("Check for Updates..."), stringEncoding); + NSMenuItem *updateMenuItem = [applicationMenu insertItemWithTitle:(NSString *)title action:@selector(checkForUpdates:) keyEquivalent:@"" atIndex:1]; + CFRelease(title); // Set the target of the new menu item [updateMenuItem setTarget:sparkleUpdater]; diff --git a/base/commandLine.cpp b/base/commandLine.cpp index 44007c494a..f6d1f1f702 100644 --- a/base/commandLine.cpp +++ b/base/commandLine.cpp @@ -145,7 +145,7 @@ static const char HELP_STRING[] = static const char *s_appName = "scummvm"; -static void usage(const char *s, ...) GCC_PRINTF(1, 2); +static void NORETURN_PRE usage(const char *s, ...) GCC_PRINTF(1, 2) NORETURN_POST; static void usage(const char *s, ...) { char buf[STRINGBUFLEN]; @@ -239,6 +239,28 @@ void registerDefaults() { ConfMan.registerDefault("gui_saveload_chooser", "grid"); ConfMan.registerDefault("gui_saveload_last_pos", "0"); + + ConfMan.registerDefault("gui_browser_show_hidden", false); + +#ifdef USE_FLUIDSYNTH + // The settings are deliberately stored the same way as in Qsynth. The + // FluidSynth music driver is responsible for transforming them into + // their appropriate values. + ConfMan.registerDefault("fluidsynth_chorus_activate", true); + ConfMan.registerDefault("fluidsynth_chorus_nr", 3); + ConfMan.registerDefault("fluidsynth_chorus_level", 100); + ConfMan.registerDefault("fluidsynth_chorus_speed", 30); + ConfMan.registerDefault("fluidsynth_chorus_depth", 80); + ConfMan.registerDefault("fluidsynth_chorus_waveform", "sine"); + + ConfMan.registerDefault("fluidsynth_reverb_activate", true); + ConfMan.registerDefault("fluidsynth_reverb_roomsize", 20); + ConfMan.registerDefault("fluidsynth_reverb_damping", 0); + ConfMan.registerDefault("fluidsynth_reverb_width", 1); + ConfMan.registerDefault("fluidsynth_reverb_level", 90); + + ConfMan.registerDefault("fluidsynth_misc_interpolation", "4th"); +#endif } // @@ -314,8 +336,11 @@ void registerDefaults() { Common::String parseCommandLine(Common::StringMap &settings, int argc, const char * const *argv) { const char *s, *s2; + if (!argv) + return Common::String(); + // argv[0] contains the name of the executable. - if (argv && argv[0]) { + if (argv[0]) { s = strrchr(argv[0], '/'); s_appName = s ? (s+1) : argv[0]; } @@ -579,8 +604,7 @@ static void listGames() { "-------------------- ------------------------------------------------------\n"); const EnginePlugin::List &plugins = EngineMan.getPlugins(); - EnginePlugin::List::const_iterator iter = plugins.begin(); - for (iter = plugins.begin(); iter != plugins.end(); ++iter) { + for (EnginePlugin::List::const_iterator iter = plugins.begin(); iter != plugins.end(); ++iter) { GameList list = (**iter)->getSupportedGames(); for (GameList::iterator v = list.begin(); v != list.end(); ++v) { printf("%-20s %s\n", v->gameid().c_str(), v->description().c_str()); diff --git a/common/bufferedstream.h b/common/bufferedstream.h index 55ea8dc13b..6c859c98fe 100644 --- a/common/bufferedstream.h +++ b/common/bufferedstream.h @@ -61,6 +61,6 @@ SeekableReadStream *wrapBufferedSeekableReadStream(SeekableReadStream *parentStr */ WriteStream *wrapBufferedWriteStream(WriteStream *parentStream, uint32 bufSize); -} // End of namespace Common +} // End of namespace Common #endif diff --git a/common/c++11-compat.h b/common/c++11-compat.h new file mode 100644 index 0000000000..50d79bd79e --- /dev/null +++ b/common/c++11-compat.h @@ -0,0 +1,42 @@ +/* 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. + * + */ + +#ifndef COMMON_CPP11_COMPAT_H +#define COMMON_CPP11_COMPAT_H + +#if __cplusplus >= 201103L +#error "c++11-compat.h included when C++11 is available" +#endif + +// +// Custom nullptr replacement. This is not type safe as the real C++11 nullptr +// though. +// +#define nullptr 0 + +// +// Replacement for the override keyword. This allows compilation of code +// which uses it, but does not feature any semantic. +// +#define override + +#endif diff --git a/common/config-file.cpp b/common/config-file.cpp index 4224d7491d..fe042e9eda 100644 --- a/common/config-file.cpp +++ b/common/config-file.cpp @@ -380,4 +380,4 @@ void ConfigFile::Section::removeKey(const String &key) { } } -} // End of namespace Common +} // End of namespace Common diff --git a/common/config-file.h b/common/config-file.h index 7bc5604b4c..8bd731c038 100644 --- a/common/config-file.h +++ b/common/config-file.h @@ -134,6 +134,6 @@ private: */ -} // End of namespace Common +} // End of namespace Common #endif diff --git a/common/config-manager.h b/common/config-manager.h index 02d4ec3438..d43a7bec51 100644 --- a/common/config-manager.h +++ b/common/config-manager.h @@ -175,7 +175,7 @@ private: String _filename; }; -} // End of namespace Common +} // End of namespace Common /** Shortcut for accessing the configuration manager. */ #define ConfMan Common::ConfigManager::instance() diff --git a/common/debug-channels.h b/common/debug-channels.h index 54de9d491e..40d1ea667e 100644 --- a/common/debug-channels.h +++ b/common/debug-channels.h @@ -124,6 +124,6 @@ private: /** Shortcut for accessing the debug manager. */ #define DebugMan Common::DebugManager::instance() -} // End of namespace Common +} // End of namespace Common #endif diff --git a/common/debug.cpp b/common/debug.cpp index 9c3a93e5a6..ba5479c34d 100644 --- a/common/debug.cpp +++ b/common/debug.cpp @@ -102,7 +102,7 @@ bool DebugManager::isDebugChannelEnabled(uint32 channel) { return (gDebugChannelsEnabled & channel) != 0; } -} // End of namespace Common +} // End of namespace Common #ifndef DISABLE_TEXT_CONSOLE diff --git a/common/file.cpp b/common/file.cpp index 12d73c9973..7ad6bc2e81 100644 --- a/common/file.cpp +++ b/common/file.cpp @@ -202,4 +202,4 @@ bool DumpFile::flush() { return _handle->flush(); } -} // End of namespace Common +} // End of namespace Common diff --git a/common/forbidden.h b/common/forbidden.h index eec80bba59..9050114442 100644 --- a/common/forbidden.h +++ b/common/forbidden.h @@ -333,11 +333,21 @@ #define isalpha(a) FORBIDDEN_SYMBOL_REPLACEMENT #endif + #ifndef FORBIDDEN_SYMBOL_EXCEPTION_iscntrl + #undef iscntrl + #define iscntrl(a) FORBIDDEN_SYMBOL_REPLACEMENT + #endif + #ifndef FORBIDDEN_SYMBOL_EXCEPTION_isdigit #undef isdigit #define isdigit(a) FORBIDDEN_SYMBOL_REPLACEMENT #endif + #ifndef FORBIDDEN_SYMBOL_EXCEPTION_isgraph + #undef isgraph + #define isgraph(a) FORBIDDEN_SYMBOL_REPLACEMENT + #endif + #ifndef FORBIDDEN_SYMBOL_EXCEPTION_isnumber #undef isnumber #define isnumber(a) FORBIDDEN_SYMBOL_REPLACEMENT @@ -348,6 +358,16 @@ #define islower(a) FORBIDDEN_SYMBOL_REPLACEMENT #endif + #ifndef FORBIDDEN_SYMBOL_EXCEPTION_isprint + #undef isprint + #define isprint(a) FORBIDDEN_SYMBOL_REPLACEMENT + #endif + + #ifndef FORBIDDEN_SYMBOL_EXCEPTION_ispunct + #undef ispunct + #define ispunct(a) FORBIDDEN_SYMBOL_REPLACEMENT + #endif + #ifndef FORBIDDEN_SYMBOL_EXCEPTION_isspace #undef isspace #define isspace(a) FORBIDDEN_SYMBOL_REPLACEMENT @@ -358,6 +378,11 @@ #define isupper(a) FORBIDDEN_SYMBOL_REPLACEMENT #endif + #ifndef FORBIDDEN_SYMBOL_EXCEPTION_isxdigit + #undef isxdigit + #define isxdigit(a) FORBIDDEN_SYMBOL_REPLACEMENT + #endif + #endif // FORBIDDEN_SYMBOL_EXCEPTION_ctype_h #ifndef FORBIDDEN_SYMBOL_EXCEPTION_mkdir diff --git a/common/fs.cpp b/common/fs.cpp index 0143c936d4..19a01074ea 100644 --- a/common/fs.cpp +++ b/common/fs.cpp @@ -335,4 +335,4 @@ int FSDirectory::listMembers(ArchiveMemberList &list) const { } -} // End of namespace Common +} // End of namespace Common diff --git a/common/func.h b/common/func.h index db57d73668..a4a80e5406 100644 --- a/common/func.h +++ b/common/func.h @@ -535,6 +535,6 @@ GENERATE_TRIVIAL_HASH_FUNCTOR(unsigned long); #undef GENERATE_TRIVIAL_HASH_FUNCTOR -} // End of namespace Common +} // End of namespace Common #endif diff --git a/common/hash-str.h b/common/hash-str.h index 08f0558bfd..190e6922eb 100644 --- a/common/hash-str.h +++ b/common/hash-str.h @@ -79,7 +79,7 @@ typedef HashMap<String, String, IgnoreCase_Hash, IgnoreCase_EqualTo> StringMap; -} // End of namespace Common +} // End of namespace Common #endif diff --git a/common/hashmap.cpp b/common/hashmap.cpp index ff8f9db9ce..e505d1dd25 100644 --- a/common/hashmap.cpp +++ b/common/hashmap.cpp @@ -106,4 +106,4 @@ void updateHashCollisionStats(int collisions, int dummyHits, int lookups, int ar } #endif -} // End of namespace Common +} // End of namespace Common diff --git a/common/hashmap.h b/common/hashmap.h index 7cf54997e8..42509d67e5 100644 --- a/common/hashmap.h +++ b/common/hashmap.h @@ -632,6 +632,6 @@ void HashMap<Key, Val, HashFunc, EqualFunc>::erase(const Key &key) { #undef HASHMAP_DUMMY_NODE -} // End of namespace Common +} // End of namespace Common #endif diff --git a/common/iff_container.cpp b/common/iff_container.cpp index 7bcbf86e0f..9c6e5f124a 100644 --- a/common/iff_container.cpp +++ b/common/iff_container.cpp @@ -22,6 +22,7 @@ #include "common/iff_container.h" #include "common/substream.h" +#include "common/util.h" namespace Common { @@ -75,4 +76,50 @@ void IFFParser::parse(IFFCallback &callback) { } while (!stop); } -} // End of namespace Common + +PackBitsReadStream::PackBitsReadStream(Common::ReadStream &input) : _input(&input) { +} + +PackBitsReadStream::~PackBitsReadStream() { +} + +bool PackBitsReadStream::eos() const { + return _input->eos(); +} + +uint32 PackBitsReadStream::read(void *dataPtr, uint32 dataSize) { + byte *out = (byte *)dataPtr; + uint32 left = dataSize; + + uint32 lenR = 0, lenW = 0; + while (left > 0 && !_input->eos()) { + lenR = _input->readByte(); + + if (lenR == 128) { + // no-op + lenW = 0; + } else if (lenR <= 127) { + // literal run + lenR++; + lenW = MIN(lenR, left); + for (uint32 j = 0; j < lenW; j++) { + *out++ = _input->readByte(); + } + for (; lenR > lenW; lenR--) { + _input->readByte(); + } + } else { // len > 128 + // expand run + lenW = MIN((256 - lenR) + 1, left); + byte val = _input->readByte(); + memset(out, val, lenW); + out += lenW; + } + + left -= lenW; + } + + return dataSize - left; +} + +} // End of namespace Common diff --git a/common/iff_container.h b/common/iff_container.h index 104ecf0f36..a730930b2c 100644 --- a/common/iff_container.h +++ b/common/iff_container.h @@ -77,22 +77,22 @@ page 376) */ #define ID_copy MKTAG('(','c',')',' ') /* EA IFF 85 Generic Copyright text chunk */ -/* ILBM chunks */ +/* IFF chunks */ #define ID_BMHD MKTAG('B','M','H','D') -/* ILBM BitmapHeader */ +/* IFF BitmapHeader */ #define ID_CMAP MKTAG('C','M','A','P') -/* ILBM 8bit RGB colormap */ +/* IFF 8bit RGB colormap */ #define ID_GRAB MKTAG('G','R','A','B') -/* ILBM "hotspot" coordiantes */ +/* IFF "hotspot" coordiantes */ #define ID_DEST MKTAG('D','E','S','T') -/* ILBM destination image info */ +/* IFF destination image info */ #define ID_SPRT MKTAG('S','P','R','T') -/* ILBM sprite identifier */ +/* IFF sprite identifier */ #define ID_CAMG MKTAG('C','A','M','G') /* Amiga viewportmodes */ #define ID_BODY MKTAG('B','O','D','Y') -/* ILBM image data */ +/* IFF image data */ #define ID_CRNG MKTAG('C','R','N','G') /* color cycling */ #define ID_CCRT MKTAG('C','C','R','T') @@ -114,7 +114,7 @@ page 376) */ #define ID_PCHG MKTAG('P','C','H','G') /* Line by line palette control information (Sebastiano Vigna) */ #define ID_PRVW MKTAG('P','R','V','W') -/* A mini duplicate ILBM used for preview (Gary Bonham) */ +/* A mini duplicate IFF used for preview (Gary Bonham) */ #define ID_XBMI MKTAG('X','B','M','I') /* eXtended BitMap Information (Soft-Logik) */ #define ID_CTBL MKTAG('C','T','B','L') @@ -239,6 +239,31 @@ public: }; +/** + * Decode a given PackBits encoded stream. + * + * PackBits is an RLE compression algorithm introduced by Apple. It is also + * used to encode ILBM and PBM subtypes of IFF files, and some flavors of + * TIFF. + * + * As there is no compression across row boundaries in the above formats, + * read() will extract a *new* line on each call, discarding any alignment + * or padding. + */ +class PackBitsReadStream : public Common::ReadStream { + +protected: + Common::ReadStream *_input; + +public: + PackBitsReadStream(Common::ReadStream &input); + ~PackBitsReadStream(); + + virtual bool eos() const; + + uint32 read(void *dataPtr, uint32 dataSize); +}; + } // namespace Common #endif diff --git a/common/language.h b/common/language.h index db552fc9c4..03b9ebaf8e 100644 --- a/common/language.h +++ b/common/language.h @@ -81,6 +81,6 @@ const String getGameGUIOptionsDescriptionLanguage(Common::Language lang); // TODO: Document this GUIO related function bool checkGameGUIOptionLanguage(Common::Language lang, const String &str); -} // End of namespace Common +} // End of namespace Common #endif diff --git a/common/macresman.cpp b/common/macresman.cpp index f2f020c6de..00562f746a 100644 --- a/common/macresman.cpp +++ b/common/macresman.cpp @@ -360,8 +360,8 @@ bool MacResManager::load(SeekableReadStream &stream) { _mapLength = stream.readUint32BE(); // do sanity check - if (_dataOffset >= (uint32)stream.size() || _mapOffset >= (uint32)stream.size() || - _dataLength + _mapLength > (uint32)stream.size()) { + if (stream.eos() || _dataOffset >= (uint32)stream.size() || _mapOffset >= (uint32)stream.size() || + _dataLength + _mapLength > (uint32)stream.size()) { _resForkOffset = -1; _mode = kResForkNone; return false; diff --git a/common/memorypool.h b/common/memorypool.h index 9a4e523d53..1cd725b99d 100644 --- a/common/memorypool.h +++ b/common/memorypool.h @@ -141,7 +141,7 @@ public: } }; -} // End of namespace Common +} // End of namespace Common /** * A custom placement new operator, using an arbitrary MemoryPool. diff --git a/common/memstream.h b/common/memstream.h index 497a178ab9..260fb64d84 100644 --- a/common/memstream.h +++ b/common/memstream.h @@ -173,6 +173,6 @@ public: bool seek(int32 offset, int whence = SEEK_SET); }; -} // End of namespace Common +} // End of namespace Common #endif diff --git a/common/mutex.cpp b/common/mutex.cpp index 4e6316528c..f912e79591 100644 --- a/common/mutex.cpp +++ b/common/mutex.cpp @@ -75,4 +75,4 @@ void StackLock::unlock() { g_system->unlockMutex(_mutex); } -} // End of namespace Common +} // End of namespace Common diff --git a/common/platform.h b/common/platform.h index b5ead825fc..72f0991409 100644 --- a/common/platform.h +++ b/common/platform.h @@ -77,6 +77,6 @@ extern const char *getPlatformCode(Platform id); extern const char *getPlatformAbbrev(Platform id); extern const char *getPlatformDescription(Platform id); -} // End of namespace Common +} // End of namespace Common #endif diff --git a/common/quicktime.cpp b/common/quicktime.cpp index 173d3c6a97..a3efc2b443 100644 --- a/common/quicktime.cpp +++ b/common/quicktime.cpp @@ -165,6 +165,8 @@ void QuickTimeParser::initParseTable() { { &QuickTimeParser::readWAVE, MKTAG('w', 'a', 'v', 'e') }, { &QuickTimeParser::readESDS, MKTAG('e', 's', 'd', 's') }, { &QuickTimeParser::readSMI, MKTAG('S', 'M', 'I', ' ') }, + { &QuickTimeParser::readDefault, MKTAG('g', 'm', 'h', 'd') }, + { &QuickTimeParser::readLeaf, MKTAG('g', 'm', 'i', 'n') }, { 0, 0 } }; @@ -442,7 +444,7 @@ int QuickTimeParser::readELST(Atom atom) { uint32 offset = 0; - for (uint32 i = 0; i < track->editCount; i++){ + for (uint32 i = 0; i < track->editCount; i++) { track->editList[i].trackDuration = _fd->readUint32BE(); track->editList[i].mediaTime = _fd->readSint32BE(); track->editList[i].mediaRate = Rational(_fd->readUint32BE(), 0x10000); @@ -477,6 +479,8 @@ int QuickTimeParser::readHDLR(Atom atom) { track->codecType = CODEC_TYPE_VIDEO; else if (type == MKTAG('s', 'o', 'u', 'n')) track->codecType = CODEC_TYPE_AUDIO; + else if (type == MKTAG('m', 'u', 's', 'i')) + track->codecType = CODEC_TYPE_MIDI; _fd->readUint32BE(); // component manufacture _fd->readUint32BE(); // component flags @@ -540,7 +544,7 @@ int QuickTimeParser::readSTSD(Atom atom) { _fd->readUint16BE(); // reserved _fd->readUint16BE(); // index - track->sampleDescs[i] = readSampleDesc(track, format); + track->sampleDescs[i] = readSampleDesc(track, format, size - 16); debug(0, "size=%d 4CC= %s codec_type=%d", size, tag2str(format), track->codecType); diff --git a/common/quicktime.h b/common/quicktime.h index 641718e13a..caa92578b1 100644 --- a/common/quicktime.h +++ b/common/quicktime.h @@ -120,7 +120,8 @@ protected: enum CodecType { CODEC_TYPE_MOV_OTHER, CODEC_TYPE_VIDEO, - CODEC_TYPE_AUDIO + CODEC_TYPE_AUDIO, + CODEC_TYPE_MIDI }; struct Track { @@ -161,7 +162,7 @@ protected: byte objectTypeMP4; }; - virtual SampleDesc *readSampleDesc(Track *track, uint32 format) = 0; + virtual SampleDesc *readSampleDesc(Track *track, uint32 format, uint32 descSize) = 0; uint32 _timeScale; uint32 _duration; diff --git a/common/random.cpp b/common/random.cpp index 55fa3cbd30..fd75534c44 100644 --- a/common/random.cpp +++ b/common/random.cpp @@ -59,4 +59,4 @@ uint RandomSource::getRandomNumberRng(uint min, uint max) { return getRandomNumber(max - min) + min; } -} // End of namespace Common +} // End of namespace Common diff --git a/common/random.h b/common/random.h index 90f2ed5cb0..c8aec58946 100644 --- a/common/random.h +++ b/common/random.h @@ -74,6 +74,6 @@ public: uint getRandomNumberRng(uint min, uint max); }; -} // End of namespace Common +} // End of namespace Common #endif diff --git a/common/rect.h b/common/rect.h index 8d1243f7e4..5790cf7c0f 100644 --- a/common/rect.h +++ b/common/rect.h @@ -266,6 +266,6 @@ struct Rect { } }; -} // End of namespace Common +} // End of namespace Common #endif diff --git a/common/scummsys.h b/common/scummsys.h index 2f4efe702f..cd8a949ce7 100644 --- a/common/scummsys.h +++ b/common/scummsys.h @@ -144,7 +144,10 @@ #endif #endif - +// Include our C++11 compatability header for pre-C++11 compilers. +#if __cplusplus < 201103L +#include "common/c++11-compat.h" +#endif // Use config.h, generated by configure #if defined(HAVE_CONFIG_H) diff --git a/common/singleton.h b/common/singleton.h index d7078360f3..6e47f119ba 100644 --- a/common/singleton.h +++ b/common/singleton.h @@ -97,6 +97,6 @@ protected: #define DECLARE_SINGLETON(T) \ template<> T *Singleton<T>::_singleton = 0 -} // End of namespace Common +} // End of namespace Common #endif diff --git a/common/str.cpp b/common/str.cpp index 84805082ac..61fdcfaf31 100644 --- a/common/str.cpp +++ b/common/str.cpp @@ -764,7 +764,7 @@ String tag2string(uint32 tag) { str[4] = '\0'; // Replace non-printable chars by dot for (int i = 0; i < 4; ++i) { - if (!isprint((unsigned char)str[i])) + if (!Common::isPrint(str[i])) str[i] = '.'; } return String(str); @@ -850,7 +850,7 @@ size_t strlcat(char *dst, const char *src, size_t size) { return dstLength + (src - srcStart); } -} // End of namespace Common +} // End of namespace Common // Portable implementation of stricmp / strcasecmp / strcmpi. // TODO: Rename this to Common::strcasecmp diff --git a/common/stream.cpp b/common/stream.cpp index 85647bfe3a..f49603c882 100644 --- a/common/stream.cpp +++ b/common/stream.cpp @@ -342,7 +342,7 @@ uint32 BufferedReadStream::read(void *dataPtr, uint32 dataSize) { return alreadyRead + dataSize; } -} // End of nameless namespace +} // End of anonymous namespace ReadStream *wrapBufferedReadStream(ReadStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream) { @@ -379,12 +379,25 @@ BufferedSeekableReadStream::BufferedSeekableReadStream(SeekableReadStream *paren bool BufferedSeekableReadStream::seek(int32 offset, int whence) { // If it is a "local" seek, we may get away with "seeking" around // in the buffer only. - // Note: We could try to handle SEEK_END and SEEK_SET, too, but - // since they are rarely used, it seems not worth the effort. _eos = false; // seeking always cancels EOS - if (whence == SEEK_CUR && (int)_pos + offset >= 0 && _pos + offset <= _bufSize) { - _pos += offset; + int relOffset = 0; + switch (whence) { + case SEEK_SET: + relOffset = offset - pos(); + break; + case SEEK_CUR: + relOffset = offset; + break; + case SEEK_END: + relOffset = (size() + offset) - pos(); + break; + default: + break; + } + + if ((int)_pos + relOffset >= 0 && _pos + relOffset <= _bufSize) { + _pos += relOffset; // Note: we do not need to reset parent's eos flag here. It is // sufficient that it is reset when actually seeking in the parent. @@ -393,14 +406,21 @@ bool BufferedSeekableReadStream::seek(int32 offset, int whence) { // just seek normally in the parent stream. if (whence == SEEK_CUR) offset -= (_bufSize - _pos); - _pos = _bufSize; + // We invalidate the buffer here. This assures that successive seeks + // do not have the chance to incorrectly think they seeked back into + // the buffer. + // Note: This does not take full advantage of the buffer. But it is + // a simple way to prevent nasty errors. It would be possible to take + // full advantage of the buffer by saving its actual start position. + // This seems not worth the effort for this seemingly uncommon use. + _pos = _bufSize = 0; _parentStream->seek(offset, whence); } return true; } -} // End of nameless namespace +} // End of anonymous namespace SeekableReadStream *wrapBufferedSeekableReadStream(SeekableReadStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream) { if (parentStream) @@ -482,7 +502,7 @@ public: }; -} // End of nameless namespace +} // End of anonymous namespace WriteStream *wrapBufferedWriteStream(WriteStream *parentStream, uint32 bufSize) { if (parentStream) @@ -490,4 +510,4 @@ WriteStream *wrapBufferedWriteStream(WriteStream *parentStream, uint32 bufSize) return 0; } -} // End of namespace Common +} // End of namespace Common diff --git a/common/stream.h b/common/stream.h index 26c04e5bf6..33ebc95a86 100644 --- a/common/stream.h +++ b/common/stream.h @@ -454,6 +454,6 @@ public: }; -} // End of namespace Common +} // End of namespace Common #endif diff --git a/common/taskbar.h b/common/taskbar.h index 6f28028e74..b4ec673739 100644 --- a/common/taskbar.h +++ b/common/taskbar.h @@ -136,7 +136,7 @@ public: virtual void clearError() {} }; -} // End of namespace Common +} // End of namespace Common #endif diff --git a/common/textconsole.cpp b/common/textconsole.cpp index ffa42e63a0..a721c121d5 100644 --- a/common/textconsole.cpp +++ b/common/textconsole.cpp @@ -40,7 +40,7 @@ void setErrorHandler(ErrorHandler handler) { } -} // End of namespace Common +} // End of namespace Common #ifndef DISABLE_TEXT_CONSOLE diff --git a/common/textconsole.h b/common/textconsole.h index 364c49b2e9..12f15e5e4b 100644 --- a/common/textconsole.h +++ b/common/textconsole.h @@ -56,7 +56,7 @@ typedef void (*ErrorHandler)(const char *msg); */ void setErrorHandler(ErrorHandler handler); -} // End of namespace Common +} // End of namespace Common void NORETURN_PRE error(const char *s, ...) GCC_PRINTF(1, 2) NORETURN_POST; diff --git a/common/unzip.cpp b/common/unzip.cpp index ab659343a2..69b9ff67cb 100644 --- a/common/unzip.cpp +++ b/common/unzip.cpp @@ -1534,4 +1534,4 @@ Archive *makeZipArchive(SeekableReadStream *stream) { return new ZipArchive(zipFile); } -} // End of namespace Common +} // End of namespace Common diff --git a/common/unzip.h b/common/unzip.h index 06480b0054..2e0dae831a 100644 --- a/common/unzip.h +++ b/common/unzip.h @@ -56,6 +56,6 @@ Archive *makeZipArchive(const FSNode &node); */ Archive *makeZipArchive(SeekableReadStream *stream); -} // End of namespace Common +} // End of namespace Common #endif diff --git a/common/updates.h b/common/updates.h index 4d58a216fb..0012808a17 100644 --- a/common/updates.h +++ b/common/updates.h @@ -95,7 +95,7 @@ public: virtual UpdateInterval getUpdateCheckInterval() { return kUpdateIntervalNotSupported; } }; -} // End of namespace Common +} // End of namespace Common #endif diff --git a/common/util.cpp b/common/util.cpp index 4d9ff11c5c..3d40fffff5 100644 --- a/common/util.cpp +++ b/common/util.cpp @@ -26,6 +26,7 @@ #define FORBIDDEN_SYMBOL_EXCEPTION_islower #define FORBIDDEN_SYMBOL_EXCEPTION_isspace #define FORBIDDEN_SYMBOL_EXCEPTION_isupper +#define FORBIDDEN_SYMBOL_EXCEPTION_isprint #include "common/util.h" @@ -144,4 +145,8 @@ bool isUpper(int c) { return isupper((byte)c); } +bool isPrint(int c) { + ENSURE_ASCII_CHAR(c); + return isprint((byte)c); +} } // End of namespace Common diff --git a/common/util.h b/common/util.h index 78340980d5..4ca1c42929 100644 --- a/common/util.h +++ b/common/util.h @@ -165,6 +165,17 @@ bool isSpace(int c); */ bool isUpper(int c); -} // End of namespace Common +/** + * Test whether the given character is printable. This includes the space + * character (' '). + * + * If the parameter is outside the range of a signed or unsigned char, then + * false is returned. + * + * @param c the character to test + * @return true if the character is printable, false otherwise. + */ +bool isPrint(int c); +} // End of namespace Common #endif diff --git a/common/zlib.cpp b/common/zlib.cpp index fc8f351054..920338e57e 100644 --- a/common/zlib.cpp +++ b/common/zlib.cpp @@ -392,17 +392,21 @@ public: #endif // USE_ZLIB SeekableReadStream *wrapCompressedReadStream(SeekableReadStream *toBeWrapped, uint32 knownSize) { -#if defined(USE_ZLIB) if (toBeWrapped) { uint16 header = toBeWrapped->readUint16BE(); bool isCompressed = (header == 0x1F8B || ((header & 0x0F00) == 0x0800 && header % 31 == 0)); toBeWrapped->seek(-2, SEEK_CUR); - if (isCompressed) + if (isCompressed) { +#if defined(USE_ZLIB) return new GZipReadStream(toBeWrapped, knownSize); - } +#else + delete toBeWrapped; + return NULL; #endif + } + } return toBeWrapped; } @@ -415,4 +419,4 @@ WriteStream *wrapCompressedWriteStream(WriteStream *toBeWrapped) { } -} // End of namespace Common +} // End of namespace Common diff --git a/common/zlib.h b/common/zlib.h index 6a840f5fdc..d940f3f3a1 100644 --- a/common/zlib.h +++ b/common/zlib.h @@ -103,7 +103,9 @@ bool inflateZlibInstallShield(byte *dst, uint dstLen, const byte *src, uint srcL * provides transparent on-the-fly decompression. Assumes the data it * retrieves from the wrapped stream to be either uncompressed or in gzip * format. In the former case, the original stream is returned unmodified - * (and in particular, not wrapped). + * (and in particular, not wrapped). In the latter case the stream is + * returned wrapped, unless there is no ZLIB support, then NULL is returned + * and the old stream is destroyed. * * Certain GZip-formats don't supply an easily readable length, if you * still need the length carried along with the stream, and you know @@ -129,6 +131,6 @@ SeekableReadStream *wrapCompressedReadStream(SeekableReadStream *toBeWrapped, ui */ WriteStream *wrapCompressedWriteStream(WriteStream *toBeWrapped); -} // End of namespace Common +} // End of namespace Common #endif @@ -21,6 +21,12 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + # Save the current environment variables for next runs SAVED_CONFIGFLAGS=$@ SAVED_LDFLAGS=$LDFLAGS @@ -123,6 +129,7 @@ _libunity=auto _debug_build=auto _release_build=auto _optimizations=auto +_use_cxx11=no _verbose_build=no _text_console=no _mt32emu=yes @@ -870,6 +877,7 @@ Game engines: The values of <engine name> for these options are as follows: $engines_help Optional Features: + --enable-c++11 build as C++11 if the compiler allows that --disable-debug disable building with debugging symbols --enable-Werror treat warnings as errors --enable-release enable building in release mode (this activates @@ -1109,6 +1117,12 @@ for ac_option in $@; do --backend=*) _backend=`echo $ac_option | cut -d '=' -f 2` ;; + --enable-c++11) + _use_cxx11=yes + ;; + --disable-c++11) + _use_cxx11=no + ;; --enable-debug) _debug_build=yes ;; @@ -1417,15 +1431,10 @@ fi case $_host in caanoo | gp2x | gp2xwiz | openpandora | ps2) if test "$_debug_build" = auto; then - # If you want to debug one of these platforms, use '--disable-release --enable-debug' + # If you want to debug one of these platforms, use '--disable-optimizations --enable-debug' _debug_build=no fi - if test "$_release_build" = auto; then - # Enable release build by default. - _release_build=yes - fi - if test "$_optimizations" = auto; then # Enable optimizations by default. _optimizations=yes @@ -1695,21 +1704,36 @@ if test "$cxx_verc_fail" = yes ; then fi # +# Check whether the compiler supports C++11 +# +have_cxx11=no +cat > $TMPC << EOF +int main(int argc, char *argv[]) { if (argv == nullptr) return -1; else return 0; } +EOF +cc_check -std=c++11 && have_cxx11=yes +if test "$_use_cxx11" = "yes" ; then + _use_cxx11=$have_cxx11 +fi + +# # Setup compiler specific CXXFLAGS now that we know the compiler version. # Foremost, this means enabling various warnings. # In addition, we set CXX_UPDATE_DEP_FLAG for GCC >= 3.0 and for ICC. # if test "$have_gcc" = yes ; then if test "$_cxx_major" -ge "3" ; then - case $_host_os in - # newlib-based system include files suppress non-C89 function - # declarations under __STRICT_ANSI__ - amigaos* | android | bada | dreamcast | ds | gamecube | mingw* | n64 | psp | ps2 | ps3 | wii | wince ) - ;; - *) - CXXFLAGS="$CXXFLAGS -ansi" - ;; - esac + # Try to use ANSI mode when C++11 is disabled. + if test "$_use_cxx11" = "no" ; then + case $_host_os in + # newlib-based system include files suppress non-C89 function + # declarations under __STRICT_ANSI__ + amigaos* | android | bada | dreamcast | ds | gamecube | mingw* | n64 | psp | ps2 | ps3 | wii | wince ) + ;; + *) + CXXFLAGS="$CXXFLAGS -ansi" + ;; + esac + fi CXXFLAGS="$CXXFLAGS -W -Wno-unused-parameter" add_line_to_config_mk 'HAVE_GCC3 = 1' add_line_to_config_mk 'CXX_UPDATE_DEP_FLAG = -MMD -MF "$(*D)/$(DEPDIR)/$(*F).d" -MQ "$@" -MP' @@ -1725,6 +1749,15 @@ elif test "$have_icc" = yes ; then add_line_to_config_mk 'CXX_UPDATE_DEP_FLAG = -MMD -MF "$(*D)/$(DEPDIR)/$(*F).d" -MQ "$@" -MP' fi; +# +# Update status about C++11 mode +# +echo_n "Building as C++11... " +if test "$_use_cxx11" = "yes" ; then + CXXFLAGS="$CXXFLAGS -std=c++11" +fi +echo $_use_cxx11 + # By default, we add -pedantic to the CXXFLAGS to catch some potentially # non-portable constructs, like use of GNU extensions. # However, some platforms use GNU extensions in system header files, so @@ -1904,7 +1937,7 @@ cc_check_clean tmp_find_type_with_size.cpp # for the smaller sizes. echo_n "Alignment required... " case $_host_cpu in - i[3-6]86 | x86_64 | ppc*) + i[3-6]86 | amd64 | x86_64 | ppc*) # Unaligned access should work _need_memalign=no ;; @@ -1951,7 +1984,7 @@ case $_host_cpu in echo "PowerPC" DEFINES="$DEFINES -DPPC_TARGET" ;; - x86_64) + amd64 | x86_64) echo "x86_64" ;; *) @@ -2521,10 +2554,13 @@ if test -n "$_host"; then DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE" if test "$_release_build" = no; then DEFINES="$DEFINES -DOP_DEBUG" - else - # Use -O3 on the OpenPandora for non-debug builds. + fi + + # Use -O3 on the OpenPandora for optimized builds. + if test "$_optimizations" = yes; then _optimization_level=-O3 fi + define_in_config_if_yes yes 'USE_ARM_NEON_ASPECT_CORRECTOR' CXXFLAGS="$CXXFLAGS -march=armv7-a" CXXFLAGS="$CXXFLAGS -mtune=cortex-a8" @@ -2540,6 +2576,16 @@ if test -n "$_host"; then _port_mk="backends/platform/openpandora/op-bundle.mk" ;; ppc-amigaos) + # Only static builds link successfully on buildbot + LDFLAGS=`echo $LDFLAGS | sed 's/-use-dynld//'` + LDFLAGS="$LDFLAGS -static" + + # toolchain binaries prefixed by host + _ranlib=$_host-ranlib + _strip=$_host-strip + _ar="$_host-ar cru" + _as="$_host-as" + _windres=$_host-windres ;; ps2) DEFINES="$DEFINES -DDISABLE_TEXT_CONSOLE" diff --git a/devtools/create_kyradat/create_kyradat.cpp b/devtools/create_kyradat/create_kyradat.cpp index 3b90ad0d85..1a3d406af1 100644 --- a/devtools/create_kyradat/create_kyradat.cpp +++ b/devtools/create_kyradat/create_kyradat.cpp @@ -47,7 +47,7 @@ #include <map> enum { - kKyraDatVersion = 83 + kKyraDatVersion = 84 }; const ExtractFilename extractFilenames[] = { @@ -606,7 +606,7 @@ const ExtractFilename extractFilenames[] = { // LANDS OF LORE // Ingame - { kLoLIngamePakFiles, kTypeStringList, false }, + { kLoLIngamePakFiles, k2TypeSfxList, false }, { kLoLCharacterDefs, kLoLTypeCharData, true }, { kLoLIngameSfxFiles, k2TypeSfxList, false }, @@ -625,7 +625,10 @@ const ExtractFilename extractFilenames[] = { { kLoLCharDefsKieran, kLoLTypeRaw16, false }, { kLoLCharDefsAkshel, kLoLTypeRaw16, false }, { kLoLExpRequirements, kLoLTypeRaw32, false }, - { kLoLMonsterModifiers, kLoLTypeRaw16, false }, + { kLoLMonsterModifiers1, kLoLTypeRaw16, false }, + { kLoLMonsterModifiers2, kLoLTypeRaw16, false }, + { kLoLMonsterModifiers3, kLoLTypeRaw16, false }, + { kLoLMonsterModifiers4, kLoLTypeRaw16, false }, { kLoLMonsterShiftOffsets, kTypeRawData, false }, { kLoLMonsterDirFlags, kTypeRawData, false }, { kLoLMonsterScaleY, kTypeRawData, false }, @@ -633,8 +636,8 @@ const ExtractFilename extractFilenames[] = { { kLoLMonsterScaleWH, kLoLTypeRaw16, false }, { kLoLFlyingObjectShp, kLoLTypeFlightShpData, false }, { kLoLInventoryDesc, kLoLTypeRaw16, false }, - { kLoLLevelShpList, kTypeStringList, false }, - { kLoLLevelDatList, kTypeStringList, false }, + { kLoLLevelShpList, k2TypeSfxList, false }, + { kLoLLevelDatList, k2TypeSfxList, false }, { kLoLCompassDefs, kLoLTypeCompassData, false }, { kLoLItemPrices, kLoLTypeRaw16, false }, { kLoLStashSetup, kTypeRawData, false }, @@ -671,14 +674,14 @@ const ExtractFilename extractFilenames[] = { { kLoLScrollYBottom, k3TypeRaw16to8, false }, { kLoLButtonDefs, kLoLTypeButtonDef, false }, - { kLoLButtonList1, kLoLTypeRaw16, false }, - { kLoLButtonList2, kLoLTypeRaw16, false }, - { kLoLButtonList3, kLoLTypeRaw16, false }, - { kLoLButtonList4, kLoLTypeRaw16, false }, - { kLoLButtonList5, kLoLTypeRaw16, false }, - { kLoLButtonList6, kLoLTypeRaw16, false }, - { kLoLButtonList7, kLoLTypeRaw16, false }, - { kLoLButtonList8, kLoLTypeRaw16, false }, + { kLoLButtonList1, k3TypeRaw16to8, false }, + { kLoLButtonList2, k3TypeRaw16to8, false }, + { kLoLButtonList3, k3TypeRaw16to8, false }, + { kLoLButtonList4, k3TypeRaw16to8, false }, + { kLoLButtonList5, k3TypeRaw16to8, false }, + { kLoLButtonList6, k3TypeRaw16to8, false }, + { kLoLButtonList7, k3TypeRaw16to8, false }, + { kLoLButtonList8, k3TypeRaw16to8, false }, { kLoLLegendData, kTypeRawData, false }, { kLoLMapCursorOvl, kTypeRawData, false }, @@ -2111,8 +2114,14 @@ const char *getIdString(const int id) { return "kLoLCharDefsAkshel"; case kLoLExpRequirements: return "kLoLExpRequirements"; - case kLoLMonsterModifiers: - return "kLoLMonsterModifiers"; + case kLoLMonsterModifiers1: + return "kLoLMonsterModifiers1"; + case kLoLMonsterModifiers2: + return "kLoLMonsterModifiers2"; + case kLoLMonsterModifiers3: + return "kLoLMonsterModifiers3"; + case kLoLMonsterModifiers4: + return "kLoLMonsterModifiers4"; case kLoLMonsterShiftOffsets: return "kLoLMonsterShiftOffsets"; case kLoLMonsterDirFlags: @@ -2229,6 +2238,8 @@ const char *getIdString(const int id) { return "kLoLLightningDefs"; case kLoLFireballCoords: return "kLoLFireballCoords"; + case kLoLCredits: + return "kLoLCredits"; case kLoLHistory: return "kLoLHistory"; default: diff --git a/devtools/create_kyradat/create_kyradat.h b/devtools/create_kyradat/create_kyradat.h index c2a69cfd79..6d5059cabe 100644 --- a/devtools/create_kyradat/create_kyradat.h +++ b/devtools/create_kyradat/create_kyradat.h @@ -606,7 +606,10 @@ enum kExtractID { kLoLCharDefsKieran, kLoLCharDefsAkshel, kLoLExpRequirements, - kLoLMonsterModifiers, + kLoLMonsterModifiers1, + kLoLMonsterModifiers2, + kLoLMonsterModifiers3, + kLoLMonsterModifiers4, kLoLMonsterShiftOffsets, kLoLMonsterDirFlags, kLoLMonsterScaleY, diff --git a/devtools/create_kyradat/extract.cpp b/devtools/create_kyradat/extract.cpp index 86244fce42..748bd36248 100644 --- a/devtools/create_kyradat/extract.cpp +++ b/devtools/create_kyradat/extract.cpp @@ -53,6 +53,7 @@ bool extractMrShapeAnimData(PAKFile &out, const ExtractInformation *info, const bool extractRaw16(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id); bool extractRaw32(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id); bool extractLoLButtonDefs(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id); +bool extractLoLFlyingShpDefs(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id); bool extractEoB2SeqData(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id); bool extractEoB2ShapeData(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id); @@ -81,7 +82,7 @@ const ExtractType extractTypeTable[] = { { kLoLTypeCharData, extractRaw }, { kLoLTypeSpellData, extractRaw }, { kLoLTypeCompassData, extractRaw16to8 }, - { kLoLTypeFlightShpData, extractRaw16to8 }, + { kLoLTypeFlightShpData, extractLoLFlyingShpDefs }, { kLoLTypeRaw16, extractRaw16 }, { kLoLTypeRaw32, extractRaw32 }, { kLoLTypeButtonDef, extractLoLButtonDefs }, @@ -965,18 +966,23 @@ bool extractPaddedStrings(PAKFile &out, const ExtractInformation *info, const by src++; while (*src && src < fin) *dst++ = *src++; - - *dst++ = '\0'; + if (src < fin) + *dst++ = *src++; entries++; } WRITE_BE_UINT32(buffer, entries); + outsize = dst - buffer; return out.addFile(filename, buffer, outsize); } bool extractRaw16to8(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) { + // Hack for some LOL FM-Towns entries + if (info->platform == Common::kPlatformFMTowns && ((id >= kLoLButtonList1 && id <= kLoLButtonList8) || id == kLoLCharInvIndex)) + return extractRaw(out, info, data, size, filename, id); + int outsize = size >> 1; uint8 *buffer = new uint8[outsize]; const uint8 *src = data; @@ -1049,6 +1055,30 @@ bool extractLoLButtonDefs(PAKFile &out, const ExtractInformation *info, const by return out.addFile(filename, buffer, outsize); } +bool extractLoLFlyingShpDefs(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) { + if (info->platform != Common::kPlatformFMTowns) + return extractRaw16to8(out, info, data, size, filename, id); + + int outsize = size / 9 * 5; + uint8 *buffer = new uint8[outsize]; + const uint8 *src = data; + uint8 *dst = buffer; + + for (int i = outsize / 5; i; --i) { + *dst++ = *src++; + src++; + *dst++ = *src++; + src++; + *dst++ = *src++; + src++; + *dst++ = *src++; + *dst++ = *src++; + src++; + } + + return out.addFile(filename, buffer, outsize); +} + bool extractEoB2SeqData(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) { int num = size / 11; uint8 *buffer = new uint8[size]; diff --git a/devtools/create_kyradat/games.cpp b/devtools/create_kyradat/games.cpp index 89229eb4f2..1b62155da0 100644 --- a/devtools/create_kyradat/games.cpp +++ b/devtools/create_kyradat/games.cpp @@ -124,6 +124,9 @@ const Game lolGames[] = { // PC98 (no language specifc strings) { kLoL, { JA_JPN, -1, -1 }, kPlatformPC98, kNoSpecial, { "6d5bd4a2f5ce433365734ca6b7a8d984", "1b0a457c48ae6908da301b656fe0aab4" } }, + // FM-Towns (no language specifc strings) + { kLoL, { JA_JPN, -1, -1 }, kPlatformFMTowns, kNoSpecial, { "a281c7143bf2b6c5d4daa107a4b0427e", "34b4cecce179990e3bcaaa2d31484a90"} }, + // DOS CD (multi language version, with no language specific strings) { kLoL, { EN_ANY, FR_FRA, DE_DEU }, kPlatformPC, kTalkieVersion, { "9d1778314de80598c0b0d032e2a1a1cf", "263998ec600afca1cc7b935c473df670" } }, { kLoL, { IT_ITA, FR_FRA, DE_DEU }, kPlatformPC, kTalkieVersion, { "9d1778314de80598c0b0d032e2a1a1cf", "f2af366e00f79dbf832fa19701d71ed9" } }, // Italian fan translation @@ -800,7 +803,9 @@ const int lolFloppyNeed[] = { kLoLCharDefsKieran, kLoLCharDefsAkshel, kLoLExpRequirements, - kLoLMonsterModifiers, + kLoLMonsterModifiers1, + kLoLMonsterModifiers2, + kLoLMonsterModifiers3, kLoLMonsterShiftOffsets, kLoLMonsterDirFlags, kLoLMonsterScaleY, @@ -844,7 +849,6 @@ const int lolFloppyNeed[] = { kLoLButtonDefs, kLoLButtonList1, - kLoLButtonList1, kLoLButtonList2, kLoLButtonList3, kLoLButtonList4, @@ -882,7 +886,9 @@ const int lolPC98Need[] = { kLoLCharDefsKieran, kLoLCharDefsAkshel, kLoLExpRequirements, - kLoLMonsterModifiers, + kLoLMonsterModifiers1, + kLoLMonsterModifiers2, + kLoLMonsterModifiers3, kLoLMonsterShiftOffsets, kLoLMonsterDirFlags, kLoLMonsterScaleY, @@ -926,6 +932,89 @@ const int lolPC98Need[] = { kLoLButtonDefs, kLoLButtonList1, + kLoLButtonList2, + kLoLButtonList3, + kLoLButtonList4, + kLoLButtonList5, + kLoLButtonList6, + kLoLButtonList7, + kLoLButtonList8, + + kLoLLegendData, + kLoLMapStringId, + + kLoLSpellbookAnim, + kLoLSpellbookCoords, + kLoLHealShapeFrames, + kLoLLightningDefs, + kLoLFireballCoords, + + kLoLCredits, + + -1 +}; + +const int lolFMTownsNeed[] = { + kLoLIngamePakFiles, + + kLoLCharacterDefs, + kLoLIngameSfxFiles, + kLoLIngameSfxIndex, + kLoLSpellProperties, + kLoLGameShapeMap, + kLoLSceneItemOffs, + kLoLCharInvIndex, + kLoLCharInvDefs, + kLoLCharDefsMan, + kLoLCharDefsWoman, + kLoLCharDefsKieran, + kLoLCharDefsAkshel, + kLoLExpRequirements, + kLoLMonsterModifiers1, + kLoLMonsterModifiers2, + kLoLMonsterModifiers3, + kLoLMonsterShiftOffsets, + kLoLMonsterDirFlags, + kLoLMonsterScaleY, + kLoLMonsterScaleX, + kLoLMonsterScaleWH, + kLoLFlyingObjectShp, + kLoLInventoryDesc, + + kLoLLevelShpList, + kLoLLevelDatList, + kLoLCompassDefs, + kLoLStashSetup, + kLoLDscWalls, + kRpgCommonDscShapeIndex, + kLoLDscOvlMap, + kLoLDscScaleWidthData, + kLoLDscScaleHeightData, + kRpgCommonDscX, + kLoLDscY, + kRpgCommonDscTileIndex, + kRpgCommonDscUnk2, + kRpgCommonDscDoorShapeIndex, + kRpgCommonDscDimData1, + kRpgCommonDscDimData2, + kRpgCommonDscBlockMap, + kRpgCommonDscDimMap, + kLoLDscOvlIndex, + kRpgCommonDscBlockIndex, + kRpgCommonDscDoorY2, + kRpgCommonDscDoorFrameY1, + kRpgCommonDscDoorFrameY2, + kLoLDscDoorScale, + kLoLDscDoor4, + kLoLDscDoorX, + kLoLDscDoorY, + + kLoLScrollXTop, + kLoLScrollYTop, + kLoLScrollXBottom, + kLoLScrollYBottom, + + kLoLButtonDefs, kLoLButtonList1, kLoLButtonList2, kLoLButtonList3, @@ -968,7 +1057,10 @@ const int lolCDNeed[] = { kLoLCharDefsKieran, kLoLCharDefsAkshel, kLoLExpRequirements, - kLoLMonsterModifiers, + kLoLMonsterModifiers1, + kLoLMonsterModifiers2, + kLoLMonsterModifiers3, + kLoLMonsterModifiers4, kLoLMonsterShiftOffsets, kLoLMonsterDirFlags, kLoLMonsterScaleY, @@ -1013,7 +1105,6 @@ const int lolCDNeed[] = { kLoLButtonDefs, kLoLButtonList1, - kLoLButtonList1, kLoLButtonList2, kLoLButtonList3, kLoLButtonList4, @@ -1695,6 +1786,7 @@ const GameNeed gameNeedTable[] = { { kLoL, kPlatformPC, kNoSpecial, lolFloppyNeed }, { kLoL, kPlatformPC98, kNoSpecial, lolPC98Need }, + { kLoL, kPlatformFMTowns, kNoSpecial, lolFMTownsNeed }, { kLoL, kPlatformPC, kTalkieVersion, lolCDNeed }, diff --git a/devtools/create_kyradat/tables.cpp b/devtools/create_kyradat/tables.cpp index 19b69d9410..09d70bc448 100644 --- a/devtools/create_kyradat/tables.cpp +++ b/devtools/create_kyradat/tables.cpp @@ -3341,7 +3341,7 @@ const ExtractEntrySearchData kEoB2WallOfForceShpIdProvider[] = { const ExtractEntrySearchData kLoLIngamePakFilesProvider[] = { { UNK_LANG, kPlatformPC, { 0x00000088, 0x0000224F, { { 0xDA, 0x24, 0x18, 0xA3, 0xEF, 0x16, 0x70, 0x8F, 0xA8, 0xC2, 0x2E, 0xC2, 0xED, 0x39, 0x03, 0xD1 } } } }, { UNK_LANG, kPlatformPC98, { 0x00000084, 0x00002125, { { 0x7A, 0x89, 0xE2, 0x36, 0xEC, 0x6F, 0x52, 0x2B, 0xEF, 0xBA, 0x3D, 0x28, 0x54, 0xDA, 0xFB, 0x72 } } } }, - + { UNK_LANG, kPlatformFMTowns, { 0x0000009D, 0x00002179, { { 0x7D, 0x7A, 0xE1, 0xD9, 0x69, 0x23, 0x9D, 0xFF, 0x83, 0x39, 0x73, 0xEC, 0xF4, 0x26, 0x20, 0x8E } } } }, EXTRACT_END_ENTRY }; @@ -3356,6 +3356,7 @@ const ExtractEntrySearchData kLoLCharacterDefsProvider[] = { { RU_RUS, kPlatformPC, { 0x00000492, 0x00004ACD, { { 0xDF, 0x87, 0xFE, 0x89, 0x59, 0xCC, 0x01, 0xD7, 0xC7, 0xEB, 0x16, 0xA4, 0x09, 0xAF, 0x5D, 0xC0 } } } }, // CD { IT_ITA, kPlatformPC, { 0x00000492, 0x00004ACD, { { 0xDF, 0x87, 0xFE, 0x89, 0x59, 0xCC, 0x01, 0xD7, 0xC7, 0xEB, 0x16, 0xA4, 0x09, 0xAF, 0x5D, 0xC0 } } } }, // CD { JA_JPN, kPlatformPC98, { 0x00000492, 0x00005893, { { 0x7C, 0x7E, 0xFB, 0x80, 0xD9, 0xB6, 0x16, 0x87, 0x80, 0xB7, 0x46, 0x9B, 0x96, 0x1A, 0x6A, 0xBE } } } }, + { JA_JPN, kPlatformFMTowns, { 0x00000492, 0x00005041, { { 0xAB, 0x07, 0x37, 0xFE, 0xC2, 0x4B, 0x5D, 0x16, 0xE4, 0xC4, 0x2C, 0x8C, 0xC3, 0x78, 0xCB, 0xCB } } } }, EXTRACT_END_ENTRY }; @@ -3364,7 +3365,7 @@ const ExtractEntrySearchData kLoLIngameSfxFilesProvider[] = { { UNK_LANG, kPlatformPC, { 0x000008F2, 0x0001E5B6, { { 0x63, 0x5E, 0x37, 0xAA, 0x27, 0x80, 0x4C, 0x85, 0xB1, 0x9D, 0x7B, 0x1D, 0x64, 0xA3, 0xEB, 0x97 } } } }, // floppy { UNK_LANG, kPlatformPC, { 0x000008F2, 0x0001E5B7, { { 0x9E, 0xC8, 0xE8, 0x19, 0x2F, 0x58, 0x0B, 0xC7, 0x2D, 0x41, 0x72, 0xE7, 0xF4, 0x80, 0x03, 0xCB } } } }, // CD { UNK_LANG, kPlatformPC98, { 0x000008EF, 0x0001E585, { { 0x85, 0x81, 0x5C, 0xA4, 0x34, 0x44, 0xF4, 0x58, 0xF9, 0x82, 0xEE, 0x0F, 0x6A, 0x0D, 0xA2, 0x7F } } } }, - + { UNK_LANG, kPlatformFMTowns, { 0x000008F0, 0x0001E585, { { 0xB7, 0x82, 0xFF, 0xAB, 0x71, 0x54, 0xEB, 0x52, 0x8D, 0xAC, 0x9A, 0xB4, 0x9E, 0x33, 0x00, 0x95 } } } }, EXTRACT_END_ENTRY }; @@ -3419,6 +3420,7 @@ const ExtractEntrySearchData kLoLSceneItemOffsProvider[] = { const ExtractEntrySearchData kLoLCharInvIndexProvider[] = { { UNK_LANG, kPlatformUnknown, { 0x0000000A, 0x00000006, { { 0x19, 0x79, 0x4E, 0xFC, 0x05, 0x14, 0x89, 0x23, 0xEB, 0xCA, 0x94, 0x50, 0xE8, 0xD3, 0x81, 0x24 } } } }, + { UNK_LANG, kPlatformFMTowns, { 0x00000005, 0x00000006, { { 0x54, 0x11, 0x01, 0x79, 0x4D, 0xED, 0xF9, 0xEA, 0xDF, 0x03, 0x51, 0xAB, 0x8D, 0x9D, 0x2F, 0x34 } } } }, EXTRACT_END_ENTRY }; @@ -3459,10 +3461,24 @@ const ExtractEntrySearchData kLoLExpRequirementsProvider[] = { EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kLoLMonsterModifiersProvider[] = { - { UNK_LANG, kPlatformUnknown, { 0x00000018, 0x000002C6, { { 0x38, 0x9A, 0x8B, 0x50, 0xD2, 0x9B, 0x95, 0x38, 0x91, 0x02, 0xA9, 0xBE, 0x78, 0xE5, 0x89, 0x65 } } } }, // floppy + PC98 - { UNK_LANG, kPlatformPC, { 0x00000018, 0x000002EE, { { 0x4E, 0x37, 0x56, 0xE3, 0x42, 0xB3, 0x15, 0x2C, 0x7E, 0x9B, 0x7E, 0x50, 0x32, 0x91, 0x55, 0xBE } } } }, // CD +const ExtractEntrySearchData kLoLMonsterModifiers1Provider[] = { + { UNK_LANG, kPlatformUnknown, { 0x00000006, 0x00000142, { { 0x62, 0x4B, 0x5E, 0x46, 0x64, 0xA4, 0x3A, 0xB7, 0x11, 0x14, 0xA8, 0x41, 0xAF, 0x4E, 0xE6, 0x58 } } } }, // floppy + PC98 + FM-TOWNS + { UNK_LANG, kPlatformPC, { 0x00000006, 0x000000E8, { { 0x94, 0xCB, 0xD2, 0xE4, 0xF4, 0xA8, 0x4D, 0x46, 0x2E, 0x84, 0x8C, 0x6F, 0xF9, 0x75, 0xD7, 0x28 } } } }, // CD + EXTRACT_END_ENTRY +}; +const ExtractEntrySearchData kLoLMonsterModifiers2Provider[] = { + { UNK_LANG, kPlatformUnknown, { 0x00000006, 0x000000C2, { { 0x89, 0x12, 0xA7, 0x0D, 0xD9, 0xC7, 0x5B, 0x03, 0xD4, 0x21, 0x6F, 0x0A, 0x1D, 0x83, 0x1B, 0x98 } } } }, + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kLoLMonsterModifiers3Provider[] = { + { UNK_LANG, kPlatformUnknown, { 0x00000006, 0x000000C2, { { 0x56, 0x4D, 0x82, 0xCC, 0x2C, 0x00, 0x1E, 0x9D, 0xF7, 0x64, 0xB7, 0x60, 0x63, 0x0A, 0x03, 0xD7 } } } }, + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kLoLMonsterModifiers4Provider[] = { + { UNK_LANG, kPlatformPC, { 0x00000006, 0x00000082, { { 0xA8, 0xFC, 0xBB, 0x1B, 0xC0, 0x85, 0x3B, 0xEF, 0xDB, 0xDE, 0xB0, 0x98, 0x58, 0x34, 0x75, 0xE9 } } } }, // CD EXTRACT_END_ENTRY }; @@ -3487,6 +3503,7 @@ const ExtractEntrySearchData kLoLMonsterScaleYProvider[] = { const ExtractEntrySearchData kLoLMonsterScaleXProvider[] = { { UNK_LANG, kPlatformPC, { 0x00000020, 0x00000918, { { 0xF6, 0x14, 0xE6, 0x48, 0x4E, 0x5B, 0x43, 0xCC, 0xCE, 0x4E, 0x98, 0x71, 0x5A, 0xC2, 0x00, 0x1E } } } }, { UNK_LANG, kPlatformPC98, { 0x0000001D, 0x000008D2, { { 0x1C, 0x25, 0x38, 0xE2, 0xBB, 0xB2, 0xDB, 0x93, 0x1B, 0x25, 0xB6, 0x89, 0xA9, 0x9B, 0x0A, 0xFE } } } }, + { UNK_LANG, kPlatformFMTowns, { 0x0000001D, 0x000008D2, { { 0x1C, 0x25, 0x38, 0xE2, 0xBB, 0xB2, 0xDB, 0x93, 0x1B, 0x25, 0xB6, 0x89, 0xA9, 0x9B, 0x0A, 0xFE } } } }, EXTRACT_END_ENTRY }; @@ -3499,6 +3516,7 @@ const ExtractEntrySearchData kLoLMonsterScaleWHProvider[] = { const ExtractEntrySearchData kLoLFlyingObjectShpProvider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000082, 0x00000252, { { 0xDE, 0x9D, 0x89, 0xAF, 0x0F, 0x50, 0x14, 0x60, 0x68, 0xAF, 0x19, 0xD8, 0x54, 0x8A, 0x36, 0x27 } } } }, + { UNK_LANG, kPlatformFMTowns, { 0x00000075, 0x00000252, { { 0xD7, 0xE5, 0x13, 0x67, 0xDB, 0x9C, 0xD4, 0x12, 0x0E, 0x99, 0x0D, 0x2A, 0x70, 0x17, 0x95, 0x89 } } } }, EXTRACT_END_ENTRY }; @@ -3511,13 +3529,13 @@ const ExtractEntrySearchData kLoLInventoryDescProvider[] = { const ExtractEntrySearchData kLoLLevelShpListProvider[] = { { UNK_LANG, kPlatformUnknown, { 0x0000007F, 0x00002090, { { 0x17, 0x31, 0x8A, 0xB5, 0x9B, 0x3A, 0xDA, 0x16, 0x9E, 0xE3, 0xD1, 0x5F, 0xB4, 0x7B, 0xB2, 0x25 } } } }, - + { UNK_LANG, kPlatformFMTowns, { 0x00000091, 0x00002090, { { 0x51, 0x79, 0x1D, 0x60, 0xB0, 0x71, 0xB8, 0xF2, 0xDD, 0xD4, 0x36, 0x1B, 0xF8, 0x15, 0xBF, 0xB7 } } } }, EXTRACT_END_ENTRY }; const ExtractEntrySearchData kLoLLevelDatListProvider[] = { - { UNK_LANG, kPlatformUnknown, { 0x0000007F, 0x00001FB8, { { 0xF6, 0xE9, 0x98, 0x79, 0x51, 0xCA, 0xA0, 0x35, 0xE4, 0xD0, 0xA1, 0xCD, 0x23, 0x89, 0x7D, 0x11 } } } }, // floppy + PC98 - { UNK_LANG, kPlatformPC, { 0x000000FF, 0x000047EC, { { 0x0D, 0xA5, 0xFD, 0x8A, 0x33, 0xDB, 0x93, 0x43, 0xE2, 0x57, 0x35, 0xEC, 0xA6, 0xCF, 0x7A, 0xA1 } } } }, // CD + { UNK_LANG, kPlatformUnknown, { 0x0000007F, 0x00001FB8, { { 0xF6, 0xE9, 0x98, 0x79, 0x51, 0xCA, 0xA0, 0x35, 0xE4, 0xD0, 0xA1, 0xCD, 0x23, 0x89, 0x7D, 0x11 } } } }, + { UNK_LANG, kPlatformFMTowns, { 0x00000091, 0x00001FB8, { { 0x65, 0x1A, 0x3E, 0x96, 0x96, 0xA9, 0x94, 0xD6, 0xD5, 0x21, 0xBE, 0x60, 0xB5, 0x83, 0xF0, 0xE5 } } } }, EXTRACT_END_ENTRY }; @@ -3680,7 +3698,7 @@ const ExtractEntrySearchData kLoLDscDoorScaleProvider[] = { const ExtractEntrySearchData kLoLDscDoor4Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000008, 0x00000103, { { 0x29, 0xC0, 0x4B, 0x7F, 0x36, 0x23, 0xBB, 0x38, 0x4C, 0x83, 0xC6, 0x9D, 0xB4, 0x8F, 0x29, 0x2E } } } }, - + { UNK_LANG, kPlatformFMTowns, { 0x00000008, 0x0000000F, { { 0x9C, 0x6B, 0xAF, 0x69, 0x42, 0xC9, 0xC9, 0xA0, 0xD9, 0xF3, 0x54, 0xD9, 0x9A, 0xAF, 0xCF, 0xD8 } } } }, EXTRACT_END_ENTRY }; @@ -3725,55 +3743,56 @@ const ExtractEntrySearchData kLoLButtonDefsProvider[] = { { 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 } } } }, - + { UNK_LANG, kPlatformFMTowns, { 0x0000082A, 0x0000D271, { { 0xAF, 0xAD, 0x11, 0xF9, 0xDC, 0x41, 0x94, 0xB3, 0x0E, 0x48, 0x69, 0xB3, 0x32, 0x89, 0x7C, 0xDD } } } }, EXTRACT_END_ENTRY }; const ExtractEntrySearchData kLoLButtonList1Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000050, 0x00000A37, { { 0x0F, 0x73, 0xEC, 0xDD, 0xAB, 0xFF, 0x49, 0x46, 0x5E, 0x8F, 0x0D, 0xC3, 0xE7, 0x1B, 0x89, 0x51 } } } }, + { UNK_LANG, kPlatformFMTowns, { 0x00000028, 0x00000938, { { 0x4B, 0xD9, 0x4A, 0x57, 0x58, 0xEC, 0x01, 0xE5, 0xA1, 0x25, 0x6A, 0x1A, 0x9C, 0x5D, 0x79, 0x19 } } } }, EXTRACT_END_ENTRY }; const ExtractEntrySearchData kLoLButtonList2Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x0000001E, 0x00000522, { { 0xEA, 0x41, 0x46, 0xE2, 0xFE, 0xAA, 0x7D, 0x5E, 0x89, 0x7F, 0xBF, 0x9B, 0x30, 0x60, 0x74, 0xF3 } } } }, - + { UNK_LANG, kPlatformFMTowns, { 0x0000000F, 0x00000423, { { 0xD3, 0xA8, 0xD4, 0xFB, 0x1A, 0x56, 0x21, 0x8C, 0x01, 0xED, 0xF8, 0x54, 0xA9, 0xC5, 0x97, 0x04 } } } }, EXTRACT_END_ENTRY }; const ExtractEntrySearchData kLoLButtonList3Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000004, 0x0000023E, { { 0x70, 0xAA, 0xCA, 0xAC, 0x5C, 0x21, 0xCF, 0xA5, 0xBF, 0x7F, 0x5F, 0xBC, 0xF1, 0x24, 0x8A, 0xAF } } } }, - + { UNK_LANG, kPlatformFMTowns, { 0x00000002, 0x0000013F, { { 0xDF, 0xE4, 0x3D, 0x18, 0x94, 0x18, 0xA5, 0x74, 0xBA, 0x26, 0x7B, 0x31, 0x87, 0xAE, 0xEE, 0x22 } } } }, EXTRACT_END_ENTRY }; const ExtractEntrySearchData kLoLButtonList4Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x0000001E, 0x0000054D, { { 0x19, 0x2A, 0xBE, 0x7F, 0x94, 0x10, 0xA0, 0x60, 0x2A, 0x33, 0xD6, 0x11, 0x85, 0xF0, 0xA4, 0xA9 } } } }, - + { UNK_LANG, kPlatformFMTowns, { 0x0000000F, 0x0000044E, { { 0x18, 0x1E, 0xBB, 0x7D, 0xAC, 0xA1, 0x87, 0x0F, 0x32, 0xA3, 0xBF, 0x5F, 0xBC, 0xBB, 0x90, 0xA4 } } } }, EXTRACT_END_ENTRY }; const ExtractEntrySearchData kLoLButtonList5Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000020, 0x0000045D, { { 0xE3, 0x7C, 0xC2, 0x36, 0x21, 0x46, 0xDB, 0xF3, 0xDD, 0x38, 0x4B, 0x40, 0xE0, 0x35, 0x09, 0xC3 } } } }, - + { UNK_LANG, kPlatformFMTowns, { 0x00000010, 0x0000035E, { { 0x4E, 0xE2, 0xD6, 0x93, 0xA3, 0xEF, 0xD0, 0xEA, 0x28, 0xE6, 0xE7, 0xDD, 0xFC, 0x44, 0xE2, 0xB9 } } } }, EXTRACT_END_ENTRY }; const ExtractEntrySearchData kLoLButtonList6Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x0000001C, 0x000004C4, { { 0x21, 0x7C, 0x29, 0x3F, 0x95, 0x6F, 0x91, 0x8C, 0xB2, 0x30, 0x09, 0xA6, 0x7B, 0x48, 0x44, 0x8F } } } }, - + { UNK_LANG, kPlatformFMTowns, { 0x0000000E, 0x000003C5, { { 0x05, 0x10, 0x83, 0x1E, 0x18, 0x11, 0xC4, 0x43, 0x01, 0xE3, 0xE0, 0xD7, 0x79, 0x29, 0xA5, 0x86 } } } }, EXTRACT_END_ENTRY }; const ExtractEntrySearchData kLoLButtonList7Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000006, 0x0000021D, { { 0xDC, 0xCE, 0x1B, 0xEB, 0x11, 0x6D, 0xDE, 0x37, 0x17, 0xC8, 0x06, 0x51, 0xC3, 0x0C, 0xCB, 0xA6 } } } }, - + { UNK_LANG, kPlatformFMTowns, { 0x00000003, 0x0000011E, { { 0xCF, 0x37, 0xEF, 0x83, 0xEC, 0x0D, 0x65, 0x41, 0xC8, 0x1D, 0xD1, 0x20, 0x82, 0x6B, 0xB5, 0x9B } } } }, EXTRACT_END_ENTRY }; const ExtractEntrySearchData kLoLButtonList8Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000004, 0x00000253, { { 0x0C, 0x7B, 0x10, 0x99, 0x93, 0xD0, 0x33, 0xCA, 0xAB, 0x8D, 0x7E, 0x24, 0xE5, 0x7E, 0x6C, 0x91 } } } }, - + { UNK_LANG, kPlatformFMTowns, { 0x00000002, 0x00000154, { { 0xE9, 0x6B, 0x8A, 0xD7, 0x8E, 0xCF, 0x66, 0x07, 0xDC, 0xF1, 0xC0, 0xAA, 0x81, 0x88, 0xB8, 0xB9 } } } }, EXTRACT_END_ENTRY }; @@ -3828,7 +3847,7 @@ const ExtractEntrySearchData kLoLFireballCoordsProvider[] = { const ExtractEntrySearchData kLoLCreditsProvider[] = { { JA_JPN , kPlatformPC98, { 0x000005E7, 0x0001A1B0, { { 0x2A, 0xD0, 0x38, 0x84, 0x0C, 0x38, 0xCB, 0x52, 0x5D, 0x82, 0xBE, 0x03, 0x76, 0xFA, 0x0A, 0x4A } } } }, - + { JA_JPN , kPlatformFMTowns, { 0x000005EC, 0x0001A219, { { 0x03, 0xBC, 0x67, 0x19, 0xA1, 0x99, 0x70, 0x10, 0x7A, 0x73, 0x85, 0xDA, 0xB4, 0x59, 0x49, 0xB0 } } } }, EXTRACT_END_ENTRY }; @@ -4377,7 +4396,10 @@ const ExtractEntry extractProviders[] = { { kLoLCharDefsKieran, kLoLCharDefsKieranProvider }, { kLoLCharDefsAkshel, kLoLCharDefsAkshelProvider }, { kLoLExpRequirements, kLoLExpRequirementsProvider }, - { kLoLMonsterModifiers, kLoLMonsterModifiersProvider }, + { kLoLMonsterModifiers1, kLoLMonsterModifiers1Provider }, + { kLoLMonsterModifiers2, kLoLMonsterModifiers2Provider }, + { kLoLMonsterModifiers3, kLoLMonsterModifiers3Provider }, + { kLoLMonsterModifiers4, kLoLMonsterModifiers4Provider }, { kLoLMonsterShiftOffsets, kLoLMonsterShiftOffsetsProvider }, { kLoLMonsterDirFlags, kLoLMonsterDirFlagsProvider }, { kLoLMonsterScaleY, kLoLMonsterScaleYProvider }, diff --git a/devtools/credits.pl b/devtools/credits.pl index e04e35d3be..28c3139bfd 100755 --- a/devtools/credits.pl +++ b/devtools/credits.pl @@ -267,14 +267,22 @@ sub begin_section { print '\f1\b0\fs24 \cf0 \\' . "\n"; } elsif ($mode eq "CPP") { if ($section_level eq 0) { - # TODO: Would be nice to have a 'fat' or 'large' mode for - # headlines... - $title = html_entities_to_cpp($title); - print '"C1""'.$title.'",' . "\n"; - print '"",' . "\n"; + # TODO: Would be nice to have a 'fat' or 'large' mode for + # headlines... + my $ascii_title = html_entities_to_ascii($title); + $title = html_entities_to_cpp($title); + if ($ascii_title ne $title) { + print '"A1""'.$ascii_title.'",' . "\n"; + } + print '"C1""'.$title.'",' . "\n"; + print '"",' . "\n"; } else { - $title = html_entities_to_cpp($title); - print '"C1""'.$title.'",' . "\n"; + my $ascii_title = html_entities_to_ascii($title); + $title = html_entities_to_cpp($title); + if ($ascii_title ne $title) { + print '"A1""'.$ascii_title.'",' . "\n"; + } + print '"C1""'.$title.'",' . "\n"; } } elsif ($mode eq "XML-DOC") { print " <row><entry namest='start' nameend='job'>"; @@ -392,13 +400,21 @@ sub add_person { } } elsif ($mode eq "CPP") { $name = $nick if $name eq ""; + my $ascii_name = html_entities_to_ascii($name); $name = html_entities_to_cpp($name); + if ($ascii_name ne $name) { + print '"A0""'.$ascii_name.'",' . "\n"; + } print '"C0""'.$name.'",' . "\n"; # Print desc wrapped if (length $desc > 0) { + my $ascii_desc = html_entities_to_ascii($desc); $desc = html_entities_to_cpp($desc); + if ($ascii_desc ne $desc) { + print '"A2""'.$ascii_desc.'",' . "\n"; + } print '"C2""'.$desc.'",' . "\n"; } } elsif ($mode eq "XML-DOC") { @@ -687,6 +703,11 @@ begin_credits("Credits"); add_person("Joost Peters", "joostp", ""); end_section(); + begin_section("Toltecs"); + add_person("Benjamin Haisch", "john_doe", ""); + add_person("Filippos Karapetis", "[md5]", ""); + end_section(); + begin_section("Tony"); add_person("Arnaud Boutonné", "Strangerke", ""); add_person("Paul Gilbert", "dreammaster", ""); @@ -940,6 +961,9 @@ begin_credits("Credits"); begin_section("Basque"); add_person("Mikel Iturbe Urretxa", "", ""); end_section(); + begin_section("Belarusian"); + add_person("Ivan Lukyanov", "", ""); + end_section(); begin_section("Catalan"); add_person("Jordi Vilalta Prat", "jvprat", ""); end_section(); @@ -949,6 +973,9 @@ begin_credits("Credits"); begin_section("Danish"); add_person("Steffen Nyeland", "", ""); end_section(); + begin_section("Finnish"); + add_person("Toni Saarela", "catnose", ""); + end_section(); begin_section("French"); add_person("Thierry Crozat", "criezy", ""); end_section(); diff --git a/dists/bada/Res/scummmobile/scummmobile_layout.stx b/dists/bada/Res/scummmobile/scummmobile_layout.stx index efb8ebc6b5..5da293a131 100644 --- a/dists/bada/Res/scummmobile/scummmobile_layout.stx +++ b/dists/bada/Res/scummmobile/scummmobile_layout.stx @@ -371,6 +371,10 @@ height = 'Globals.Line.Height' /> </layout> + <widget name = 'mcFluidSynthSettings' + width = '200' + height = 'Globals.Button.Height' + /> </layout> </dialog> @@ -786,6 +790,157 @@ </layout> </dialog> + <dialog name = 'FluidSynthSettings' overlays = 'GlobalOptions' shading = 'dim'> + <layout type = 'vertical' padding = '0, 0, 0, 0'> + <widget name = 'TabWidget'/> + <layout type = 'horizontal' padding = '16, 16, 16, 16'> + <space/> + <widget name = 'ResetSettings' + type = 'Button' + /> + <widget name = 'Cancel' + type = 'Button' + /> + <widget name = 'Ok' + type = 'Button' + /> + </layout> + </layout> + </dialog> + + <dialog name = 'FluidSynthSettings_Chorus' overlays = 'Dialog.FluidSynthSettings.TabWidget'> + <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'> + <widget name = 'EnableTabCheckbox' + type = 'Checkbox' + /> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'VoiceCountText' + type = 'OptionsLabel' + /> + <widget name = 'VoiceCountSlider' + type = 'Slider' + /> + <widget name = 'VoiceCountLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'LevelText' + type = 'OptionsLabel' + /> + <widget name = 'LevelSlider' + type = 'Slider' + /> + <widget name = 'LevelLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'SpeedText' + type = 'OptionsLabel' + /> + <widget name = 'SpeedSlider' + type = 'Slider' + /> + <widget name = 'SpeedLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'DepthText' + type = 'OptionsLabel' + /> + <widget name = 'DepthSlider' + type = 'Slider' + /> + <widget name = 'DepthLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'WaveFormTypeText' + type = 'OptionsLabel' + /> + <widget name = 'WaveFormType' + type = 'PopUp' + /> + </layout> + </layout> + </dialog> + + <dialog name = 'FluidSynthSettings_Reverb' overlays = 'Dialog.FluidSynthSettings.TabWidget'> + <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'> + <widget name = 'EnableTabCheckbox' + type = 'Checkbox' + /> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'RoomSizeText' + type = 'OptionsLabel' + /> + <widget name = 'RoomSizeSlider' + type = 'Slider' + /> + <widget name = 'RoomSizeLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'DampingText' + type = 'OptionsLabel' + /> + <widget name = 'DampingSlider' + type = 'Slider' + /> + <widget name = 'DampingLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'WidthText' + type = 'OptionsLabel' + /> + <widget name = 'WidthSlider' + type = 'Slider' + /> + <widget name = 'WidthLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'LevelText' + type = 'OptionsLabel' + /> + <widget name = 'LevelSlider' + type = 'Slider' + /> + <widget name = 'LevelLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + </layout> + </dialog> + + <dialog name = 'FluidSynthSettings_Misc' overlays = 'Dialog.FluidSynthSettings.TabWidget'> + <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'InterpolationText' + type = 'OptionsLabel' + /> + <widget name = 'Interpolation' + type = 'PopUp' + /> + </layout> + </layout> + </dialog> + <dialog name = 'SaveLoadChooser' overlays = 'screen' inset = '8' shading = 'dim'> <layout type = 'vertical' padding = '8, 8, 8, 32' center = 'true'> <widget name = 'Title' diff --git a/dists/debian/copyright b/dists/debian/copyright index 318c06f62b..1cccd01a07 100644 --- a/dists/debian/copyright +++ b/dists/debian/copyright @@ -7,7 +7,7 @@ It was downloaded from <http://www.scummvm.org/>. Upstream Authors: see `/usr/share/doc/scummvm/AUTHORS'. -Scummvm is Copyright © 2002-2012 The ScummVM Project +Scummvm is Copyright © 2002-2013 The ScummVM Project 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 diff --git a/dists/engine-data/kyra.dat b/dists/engine-data/kyra.dat Binary files differindex 339b85664a..305c7e665c 100644 --- a/dists/engine-data/kyra.dat +++ b/dists/engine-data/kyra.dat diff --git a/dists/engine-data/wintermute.zip b/dists/engine-data/wintermute.zip Binary files differnew file mode 100644 index 0000000000..924429972b --- /dev/null +++ b/dists/engine-data/wintermute.zip diff --git a/dists/macosx/Info.plist b/dists/macosx/Info.plist index d8c28f6a08..43d7c37bc5 100644 --- a/dists/macosx/Info.plist +++ b/dists/macosx/Info.plist @@ -28,7 +28,7 @@ <key>CFBundleExecutable</key> <string>scummvm</string> <key>CFBundleGetInfoString</key> - <string>1.6.0git, Copyright 2001-2012 The ScummVM team</string> + <string>1.6.0git, Copyright 2001-2013 The ScummVM team</string> <key>CFBundleIconFile</key> <string>scummvm.icns</string> <key>CFBundleIdentifier</key> @@ -46,7 +46,7 @@ <key>NSPrincipalClass</key> <string>NSApplication</string> <key>NSHumanReadableCopyright</key> - <string>Copyright 2001-2012 The ScummVM team</string> + <string>Copyright 2001-2013 The ScummVM team</string> <key>SUFeedURL</key> <string>http://www.scummvm.org/appcasts/macosx/release.xml</string> <key>SUPublicDSAKeyFile</key> diff --git a/dists/macosx/Info.plist.in b/dists/macosx/Info.plist.in index ff010bee07..b810b7ea5a 100644 --- a/dists/macosx/Info.plist.in +++ b/dists/macosx/Info.plist.in @@ -28,7 +28,7 @@ <key>CFBundleExecutable</key> <string>scummvm</string> <key>CFBundleGetInfoString</key> - <string>@VERSION@, Copyright 2001-2012 The ScummVM team</string> + <string>@VERSION@, Copyright 2001-2013 The ScummVM team</string> <key>CFBundleIconFile</key> <string>scummvm.icns</string> <key>CFBundleIdentifier</key> @@ -46,7 +46,7 @@ <key>NSPrincipalClass</key> <string>NSApplication</string> <key>NSHumanReadableCopyright</key> - <string>Copyright 2001-2012 The ScummVM team</string> + <string>Copyright 2001-2013 The ScummVM team</string> <key>SUFeedURL</key> <string>http://www.scummvm.org/appcasts/macosx/release.xml</string> <key>SUPublicDSAKeyFile</key> diff --git a/dists/scummvm.rc b/dists/scummvm.rc index 8527c668c8..b9c001c1f1 100644 --- a/dists/scummvm.rc +++ b/dists/scummvm.rc @@ -20,34 +20,37 @@ scummmodern.zip FILE "gui/themes/scummmodern.zip" translations.dat FILE "gui/themes/translations.dat" #endif -#if ENABLE_DRASCULA == STATIC_PLUGIN +#if ENABLE_DRASCULA == STATIC_PLUGIN drascula.dat FILE "dists/engine-data/drascula.dat" #endif -#if ENABLE_HUGO == STATIC_PLUGIN +#if ENABLE_HUGO == STATIC_PLUGIN hugo.dat FILE "dists/engine-data/hugo.dat" #endif -#if ENABLE_KYRA == STATIC_PLUGIN +#if ENABLE_KYRA == STATIC_PLUGIN kyra.dat FILE "dists/engine-data/kyra.dat" #endif -#if ENABLE_LURE == STATIC_PLUGIN +#if ENABLE_LURE == STATIC_PLUGIN lure.dat FILE "dists/engine-data/lure.dat" #endif -#if ENABLE_QUEEN == STATIC_PLUGIN +#if ENABLE_QUEEN == STATIC_PLUGIN queen.tbl FILE "dists/engine-data/queen.tbl" #endif -#if ENABLE_SKY == STATIC_PLUGIN +#if ENABLE_SKY == STATIC_PLUGIN sky.cpt FILE "dists/engine-data/sky.cpt" #endif -#if ENABLE_TEENAGENT == STATIC_PLUGIN +#if ENABLE_TEENAGENT == STATIC_PLUGIN teenagent.dat FILE "dists/engine-data/teenagent.dat" #endif -#if ENABLE_TOON == STATIC_PLUGIN +#if ENABLE_TOON == STATIC_PLUGIN toon.dat FILE "dists/engine-data/toon.dat" #endif -#if ENABLE_TONY == STATIC_PLUGIN +#if ENABLE_TONY == STATIC_PLUGIN tony.dat FILE "dists/engine-data/tony.dat" #endif -#if ENABLE_AGI == STATIC_PLUGIN +#if ENABLE_WINTERMUTE == STATIC_PLUGIN +wintermute.zip FILE "dists/engine-data/wintermute.zip" +#endif +#if ENABLE_AGI == STATIC_PLUGIN pred.dic FILE "dists/pred.dic" #endif @@ -72,7 +75,7 @@ BEGIN VALUE "FileDescription", "http://www.scummvm.org/\0" VALUE "FileVersion", "1.6.0git\0" VALUE "InternalName", "scummvm\0" - VALUE "LegalCopyright", "Copyright © 2001-2012 The ScummVM Team\0" + VALUE "LegalCopyright", "Copyright © 2001-2013 The ScummVM Team\0" VALUE "LegalTrademarks", "'SCUMM', and all SCUMM games are a TM of LucasArts. Simon The Sorcerer is a TM of AdventureSoft. Beneath a Steel Sky and Broken Sword are a TM of Revolution. Flight of the Amazon Queen is a TM of John Passfield and Steve Stamatiadis. \0" VALUE "OriginalFilename", "scummvm.exe\0" VALUE "ProductName", "ScummVM\0" diff --git a/dists/scummvm.rc.in b/dists/scummvm.rc.in index a874b98514..f986cc52e8 100644 --- a/dists/scummvm.rc.in +++ b/dists/scummvm.rc.in @@ -20,31 +20,34 @@ scummmodern.zip FILE "gui/themes/scummmodern.zip" translations.dat FILE "gui/themes/translations.dat" #endif -#if ENABLE_DRASCULA == STATIC_PLUGIN +#if ENABLE_DRASCULA == STATIC_PLUGIN drascula.dat FILE "dists/engine-data/drascula.dat" #endif -#if ENABLE_HUGO == STATIC_PLUGIN +#if ENABLE_HUGO == STATIC_PLUGIN hugo.dat FILE "dists/engine-data/hugo.dat" #endif -#if ENABLE_KYRA == STATIC_PLUGIN +#if ENABLE_KYRA == STATIC_PLUGIN kyra.dat FILE "dists/engine-data/kyra.dat" #endif -#if ENABLE_LURE == STATIC_PLUGIN +#if ENABLE_LURE == STATIC_PLUGIN lure.dat FILE "dists/engine-data/lure.dat" #endif -#if ENABLE_QUEEN == STATIC_PLUGIN +#if ENABLE_QUEEN == STATIC_PLUGIN queen.tbl FILE "dists/engine-data/queen.tbl" #endif -#if ENABLE_SKY == STATIC_PLUGIN +#if ENABLE_SKY == STATIC_PLUGIN sky.cpt FILE "dists/engine-data/sky.cpt" #endif -#if ENABLE_TEENAGENT == STATIC_PLUGIN +#if ENABLE_TEENAGENT == STATIC_PLUGIN teenagent.dat FILE "dists/engine-data/teenagent.dat" #endif -#if ENABLE_TOON == STATIC_PLUGIN +#if ENABLE_TOON == STATIC_PLUGIN toon.dat FILE "dists/engine-data/toon.dat" #endif -#if ENABLE_AGI == STATIC_PLUGIN +#if ENABLE_WINTERMUTE == STATIC_PLUGIN +wintermute.zip FILE "dists/engine-data/wintermute.zip" +#endif +#if ENABLE_AGI == STATIC_PLUGIN pred.dic FILE "dists/pred.dic" #endif @@ -69,7 +72,7 @@ BEGIN VALUE "FileDescription", "http://www.scummvm.org/\0" VALUE "FileVersion", "@VERSION@\0" VALUE "InternalName", "scummvm\0" - VALUE "LegalCopyright", "Copyright © 2001-2012 The ScummVM Team\0" + VALUE "LegalCopyright", "Copyright © 2001-2013 The ScummVM Team\0" VALUE "LegalTrademarks", "'SCUMM', and all SCUMM games are a TM of LucasArts. Simon The Sorcerer is a TM of AdventureSoft. Beneath a Steel Sky and Broken Sword are a TM of Revolution. Flight of the Amazon Queen is a TM of John Passfield and Steve Stamatiadis. \0" VALUE "OriginalFilename", "scummvm.exe\0" VALUE "ProductName", "ScummVM\0" diff --git a/dists/win32/ScummVM.iss b/dists/win32/ScummVM.iss index adea759110..fa0f760f59 100644 --- a/dists/win32/ScummVM.iss +++ b/dists/win32/ScummVM.iss @@ -1,5 +1,5 @@ [Setup] -AppCopyright=2012 +AppCopyright=2013 AppName=ScummVM AppVerName=ScummVM Git AppPublisher=The ScummVM Team diff --git a/dists/win32/migration.bat b/dists/win32/migration.bat index 2bba7baef4..b4b00c02cc 100644 --- a/dists/win32/migration.bat +++ b/dists/win32/migration.bat @@ -4,7 +4,7 @@ :: This script will copy any saved games located in the :: old default location, to the new default location. :: -:: (c) 2012 ScummVM Team +:: (c) 2012-2013 ScummVM Team :: @echo off diff --git a/dists/win32/scummvm.nsi b/dists/win32/scummvm.nsi index 795eb660b6..fb4787a172 100644 --- a/dists/win32/scummvm.nsi +++ b/dists/win32/scummvm.nsi @@ -76,7 +76,7 @@ Name ScummVM !define COMPANY "ScummVM Team" !define URL "http://scummvm.org/" !define DESCRIPTION "ScummVM Installer. Look! A three headed monkey (TM)!" -!define COPYRIGHT "Copyright © 2001-2012 The ScummVM Team" +!define COPYRIGHT "Copyright © 2001-2013 The ScummVM Team" ######################################################################################### # Installer configuration diff --git a/dists/win32/scummvm.nsi.in b/dists/win32/scummvm.nsi.in index 340024e6a1..9f8bd1dad2 100644 --- a/dists/win32/scummvm.nsi.in +++ b/dists/win32/scummvm.nsi.in @@ -76,7 +76,7 @@ Name ScummVM !define COMPANY "ScummVM Team" !define URL "http://scummvm.org/" !define DESCRIPTION "ScummVM Installer. Look! A three headed monkey (TM)!" -!define COPYRIGHT "Copyright © 2001-2012 The ScummVM Team" +!define COPYRIGHT "Copyright © 2001-2013 The ScummVM Team" ######################################################################################### # Installer configuration diff --git a/doc/cz/PrectiMe b/doc/cz/PrectiMe index 153ef09dcd..9f16eb2f96 100644 --- a/doc/cz/PrectiMe +++ b/doc/cz/PrectiMe @@ -1,7 +1,8 @@ PŘEÄŒTIMÄš ScummVM ------------------------------------------------------------------------ -Pro vÃce informacÃ, seznamy kompatibility, podrobnosti o dotacÃch, nejnovÄ›jšà verze, novinky o vývoji a dalÅ¡Ã, prosÃm navÅ¡tivte domovskou stránku ScummVM na: http://www.scummvm.org/ +Pro vÃce informacÃ, seznamy kompatibility, podrobnosti o dotacÃch, nejnovÄ›jšà verze, +novinky o vývoji a dalÅ¡Ã, prosÃm navÅ¡tivte domovskou stránku ScummVM na: http://www.scummvm.org/ Obsah: @@ -210,10 +211,14 @@ Dalšà hry: Discworld 2: Missing Presumed ...!? [dw2] Dragon History [draci] Drascula: The Vampire Strikes Back [drascula] + Eye of the Beholder [eob] + Eye of the Beholder II: The Legend of + Darkmoon [eob2] Flight of the Amazon Queen [queen] Future Wars [fw] Inherit the Earth: Quest for the Orb [ite] Nippon Safes Inc. [nippon] + Lands of Lore: The Throne of Chaos [lol] The Legend of Kyrandia [kyra1] The Legend of Kyrandia: The Hand of Fate [kyra2] The Legend of Kyrandia: Malcolm's Revenge [kyra3] @@ -315,21 +320,24 @@ V nÄ›kterých pÅ™Ãpadech ScummVM pÅ™esto zobrazà obrazovku ochrany proti kopà ScummVM pÅ™eskakuje ochranu v následujÃcÃch hrách: - * Maniac Mansion - * Zak McKracken and the Alien Mindbenders - * Loom (EGA) - * The Secret of Monkey Island (VGA) - * Monkey Island 2: LeChuck's Revenge * Beneath a Steel Sky -- potlaÄeno s laskavým svolenÃm Revolution Software. + * Dreamweb + -- seznam dostupných pÅ™Ãkazů v terminálech ve hÅ™e je nynà zobrazen + když hrÃ¡Ä použije pÅ™Ãkaz 'help' * Inherit the Earth: Quest for the Orb (Floppy version) -- potlaÄeno s laskavým svolenÃm Wyrmkeep Entertainment, protože byla potlaÄena ve vÅ¡ech vydánÃch hry na CD. + * Loom (EGA DOS) + * Maniac Mansion + * Monkey Island 2: LeChuck's Revenge * Simon the Sorcerer 1 (Floppy version) * Simon the Sorcerer 2 (Floppy version) -- potlaÄeno s laskavým svolenÃm from Adventure Soft, protože byla potlaÄena ve vÅ¡ech vydánÃch hry na CD. + * The Secret of Monkey Island (VGA) * Waxworks + * Zak McKracken and the Alien Mindbenders 3.2) Poznámky ke hrám Commodore64: @@ -1513,7 +1521,7 @@ Jsou rozpoznávána následujÃcà klÃÄová slova: output_rate ÄÃslo Který výstupnà vzorkovacà kmitoÄet použÃt v Hz. Rozumné hodnoty jsou 11025, 22050 a 44100. alsa_port Å™etÄ›zec Který port použÃt pro výstup pÅ™i použità hudebnÃho ovladaÄe ALSA. music_volume ÄÃslo Nastavenà hlasitosti hudby (0-255) - multi_midi boolean Pokud true, je povoleno smÃÅ¡ený AdLib a pÅ™irozený MIDI. + multi_midi boolean Pokud true, jsou povoleny smÃÅ¡ený AdLib a původnà MIDI. soundfont Å™etÄ›zec Který SoundFont použÃt pro pÅ™ehrávánà MIDI. (Podporováno pouze nÄ›kterými ovladaÄi MIDI.) native_mt32 boolean Pokud true, zakáže emulaci GM a pÅ™edpokládá, že je dostupný pravý Roland MT-32. enable_gs boolean Pokud true, povolà funkce urÄené pro Roland GS ke zlepÅ¡enà emulace GM. Pokud je native_mt32 také nastaven na true, zaÅ™Ãzenà GS zvolà mapu MT-32 pro pÅ™ehrávánà správných instrumentů. @@ -1574,16 +1582,27 @@ Simon the Sorcerer 1 a 2 pÅ™idává následujÃcà nestandardnà klÃÄová slov The Legend of Kyrandia pÅ™idává následujÃcà nestandardnà klÃÄové slovo: walkspeed celé ÄÃslo Rychlost chůze (0-4) + +The Legend of Kyrandia: The Hand of Fate pÅ™idává následujÃcà nestandardnà klÃÄové slovo: + + walkspeed ÄÃslo Rychlost chůze (3 nebo 5, což znamená + rychle nebo pomalu) The Legend of Kyrandia: Malcolm's Revenge pÅ™idává následujÃcà nestandardnà klÃÄová slova: + walkspeed ÄÃslo Rychlost chůze (3 nebo 5, což znamená + rychle nebo pomalu) studio_audience boolean Pokud true, je slyÅ¡et potlesk a smÃch kdykoliv Malcolm provede nÄ›co vtipného skip_support boolean Pokud true, hrÃ¡Ä může pÅ™eskakovat text a scény hry helium_mode boolean Pokud true, lidé znÄ›jà tak, jakoby se nadýchali hélia The 7th Guest pÅ™idává následujÃcà nestandardnà klÃÄové slovo: - t7g_speed Å™etÄ›zec Rychlost pÅ™ehrávánà videa (normal - normálnÃ, tweaked - upravená, im_an_ios - jsem na ios) + fast_movie_speed boolean Pokud true, jsou videa pÅ™ehrávána pÅ™i zvýšené + rychlosti, stejné jako ve verzi pro iOS. + Videa bez zvuku jsou stále pÅ™ehrávána pÅ™i + normálnà rychlosti, aby nedoÅ¡lo k desynchronizaci + hudby 8.2) Vlastnà hernà volby, které mohou být pÅ™epÃnány pomoci grafického ---- ---------------------------------------------------------------- @@ -1665,3 +1684,4 @@ http://www.scummvm.org/ + diff --git a/engines/agi/console.cpp b/engines/agi/console.cpp index dd06736290..b9a64bc572 100644 --- a/engines/agi/console.cpp +++ b/engines/agi/console.cpp @@ -35,7 +35,6 @@ Console::Console(AgiEngine *vm) : GUI::Debugger() { DCmd_Register("debug", WRAP_METHOD(Console, Cmd_Debug)); DCmd_Register("cont", WRAP_METHOD(Console, Cmd_Cont)); DCmd_Register("agiver", WRAP_METHOD(Console, Cmd_Agiver)); - DCmd_Register("crc", WRAP_METHOD(Console, Cmd_Crc)); DCmd_Register("flags", WRAP_METHOD(Console, Cmd_Flags)); DCmd_Register("logic0", WRAP_METHOD(Console, Cmd_Logic0)); DCmd_Register("objs", WRAP_METHOD(Console, Cmd_Objs)); @@ -119,12 +118,6 @@ bool Console::Cmd_RunOpcode(int argc, const char **argv) { return true; } -bool Console::Cmd_Crc(int argc, const char **argv) { - DebugPrintf("command removed from scummvm\n"); - - return true; -} - bool Console::Cmd_Agiver(int argc, const char **argv) { int ver, maj, min; @@ -278,22 +271,17 @@ bool Console::Cmd_BT(int argc, const char **argv) { MickeyConsole::MickeyConsole(MickeyEngine *mickey) : GUI::Debugger() { _mickey = mickey; - DCmd_Register("curRoom", WRAP_METHOD(MickeyConsole, Cmd_CurRoom)); - DCmd_Register("gotoRoom", WRAP_METHOD(MickeyConsole, Cmd_GotoRoom)); + DCmd_Register("room", WRAP_METHOD(MickeyConsole, Cmd_Room)); DCmd_Register("drawPic", WRAP_METHOD(MickeyConsole, Cmd_DrawPic)); DCmd_Register("drawObj", WRAP_METHOD(MickeyConsole, Cmd_DrawObj)); } -bool MickeyConsole::Cmd_CurRoom(int argc, const char **argv) { +bool MickeyConsole::Cmd_Room(int argc, const char **argv) { + if (argc == 2) + _mickey->debugGotoRoom(atoi(argv[1])); + _mickey->debugCurRoom(); - return true; -} -bool MickeyConsole::Cmd_GotoRoom(int argc, const char **argv) { - if (argc != 2) - DebugPrintf("Usage: %s <Room number>\n", argv[0]); - else - _mickey->debugGotoRoom(atoi(argv[1])); return true; } diff --git a/engines/agi/console.h b/engines/agi/console.h index 5f69460907..f8025e0562 100644 --- a/engines/agi/console.h +++ b/engines/agi/console.h @@ -49,7 +49,6 @@ private: bool Cmd_SetFlag(int argc, const char **argv); bool Cmd_SetObj(int argc, const char **argv); bool Cmd_RunOpcode(int argc, const char **argv); - bool Cmd_Crc(int argc, const char **argv); bool Cmd_Agiver(int argc, const char **argv); bool Cmd_Flags(int argc, const char **argv); bool Cmd_Vars(int argc, const char **argv); @@ -75,8 +74,7 @@ public: private: MickeyEngine *_mickey; - bool Cmd_CurRoom(int argc, const char **argv); - bool Cmd_GotoRoom(int argc, const char **argv); + bool Cmd_Room(int argc, const char **argv); bool Cmd_DrawPic(int argc, const char **argv); bool Cmd_DrawObj(int argc, const char **argv); }; diff --git a/engines/agi/logic.h b/engines/agi/logic.h index fecc2e3b8a..14137f01d2 100644 --- a/engines/agi/logic.h +++ b/engines/agi/logic.h @@ -37,6 +37,6 @@ struct AgiLogic { const char **texts; /**< message list */ }; -} // End of namespace Agi +} // End of namespace Agi #endif /* AGI_LOGIC_H */ diff --git a/engines/agi/lzw.h b/engines/agi/lzw.h index e3fbafe584..c732491e8e 100644 --- a/engines/agi/lzw.h +++ b/engines/agi/lzw.h @@ -27,6 +27,6 @@ namespace Agi { void lzwExpand(uint8 *, uint8 *, int32); -} // End of namespace Agi +} // End of namespace Agi #endif /* AGI_LZW_H */ diff --git a/engines/agi/op_cmd.cpp b/engines/agi/op_cmd.cpp index 5334407eb8..9d899b1855 100644 --- a/engines/agi/op_cmd.cpp +++ b/engines/agi/op_cmd.cpp @@ -1399,7 +1399,7 @@ void cmdDistance(AgiGame *state, uint8 *p) { // a zombie or the zombie getting turned away by the scarab) we make it appear the // zombie is far away from Rosella if the zombie is not already up and chasing her. enum zombieStates {ZOMBIE_SET_TO_RISE_UP, ZOMBIE_RISING_UP, ZOMBIE_CHASING_EGO}; - uint8 zombieStateVarNumList[] = {155, 156, (_v[vCurRoom] == 16) ? 162 : 158}; + uint8 zombieStateVarNumList[] = {155, 156, (uint8)((_v[vCurRoom] == 16) ? 162 : 158)}; uint8 zombieNum = p2 - 221; // Zombie's number (In range 0-2) uint8 zombieStateVarNum = zombieStateVarNumList[zombieNum]; // Number of the variable containing zombie's state uint8 zombieState = _v[zombieStateVarNum]; // Zombie's state diff --git a/engines/agi/opcodes.cpp b/engines/agi/opcodes.cpp index 7a427bd94f..807ab2dc2c 100644 --- a/engines/agi/opcodes.cpp +++ b/engines/agi/opcodes.cpp @@ -376,6 +376,18 @@ void AgiEngine::setupOpcodes() { logicNamesTest = insV1Test; logicNamesCmd = insV1; } + + // Alter opcode parameters for specific games + // TODO: This could be either turned into a game feature, or a version + // specific check, instead of a game version check + + // The Apple IIGS versions of MH1 and Goldrush both have a parameter for + // show.mouse and hide.mouse. Fixes bugs #3577754 and #3426946. + if ((getGameID() == GID_MH1 || getGameID() == GID_GOLDRUSH) && + getPlatform() == Common::kPlatformApple2GS) { + logicNamesCmd[176].args = "n"; // hide.mouse + logicNamesCmd[178].args = "n"; // show.mouse + } } } diff --git a/engines/agi/preagi_winnie.h b/engines/agi/preagi_winnie.h index 96ae65997e..f34c80cec1 100644 --- a/engines/agi/preagi_winnie.h +++ b/engines/agi/preagi_winnie.h @@ -355,6 +355,6 @@ private: void printStrWinnie(char *szMsg); }; -} // End of namespace Agi +} // End of namespace Agi #endif diff --git a/engines/cge/events.cpp b/engines/cge/events.cpp index 1530c870ef..89802058f4 100644 --- a/engines/cge/events.cpp +++ b/engines/cge/events.cpp @@ -184,7 +184,7 @@ void Mouse::on() { step(0); if (_busy) _busy->step(0); - } + } } void Mouse::off() { diff --git a/engines/composer/detection.cpp b/engines/composer/detection.cpp index 835f3c5683..8411441c60 100644 --- a/engines/composer/detection.cpp +++ b/engines/composer/detection.cpp @@ -374,7 +374,7 @@ static const ComposerGameDescription gameDescriptions[] = { using namespace Composer; // we match from data too, to stop detection from a non-top-level directory -const static char *directoryGlobs[] = { +static const char *directoryGlobs[] = { "data", "liam", "programs", diff --git a/engines/composer/resource.cpp b/engines/composer/resource.cpp index 83e49971fb..fa29cc886b 100644 --- a/engines/composer/resource.cpp +++ b/engines/composer/resource.cpp @@ -400,4 +400,4 @@ void OldPipe::nextFrame() { _currFrame++; } -} // End of namespace Composer +} // End of namespace Composer diff --git a/engines/configure.engines b/engines/configure.engines index e17e2f67e0..3ac287e23f 100644 --- a/engines/configure.engines +++ b/engines/configure.engines @@ -20,7 +20,7 @@ add_engine hopkins "Hopkins FBI" no add_engine hugo "Hugo Trilogy" yes add_engine kyra "Kyra" yes "lol eob" "Legend of Kyrandia 1-3" add_engine lol "Lands of Lore" yes -add_engine eob "Eye of the Beholder" no +add_engine eob "Eye of the Beholder" yes add_engine lastexpress "The Last Express" no "" "" "16bit" add_engine lure "Lure of the Temptress" yes add_engine made "MADE" yes @@ -43,7 +43,7 @@ add_engine sword25 "Broken Sword 2.5" no "" "" "png zlib 16bit" add_engine teenagent "Teen Agent" yes add_engine testbed "TestBed: the Testing framework" no add_engine tinsel "Tinsel" yes -add_engine toltecs "3 Skulls of the Toltecs" no +add_engine toltecs "3 Skulls of the Toltecs" yes add_engine toon "Toonstruck" yes add_engine touche "Touche: The Adventures of the Fifth Musketeer" yes add_engine tony "Tony Tough and the Night of Roasted Moths" yes "" "" "16bit" diff --git a/engines/cruise/linker.h b/engines/cruise/linker.h index ce212f6cea..25f4a5cc2a 100644 --- a/engines/cruise/linker.h +++ b/engines/cruise/linker.h @@ -27,5 +27,5 @@ namespace Cruise { void updateAllScriptsImports(); -} // End of namespace Cruise +} // End of namespace Cruise #endif diff --git a/engines/cruise/staticres.cpp b/engines/cruise/staticres.cpp index a3fc4f884b..08ff4d7548 100644 --- a/engines/cruise/staticres.cpp +++ b/engines/cruise/staticres.cpp @@ -177,9 +177,9 @@ const int16 spanish_fontCharacterTable[256] = { 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, -1, -1, - 0x72, 0x80 + 0x72, 0x80, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0x7f, 0x79, 0x7b, 0x81, 0x82, 0x83, -1, -1, 0x7d, diff --git a/engines/drascula/animation.cpp b/engines/drascula/animation.cpp index 43799f7944..7009752365 100644 --- a/engines/drascula/animation.cpp +++ b/engines/drascula/animation.cpp @@ -42,7 +42,6 @@ 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()"); @@ -92,12 +91,8 @@ void DrasculaEngine::animation_1_1() { playFLI("scrollb.bin", 9); - if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit()) - break; clearRoom(); playSound(5); - if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit()) - break; if (animate("scr2.bin", 17)) break; stopSound(); @@ -194,8 +189,6 @@ void DrasculaEngine::animation_1_1() { if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit()) break; talk_drascula(3); - if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit()) - break; if (animate("lib.bin", 16)) break; if (animate("lib2.bin", 16)) @@ -211,8 +204,6 @@ void DrasculaEngine::animation_1_1() { loadPic("plan1.alg", screenSurface, HALF_PAL); updateScreen(); talk_solo(_textd[5], "d5.als"); - if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit()) - break; if (animate("lib2.bin", 16)) break; clearRoom(); @@ -220,8 +211,6 @@ void DrasculaEngine::animation_1_1() { updateScreen(); pause(20); talk_solo(_textd[6], "d6.als"); - if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit()) - break; if (animate("lib2.bin", 16)) break; clearRoom(); @@ -255,8 +244,6 @@ void DrasculaEngine::animation_1_1() { break; playMusic(11); talk_drascula(10); - if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit()) - break; if (animate("rayo1.bin", 16)) break; playSound(5); @@ -372,7 +359,6 @@ void DrasculaEngine::animation_1_1() { loadPic(99, backSurface); } -// John falls in love with BJ, who is then abducted by Drascula void DrasculaEngine::animation_2_1() { debug(4, "animation_2_1()"); @@ -384,9 +370,6 @@ void DrasculaEngine::animation_2_1() { term_int = 0; while (!shouldQuit()) { - if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit()) - break; - if (animate("ag.bin", 14)) break; @@ -456,13 +439,8 @@ void DrasculaEngine::animation_2_1() { curY = 95; trackProtagonist = 1; hare_se_ve = 1; - if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit()) - break; loadPic("97g.alg", extraSurface); - if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit()) - break; - if (animate("lev.bin", 15)) break; @@ -520,8 +498,6 @@ void DrasculaEngine::animation_2_1() { break; talk_bj(12); gotoObject(157, 98 + curHeight); - if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit()) - break; if (animate("bes.bin", 16)) break; playMusic(11); @@ -563,7 +539,6 @@ 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()"); @@ -574,7 +549,6 @@ void DrasculaEngine::animation_3_1() { loadPic(97, extraSurface); } -// John Hacker talks with the pianist void DrasculaEngine::animation_4_1() { debug(4, "animation_4_1()"); @@ -676,26 +650,39 @@ void DrasculaEngine::animation_4_2() { pause(5); talk_hacker(57); pause(6); - talk_blind(2); - pause(4); - talk_hacker(58); - talk_blind(3); - delay(14); - talk_hacker(59); - talk_blind(4); - talk_hacker(60); - talk_blind(5); - talk_hacker(61); - talk_blind(6); - talk_hacker(62); - talk_blind(7); - talk_hacker(63); - talk_blind(8); - copyBackground(); - updateScreen(); - _system->delayMillis(1000); - talk_hacker(64); - talk_blind(9); + + if (flags[4] == 0) { // first time + talk_blind(2); + pause(4); + talk_hacker(58); + talk_blind(3); + delay(14); + talk_hacker(59); + talk_blind(4); + talk_hacker(60); + talk_blind(5); + talk_hacker(61); + talk_blind(6); + talk_hacker(62); + talk_blind(7); + talk_hacker(63); + talk_blind(8); + copyBackground(); + updateScreen(); + _system->delayMillis(1000); + talk_hacker(64); + talk_blind(9); + + flags[4] = 1; // talked to the blind man + } else { // second time + _system->delayMillis(1000); + talk_blind(10); + talk_hacker(65); + + flags[33] = 1; + } + + flags[9] = 0; copyBackground(); updateScreen(); @@ -711,9 +698,6 @@ void DrasculaEngine::animation_4_2() { loadPic(97, extraSurface); loadPic(99, backSurface); selectVerb(kVerbNone); - - flags[9] = 0; - flags[4] = 1; } void DrasculaEngine::animation_14_2() { @@ -798,17 +782,22 @@ void DrasculaEngine::animation_16_2() { return; } - delay(3000); + uint32 now = _system->getMillis(); + while (_system->getMillis() - now < 3000 * 2) { + delay(50); + if (getScan() != 0) { + asco(); + return; + } + } if (i < 4) { fadeToBlack(1); - + clearRoom(); if (getScan() != 0) { asco(); return; } - - clearRoom(); } } @@ -818,6 +807,7 @@ void DrasculaEngine::animation_16_2() { for (int l = 1; l < 200; l++) { copyBackground(0, 0, 0, l, 320, 200 - l, drawSurface3, screenSurface); copyBackground(0, 200 - l, 0, 0, 320, l, bgSurface, screenSurface); + delay(10); updateScreen(); if (getScan() != 0) { asco(); @@ -867,6 +857,20 @@ void DrasculaEngine::animation_20_2() { void DrasculaEngine::animation_23_2() { debug(4, "animation_23_2()"); + int p_x, p_y; + int maxN; + int animX, animY; + + // Animation offsets - without earplugs + int johnFrameX[] = {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}; + int johnFrameY[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 1, 1, 1, 1}; + + // Animation offsets - with earplugs + int john2FrameX[] = {1, 35, 69, 103, 137, 171, 205, 239, 273, 1, 35, 69, 103, 137}; + int john2FrameY[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 73, 73, 73, 73, 73}; + loadPic("an24.alg", frontSurface); flags[21] = 1; @@ -893,10 +897,41 @@ void DrasculaEngine::animation_23_2() { trackVonBraun = 1; talk_vonBraun(18, kVonBraunNormal); - if (flags[29] == 0) - animation_23_joined(); - else - animation_23_joined2(); + if (flags[29] == 0) { + // John isn't wearing earplugs + p_x = curX + 2; + p_y = curY - 3; + maxN = 34; + animX = 36; + animY = 74; + + loadPic("an23.alg", backSurface); + } else { + // John is wearing earplugs + p_x = curX + 4; + p_y = curY; + maxN = 14; + animX = 33; + animY = 71; + + pause(50); + + loadPic("an23_2.alg", backSurface); + } + + for (int n = 0; n < maxN; n++) { + copyRect(p_x, p_y, p_x, p_y, animX, animY, bgSurface, screenSurface); + if (flags[29] == 0) + copyRect(johnFrameX[n], johnFrameY[n], p_x, p_y, animX, animY, backSurface, screenSurface); + else + copyRect(john2FrameX[n], john2FrameY[n], p_x, p_y, animX, animY, backSurface, screenSurface); + updateRefresh(); + updateScreen(p_x, p_y, p_x, p_y, animX, animY, screenSurface); + updateEvents(); + pause(5); + } + + loadPic(99, backSurface); trackVonBraun = 2; animation_25_2(); @@ -921,52 +956,6 @@ void DrasculaEngine::animation_23_2() { breakOut = 1; } -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}; - int y[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 76, 76, 1, 1, 1, 1}; - - loadPic("an23.alg", backSurface); - - for (int n = 0; n < 34; n++) { - copyRect(p_x, p_y, p_x, p_y, 36, 74, bgSurface, screenSurface); - 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); - } - - loadPic(99, backSurface); -} - -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}; - - pause(50); - - loadPic("an23_2.alg", backSurface); - - for (int n = 0; n < 14; n++) { - copyRect(p_x, p_y, p_x, p_y, 33, 71, bgSurface, screenSurface); - 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); - } - - loadPic(99, backSurface); -} - void DrasculaEngine::animation_25_2() { debug(4, "animation_25_2()"); @@ -1091,31 +1080,11 @@ void DrasculaEngine::animation_35_2() { fadeToBlack(2); } -// Use cross on Yoda void DrasculaEngine::animation_2_3() { debug(4, "animation_2_3()"); flags[0] = 1; playMusic(13); - animation_3_3(); - playMusic(13); - animation_4_3(); - flags[1] = 1; - updateRoom(); - updateScreen(120, 0, 120, 0, 200, 200, screenSurface); - animation_5_3(); - flags[0] = 0; - flags[1] = 1; - - loadPic(96, frontSurface); - loadPic(97, extraSurface); - loadPic(99, backSurface); - - gotoObject(332, 127); -} - -void DrasculaEngine::animation_3_3() { - debug(4, "animation_3_3()"); int px = curX - 20, py = curY - 1; @@ -1129,12 +1098,11 @@ void DrasculaEngine::animation_3_3() { updateAnim(75, px, py, 71, 72, 4, extraSurface, 3, true); updateAnim(2, px, py, 71, 72, 4, backSurface, 3, true); updateAnim(75, px, py, 71, 72, 4, backSurface, 3, true); -} -void DrasculaEngine::animation_4_3() { - debug(4, "animation_4_3()"); + playMusic(13); - int px = 120, py = 63; + px = 120; + py = 63; loadPic("any_1.alg", frontSurface); loadPic("any_2.alg", extraSurface); @@ -1146,12 +1114,13 @@ void DrasculaEngine::animation_4_3() { updateAnim(91, px, py, 77, 89, 4, extraSurface, 3, true); updateAnim(1, px, py, 77, 89, 4, backSurface, 3, true); updateAnim(91, px, py, 77, 89, 4, backSurface, 3, true); -} -void DrasculaEngine::animation_5_3() { - debug(4, "animation_5_3()"); + flags[1] = 1; + updateRoom(); + updateScreen(120, 0, 120, 0, 200, 200, screenSurface); - int px = curX - 20, py = curY - 1; + px = curX - 20; + py = curY - 1; loadPic("an3y_1.alg", frontSurface); loadPic("an3y_2.alg", extraSurface); @@ -1163,6 +1132,15 @@ void DrasculaEngine::animation_5_3() { updateAnim(75, px, py, 71, 72, 4, extraSurface, 3, true); updateAnim(2, px, py, 71, 72, 4, backSurface, 3, true); updateAnim(75, px, py, 71, 72, 4, backSurface, 3, true); + + flags[0] = 0; + flags[1] = 1; + + loadPic(96, frontSurface); + loadPic(97, extraSurface); + loadPic(99, backSurface); + + gotoObject(332, 127); } void DrasculaEngine::animation_6_3() { @@ -1197,8 +1175,8 @@ void DrasculaEngine::animation_6_3() { updateScreen(); } -void DrasculaEngine::animation_ray() { - debug(4, "animation_ray()"); +void DrasculaEngine::animation_castle() { + debug(4, "animation_castle()"); loadPic("anr_1.alg", frontSurface, HALF_PAL); loadPic("anr_2.alg", extraSurface); @@ -1365,18 +1343,6 @@ void DrasculaEngine::animation_5_5(){ loadPic(49, bgSurface, HALF_PAL); } -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(); - else { - flags[9] = 0; - talk(33); - } -} - void DrasculaEngine::animation_12_5() { debug(4, "animation_12_5()"); @@ -1426,7 +1392,7 @@ void DrasculaEngine::animation_12_5() { loadPic("3an11_1.alg", backSurface); for (frame = 0; frame < 8; frame++) { - if (frame == 2 || frame == 4 || frame == 8 || frame==10) + if (frame == 2 || frame == 4 || frame == 8 || frame == 10) setPalette((byte *)&bgPalette1); else if (frame == 1 || frame == 5 || frame == 7 || frame == 9) setPalette((byte *)&bgPalette2); @@ -1465,7 +1431,8 @@ void DrasculaEngine::animation_12_5() { flags[1] = 1; - animation_13_5(); + animation_12_5_frankenstein(); + playSound(1); hiccup(12); finishSound(); @@ -1487,13 +1454,11 @@ void DrasculaEngine::animation_12_5() { enterRoom(57); } -void DrasculaEngine::animation_13_5() { - debug(4, "animation_13_5()"); - +void DrasculaEngine::animation_12_5_frankenstein() { int frank_x = 199; - int frame = 0; int frus_x[] = {1, 46, 91, 136, 181, 226, 271}; int frus_y[] = {1, 1, 1, 1, 1, 1, 1, 89}; + int frame = 0; loadPic("auxfr.alg", backSurface); @@ -1898,27 +1863,6 @@ void DrasculaEngine::animation_24_2() { loadPic("an24.alg", frontSurface); - animation_32_2(); - - flags[21] = 1; - - talk_vonBraun(22, kVonBraunNormal); - - if (flags[22] == 0) - converse(4); - else - converse(5); - - exitRoom(0); - flags[21] = 0; - flags[24] = 0; - trackVonBraun = 1; - vonBraunX = 120; -} - -void DrasculaEngine::animation_32_2() { - debug(4, "animation_32_2()"); - loadPic("an32_1.alg", drawSurface3); loadPic("an32_2.alg", backSurface); @@ -1939,6 +1883,21 @@ void DrasculaEngine::animation_32_2() { } loadPic("aux18.alg", drawSurface3); + + flags[21] = 1; + + talk_vonBraun(22, kVonBraunNormal); + + if (flags[22] == 0) + converse(4); + else + converse(5); + + exitRoom(0); + flags[21] = 0; + flags[24] = 0; + trackVonBraun = 1; + vonBraunX = 120; } void DrasculaEngine::animation_34_2() { @@ -2126,55 +2085,6 @@ void DrasculaEngine::animation_6_2() { flags[9] = 0; } -void DrasculaEngine::animation_33_2() { - debug(4, "animation_33_2()"); - - stopMusic(); - flags[9] = 1; - - pause(12); - talk(60); - pause(8); - - clearRoom(); - loadPic("ciego1.alg", bgSurface, HALF_PAL); // ciego = blind - loadPic("ciego2.alg", drawSurface3); - loadPic("ciego3.alg", extraSurface); - loadPic("ciego4.alg", backSurface); - loadPic("ciego5.alg", frontSurface); - - copyBackground(); - updateScreen(); - - pause(10); - - talk_blind(1); - pause(5); - talk_hacker(57); - pause(6); - _system->delayMillis(1000); - talk_blind(10); - talk_hacker(65); - - copyBackground(); - updateScreen(); - - pause(14); - - clearRoom(); - - playMusic(roomMusic); - loadPic(9, bgSurface, HALF_PAL); - loadPic("aux9.alg", drawSurface3); - loadPic(96, frontSurface); - loadPic(97, extraSurface); - loadPic(99, backSurface); - selectVerb(kVerbNone); - - flags[33] = 1; - flags[9] = 0; -} - void DrasculaEngine::animation_1_4() { debug(4, "animation_1_4()"); diff --git a/engines/drascula/console.cpp b/engines/drascula/console.cpp index d2fd32f2e5..426b2ade67 100644 --- a/engines/drascula/console.cpp +++ b/engines/drascula/console.cpp @@ -46,7 +46,6 @@ bool Console::Cmd_Room(int argc, const char **argv) { _vm->selectVerb(kVerbNone); _vm->clearRoom(); _vm->loadPic(roomNum, _vm->bgSurface, HALF_PAL); - _vm->selectionMade = 0; return false; } diff --git a/engines/drascula/converse.cpp b/engines/drascula/converse.cpp index 7abbb3214b..d045d683fc 100644 --- a/engines/drascula/converse.cpp +++ b/engines/drascula/converse.cpp @@ -167,7 +167,6 @@ void DrasculaEngine::converse(int index) { // no need to delete the stream, since TextResourceParser takes ownership // delete stream; - if (currentChapter == 2 && !strcmp(fileName, "op_5.cal") && flags[38] == 1 && flags[33] == 1) { strcpy(phrase3, _text[405]); strcpy(sound3, "405.als"); diff --git a/engines/drascula/detection.cpp b/engines/drascula/detection.cpp index 760d8b7d98..e1f69e2158 100644 --- a/engines/drascula/detection.cpp +++ b/engines/drascula/detection.cpp @@ -21,10 +21,13 @@ */ #include "base/plugins.h" +#include "common/file.h" +#include "common/translation.h" #include "engines/advancedDetector.h" #include "engines/savestate.h" -#include "common/file.h" + +#include "graphics/thumbnail.h" #include "drascula/drascula.h" @@ -263,81 +266,123 @@ static const DrasculaGameDescription gameDescriptions[] = { { AD_TABLE_END_MARKER } }; -} // End of namespace Drascula +static const ExtraGuiOption drasculaExtraGuiOption = { + _s("Use original save/load screens"), + _s("Use the original save/load screens, instead of the ScummVM ones"), + "originalsaveload", + false +}; + +SaveStateDescriptor loadMetaData(Common::ReadStream *s, int slot, bool setPlayTime); class DrasculaMetaEngine : public AdvancedMetaEngine { public: DrasculaMetaEngine() : AdvancedMetaEngine(Drascula::gameDescriptions, sizeof(Drascula::DrasculaGameDescription), drasculaGames) { _singleid = "drascula"; - _guioptions = GUIO2(GUIO_NOMIDI, GUIO_NOLAUNCHLOAD); + _guioptions = GUIO1(GUIO_NOMIDI); + } + + virtual const char *getName() const { + return "Drascula"; } - virtual bool hasFeature(MetaEngineFeature f) const { - return (f == kSupportsListSaves); + virtual const char *getOriginalCopyright() const { + return "Drascula Engine (C) 2000 Alcachofa Soft, (C) 1996 Digital Dreams Multimedia, (C) 1994 Emilio de Paz"; } - virtual SaveStateList listSaves(const char *target) const { - Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); - Common::String pattern = Common::String::format("%s??", target); + virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *gd) const; + virtual bool hasFeature(MetaEngineFeature f) const; + virtual const ExtraGuiOptions getExtraGuiOptions(const Common::String &target) const; + virtual SaveStateList listSaves(const char *target) const; + virtual int getMaximumSaveSlot() const; + virtual void removeSaveState(const char *target, int slot) const; + SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const; +}; - // Get list of savefiles for target game - Common::StringArray filenames = saveFileMan->listSavefiles(pattern); - Common::Array<int> slots; - for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { +bool DrasculaMetaEngine::hasFeature(MetaEngineFeature f) const { + return + (f == kSupportsListSaves) || + (f == kSupportsLoadingDuringStartup) || + (f == kSupportsDeleteSave) || + (f == kSavesSupportMetaInfo) || + (f == kSavesSupportThumbnail) || + (f == kSavesSupportCreationDate) || + (f == kSavesSupportPlayTime); +} - // Obtain the last 2 digits of the filename, since they correspond to the save slot - int slotNum = atoi(file->c_str() + file->size() - 2); +const ExtraGuiOptions DrasculaMetaEngine::getExtraGuiOptions(const Common::String &target) const { + ExtraGuiOptions options; + options.push_back(drasculaExtraGuiOption); + return options; +} - // Ensure save slot is within valid range - if (slotNum >= 1 && slotNum <= 10) { - slots.push_back(slotNum); +SaveStateList DrasculaMetaEngine::listSaves(const char *target) const { + Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); + Common::StringArray filenames; + Common::String pattern = target; + pattern += ".???"; + + filenames = saveFileMan->listSavefiles(pattern); + sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..) + + SaveStateList saveList; + int slotNum = 0; + for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { + // Obtain the last 3 digits of the filename, since they correspond to the save slot + slotNum = atoi(file->c_str() + file->size() - 3); + + if (slotNum >= 0 && slotNum <= getMaximumSaveSlot()) { + Common::InSaveFile *in = saveFileMan->openForLoading(*file); + if (in) { + SaveStateDescriptor desc = loadMetaData(in, slotNum, false); + if (desc.getSaveSlot() != slotNum) { + // invalid + delete in; + continue; + } + saveList.push_back(desc); + delete in; } } + } - // Sort save slot ids - Common::sort<int>(slots.begin(), slots.end()); - - // Load save index - Common::String fileEpa = Common::String::format("%s.epa", target); - Common::InSaveFile *epa = saveFileMan->openForLoading(fileEpa); - - // Get savegame names from index - Common::String saveDesc; - SaveStateList saveList; - int line = 1; - for (size_t i = 0; i < slots.size(); i++) { - // ignore lines corresponding to unused saveslots - for (; line < slots[i]; line++) - epa->readLine(); + return saveList; +} - // copy the name in the line corresponding to the save slot and truncate to 22 characters - saveDesc = Common::String(epa->readLine().c_str(), 22); +SaveStateDescriptor DrasculaMetaEngine::querySaveMetaInfos(const char *target, int slot) const { + char fileName[MAXPATHLEN]; + sprintf(fileName, "%s.%03d", target, slot); - // handle cases where the save directory and save index are detectably out of sync - if (saveDesc == "*") - saveDesc = "No name specified."; + Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(fileName); - // increment line number to keep it in sync with slot number - line++; + SaveStateDescriptor desc; + // Do not allow save slot 0 (used for auto-saving) to be deleted or + // overwritten. + desc.setDeletableFlag(slot != 0); + desc.setWriteProtectedFlag(slot == 0); - // Insert savegame name into list - saveList.push_back(SaveStateDescriptor(slots[i], saveDesc)); + if (in) { + desc = Drascula::loadMetaData(in, slot, false); + if (desc.getSaveSlot() != slot) { + delete in; + return SaveStateDescriptor(); } - delete epa; - return saveList; - } + Graphics::Surface *const thumbnail = Graphics::loadThumbnail(*in); + desc.setThumbnail(thumbnail); - virtual const char *getName() const { - return "Drascula"; + delete in; } - virtual const char *getOriginalCopyright() const { - return "Drascula Engine (C) 2000 Alcachofa Soft, (C) 1996 Digital Dreams Multimedia, (C) 1994 Emilio de Paz"; - } + return desc; +} - virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const; -}; +int DrasculaMetaEngine::getMaximumSaveSlot() const { return 999; } + +void DrasculaMetaEngine::removeSaveState(const char *target, int slot) const { + Common::String fileName = Common::String::format("%s.%03d", target, slot); + g_system->getSavefileManager()->removeSavefile(fileName); +} bool DrasculaMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const { const Drascula::DrasculaGameDescription *gd = (const Drascula::DrasculaGameDescription *)desc; @@ -347,8 +392,10 @@ bool DrasculaMetaEngine::createInstance(OSystem *syst, Engine **engine, const AD return gd != 0; } +} // End of namespace Drascula + #if PLUGIN_ENABLED_DYNAMIC(DRASCULA) - REGISTER_PLUGIN_DYNAMIC(DRASCULA, PLUGIN_TYPE_ENGINE, DrasculaMetaEngine); + REGISTER_PLUGIN_DYNAMIC(DRASCULA, PLUGIN_TYPE_ENGINE, Drascula::DrasculaMetaEngine); #else - REGISTER_PLUGIN_STATIC(DRASCULA, PLUGIN_TYPE_ENGINE, DrasculaMetaEngine); + REGISTER_PLUGIN_STATIC(DRASCULA, PLUGIN_TYPE_ENGINE, Drascula::DrasculaMetaEngine); #endif diff --git a/engines/drascula/drascula.cpp b/engines/drascula/drascula.cpp index 1b3c4038f0..804881cf9a 100644 --- a/engines/drascula/drascula.cpp +++ b/engines/drascula/drascula.cpp @@ -87,6 +87,7 @@ DrasculaEngine::DrasculaEngine(OSystem *syst, const DrasculaGameDescription *gam _textmisc = 0; _textd1 = 0; _talkSequences = 0; + _currentSaveSlot = 0; _color = 0; blinking = 0; @@ -187,6 +188,8 @@ Common::Error DrasculaEngine::run() { if (!loadDrasculaDat()) return Common::kUnknownError; + checkForOldSaveGames(); + setupRoomsTable(); loadArchives(); @@ -195,6 +198,13 @@ Common::Error DrasculaEngine::run() { currentChapter = 1; // values from 1 to 6 will start each part of game loadedDifferentChapter = 0; + setTotalPlayTime(0); + + // Check if a save is loaded from the launcher + int directSaveSlotLoading = ConfMan.getInt("save_slot"); + if (directSaveSlotLoading >= 0) { + loadGame(directSaveSlotLoading); + } checkCD(); @@ -233,7 +243,6 @@ Common::Error DrasculaEngine::run() { framesWithoutAction = 0; term_int = 0; musicStopped = 0; - selectionMade = 0; globalSpeed = 0; curExcuseLook = 0; curExcuseAction = 0; @@ -246,7 +255,6 @@ Common::Error DrasculaEngine::run() { allocMemory(); _subtitlesDisabled = !ConfMan.getBool("subtitles"); - selectionMade = 0; if (currentChapter != 3) loadPic(96, frontSurface, COMPLETE_PAL); @@ -261,7 +269,7 @@ Common::Error DrasculaEngine::run() { loadPic(96, frontSurface); } else if (currentChapter == 4) { if (loadedDifferentChapter == 0) - animation_ray(); + animation_castle(); loadPic(96, frontSurface); clearRoom(); } else if (currentChapter == 5) { @@ -295,6 +303,7 @@ Common::Error DrasculaEngine::run() { strcpy(iconName[i + 1], _textverbs[i]); assignPalette(defaultPalette); + if (!runCurrentChapter()) { endChapter(); break; @@ -359,7 +368,7 @@ bool DrasculaEngine::runCurrentChapter() { trackProtagonist = 1; objExit = 104; if (loadedDifferentChapter != 0) { - if (!loadGame(saveName)) { + if (!loadGame(_currentSaveSlot)) { return true; } } else { @@ -368,6 +377,8 @@ bool DrasculaEngine::runCurrentChapter() { curY = 56; gotoObject(65, 145); } + + // REMINDER: This is a good place to debug animations } else if (currentChapter == 2) { addObject(kItemPhone); trackProtagonist = 3; @@ -375,7 +386,7 @@ bool DrasculaEngine::runCurrentChapter() { if (loadedDifferentChapter == 0) enterRoom(14); else { - if (!loadGame(saveName)) { + if (!loadGame(_currentSaveSlot)) { return true; } } @@ -393,7 +404,7 @@ bool DrasculaEngine::runCurrentChapter() { if (loadedDifferentChapter == 0) enterRoom(20); else { - if (!loadGame(saveName)) { + if (!loadGame(_currentSaveSlot)) { return true; } } @@ -410,7 +421,7 @@ bool DrasculaEngine::runCurrentChapter() { curX = 235; curY = 164; } else { - if (!loadGame(saveName)) { + if (!loadGame(_currentSaveSlot)) { return true; } } @@ -429,7 +440,7 @@ bool DrasculaEngine::runCurrentChapter() { if (loadedDifferentChapter == 0) { enterRoom(45); } else { - if (!loadGame(saveName)) { + if (!loadGame(_currentSaveSlot)) { return true; } } @@ -443,7 +454,7 @@ bool DrasculaEngine::runCurrentChapter() { enterRoom(58); animation_1_6(); } else { - if (!loadGame(saveName)) { + if (!loadGame(_currentSaveSlot)) { return true; } loadPic("auxdr.alg", drawSurface2); @@ -596,13 +607,23 @@ bool DrasculaEngine::runCurrentChapter() { selectVerb(kVerbTalk); } else if (key == Common::KEYCODE_F6 && !_menuScreen) { selectVerb(kVerbMove); - } else if (key == Common::KEYCODE_F9) { - volumeControls(); - } else if (key == Common::KEYCODE_F10) { - if (!saveLoadScreen()) + } else if (key == Common::KEYCODE_F7) { + // ScummVM load screen + if (!scummVMSaveLoadDialog(false)) return true; } else if (key == Common::KEYCODE_F8) { selectVerb(kVerbNone); + } else if (key == Common::KEYCODE_F9) { + volumeControls(); + } else if (key == Common::KEYCODE_F10) { + if (!ConfMan.getBool("originalsaveload")) { + // ScummVM save screen + scummVMSaveLoadDialog(true); + } else { + // Original save/load screen + if (!saveLoadScreen()) + return true; + } } else if (key == Common::KEYCODE_v) { _subtitlesDisabled = true; ConfMan.setBool("subtitles", !_subtitlesDisabled); @@ -628,17 +649,14 @@ bool DrasculaEngine::runCurrentChapter() { } if (leftMouseButton != 0 || rightMouseButton != 0 || key != 0) - if (currentChapter != 3) - framesWithoutAction = 0; + framesWithoutAction = 0; if (framesWithoutAction == 15000) { screenSaver(); - if (currentChapter != 3) - framesWithoutAction = 0; + framesWithoutAction = 0; } - if (currentChapter != 3) - framesWithoutAction++; + framesWithoutAction++; } return false; @@ -652,8 +670,8 @@ bool DrasculaEngine::verify1() { removeObject(); else { for (l = 0; l < numRoomObjs; l++) { - if (mouseX >= x1[l] && mouseY >= y1[l] - && mouseX <= x2[l] && mouseY <= y2[l] && doBreak == 0) { + if (mouseX >= _objectX1[l] && mouseY >= _objectY1[l] + && mouseX <= _objectX2[l] && mouseY <= _objectY2[l] && doBreak == 0) { if (exitRoom(l)) return true; if (doBreak == 1) @@ -666,8 +684,8 @@ bool DrasculaEngine::verify1() { doBreak = 1; for (l = 0; l < numRoomObjs; l++) { - if (mouseX > x1[l] && mouseY > y1[l] - && mouseX < x2[l] && mouseY < y2[l] && doBreak == 0) { + if (mouseX > _objectX1[l] && mouseY > _objectY1[l] + && mouseX < _objectX2[l] && mouseY < _objectY2[l] && doBreak == 0) { roomX = roomObjX[l]; roomY = roomObjY[l]; trackFinal = trackObj[l]; @@ -700,8 +718,8 @@ bool DrasculaEngine::verify2() { return true; } else { for (l = 0; l < numRoomObjs; l++) { - if (mouseX > x1[l] && mouseY > y1[l] - && mouseX < x2[l] && mouseY < y2[l] && visible[l] == 1) { + if (mouseX > _objectX1[l] && mouseY > _objectY1[l] + && mouseX < _objectX2[l] && mouseY < _objectY2[l] && visible[l] == 1) { trackFinal = trackObj[l]; walkToObject = 1; gotoObject(roomObjX[l], roomObjY[l]); diff --git a/engines/drascula/drascula.h b/engines/drascula/drascula.h index 2d1954e3ca..e547503bee 100644 --- a/engines/drascula/drascula.h +++ b/engines/drascula/drascula.h @@ -36,6 +36,8 @@ #include "common/system.h" #include "common/util.h" +#include "engines/savestate.h" + #include "audio/mixer.h" #include "engines/engine.h" @@ -415,7 +417,7 @@ public: int inventoryObjects[43]; char _targetSurface[40][20]; int _destX[40], _destY[40], trackCharacter_alkeva[40], roomExits[40]; - int x1[40], y1[40], x2[40], y2[40]; + int _objectX1[40], _objectY1[40], _objectX2[40], _objectY2[40]; int takeObject, pickedObject; bool _subtitlesDisabled; bool _menuBar, _menuScreen, _hasName; @@ -453,11 +455,9 @@ public: int term_int; int currentChapter; int loadedDifferentChapter; - char saveName[13]; + int _currentSaveSlot; int _color; int musicStopped; - char select[23]; - int selectionMade; int mouseX; int mouseY; int leftMouseButton; @@ -494,9 +494,16 @@ public: void selectVerb(int); void updateVolume(Audio::Mixer::SoundType soundType, int prevVolume); void volumeControls(); + bool saveLoadScreen(); + bool scummVMSaveLoadDialog(bool isSave); + Common::String enterName(Common::String &selectedName); void loadSaveNames(); - void saveSaveNames(); + void saveGame(int slot, Common::String &desc); + bool loadGame(int slot); + void checkForOldSaveGames(); + void convertSaveGame(int slot, Common::String &desc); + void print_abc(const char *, int, int); void delay(int ms); bool confirmExit(); @@ -550,7 +557,6 @@ public: void updateMusic(); int musicStatus(); void updateRoom(); - bool loadGame(const char *); void updateDoor(int); void setPaletteBase(int darkness); void updateVisible(); @@ -568,7 +574,6 @@ public: void showCursor(); void hideCursor(); bool isCursorVisible(); - void enterName(); bool soundIsActive(); void waitFrameSSN(); void mixVideo(byte *OldScreen, byte *NewScreen, uint16 oldPitch); @@ -589,7 +594,6 @@ public: void quadrant_2(); void quadrant_3(); void quadrant_4(); - void saveGame(const char *gameName); void increaseFrameNum(); int whichObject(); bool checkMenuFlags(); @@ -650,63 +654,56 @@ public: bool room_62(int); bool room_102(int); - void animation_1_1(); - void animation_2_1(); - void animation_3_1(); - void animation_4_1(); - // - void animation_2_2(); - void animation_4_2(); - void animation_5_2(); - void animation_6_2(); - void animation_7_2(); - void animation_11_2(); - void animation_12_2(); - void animation_13_2(); - void animation_14_2(); void asco(); - void animation_16_2(); - void animation_20_2(); - void animation_23_2(); - void animation_23_joined(); - void animation_23_joined2(); - void animation_24_2(); - void animation_25_2(); - void animation_26_2(); - void animation_27_2(); - void animation_29_2(); - void animation_31_2(); - void animation_32_2(); - void animation_33_2(); - void animation_34_2(); - void animation_35_2(); - void animation_36_2(); + + void animation_1_1(); // Game introduction + void animation_2_1(); // John falls in love with BJ, who is then abducted by Drascula + void animation_3_1(); // John talks with the bartender to book a room + void animation_4_1(); // John talks with the pianist + // + void animation_2_2(); // John enters the chapel via the window + void animation_4_2(); // John talks with the blind man (closeup) + void animation_5_2(); // John breaks the chapel window with the pike + void animation_6_2(); // The blind man (closeup) thanks John for giving him money and hands him the sickle + void animation_7_2(); // John uses the sickle + void animation_11_2(); // The drunk man says "they're all dead, thanks *hic*" + void animation_12_2(); // Conversation screen - John talks to the pianist after BJ is abducted by Drascula + void animation_13_2(); // ??? + void animation_14_2(); // The glass box falls from the ceiling + void animation_16_2(); // The drunk tells us about Von Braun + void animation_20_2(); // Von Braun tells John that he needs to have special skills to fight vampires + void animation_23_2(); // Von Braun tests John's reactions to scratching noises + void animation_24_2(); // Conversation screen - John talks with Von Braun + void animation_25_2(); // The glass box is lifted back to the ceiling + void animation_26_2(); // John gives the book to the pianist and gets his earplugs in return + void animation_27_2(); // Von Braun admits that John is ready to fight vampires and gives him his money back + void animation_29_2(); // Von Braun tells John what ingredients he needs for the brew + void animation_31_2(); // Von Braun obtains the items needed for the brew from John and creates it + void animation_34_2(); // John kicks an object + void animation_35_2(); // John jumps into the well + void animation_36_2(); // John asks the bartender about the pianist // - void animation_2_3(); - void animation_3_3(); - void animation_4_3(); - void animation_5_3(); - void animation_6_3(); - void animation_ray(); + void animation_2_3(); // John uses the cross with the Frankenstein-zombie ("yoda") and destroys him + void animation_6_3(); // Frankenstein is blocking John's path // - void animation_1_4(); - void animation_5_4(); - void animation_6_4(); - void animation_7_4(); - void animation_8_4(); + void animation_castle(); // Chapter 4 start - Drascula's castle exterior, lightning strikes + void animation_1_4(); // Conversation screen - John talks with Igor + void animation_5_4(); // John enters Igor's room dressed as Drascula + void animation_6_4(); // Igor says that he's going for supper + void animation_7_4(); // John removes Drascula's disguise + void animation_8_4(); // Secret passage behind bookcase is revealed // - void animation_1_5(); - void animation_5_5(); - void animation_11_5(); - void animation_12_5(); - void animation_13_5(); - void animation_14_5(); + void animation_1_5(); // John finds BJ + void animation_5_5(); // ??? + void animation_12_5(); // Frankenstein comes to life + void animation_12_5_frankenstein(); + void animation_14_5(); // John finds out that an object is empty // - void animation_1_6(); - void animation_5_6(); - void animation_6_6(); - void animation_9_6(); - void animation_19_6(); + void animation_1_6(); // ??? + void animation_5_6(); // John is tied to the table. Drascula and Igor lower the pendulum + void animation_6_6(); // John uses the pendulum to break free + void animation_9_6(); // Game ending - John uses the cross on Drascula and reads BJ's letter + void animation_19_6(); // Someone pops up from behind a door when trying to open it void update_1_pre(); void update_2(); @@ -778,7 +775,7 @@ private: RoomUpdate *_roomPreUpdates, *_roomUpdates; RoomTalkAction *_roomActions; TalkSequenceCommand *_talkSequences; - char _saveNames[10][23]; + Common::String _saveNames[10]; char **loadTexts(Common::File &in); void freeTexts(char **ptr); diff --git a/engines/drascula/graphics.cpp b/engines/drascula/graphics.cpp index 590561f0bd..3bdf724670 100644 --- a/engines/drascula/graphics.cpp +++ b/engines/drascula/graphics.cpp @@ -668,7 +668,7 @@ bool DrasculaEngine::animate(const char *animationFile, int FPS) { } delete stream; - return ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)); + return ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit()); } } // End of namespace Drascula diff --git a/engines/drascula/interface.cpp b/engines/drascula/interface.cpp index 4b8db63bb7..70212db9e8 100644 --- a/engines/drascula/interface.cpp +++ b/engines/drascula/interface.cpp @@ -153,52 +153,6 @@ void DrasculaEngine::clearMenu() { } } -void DrasculaEngine::enterName() { - Common::KeyCode key; - flushKeyBuffer(); - int v = 0, h = 0; - char select2[23]; - strcpy(select2, " "); - while (!shouldQuit()) { - select2[v] = '-'; - copyBackground(115, 14, 115, 14, 176, 9, bgSurface, screenSurface); - print_abc(select2, 117, 15); - updateScreen(); - - key = getScan(); - - if (key != 0) { - if (key >= 0 && key <= 0xFF && isAlpha(key)) - select2[v] = tolower(key); - else if ((key >= Common::KEYCODE_0 && key <= Common::KEYCODE_9) || key == Common::KEYCODE_SPACE) - select2[v] = key; - else if (key == Common::KEYCODE_ESCAPE) - break; - else if (key == Common::KEYCODE_RETURN) { - select2[v] = '\0'; - h = 1; - break; - } else if (key == Common::KEYCODE_BACKSPACE) - select2[v] = '\0'; - else - v--; - - if (key == Common::KEYCODE_BACKSPACE) - v--; - else - v++; - } - if (v == 22) - v = 21; - else if (v == -1) - v = 0; - } - if (h == 1) { - strcpy(select, select2); - selectionMade = 1; - } -} - bool DrasculaEngine::checkMenuFlags() { int n = whichObject(); if (n != 0) { @@ -213,8 +167,8 @@ void DrasculaEngine::showMap() { _hasName = false; for (int l = 0; l < numRoomObjs; l++) { - if (mouseX > x1[l] && mouseY > y1[l] - && mouseX < x2[l] && mouseY < y2[l] + if (mouseX > _objectX1[l] && mouseY > _objectY1[l] + && mouseX < _objectX2[l] && mouseY < _objectY2[l] && visible[l] == 1) { strcpy(textName, objName[l]); _hasName = true; diff --git a/engines/drascula/objects.cpp b/engines/drascula/objects.cpp index 07b8464de4..f9f68c3317 100644 --- a/engines/drascula/objects.cpp +++ b/engines/drascula/objects.cpp @@ -100,8 +100,8 @@ void DrasculaEngine::checkObjects() { int l, veo = 0; for (l = 0; l < numRoomObjs; l++) { - if (mouseX > x1[l] && mouseY > y1[l] - && mouseX < x2[l] && mouseY < y2[l] + if (mouseX > _objectX1[l] && mouseY > _objectY1[l] + && mouseX < _objectX2[l] && mouseY < _objectY2[l] && visible[l] == 1 && isDoor[l] == 0) { strcpy(textName, objName[l]); _hasName = true; diff --git a/engines/drascula/rooms.cpp b/engines/drascula/rooms.cpp index 9f725b6d76..9f707eaa07 100644 --- a/engines/drascula/rooms.cpp +++ b/engines/drascula/rooms.cpp @@ -374,16 +374,16 @@ bool DrasculaEngine::room_8(int fl) { } bool DrasculaEngine::room_9(int fl) { - if (pickedObject == kVerbTalk && fl == 51 && flags[4] == 0) + // Talking with the blind man + if (pickedObject == kVerbTalk && fl == 51) { animation_4_2(); - else if (pickedObject == kVerbTalk && fl == 51 && flags[4] == 1) - animation_33_2(); - else if (pickedObject == 7 && fl == 51) { + } else if (pickedObject == 7 && fl == 51) { animation_6_2(); removeObject(kItemMoney); - pickObject(14);} - else + pickObject(14); + } else { hasAnswer = 0; + } return true; } @@ -837,9 +837,9 @@ bool DrasculaEngine::room_35(int fl) { } bool DrasculaEngine::room_49(int fl) { - if (pickedObject == kVerbTalk && fl ==51) + if (pickedObject == kVerbTalk && fl == 51) converse(9); - else if ((pickedObject == 8 && fl == 51) || (pickedObject == 8 && fl == 203)) + else if (pickedObject == 8 && (fl == 51 || fl == 203)) animation_5_5(); else hasAnswer = 0; @@ -852,7 +852,13 @@ bool DrasculaEngine::room_53(int fl) { pickObject(16); visible[3] = 0; } else if (pickedObject == kVerbMove && fl == 123) { - animation_11_5(); + flags[9] = 1; + if (flags[2] == 1 && flags[3] == 1 && flags[4] == 1) { + animation_12_5(); + } else { + flags[9] = 0; + talk(33); + } } else if (pickedObject == 12 && fl == 52) { flags[3] = 1; talk(401); @@ -1649,7 +1655,7 @@ bool DrasculaEngine::room(int rN, int fl) { } } - // We did not find any parser, let default one work + // We did not find any parser, let the default one work hasAnswer = 0; } @@ -1706,10 +1712,10 @@ void DrasculaEngine::enterRoom(int roomIndex) { for (l = 0; l < numRoomObjs; l++) { p.parseInt(objectNum[l]); p.parseString(objName[l]); - p.parseInt(x1[l]); - p.parseInt(y1[l]); - p.parseInt(x2[l]); - p.parseInt(y2[l]); + p.parseInt(_objectX1[l]); + p.parseInt(_objectY1[l]); + p.parseInt(_objectX2[l]); + p.parseInt(_objectY2[l]); p.parseInt(roomObjX[l]); p.parseInt(roomObjY[l]); p.parseInt(trackObj[l]); diff --git a/engines/drascula/saveload.cpp b/engines/drascula/saveload.cpp index 35e3821dc4..ba4148fb76 100644 --- a/engines/drascula/saveload.cpp +++ b/engines/drascula/saveload.cpp @@ -21,218 +21,270 @@ */ #include "common/textconsole.h" +#include "common/translation.h" + +#include "engines/savestate.h" +#include "graphics/thumbnail.h" +#include "gui/message.h" +#include "gui/saveload.h" #include "drascula/drascula.h" namespace Drascula { -/** - * Loads the save names from the EPA index file. - * - * TODO: We should move the save names in their respective save files and get - * rid of this completely. A good example is the sword1 engine, which also used - * to have an index file for its saves, that has been removed. - * sword1 contains code that converts the old index-based saves into the new - * format without the index file, so we could apply this idea to drascula as - * well. - */ -void DrasculaEngine::loadSaveNames() { - Common::InSaveFile *sav; - Common::String fileEpa = Common::String::format("%s.epa", _targetName.c_str()); - - // Create and initialize the index file, if it doesn't exist - if (!(sav = _saveFileMan->openForLoading(fileEpa))) { - Common::OutSaveFile *epa; - if (!(epa = _saveFileMan->openForSaving(fileEpa))) - error("Can't open %s file", fileEpa.c_str()); - for (int n = 0; n < NUM_SAVES; n++) - epa->writeString("*\n"); - epa->finalize(); - delete epa; - if (!(sav = _saveFileMan->openForLoading(fileEpa))) { - error("Can't open %s file", fileEpa.c_str()); - } +#define MAGIC_HEADER 0xD6A55A57 // (D)rascula (GA)me (S)cummVM (SA)ve (ST)ate +#define SAVEGAME_VERSION 1 + +void DrasculaEngine::checkForOldSaveGames() { + Common::String indexFileName = Common::String::format("%s.epa", _targetName.c_str()); + Common::InSaveFile *indexFile = _saveFileMan->openForLoading(indexFileName); + + // Check for the existence of an old index file + if (!indexFile) { + delete indexFile; + return; } - // Load the index file - for (int n = 0; n < NUM_SAVES; n++) { - strncpy(_saveNames[n], sav->readLine().c_str(), 23); - _saveNames[n][22] = '\0'; // make sure the savegame name is 0-terminated + GUI::MessageDialog dialog0( + _("ScummVM found that you have old savefiles for Drascula that should be converted.\n" + "The old save game format is no longer supported, so you will not be able to load your games if you don't convert them.\n\n" + "Press OK to convert them now, otherwise you will be asked again the next time you start the game.\n"), _("OK"), _("Cancel")); + + int choice = dialog0.runModal(); + if (choice == GUI::kMessageCancel) + return; + + // Convert every save slot we find in the index file to the new format + Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); + Common::String pattern = Common::String::format("%s??", _targetName.c_str()); + + // Get list of savefiles for target game + Common::StringArray filenames = saveFileMan->listSavefiles(pattern); + Common::Array<int> slots; + for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { + // Obtain the last 2 digits of the filename, since they correspond to the save slot + int slotNum = atoi(file->c_str() + file->size() - 2); + + // Ensure save slot is within valid range + if (slotNum >= 1 && slotNum <= 10) { + slots.push_back(slotNum); + } } - delete sav; -} -/** - * Saves the save names into the EPA index file. - * - * TODO: We should move the save names in their respective save files and get - * rid of this completely. A good example is the sword1 engine, which also used - * to have an index file for its saves, that has been removed. - * sword1 contains code that converts the old index-based saves into the new - * format without the index file, so we could apply this idea to drascula as - * well. - */ -void DrasculaEngine::saveSaveNames() { - Common::OutSaveFile *tsav; - Common::String fileEpa = Common::String::format("%s.epa", _targetName.c_str()); + // Sort save slot ids + Common::sort<int>(slots.begin(), slots.end()); - if (!(tsav = _saveFileMan->openForSaving(fileEpa))) { - error("Can't open %s file", fileEpa.c_str()); - } - for (int n = 0; n < NUM_SAVES; n++) { - tsav->writeString(_saveNames[n]); - tsav->writeString("\n"); + // Get savegame names from index + Common::String saveDesc; + + int line = 1; + for (uint i = 0; i < slots.size(); i++) { + // Ignore lines corresponding to unused saveslots + for (; line < slots[i]; line++) + indexFile->readLine(); + + // Copy the name in the line corresponding to the save slot + saveDesc = indexFile->readLine(); + + // Handle cases where the save directory and save index are detectably out of sync + if (saveDesc == "*") + saveDesc = "No name specified."; + + // Increment line number to keep it in sync with slot number + line++; + + // Convert savegame + convertSaveGame(slots[i], saveDesc); } - tsav->finalize(); - delete tsav; -} -bool DrasculaEngine::saveLoadScreen() { - Common::String file; - int n, n2, num_sav = 0, y = 27; + delete indexFile; - clearRoom(); + // Remove index file + _saveFileMan->removeSavefile(indexFileName); +} - loadSaveNames(); +SaveStateDescriptor loadMetaData(Common::ReadStream *s, int slot, bool setPlayTime) { + uint32 sig = s->readUint32BE(); + byte version = s->readByte(); - loadPic("savescr.alg", bgSurface, HALF_PAL); + SaveStateDescriptor desc(-1, ""); // init to an invalid save slot - color_abc(kColorLightGreen); + if (sig != MAGIC_HEADER || version > SAVEGAME_VERSION) + return desc; - select[0] = 0; + // Save is valid, set its slot number + desc.setSaveSlot(slot); - _system->setFeatureState(OSystem::kFeatureVirtualKeyboard, true); - setCursor(kCursorCrosshair); + Common::String name; + byte size = s->readByte(); + for (int i = 0; i < size; ++i) + name += s->readByte(); + desc.setDescription(name); - while (!shouldQuit()) { - y = 27; - copyBackground(); - for (n = 0; n < NUM_SAVES; n++) { - print_abc(_saveNames[n], 116, y); - y = y + 9; - } - print_abc(select, 117, 15); - updateScreen(); - y = 27; + uint32 saveDate = s->readUint32LE(); + int day = (saveDate >> 24) & 0xFF; + int month = (saveDate >> 16) & 0xFF; + int year = saveDate & 0xFFFF; + desc.setSaveDate(year, month, day); - updateEvents(); + uint16 saveTime = s->readUint16LE(); + int hour = (saveTime >> 8) & 0xFF; + int minutes = saveTime & 0xFF; + desc.setSaveTime(hour, minutes); - if (leftMouseButton == 1) { - delay(50); - for (n = 0; n < NUM_SAVES; n++) { - if (mouseX > 115 && mouseY > y + (9 * n) && mouseX < 115 + 175 && mouseY < y + 10 + (9 * n)) { - strcpy(select, _saveNames[n]); - - if (strcmp(select, "*") != 0) - selectionMade = 1; - else { - enterName(); - strcpy(_saveNames[n], select); - if (selectionMade == 1) { - file = Common::String::format("%s%02d", _targetName.c_str(), n + 1); - saveGame(file.c_str()); - saveSaveNames(); - } - } + uint32 playTime = s->readUint32LE(); + desc.setPlayTime(playTime * 1000); + if (setPlayTime) + g_engine->setTotalPlayTime(playTime * 1000); - print_abc(select, 117, 15); - y = 27; - for (n2 = 0; n2 < NUM_SAVES; n2++) { - print_abc(_saveNames[n2], 116, y); - y = y + 9; - } - if (selectionMade == 1) { - file = Common::String::format("%s%02d", _targetName.c_str(), n + 1); - } - num_sav = n; - } - } + return desc; +} - if (mouseX > 117 && mouseY > 15 && mouseX < 295 && mouseY < 24 && selectionMade == 1) { - enterName(); - strcpy(_saveNames[num_sav], select); - print_abc(select, 117, 15); - y = 27; - for (n2 = 0; n2 < NUM_SAVES; n2++) { - print_abc(_saveNames[n2], 116, y); - y = y + 9; - } +void saveMetaData(Common::WriteStream *s, Common::String &desc) { + TimeDate curTime; + g_system->getTimeAndDate(curTime); + + uint32 saveDate = ((curTime.tm_mday & 0xFF) << 24) | (((curTime.tm_mon + 1) & 0xFF) << 16) | ((curTime.tm_year + 1900) & 0xFFFF); + uint16 saveTime = ((curTime.tm_hour & 0xFF) << 8) | ((curTime.tm_min) & 0xFF); + uint32 playTime = g_engine->getTotalPlayTime() / 1000; + + s->writeUint32BE(MAGIC_HEADER); + s->writeByte(SAVEGAME_VERSION); + s->writeByte(desc.size()); + s->writeString(desc); + s->writeUint32LE(saveDate); + s->writeUint16LE(saveTime); + s->writeUint32LE(playTime); +} - if (selectionMade == 1) { - file = Common::String::format("%s%02d", _targetName.c_str(), n + 1); - saveGame(file.c_str()); - saveSaveNames(); - } - } +void DrasculaEngine::convertSaveGame(int slot, Common::String &desc) { + Common::String oldFileName = Common::String::format("%s%02d", _targetName.c_str(), slot); + Common::String newFileName = Common::String::format("%s.%03d", _targetName.c_str(), slot); + Common::InSaveFile *oldFile = _saveFileMan->openForLoading(oldFileName); + if (!oldFile) + error("Can't open %s", oldFileName.c_str()); + Common::OutSaveFile *newFile = _saveFileMan->openForSaving(newFileName); + if (!newFile) + error("Can't open %s", newFileName.c_str()); + + // Read data from old file + int32 dataSize = oldFile->size(); + byte *buffer = new byte[dataSize]; + oldFile->read(buffer, dataSize); + + // First, write the appropriate meta data in the new file + saveMetaData(newFile, desc); + Graphics::saveThumbnail(*newFile); // basically, at this point this will capture a black screen + + // And then attach the actual save data + newFile->write(buffer, dataSize); + newFile->finalize(); + if (newFile->err()) + warning("Can't write file '%s'. (Disk full?)", newFileName.c_str()); + + delete[] buffer; + delete newFile; + delete oldFile; + + // Remove old save file + _saveFileMan->removeSavefile(oldFileName); +} - if (mouseX > 125 && mouseY > 123 && mouseX < 199 && mouseY < 149 && selectionMade == 1) { - if (!loadGame(file.c_str())) { - _system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false); - return false; - } - break; - } else if (mouseX > 208 && mouseY > 123 && mouseX < 282 && mouseY < 149 && selectionMade == 1) { - saveGame(file.c_str()); - saveSaveNames(); - } else if (mouseX > 168 && mouseY > 154 && mouseX < 242 && mouseY < 180) - break; - else if (selectionMade == 0) { - print_abc("Please select a slot", 117, 15); - } - updateScreen(); - delay(200); +/** + * Loads the first 10 save names, to be used in Drascula's save/load screen + */ +void DrasculaEngine::loadSaveNames() { + Common::String saveFileName; + Common::InSaveFile *in; + + for (int n = 0; n < NUM_SAVES; n++) { + saveFileName = Common::String::format("%s.%03d", _targetName.c_str(), n + 1); + if ((in = _saveFileMan->openForLoading(saveFileName))) { + SaveStateDescriptor desc = loadMetaData(in, n + 1, false); + _saveNames[n] = desc.getDescription(); + delete in; } - y = 26; + } +} + +void DrasculaEngine::saveGame(int slot, Common::String &desc) { + Common::OutSaveFile *out; + int l; - delay(5); + Common::String saveFileName = Common::String::format("%s.%03d", _targetName.c_str(), slot); + if (!(out = _saveFileMan->openForSaving(saveFileName))) { + error("Unable to open the file"); } - selectVerb(kVerbNone); + saveMetaData(out, desc); + Graphics::saveThumbnail(*out); - clearRoom(); - loadPic(roomNumber, bgSurface, HALF_PAL); - selectionMade = 0; + // Actual save data follows + out->writeSint32LE(currentChapter); + out->write(currentData, 20); + out->writeSint32LE(curX); + out->writeSint32LE(curY); + out->writeSint32LE(trackProtagonist); - _system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false); + for (l = 1; l < ARRAYSIZE(inventoryObjects); l++) { + out->writeSint32LE(inventoryObjects[l]); + } - return true; + for (l = 0; l < NUM_FLAGS; l++) { + out->writeSint32LE(flags[l]); + } + + out->writeSint32LE(takeObject); + out->writeSint32LE(pickedObject); + + out->finalize(); + if (out->err()) + warning("Can't write file '%s'. (Disk full?)", saveFileName.c_str()); + + delete out; } -bool DrasculaEngine::loadGame(const char *gameName) { +bool DrasculaEngine::loadGame(int slot) { int l, savedChapter, roomNum = 0; - Common::InSaveFile *sav; + Common::InSaveFile *in; previousMusic = roomMusic; _menuScreen = false; if (currentChapter != 1) clearRoom(); - if (!(sav = _saveFileMan->openForLoading(gameName))) { - error("missing savegame file"); + Common::String saveFileName = Common::String::format("%s.%03d", _targetName.c_str(), slot); + if (!(in = _saveFileMan->openForLoading(saveFileName))) { + error("missing savegame file %s", saveFileName.c_str()); } - savedChapter = sav->readSint32LE(); + loadMetaData(in, slot, true); + Graphics::skipThumbnail(*in); + + savedChapter = in->readSint32LE(); if (savedChapter != currentChapter) { - strcpy(saveName, gameName); + _currentSaveSlot = slot; currentChapter = savedChapter - 1; loadedDifferentChapter = 1; + delete in; return false; } - sav->read(currentData, 20); - curX = sav->readSint32LE(); - curY = sav->readSint32LE(); - trackProtagonist = sav->readSint32LE(); + + in->read(currentData, 20); + curX = in->readSint32LE(); + curY = in->readSint32LE(); + trackProtagonist = in->readSint32LE(); for (l = 1; l < ARRAYSIZE(inventoryObjects); l++) { - inventoryObjects[l] = sav->readSint32LE(); + inventoryObjects[l] = in->readSint32LE(); } for (l = 0; l < NUM_FLAGS; l++) { - flags[l] = sav->readSint32LE(); + flags[l] = in->readSint32LE(); } - takeObject = sav->readSint32LE(); - pickedObject = sav->readSint32LE(); + takeObject = in->readSint32LE(); + pickedObject = in->readSint32LE(); loadedDifferentChapter = 0; if (!sscanf(currentData, "%d.ald", &roomNum)) { error("Bad save format"); @@ -243,35 +295,158 @@ bool DrasculaEngine::loadGame(const char *gameName) { return true; } -void DrasculaEngine::saveGame(const char *gameName) { - Common::OutSaveFile *out; - int l; +Common::String DrasculaEngine::enterName(Common::String &selectedName) { + Common::KeyCode key; + Common::String inputLine = selectedName; - if (!(out = _saveFileMan->openForSaving(gameName))) { - error("Unable to open the file"); + flushKeyBuffer(); + _system->setFeatureState(OSystem::kFeatureVirtualKeyboard, true); + + while (!shouldQuit()) { + copyBackground(115, 14, 115, 14, 176, 9, bgSurface, screenSurface); + print_abc((inputLine + "-").c_str(), 117, 15); + updateScreen(); + + key = getScan(); + + if (key != 0) { + if (key >= 0 && key <= 0xFF && isAlpha(key)) { + inputLine += tolower(key); + } else if ((key >= Common::KEYCODE_0 && key <= Common::KEYCODE_9) || key == Common::KEYCODE_SPACE) { + inputLine += key; + } else if (key == Common::KEYCODE_ESCAPE) { + inputLine.clear(); + break; + } else if (key == Common::KEYCODE_RETURN) { + break; + } else if (key == Common::KEYCODE_BACKSPACE) { + inputLine.deleteLastChar(); + } + } } - out->writeSint32LE(currentChapter); - out->write(currentData, 20); - out->writeSint32LE(curX); - out->writeSint32LE(curY); - out->writeSint32LE(trackProtagonist); - for (l = 1; l < ARRAYSIZE(inventoryObjects); l++) { - out->writeSint32LE(inventoryObjects[l]); + _system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false); + return inputLine; +} + +bool DrasculaEngine::scummVMSaveLoadDialog(bool isSave) { + GUI::SaveLoadChooser *dialog; + Common::String desc; + int slot; + + if (isSave) { + dialog = new GUI::SaveLoadChooser(_("Save game:"), _("Save"), true); + + slot = dialog->runModalWithCurrentTarget(); + desc = dialog->getResultString(); + + if (desc.empty()) { + // create our own description for the saved game, the user didnt enter it + desc = dialog->createDefaultSaveDescription(slot); + } + + if (desc.size() > 28) + desc = Common::String(desc.c_str(), 28); + } else { + dialog = new GUI::SaveLoadChooser(_("Restore game:"), _("Restore"), false); + slot = dialog->runModalWithCurrentTarget(); } - for (l = 0; l < NUM_FLAGS; l++) { - out->writeSint32LE(flags[l]); + delete dialog; + + if (slot < 0) + return true; + + if (isSave) { + saveGame(slot, desc); + return true; + } else { + return loadGame(slot); } +} - out->writeSint32LE(takeObject); - out->writeSint32LE(pickedObject); +bool DrasculaEngine::saveLoadScreen() { + int n, selectedSlot = 0; + Common::String selectedName; - out->finalize(); - if (out->err()) - warning("Can't write file '%s'. (Disk full?)", gameName); + clearRoom(); + loadPic("savescr.alg", bgSurface, HALF_PAL); + color_abc(kColorLightGreen); + setCursor(kCursorCrosshair); + loadSaveNames(); - delete out; + while (!shouldQuit()) { + copyBackground(); + for (n = 0; n < NUM_SAVES; n++) { + print_abc(_saveNames[n].c_str(), 116, 27 + 9 * n); + } + print_abc(selectedName.c_str(), 117, 15); + + updateScreen(); + updateEvents(); + + if (leftMouseButton == 1) { + // Check if the user has clicked on a save slot + for (n = 0; n < NUM_SAVES; n++) { + if (mouseX > 115 && mouseY > 27 + (9 * n) && mouseX < 115 + 175 && mouseY < 27 + 10 + (9 * n)) { + selectedSlot = n; + selectedName = _saveNames[selectedSlot]; + if (selectedName.empty()) { + selectedName = enterName(selectedName); + if (!selectedName.empty()) + _saveNames[selectedSlot] = selectedName; // update save name + } + break; + } + } + + // Check if the user has clicked in the text area above the save slots + if (mouseX > 117 && mouseY > 15 && mouseX < 295 && mouseY < 24 && !selectedName.empty()) { + selectedName = enterName(selectedName); + if (!selectedName.empty()) + _saveNames[selectedSlot] = selectedName; // update save name + } + + // Check if the user has clicked a button + if (mouseX > 208 && mouseY > 123 && mouseX < 282 && mouseY < 149) { + // "Save" button + if (selectedName.empty()) { + print_abc("Please select a slot", 117, 15); + updateScreen(); + delay(200); + } else { + selectVerb(kVerbNone); + clearRoom(); + loadPic(roomNumber, bgSurface, HALF_PAL); + updateRoom(); + updateScreen(); + + saveGame(selectedSlot + 1, _saveNames[selectedSlot]); + return true; + } + } else if (mouseX > 125 && mouseY > 123 && mouseX < 199 && mouseY < 149) { + // "Load" button + if (selectedName.empty()) { + print_abc("Please select a slot", 117, 15); + updateScreen(); + delay(200); + } else { + return loadGame(selectedSlot + 1); + } + } else if (mouseX > 168 && mouseY > 154 && mouseX < 242 && mouseY < 180) { + // "Play" button + break; + } + } // if (leftMouseButton == 1) + + leftMouseButton = 0; + delay(10); + } + + selectVerb(kVerbNone); + clearRoom(); + loadPic(roomNumber, bgSurface, HALF_PAL); + return true; } } // End of namespace Drascula diff --git a/engines/dreamweb/backdrop.cpp b/engines/dreamweb/backdrop.cpp index 1db2663624..5ccc68704a 100644 --- a/engines/dreamweb/backdrop.cpp +++ b/engines/dreamweb/backdrop.cpp @@ -25,35 +25,35 @@ namespace DreamWeb { void DreamWebEngine::doBlocks() { - uint16 dstOffset = _mapAdY * 320 + _mapAdX; + uint16 dstOffset = _mapAdY * kScreenwidth + _mapAdX; uint16 mapOffset = _mapY * kMapWidth + _mapX; const uint8 *mapData = _mapData + mapOffset; uint8 *dstBuffer = workspace() + dstOffset; - for (size_t i = 0; i < 10; ++i) { - for (size_t j = 0; j < 11; ++j) { + for (uint i = 0; i < 10; ++i) { + for (uint j = 0; j < 11; ++j) { uint16 blockType = mapData[j]; if (blockType != 0) { - uint8 *dst = dstBuffer + i * 320 * 16 + j * 16; + uint8 *dst = dstBuffer + i * kScreenwidth * 16 + j * 16; const uint8 *block = _backdropBlocks + blockType * 256; - for (size_t k = 0; k < 4; ++k) { + for (uint k = 0; k < 4; ++k) { memcpy(dst, block, 16); block += 16; - dst += 320; + dst += kScreenwidth; } - for (size_t k = 0; k < 12; ++k) { + for (uint k = 0; k < 12; ++k) { memcpy(dst, block, 16); memset(dst + 16, 0xdf, 4); block += 16; - dst += 320; + dst += kScreenwidth; } dst += 4; memset(dst, 0xdf, 16); - dst += 320; + dst += kScreenwidth; memset(dst, 0xdf, 16); - dst += 320; + dst += kScreenwidth; memset(dst, 0xdf, 16); - dst += 320; + dst += kScreenwidth; memset(dst, 0xdf, 16); } } @@ -129,7 +129,7 @@ void DreamWebEngine::showAllObs() { _setList.clear(); const GraphicsFile &frameBase = _setFrames; - for (size_t i = 0; i < 128; ++i) { + for (uint i = 0; i < 128; ++i) { SetObject *setEntry = &_setDat[i]; uint16 x, y; if (getMapAd(setEntry->mapad, &x, &y) == 0) @@ -154,7 +154,7 @@ void DreamWebEngine::showAllObs() { } static bool addAlong(const MapFlag *mapFlags) { - for (size_t i = 0; i < 11; ++i) { + for (uint i = 0; i < 11; ++i) { if (mapFlags[i]._flag != 0) return true; } @@ -162,7 +162,7 @@ static bool addAlong(const MapFlag *mapFlags) { } static bool addLength(const MapFlag *mapFlags) { - for (size_t i = 0; i < 10; ++i) { + for (uint i = 0; i < 10; ++i) { if (mapFlags[11 * i]._flag != 0) return true; } @@ -205,13 +205,13 @@ void DreamWebEngine::calcMapAd() { } void DreamWebEngine::showAllFree() { - const unsigned int count = 80; + const uint count = 80; _freeList.clear(); const DynObject *freeObjects = _freeDat; const GraphicsFile &frameBase = _freeFrames; - for (size_t i = 0; i < count; ++i) { + for (uint i = 0; i < count; ++i) { uint16 x, y; uint8 mapAd = getMapAd(freeObjects[i].mapad, &x, &y); if (mapAd != 0) { @@ -236,8 +236,8 @@ void DreamWebEngine::drawFlags() { uint16 mapOffset = _mapY * kMapWidth + _mapX; const uint8 *mapData = _mapData + mapOffset; - for (size_t i = 0; i < 10; ++i) { - for (size_t j = 0; j < 11; ++j) { + for (uint i = 0; i < 10; ++i) { + for (uint j = 0; j < 11; ++j) { uint8 tile = mapData[i * kMapWidth + j]; mapFlag->_flag = _backdropFlags[tile]._flag; mapFlag->_flagEx = _backdropFlags[tile]._flagEx; @@ -248,13 +248,13 @@ void DreamWebEngine::drawFlags() { } void DreamWebEngine::showAllEx() { - const unsigned int count = 100; + const uint count = 100; _exList.clear(); DynObject *objects = _exData; const GraphicsFile &frameBase = _exFrames; - for (size_t i = 0; i < count; ++i) { + for (uint i = 0; i < count; ++i) { DynObject *object = objects + i; if (object->mapad[0] == 0xff) continue; diff --git a/engines/dreamweb/dreamweb.cpp b/engines/dreamweb/dreamweb.cpp index 5f5d627553..c3ede46df2 100644 --- a/engines/dreamweb/dreamweb.cpp +++ b/engines/dreamweb/dreamweb.cpp @@ -208,7 +208,7 @@ DreamWebEngine::DreamWebEngine(OSystem *syst, const DreamWebGameDescription *gam _addToRed = 0; _addToBlue = 0; _lastSoundReel = 0; - _lastHardKey = 0; + _lastHardKey = Common::KEYCODE_INVALID; _bufferIn = 0; _bufferOut = 0; _blinkFrame = 23; @@ -263,7 +263,7 @@ void DreamWebEngine::waitForVSync() { void DreamWebEngine::quit() { _quitRequested = true; - _lastHardKey = 1; + _lastHardKey = Common::KEYCODE_ESCAPE; } void DreamWebEngine::processEvents() { @@ -274,7 +274,7 @@ void DreamWebEngine::processEvents() { _sound->soundHandler(); Common::Event event; - int softKey, hardKey; + int softKey; while (_eventMan->pollEvent(event)) { switch(event.type) { case Common::EVENT_RTL: @@ -309,28 +309,21 @@ void DreamWebEngine::processEvents() { return; //do not pass ctrl + key to the engine } - // Some parts of the ASM code uses the hardware key - // code directly. We don't have that code, so we fake - // it for the keys where it's needed and assume it's - // 0 (which is actually an invalid value, as far as I - // know) otherwise. - - hardKey = 0; + // Some parts of the code uses the hardware key + // code directly. switch (event.kbd.keycode) { case Common::KEYCODE_ESCAPE: - hardKey = 1; + _lastHardKey = Common::KEYCODE_ESCAPE; break; case Common::KEYCODE_SPACE: - hardKey = 57; + _lastHardKey = Common::KEYCODE_SPACE; break; default: - hardKey = 0; + _lastHardKey = Common::KEYCODE_INVALID; break; } - _lastHardKey = hardKey; - // The rest of the keys are converted to ASCII. This // is fairly restrictive, and eventually we may want // to let through more keys. I think this is mostly to @@ -338,11 +331,13 @@ void DreamWebEngine::processEvents() { softKey = 0; - if (event.kbd.keycode >= Common::KEYCODE_a && event.kbd.keycode <= Common::KEYCODE_z) { - softKey = event.kbd.ascii & ~0x20; - } else if (event.kbd.keycode == Common::KEYCODE_MINUS || - event.kbd.keycode == Common::KEYCODE_SPACE || - (event.kbd.keycode >= Common::KEYCODE_0 && event.kbd.keycode <= Common::KEYCODE_9)) { + debug(1, "DreamWebEngine::processEvents() KeyDown keycode:%d ascii:0x%02x", event.kbd.keycode, event.kbd.ascii); + if ((event.kbd.ascii >= 'a' && event.kbd.ascii <= 'z') || + (event.kbd.ascii >= 'A' && event.kbd.ascii <= 'Z')) { + softKey = event.kbd.ascii & ~0x20; // (& ~0x20) forces ascii codes for a-z to map to A-Z + } else if (event.kbd.ascii == '-' || + event.kbd.ascii == ' ' || + (event.kbd.ascii >= '0' && event.kbd.ascii <= '9')) { softKey = event.kbd.ascii; } else if (event.kbd.keycode >= Common::KEYCODE_KP0 && event.kbd.keycode <= Common::KEYCODE_KP9) { softKey = event.kbd.keycode - Common::KEYCODE_KP0 + '0'; @@ -374,6 +369,7 @@ Common::Error DreamWebEngine::run() { ConfMan.registerDefault("bright_palette", true); _hasSpeech = Common::File::exists(_speechDirName + "/r01c0000.raw") && !ConfMan.getBool("speech_mute"); _brightPalette = ConfMan.getBool("bright_palette"); + _copyProtection = ConfMan.getBool("copy_protection"); _timer->installTimerProc(vSyncInterrupt, 1000000 / 70, this, "dreamwebVSync"); dreamweb(); @@ -403,14 +399,14 @@ Common::String DreamWebEngine::getSavegameFilename(int slot) const { void DreamWebEngine::keyPressed(uint16 ascii) { debug(2, "key pressed = %04x", ascii); - uint16 in = (_bufferIn + 1) & 0x0f; + uint16 in = (_bufferIn + 1) % ARRAYSIZE(_keyBuffer); uint16 out = _bufferOut; if (in == out) { warning("keyboard buffer is full"); return; } _bufferIn = in; - DreamWeb::g_keyBuffer[in] = ascii; + _keyBuffer[in] = ascii; } void DreamWebEngine::getPalette(uint8 *data, uint start, uint count) { @@ -421,7 +417,7 @@ void DreamWebEngine::getPalette(uint8 *data, uint start, uint count) { void DreamWebEngine::setPalette(const uint8 *data, uint start, uint count) { assert(start + count <= 256); - uint8 fixed[768]; + uint8 fixed[3*256]; for (uint i = 0; i < count * 3; ++i) { fixed[i] = data[i] << 2; } @@ -429,10 +425,10 @@ void DreamWebEngine::setPalette(const uint8 *data, uint start, uint count) { } void DreamWebEngine::blit(const uint8 *src, int pitch, int x, int y, int w, int h) { - if (y + h > 200) - h = 200 - y; - if (x + w > 320) - w = 320 - x; + if (y + h > (int)kScreenheight) + h = kScreenheight - y; + if (x + w > (int)kScreenwidth) + w = kScreenwidth - x; if (h <= 0 || w <= 0) return; _system->copyRectToScreen(src, pitch, x, y, w, h); diff --git a/engines/dreamweb/dreamweb.h b/engines/dreamweb/dreamweb.h index a4597b1867..eb35a73f66 100644 --- a/engines/dreamweb/dreamweb.h +++ b/engines/dreamweb/dreamweb.h @@ -25,6 +25,7 @@ #include "common/error.h" #include "common/file.h" +#include "common/keyboard.h" #include "common/random.h" #include "common/rect.h" #include "common/savefile.h" @@ -63,6 +64,7 @@ const unsigned int kMapHeight = 60; const unsigned int kLengthOfMap = kMapWidth * kMapHeight; const unsigned int kNumExObjects = 114; const unsigned int kScreenwidth = 320; +const unsigned int kScreenheight = 200; const unsigned int kDiaryx = (68+24); const unsigned int kDiaryy = (48+12); const unsigned int kInventx = 80; @@ -88,10 +90,6 @@ const unsigned int kNumRoomTexts = 38; const unsigned int kNumFreeTexts = 82; const unsigned int kNumPersonTexts = 1026; -// Keyboard buffer. data.word(kBufferin) and data.word(kBufferout) are indexes -// into this, making it a ring buffer -extern uint8 g_keyBuffer[16]; - // Engine Debug Flags enum { kDebugAnimation = (1 << 0), @@ -156,6 +154,12 @@ public: const Common::String& getSpeechDirName() { return _speechDirName; } private: + // Keyboard buffer. _bufferIn and _bufferOut are indexes + // into this, making it a ring buffer + uint8 _keyBuffer[16]; + uint16 _bufferIn; + uint16 _bufferOut; + void keyPressed(uint16 ascii); void setSpeed(uint speed); @@ -316,6 +320,7 @@ public: uint16 _charShift; uint8 _kerning; bool _brightPalette; + bool _copyProtection; uint8 _roomLoaded; uint8 _didZoom; uint16 _lineSpacing; @@ -419,9 +424,7 @@ public: uint8 _addToRed; uint8 _addToBlue; uint16 _lastSoundReel; - uint8 _lastHardKey; - uint16 _bufferIn; - uint16 _bufferOut; + Common::KeyCode _lastHardKey; uint8 _blinkFrame; uint8 _blinkCount; uint8 _reAssesChanges; @@ -750,7 +753,6 @@ public: void showRyanPage(); void switchRyanOn(); void switchRyanOff(); - void middlePanel(); void showDiary(); void readMouse(); uint16 readMouseState(); @@ -882,7 +884,6 @@ public: void obsThatDoThings(); void describeOb(); void putBackObStuff(); - void reExFromOpen(); void showDiaryPage(); void showDiaryKeys(); void dumpDiaryKeys(); diff --git a/engines/dreamweb/keypad.cpp b/engines/dreamweb/keypad.cpp index 3580f8ad52..7bbca2b979 100644 --- a/engines/dreamweb/keypad.cpp +++ b/engines/dreamweb/keypad.cpp @@ -103,7 +103,6 @@ void DreamWebEngine::enterCode(uint8 digit0, uint8 digit1, uint8 digit2, uint8 d // Note: isItRight comes from use.asm, but is only used by enterCode(), // so we place it here. bool DreamWebEngine::isItRight(uint8 digit0, uint8 digit1, uint8 digit2, uint8 digit3) { - return digit0 == _pressList[0] && digit1 == _pressList[1] && digit2 == _pressList[2] && digit3 == _pressList[3]; } @@ -434,7 +433,7 @@ void DreamWebEngine::folderExit() { void DreamWebEngine::showLeftPage() { showFrame(_folderGraphics2, 0, 12, 3, 0); uint16 y = 12+5; - for (size_t i = 0; i < 9; ++i) { + for (uint i = 0; i < 9; ++i) { showFrame(_folderGraphics2, 0, y, 4, 0); y += 16; } @@ -445,7 +444,7 @@ void DreamWebEngine::showLeftPage() { uint8 pageIndex = _folderPage - 2; const uint8 *string = getTextInFile1(pageIndex * 2); y = 48; - for (size_t i = 0; i < 2; ++i) { + for (uint i = 0; i < 2; ++i) { uint8 lastChar; do { lastChar = printDirect(&string, 2, &y, 140, false); @@ -455,19 +454,19 @@ void DreamWebEngine::showLeftPage() { _kerning = 0; _charShift = 0; _lineSpacing = 10; - uint8 *bufferToSwap = workspace() + (48*320)+2; - for (size_t i = 0; i < 120; ++i) { - for (size_t j = 0; j < 65; ++j) { + uint8 *bufferToSwap = workspace() + (48*kScreenwidth)+2; + for (uint i = 0; i < 120; ++i) { + for (uint j = 0; j < 65; ++j) { SWAP(bufferToSwap[j], bufferToSwap[130 - j]); } - bufferToSwap += 320; + bufferToSwap += kScreenwidth; } } void DreamWebEngine::showRightPage() { showFrame(_folderGraphics2, 143, 12, 0, 0); uint16 y = 12+37; - for (size_t i = 0; i < 7; ++i) { + for (uint i = 0; i < 7; ++i) { showFrame(_folderGraphics2, 143, y, 1, 0); y += 16; } @@ -478,7 +477,7 @@ void DreamWebEngine::showRightPage() { uint8 pageIndex = _folderPage - 1; const uint8 *string = getTextInFile1(pageIndex * 2); y = 48; - for (size_t i = 0; i < 2; ++i) { + for (uint i = 0; i < 2; ++i) { uint8 lastChar; do { lastChar = printDirect(&string, 152, &y, 140, false); diff --git a/engines/dreamweb/monitor.cpp b/engines/dreamweb/monitor.cpp index 1886a80b6a..b6922cba51 100644 --- a/engines/dreamweb/monitor.cpp +++ b/engines/dreamweb/monitor.cpp @@ -149,6 +149,13 @@ bool DreamWebEngine::execCommand() { return true; case 1: monMessage(6); + // An extra addition in ScummVM: available commands. + // Since the reference to the game manual is a form of copy protection, + // this extra text is wrapped around the common copy protection check, + // to keep it faithful to the original, if requested. + if (!_copyProtection) { + monPrint("VALID COMMANDS ARE EXIT, HELP, LIST, READ, LOGON, KEYS"); + } break; case 2: dirCom(); @@ -366,7 +373,7 @@ void DreamWebEngine::lockLightOff() { } void DreamWebEngine::turnOnPower() { - for (size_t i = 0; i < 3; ++i) { + for (uint i = 0; i < 3; ++i) { powerLightOn(); hangOn(30); powerLightOff(); diff --git a/engines/dreamweb/object.cpp b/engines/dreamweb/object.cpp index 1e84aba6bd..bee3a6d511 100644 --- a/engines/dreamweb/object.cpp +++ b/engines/dreamweb/object.cpp @@ -31,7 +31,7 @@ void DreamWebEngine::showRyanPage() { void DreamWebEngine::findAllRyan() { memset(_ryanInvList, 0xff, sizeof(_ryanInvList)); - for (size_t i = 0; i < kNumexobjects; ++i) { + for (uint i = 0; i < kNumexobjects; ++i) { const DynObject *extra = getExAd(i); if (extra->mapad[0] != kExObjectType) continue; @@ -47,8 +47,8 @@ void DreamWebEngine::findAllRyan() { void DreamWebEngine::fillRyan() { ObjectRef *inv = &_ryanInvList[_vars._ryanPage * 10]; findAllRyan(); - for (size_t i = 0; i < 2; ++i) { - for (size_t j = 0; j < 5; ++j) { + for (uint i = 0; i < 2; ++i) { + for (uint j = 0; j < 5; ++j) { obToInv(inv->_index, inv->_type, kInventx + j * kItempicsize, kInventy + i * kItempicsize); ++inv; } @@ -435,10 +435,23 @@ void DreamWebEngine::deleteExFrame(uint8 frameNum) { _vars._exFramePos -= frameSize; // Adjust all frame pointers pointing into the shifted data - for (unsigned int i = 0; i < 3*kNumexobjects; ++i) { - frame = &_exFrames._frames[i]; - if (frame->ptr() >= startOff) - frame->setPtr(frame->ptr() - frameSize); + for (unsigned int i = 0; i < kNumexobjects; ++i) { + if (_exData[i].mapad[0] != 0xff) { + frame = &_exFrames._frames[3*i+0]; + if (frame->ptr() >= startOff) { + frame->setPtr(frame->ptr() - frameSize); + assert(frame->ptr() + frame->width*frame->height <= _vars._exFramePos); + } else { + assert(frame->ptr() + frame->width*frame->height <= startOff); + } + frame = &_exFrames._frames[3*i+1]; + if (frame->ptr() >= startOff) { + frame->setPtr(frame->ptr() - frameSize); + assert(frame->ptr() + frame->width*frame->height <= _vars._exFramePos); + } else { + assert(frame->ptr() + frame->width*frame->height <= startOff); + } + } } } @@ -875,7 +888,7 @@ void DreamWebEngine::useOpened() { void DreamWebEngine::outOfOpen() { if (_openedOb == 255) - return; // cannot use opened object + return; // cannot use opened object ObjectRef objectId = findOpenPos(); @@ -892,13 +905,10 @@ void DreamWebEngine::outOfOpen() { } if (_mouseButton == _oldButton) - return; // notletgo4 + return; // notletgo4 - if (_mouseButton != 1) { - if (_mouseButton == 2) - reExFromOpen(); + if (_mouseButton != 1) return; - } delPointer(); _pickUp = 1; @@ -1102,4 +1112,136 @@ void DreamWebEngine::pickupConts(uint8 from, uint8 containerEx) { } } +void DreamWebEngine::incRyanPage() { + commandOnlyCond(31, 222); + + if (_mouseButton == _oldButton || !(_mouseButton & 1)) + return; + + _vars._ryanPage = (_mouseX - (kInventx + 167)) / 18; + + delPointer(); + fillRyan(); + readMouse(); + showPointer(); + workToScreen(); + delPointer(); +} + +void DreamWebEngine::emergencyPurge() { + debug(2, "Ex memory: frames %d/%d, text %d/%d", _vars._exFramePos, kExframeslen, _vars._exTextPos, kExtextlen); + + while (_vars._exFramePos + 4000 >= kExframeslen || + _vars._exTextPos + 400 >= kExtextlen) + { + purgeAnItem(); + debug(2, "Ex memory after purging: frames %d/%d, text %d/%d", _vars._exFramePos, kExframeslen, _vars._exTextPos, kExtextlen); + } +} + +void DreamWebEngine::purgeAnItem() { + const DynObject *extraObjects = _exData; + + + for (uint i = 0; i < kNumexobjects; ++i) { + if (extraObjects[i].mapad[0] == 0 && + (extraObjects[i].objId[0] == 255 || extraObjects[i].objId[0] == 2) && + extraObjects[i].initialLocation != _realLocation) { + debug(1, "Purging ex object %d", i); + deleteExObject(i); + return; + } + } + + for (uint i = 0; i < kNumexobjects; ++i) { + if (extraObjects[i].mapad[0] == 0 && extraObjects[i].objId[0] == 255) { + debug(1, "Purging ex object %d", i); + deleteExObject(i); + return; + } + } + + error("Out of Ex object memory"); +} + +void DreamWebEngine::dropError() { + _commandType = 255; + delPointer(); + printMessage(76, 21, 56, 240, 240 & 1); + workToScreenM(); + hangOnP(50); + showPanel(); + showMan(); + examIcon(); + _commandType = 255; + workToScreenM(); +} + +void DreamWebEngine::cantDrop() { + _commandType = 255; + delPointer(); + printMessage(76, 21, 24, 240, 240 & 1); + workToScreenM(); + hangOnP(50); + showPanel(); + showMan(); + examIcon(); + _commandType = 255; + workToScreenM(); +} + +void DreamWebEngine::examineInventory() { + commandOnlyCond(32, 249); + + if (!(_mouseButton & 1)) + return; + + createPanel(); + showPanel(); + showMan(); + showExit(); + examIcon(); + _pickUp = 0; + _invOpen = 2; + openInv(); + workToScreenM(); +} + +void DreamWebEngine::openInv() { + _invOpen = 1; + printMessage(80, 58 - 10, 61, 240, (240 & 1)); + fillRyan(); + _commandType = 255; +} + +void DreamWebEngine::pickupOb(uint8 command, uint8 pos) { + _lastInvPos = pos; + _objectType = kFreeObjectType; + _itemFrame = command; + _command = command; + //uint8 dummy; + //getAnyAd(&dummy, &dummy); // was in the original source, seems useless here + transferToEx(command); +} + +void DreamWebEngine::initialInv() { + if (_realLocation != 24) + return; + + pickupOb(11, 5); + pickupOb(12, 6); + pickupOb(13, 7); + pickupOb(14, 8); + pickupOb(18, 0); + pickupOb(19, 1); + pickupOb(20, 9); + pickupOb(16, 2); + _vars._watchMode = 1; + _vars._reelToHold = 0; + _vars._endOfHoldReel = 6; + _vars._watchSpeed = 1; + _vars._speedCount = 1; + switchRyanOff(); +} + } // End of namespace DreamWeb diff --git a/engines/dreamweb/pathfind.cpp b/engines/dreamweb/pathfind.cpp index c39070532c..64cffde4de 100644 --- a/engines/dreamweb/pathfind.cpp +++ b/engines/dreamweb/pathfind.cpp @@ -110,7 +110,7 @@ void DreamWebEngine::checkDest(const RoomPaths *roomsPaths) { const PathSegment *segments = roomsPaths->segments; const uint8 tmp = _mansPath << 4; uint8 destination = _destination; - for (size_t i = 0; i < 24; ++i) { + for (uint i = 0; i < 24; ++i) { if ((segments[i].b0 & 0xf0) == tmp && (segments[i].b0 & 0x0f) == _destination) { _destination = segments[i].b1 & 0x0f; diff --git a/engines/dreamweb/people.cpp b/engines/dreamweb/people.cpp index dbb81406cd..53f04d482b 100644 --- a/engines/dreamweb/people.cpp +++ b/engines/dreamweb/people.cpp @@ -194,7 +194,7 @@ void DreamWebEngine::madman(ReelRoutine &routine) { if (newReelPointer == 66) { ++_vars._combatCount; - if (_lastHardKey == 1) // ESC pressed, skip the mad man's speech + if (_lastHardKey == Common::KEYCODE_ESCAPE) // ESC pressed, skip the mad man's speech _vars._combatCount = _speechCount = (hasSpeech() ? 65 : 63); madmanText(); diff --git a/engines/dreamweb/print.cpp b/engines/dreamweb/print.cpp index 64b9849980..bc75b97e71 100644 --- a/engines/dreamweb/print.cpp +++ b/engines/dreamweb/print.cpp @@ -49,7 +49,9 @@ uint8 DreamWebEngine::getNextWord(const GraphicsFile &charSet, const uint8 *stri return 0; } firstChar = modifyChar(firstChar); - if (firstChar != 255) { + // WORKAROUND: Also filter out invalid characters here (refer to the + // workaround in printChar() below for more info). + if (firstChar >= 32 && firstChar != 255) { uint8 secondChar = *string; uint8 width = charSet._frames[firstChar - 32 + _charShift].width; width = kernChars(firstChar, secondChar, width); @@ -59,9 +61,13 @@ uint8 DreamWebEngine::getNextWord(const GraphicsFile &charSet, const uint8 *stri } void DreamWebEngine::printChar(const GraphicsFile &charSet, uint16* x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height) { - if (c == 255) + // WORKAROUND: Some texts contain leftover tab characters, which will cause + // OOB memory access when showing a character, as all the printable ones are + // from 32 onwards. We compensate for that here by ignoring all the invalid + // characters (0 - 31). + if (c < 32 || c == 255) return; - + uint8 dummyWidth, dummyHeight; if (width == NULL) width = &dummyWidth; @@ -315,7 +321,7 @@ void DreamWebEngine::rollEndCreditsGameLost() { waitForVSync(); multiDump(25, 20, 160, 160); - if (_lastHardKey == 1) + if (_lastHardKey == Common::KEYCODE_ESCAPE) return; } @@ -325,7 +331,7 @@ void DreamWebEngine::rollEndCreditsGameLost() { c = *string++; } while (c != ':' && c != 0); - if (_lastHardKey == 1) + if (_lastHardKey == Common::KEYCODE_ESCAPE) return; } diff --git a/engines/dreamweb/rain.cpp b/engines/dreamweb/rain.cpp index 8e42e0c161..b636b7def7 100644 --- a/engines/dreamweb/rain.cpp +++ b/engines/dreamweb/rain.cpp @@ -42,12 +42,12 @@ void DreamWebEngine::showRain() { uint16 offset = (rain.w3 - rain.b5) & 511; rain.w3 = offset; const uint8 *src = frameData + offset; - uint8 *dst = workspace() + y * 320 + x; + uint8 *dst = workspace() + y * kScreenwidth + x; for (uint16 j = 0; j < size; ++j) { uint8 v = src[j]; if (v != 0) *dst = v; - dst += 320-1; // advance diagonally + dst += kScreenwidth-1; // advance diagonally } } diff --git a/engines/dreamweb/saveload.cpp b/engines/dreamweb/saveload.cpp index ea9cdc0249..8a0791d19b 100644 --- a/engines/dreamweb/saveload.cpp +++ b/engines/dreamweb/saveload.cpp @@ -156,8 +156,16 @@ void DreamWebEngine::doLoad(int savegameId) { } else { if (savegameId == -1) { - // Open dialog to get savegameId + // Wait till both mouse buttons are up. We should wait till the user + // releases the mouse button, otherwise the follow-up mouseup event + // will trigger a load of the save slot under the mouse cursor. Fixes + // bug #3582582. + while (_oldMouseState > 0) { + readMouse(); + g_system->delayMillis(10); + } + // Open dialog to get savegameId GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser(_("Restore game:"), _("Restore"), false); savegameId = dialog->runModalWithCurrentTarget(); delete dialog; @@ -241,6 +249,15 @@ void DreamWebEngine::saveGame() { } return; } else { + // Wait till both mouse buttons are up. We should wait till the user + // releases the mouse button, otherwise the follow-up mouseup event + // will trigger a save into the save slot under the mouse cursor. Fixes + // bug #3582582. + while (_oldMouseState > 0) { + readMouse(); + g_system->delayMillis(10); + } + GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser(_("Save game:"), _("Save"), true); int savegameId = dialog->runModalWithCurrentTarget(); Common::String game_description = dialog->getResultString(); @@ -557,6 +574,14 @@ void DreamWebEngine::savePosition(unsigned int slot, const char *descbuf) { delete outSaveFile; } + +// Utility struct for a savegame sanity check in loadPosition +struct FrameExtent { + uint16 start; + uint16 length; + bool operator<(const struct FrameExtent& other) const { return start<other.start; } +}; + void DreamWebEngine::loadPosition(unsigned int slot) { _timeCount = 0; clearChanges(); @@ -636,6 +661,42 @@ void DreamWebEngine::loadPosition(unsigned int slot) { } delete inSaveFile; + + + // Do a sanity check on exFrames data to detect exFrames corruption + // caused by a (now fixed) bug in emergencyPurge. See bug #3591088. + // Gather the location of frame data of all used ex object frames. + Common::List<FrameExtent> flist; + for (unsigned int i = 0; i < kNumexobjects; ++i) { + if (_exData[i].mapad[0] != 0xff) { + FrameExtent fe; + Frame *frame = &_exFrames._frames[3*i+0]; + fe.start = frame->ptr(); + fe.length = frame->width * frame->height; + flist.push_back(fe); + + frame = &_exFrames._frames[3*i+1]; + fe.start = frame->ptr(); + fe.length = frame->width * frame->height; + flist.push_back(fe); + } + } + // ...and check if the frames overlap. + Common::sort(flist.begin(), flist.end(), Common::Less<FrameExtent>()); + Common::List<FrameExtent>::const_iterator iter; + uint16 curEnd = 0; + for (iter = flist.begin(); iter != flist.end(); ++iter) { + if (iter->start < curEnd) + error("exFrames data corruption in savegame"); + curEnd = iter->start + iter->length; + } + if (curEnd > _vars._exFramePos) { + if (curEnd > kExframeslen) + error("exFrames data corruption in savegame"); + warning("Fixing up exFramePos"); + _vars._exFramePos = curEnd; + } + // (end of sanity check) } // Count number of save files, and load their descriptions into _saveNames diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp index 01570c907a..1fa2e7d6a4 100644 --- a/engines/dreamweb/sprite.cpp +++ b/engines/dreamweb/sprite.cpp @@ -26,7 +26,7 @@ namespace DreamWeb { void DreamWebEngine::printSprites() { - for (size_t priority = 0; priority < 7; ++priority) { + for (uint priority = 0; priority < 7; ++priority) { Common::List<Sprite>::const_iterator i; for (i = _spriteTable.begin(); i != _spriteTable.end(); ++i) { const Sprite &sprite = *i; diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index f235f7c2fd..d93c2a951c 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -26,10 +26,6 @@ namespace DreamWeb { -// Keyboard buffer. _bufferIn and _bufferOut are indexes -// into this, making it a ring buffer -uint8 g_keyBuffer[16]; - const Room g_roomData[] = { // location 0 { "DREAMWEB.R00", // Ryan's apartment @@ -723,7 +719,6 @@ void DreamWebEngine::dreamweb() { showGun(); fadeScreenDown(); hangOn(100); - } } @@ -965,7 +960,6 @@ void DreamWebEngine::useTimedText() { } void DreamWebEngine::setupTimedTemp(uint8 textIndex, uint8 voiceIndex, uint8 x, uint8 y, uint16 countToTimed, uint16 timeCount) { - if (hasSpeech() && voiceIndex != 0) { _speechLoaded = _sound->loadSpeech('T', voiceIndex, 'T', textIndex); if (_speechLoaded) @@ -1056,7 +1050,7 @@ void DreamWebEngine::lockMon() { // key because calling readkey() drains characters from the input // buffer, we we want the user to be able to type ahead while the text // is being printed. - if (_lastHardKey == 57) { + if (_lastHardKey == Common::KEYCODE_SPACE) { // Clear the keyboard buffer. Otherwise the space that caused // the pause will be read immediately unpause the game. do { @@ -1072,7 +1066,7 @@ void DreamWebEngine::lockMon() { } // Forget the last "hard" key, otherwise the space that caused // the unpausing will immediately re-pause the game. - _lastHardKey = 0; + _lastHardKey = Common::KEYCODE_INVALID; lockLightOff(); } } @@ -1148,7 +1142,7 @@ void DreamWebEngine::plotReel(uint16 &reelPointer) { reel += 8; } - for (size_t i = 0; i < 8; ++i) { + for (uint i = 0; i < 8; ++i) { if (reel->frame() != 0xffff) showReelFrame(reel); ++reel; @@ -1247,7 +1241,7 @@ const uint8 *DreamWebEngine::findObName(uint8 type, uint8 index) { void DreamWebEngine::copyName(uint8 type, uint8 index, uint8 *dst) { const uint8 *src = findObName(type, index); - size_t i; + uint i; for (i = 0; i < 28; ++i) { char c = src[i]; if (c == ':') @@ -1377,7 +1371,7 @@ void DreamWebEngine::doChange(uint8 index, uint8 value, uint8 type) { } void DreamWebEngine::deleteTaken() { - for (size_t i = 0; i < kNumexobjects; ++i) { + for (uint i = 0; i < kNumexobjects; ++i) { uint8 location = _exData[i].initialLocation; if (location == _realLocation) { uint8 index = _exData[i].index; @@ -1388,7 +1382,7 @@ void DreamWebEngine::deleteTaken() { uint8 DreamWebEngine::getExPos() { DynObject *objects = _exData; - for (size_t i = 0; i < kNumexobjects; ++i) { + for (uint i = 0; i < kNumexobjects; ++i) { if (objects[i].mapad[0] == 0xff) return i; } @@ -1543,7 +1537,7 @@ void DreamWebEngine::printMessage2(uint16 x, uint16 y, uint8 index, uint8 maxWid bool DreamWebEngine::objectMatches(void *object, const char *id) { const char *objId = (const char *)object + 12; // whether it is a DynObject or a SetObject - for (size_t i = 0; i < 4; ++i) { + for (uint i = 0; i < 4; ++i) { if (id[i] != objId[i] + 'A') return false; } @@ -2138,7 +2132,6 @@ void DreamWebEngine::workToScreenM() { } void DreamWebEngine::atmospheres() { - const Atmosphere *a = &g_atmosphereList[0]; for (; a->_location != 255; ++a) { @@ -2208,8 +2201,8 @@ void DreamWebEngine::readKey() { return; } - bufOut = (bufOut + 1) & 15; // The buffer has size 16 - _currentKey = g_keyBuffer[bufOut]; + bufOut = (bufOut + 1) % ARRAYSIZE(_keyBuffer); + _currentKey = _keyBuffer[bufOut]; _bufferOut = bufOut; } @@ -2220,36 +2213,6 @@ void DreamWebEngine::newGame() { _getBack = 3; } -void DreamWebEngine::pickupOb(uint8 command, uint8 pos) { - _lastInvPos = pos; - _objectType = kFreeObjectType; - _itemFrame = command; - _command = command; - //uint8 dummy; - //getAnyAd(&dummy, &dummy); // was in the original source, seems useless here - transferToEx(command); -} - -void DreamWebEngine::initialInv() { - if (_realLocation != 24) - return; - - pickupOb(11, 5); - pickupOb(12, 6); - pickupOb(13, 7); - pickupOb(14, 8); - pickupOb(18, 0); - pickupOb(19, 1); - pickupOb(20, 9); - pickupOb(16, 2); - _vars._watchMode = 1; - _vars._reelToHold = 0; - _vars._endOfHoldReel = 6; - _vars._watchSpeed = 1; - _vars._speedCount = 1; - switchRyanOff(); -} - void DreamWebEngine::walkIntoRoom() { if (_vars._location == 14 && _mapX == 22) { _destination = 1; @@ -2314,13 +2277,6 @@ void DreamWebEngine::makeMainScreen() { _manIsOffScreen = 0; } -void DreamWebEngine::openInv() { - _invOpen = 1; - printMessage(80, 58 - 10, 61, 240, (240 & 1)); - fillRyan(); - _commandType = 255; -} - void DreamWebEngine::obsThatDoThings() { if (!compare(_command, _objectType, "MEMB")) return; // notlouiscard @@ -2420,10 +2376,6 @@ void DreamWebEngine::errorMessage3() { delPointer(); } -void DreamWebEngine::reExFromOpen() { - -} - void DreamWebEngine::putBackObStuff() { createPanel(); showPanel(); @@ -2444,26 +2396,6 @@ bool DreamWebEngine::isSetObOnMap(uint8 index) { return (getSetAd(index)->mapad[0] == 0); } -void DreamWebEngine::examineInventory() { - commandOnlyCond(32, 249); - - if (!(_mouseButton & 1)) - return; - - createPanel(); - showPanel(); - showMan(); - showExit(); - examIcon(); - _pickUp = 0; - _invOpen = 2; - openInv(); - workToScreenM(); -} - -void DreamWebEngine::middlePanel() { -} - void DreamWebEngine::underTextLine() { if (_foreignRelease) multiGet(_textUnder, _textAddressX, _textAddressY - 3, kUnderTextSizeX_f, kUnderTextSizeY_f); @@ -2575,7 +2507,6 @@ void DreamWebEngine::madmanRun() { _vars._lastWeapon = 8; } - void DreamWebEngine::decide() { setMode(); loadPalFromIFF(); @@ -2659,39 +2590,12 @@ void DreamWebEngine::showGun() { getRidOfTempText(); } -void DreamWebEngine::dropError() { - _commandType = 255; - delPointer(); - printMessage(76, 21, 56, 240, 240 & 1); - workToScreenM(); - hangOnP(50); - showPanel(); - showMan(); - examIcon(); - _commandType = 255; - workToScreenM(); -} - -void DreamWebEngine::cantDrop() { - _commandType = 255; - delPointer(); - printMessage(76, 21, 24, 240, 240 & 1); - workToScreenM(); - hangOnP(50); - showPanel(); - showMan(); - examIcon(); - _commandType = 255; - workToScreenM(); -} - void DreamWebEngine::getBack1() { if (_pickUp != 0) { blank(); return; } - commandOnlyCond(26, 202); if (_mouseButton == _oldButton) @@ -3003,52 +2907,4 @@ void DreamWebEngine::edensFlatReminders() { _vars._progressPoints++; // got card } -void DreamWebEngine::incRyanPage() { - commandOnlyCond(31, 222); - - if (_mouseButton == _oldButton || !(_mouseButton & 1)) - return; - - _vars._ryanPage = (_mouseX - (kInventx + 167)) / 18; - - delPointer(); - fillRyan(); - readMouse(); - showPointer(); - workToScreen(); - delPointer(); - -} - -void DreamWebEngine::emergencyPurge() { - while (true) { - if (_vars._exFramePos + 4000 < kExframeslen) { - // Not near frame end - if (_vars._exTextPos + 400 < kExtextlen) - return; // notneartextend - } - - purgeAnItem(); - } -} - -void DreamWebEngine::purgeAnItem() { - const DynObject *extraObjects = _exData; - - for (size_t i = 0; i < kNumexobjects; ++i) { - if (extraObjects[i].mapad[0] && extraObjects[i].objId[0] == 255 && - extraObjects[i].initialLocation != _realLocation) { - deleteExObject(i); - return; - } - } - - for (size_t i = 0; i < kNumexobjects; ++i) { - if (extraObjects[i].mapad[0] && extraObjects[i].objId[0] == 255) { - deleteExObject(i); - return; - } - } -} - } // End of namespace DreamWeb diff --git a/engines/dreamweb/titles.cpp b/engines/dreamweb/titles.cpp index f005279ba0..4e4faa75a0 100644 --- a/engines/dreamweb/titles.cpp +++ b/engines/dreamweb/titles.cpp @@ -105,34 +105,34 @@ void DreamWebEngine::bibleQuote() { fadeScreenUps(); hangOne(80); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "biblequotearly" } hangOne(560); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "biblequotearly" } fadeScreenDowns(); hangOne(200); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "biblequotearly" } _sound->cancelCh0(); - _lastHardKey = 0; + _lastHardKey = Common::KEYCODE_INVALID; } void DreamWebEngine::hangOne(uint16 delay) { do { waitForVSync(); - if (_lastHardKey == 1) + if (_lastHardKey == Common::KEYCODE_ESCAPE) return; // "hangonearly" } while (--delay); } @@ -150,8 +150,8 @@ void DreamWebEngine::intro() { fadeScreenUps(); runIntroSeq(); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "introearly" } @@ -160,8 +160,8 @@ void DreamWebEngine::intro() { loadIntroRoom(); runIntroSeq(); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "introearly" } @@ -170,8 +170,8 @@ void DreamWebEngine::intro() { loadIntroRoom(); runIntroSeq(); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "introearly" } @@ -181,15 +181,15 @@ void DreamWebEngine::intro() { loadIntroRoom(); runIntroSeq(); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "introearly" } getRidOfTempText(); clearBeforeLoad(); - _lastHardKey = 0; + _lastHardKey = Common::KEYCODE_INVALID; } void DreamWebEngine::runIntroSeq() { @@ -198,13 +198,13 @@ void DreamWebEngine::runIntroSeq() { do { waitForVSync(); - if (_lastHardKey == 1) + if (_lastHardKey == Common::KEYCODE_ESCAPE) break; spriteUpdate(); waitForVSync(); - if (_lastHardKey == 1) + if (_lastHardKey == Common::KEYCODE_ESCAPE) break; delEverything(); @@ -214,20 +214,20 @@ void DreamWebEngine::runIntroSeq() { useTimedText(); waitForVSync(); - if (_lastHardKey == 1) + if (_lastHardKey == Common::KEYCODE_ESCAPE) break; dumpMap(); dumpTimedText(); waitForVSync(); - if (_lastHardKey == 1) + if (_lastHardKey == Common::KEYCODE_ESCAPE) break; } while (_getBack != 1); - if (_lastHardKey == 1) { + if (_lastHardKey == Common::KEYCODE_ESCAPE) { getRidOfTempText(); clearBeforeLoad(); } @@ -266,7 +266,7 @@ void DreamWebEngine::loadIntroRoom() { _mapOffsetY = 16; clearSprites(); _vars._throughDoor = 0; - _currentKey = '0'; + _currentKey = 0; _mainMode = 0; clearWork(); _vars._newObs = 1; @@ -293,24 +293,24 @@ void DreamWebEngine::realCredits() { hangOne(2); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "realcreditsearly" } allPalette(); hangOne(80); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "realcreditsearly" } fadeScreenDowns(); hangOne(256); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "realcreditsearly" } @@ -318,24 +318,24 @@ void DreamWebEngine::realCredits() { _sound->playChannel0(12, 0); hangOne(2); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "realcreditsearly" } allPalette(); hangOne(80); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "realcreditsearly" } fadeScreenDowns(); hangOne(256); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "realcreditsearly" } @@ -343,24 +343,24 @@ void DreamWebEngine::realCredits() { _sound->playChannel0(12, 0); hangOne(2); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "realcreditsearly" } allPalette(); hangOne(80); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "realcreditsearly" } fadeScreenDowns(); hangOne(256); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "realcreditsearly" } @@ -368,24 +368,24 @@ void DreamWebEngine::realCredits() { _sound->playChannel0(12, 0); hangOne(2); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "realcreditsearly" } allPalette(); hangOne(80); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "realcreditsearly" } fadeScreenDowns(); hangOne(256); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "realcreditsearly" } @@ -393,24 +393,24 @@ void DreamWebEngine::realCredits() { _sound->playChannel0(12, 0); hangOne(2); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "realcreditsearly" } allPalette(); hangOne(80); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "realcreditsearly" } fadeScreenDowns(); hangOne(256); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "realcreditsearly" } @@ -418,23 +418,23 @@ void DreamWebEngine::realCredits() { fadeScreenUps(); hangOne(60); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "realcreditsearly" } _sound->playChannel0(13, 0); hangOne(350); - if (_lastHardKey == 1) { - _lastHardKey = 0; + if (_lastHardKey == Common::KEYCODE_ESCAPE) { + _lastHardKey = Common::KEYCODE_INVALID; return; // "realcreditsearly" } fadeScreenDowns(); hangOne(256); - _lastHardKey = 0; + _lastHardKey = Common::KEYCODE_INVALID; } } // End of namespace DreamWeb diff --git a/engines/dreamweb/use.cpp b/engines/dreamweb/use.cpp index 995eef04cd..476f847c40 100644 --- a/engines/dreamweb/use.cpp +++ b/engines/dreamweb/use.cpp @@ -131,7 +131,7 @@ void DreamWebEngine::useRoutine() { uint8 dummy; void *obj = getAnyAd(&dummy, &dummy); - for (size_t i = 0; i < sizeof(kUseList)/sizeof(UseListEntry); ++i) { + for (uint i = 0; i < ARRAYSIZE(kUseList); ++i) { const UseListEntry &entry = kUseList[i]; if (objectMatches(obj, entry.id)) { (this->*entry.callback)(); diff --git a/engines/dreamweb/vgafades.cpp b/engines/dreamweb/vgafades.cpp index c8f05641b5..d1e2480f70 100644 --- a/engines/dreamweb/vgafades.cpp +++ b/engines/dreamweb/vgafades.cpp @@ -56,8 +56,8 @@ void DreamWebEngine::fadeDOS() { //processEvents will be called from waitForVSync uint8 *dst = _startPal; getPalette(dst, 0, 64); - for (int fade = 0; fade < 64; ++fade) { - for (int c = 0; c < 768; ++c) { //original sources decrement 768 values -> 256 colors + for (uint fade = 0; fade < 64; ++fade) { + for (uint c = 0; c < 768; ++c) { //original sources decrement 768 values -> 256 colors if (dst[c]) { --dst[c]; } @@ -88,7 +88,7 @@ void DreamWebEngine::fadeCalculation() { uint8 *startPal = _startPal; const uint8 *endPal = _endPal; - for (size_t i = 0; i < 256 * 3; ++i) { + for (uint i = 0; i < 256 * 3; ++i) { uint8 s = startPal[i]; uint8 e = endPal[i]; if (s == e) @@ -212,7 +212,7 @@ void DreamWebEngine::fadeScreenDownHalf() { const uint8 *startPal = _startPal; uint8 *endPal = _endPal; - for (int i = 0; i < 256 * 3; ++i) { + for (uint i = 0; i < 256 * 3; ++i) { *endPal >>= 1; endPal++; } @@ -239,7 +239,7 @@ void DreamWebEngine::greyscaleSum() { byte *src = _mainPal; byte *dst = _endPal; - for (int i = 0; i < 256; ++i) { + for (uint i = 0; i < 256; ++i) { const unsigned int r = 20 * *src++; const unsigned int g = 59 * *src++; const unsigned int b = 11 * *src++; diff --git a/engines/dreamweb/vgagrafx.cpp b/engines/dreamweb/vgagrafx.cpp index d2390fb1fd..d8984d312b 100644 --- a/engines/dreamweb/vgagrafx.cpp +++ b/engines/dreamweb/vgagrafx.cpp @@ -31,14 +31,16 @@ const uint16 kZoomx = 8; const uint16 kZoomy = 132; void DreamWebEngine::multiGet(uint8 *dst, uint16 x, uint16 y, uint8 w, uint8 h) { - assert(x < 320); - assert(y < 200); + assert(x < kScreenwidth); + assert(y < kScreenheight); + const uint8 *src = workspace() + x + y * kScreenwidth; - if (y + h > 200) - h = 200 - y; - if (x + w > 320) - w = 320 - x; - //debug(1, "multiGet %u,%u %ux%u -> segment: %04x->%04x", x, y, w, h, (uint16)ds, (uint16)es); + + if (y + h > kScreenheight) + h = kScreenheight - y; + if (x + w > kScreenwidth) + w = kScreenwidth - x; + for (unsigned l = 0; l < h; ++l) { const uint8 *src_p = src + kScreenwidth * l; uint8 *dst_p = dst + w * l; @@ -47,14 +49,16 @@ void DreamWebEngine::multiGet(uint8 *dst, uint16 x, uint16 y, uint8 w, uint8 h) } void DreamWebEngine::multiPut(const uint8 *src, uint16 x, uint16 y, uint8 w, uint8 h) { - assert(x < 320); - assert(y < 200); + assert(x < kScreenwidth); + assert(y < kScreenheight); + uint8 *dst = workspace() + x + y * kScreenwidth; - if (y + h > 200) - h = 200 - y; - if (x + w > 320) - w = 320 - x; - //debug(1, "multiPut %ux%u -> segment: %04x->%04x", w, h, (uint16)ds, (uint16)es); + + if (y + h > kScreenheight) + h = kScreenheight - y; + if (x + w > kScreenwidth) + w = kScreenwidth - x; + for (unsigned l = 0; l < h; ++l) { const uint8 *src_p = src + w * l; uint8 *dst_p = dst + kScreenwidth * l; @@ -64,12 +68,11 @@ void DreamWebEngine::multiPut(const uint8 *src, uint16 x, uint16 y, uint8 w, uin void DreamWebEngine::multiDump(uint16 x, uint16 y, uint8 width, uint8 height) { unsigned offset = x + y * kScreenwidth; - //debug(1, "multiDump %ux%u(segment: %04x) -> %d,%d(address: %d)", w, h, (uint16)ds, x, y, offset); blit(workspace() + offset, kScreenwidth, x, y, width, height); } void DreamWebEngine::workToScreen() { - blit(workspace(), 320, 0, 0, 320, 200); + blit(workspace(), kScreenwidth, 0, 0, kScreenwidth, kScreenheight); } void DreamWebEngine::frameOutNm(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y) { @@ -147,7 +150,7 @@ void DreamWebEngine::doShake() { void DreamWebEngine::setMode() { waitForVSync(); - initGraphics(320, 200, false); + initGraphics(kScreenwidth, kScreenheight, false); } void DreamWebEngine::showPCX(const Common::String &suffix) { @@ -185,7 +188,7 @@ void DreamWebEngine::showPCX(const Common::String &suffix) { void DreamWebEngine::frameOutV(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, int16 x, int16 y) { // NB : These resilience checks were not in the original engine, but did they result in undefined behaviour // or was something broken during porting to C++? - assert(pitch == 320); + assert(pitch == kScreenwidth); if (x < 0) { assert(width >= -x); @@ -199,15 +202,16 @@ void DreamWebEngine::frameOutV(uint8 *dst, const uint8 *src, uint16 pitch, uint1 src += (-y) * width; y = 0; } - if (x >= 320) + + if ((uint16)x >= kScreenwidth) return; - if (y >= 200) + if ((uint16)y >= kScreenheight) return; - if (x + width > 320) { - width = 320 - x; + if ((uint16)x + width > kScreenwidth) { + width = kScreenwidth - x; } - if (y + height > 200) { - height = 200 - y; + if ((uint16)y + height > kScreenheight) { + height = kScreenheight - y; } uint16 stride = pitch - width; @@ -246,20 +250,20 @@ void DreamWebEngine::showFrameInternal(const uint8 *pSrc, uint16 x, uint16 y, ui //addToPrintList(x - _mapAdX, y - _mapAdY); // NB: Commented in the original asm } if (effectsFlag & 4) { // flippedX - frameOutFx(workspace(), pSrc, 320, width, height, x, y); + frameOutFx(workspace(), pSrc, kScreenwidth, width, height, x, y); return; } if (effectsFlag & 2) { // noMask - frameOutNm(workspace(), pSrc, 320, width, height, x, y); + frameOutNm(workspace(), pSrc, kScreenwidth, width, height, x, y); return; } if (effectsFlag & 32) { - frameOutBh(workspace(), pSrc, 320, width, height, x, y); + frameOutBh(workspace(), pSrc, kScreenwidth, width, height, x, y); return; } } // "noEffects" - frameOutV(workspace(), pSrc, 320, width, height, x, y); + frameOutV(workspace(), pSrc, kScreenwidth, width, height, x, y); } void DreamWebEngine::showFrame(const GraphicsFile &frameData, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height) { @@ -285,7 +289,7 @@ void DreamWebEngine::showFrame(const GraphicsFile &frameData, uint16 x, uint16 y } void DreamWebEngine::clearWork() { - memset(workspace(), 0, 320*200); + memset(workspace(), 0, kScreenwidth*kScreenheight); } void DreamWebEngine::dumpZoom() { @@ -326,20 +330,20 @@ void DreamWebEngine::zoom() { putUnderZoom(); return; } - uint16 srcOffset = (_oldPointerY - 9) * 320 + (_oldPointerX - 11); - uint16 dstOffset = (kZoomy + 4) * 320 + (kZoomx + 5); + uint16 srcOffset = (_oldPointerY - 9) * kScreenwidth + (_oldPointerX - 11); + uint16 dstOffset = (kZoomy + 4) * kScreenwidth + (kZoomx + 5); const uint8 *src = workspace() + srcOffset; uint8 *dst = workspace() + dstOffset; - for (size_t i = 0; i < 20; ++i) { - for (size_t j = 0; j < 23; ++j) { + for (uint i = 0; i < 20; ++i) { + for (uint j = 0; j < 23; ++j) { uint8 v = src[j]; dst[2*j+0] = v; dst[2*j+1] = v; - dst[2*j+320] = v; - dst[2*j+321] = v; + dst[2*j+kScreenwidth] = v; + dst[2*j+kScreenwidth+1] = v; } - src += 320; - dst += 320*2; + src += kScreenwidth; + dst += kScreenwidth*2; } crosshair(); _didZoom = 1; @@ -375,7 +379,7 @@ void DreamWebEngine::loadPalFromIFF() { const uint8 *src = buf + 0x30; uint8 *dst = _mainPal; - for (size_t i = 0; i < 256*3; ++i) { + for (uint i = 0; i < 256*3; ++i) { uint8 c = src[i] / 4; if (_brightPalette) { if (c) { diff --git a/engines/engine.cpp b/engines/engine.cpp index 2ef4ecab60..c84404cc68 100644 --- a/engines/engine.cpp +++ b/engines/engine.cpp @@ -179,7 +179,12 @@ void initCommonGFX(bool defaultTo1XScaler) { } else { // Override global scaler with any game-specific define if (ConfMan.hasKey("gfx_mode")) { - g_system->setGraphicsMode(ConfMan.get("gfx_mode").c_str()); + Common::String gfxMode = ConfMan.get("gfx_mode"); + g_system->setGraphicsMode(gfxMode.c_str()); + + // HACK: For OpenGL modes, we will still honor the graphics scale override + if (defaultTo1XScaler && (gfxMode.equalsIgnoreCase("gl1") || gfxMode.equalsIgnoreCase("gl2") || gfxMode.equalsIgnoreCase("gl4"))) + g_system->resetGraphicsScale(); } } diff --git a/engines/gob/inter.h b/engines/gob/inter.h index 63bf3eb1c6..2aa837e777 100644 --- a/engines/gob/inter.h +++ b/engines/gob/inter.h @@ -693,7 +693,7 @@ protected: void o7_zeroVar(); void o7_getINIValue(); void o7_setINIValue(); - void o7_loadLBMPalette(); + void o7_loadIFFPalette(); void o7_opendBase(); void o7_closedBase(); void o7_getDBString(); diff --git a/engines/gob/inter_v7.cpp b/engines/gob/inter_v7.cpp index 6cf69ed9df..1238c23e3b 100644 --- a/engines/gob/inter_v7.cpp +++ b/engines/gob/inter_v7.cpp @@ -27,6 +27,7 @@ #include "graphics/cursorman.h" #include "graphics/wincursor.h" +#include "graphics/decoders/iff.h" #include "gob/gob.h" #include "gob/global.h" @@ -72,7 +73,7 @@ void Inter_v7::setupOpcodesDraw() { OPCODEDRAW(0x95, o7_zeroVar); OPCODEDRAW(0xA1, o7_getINIValue); OPCODEDRAW(0xA2, o7_setINIValue); - OPCODEDRAW(0xA4, o7_loadLBMPalette); + OPCODEDRAW(0xA4, o7_loadIFFPalette); OPCODEDRAW(0xC4, o7_opendBase); OPCODEDRAW(0xC5, o7_closedBase); OPCODEDRAW(0xC6, o7_getDBString); @@ -523,7 +524,7 @@ void Inter_v7::o7_setINIValue() { _inis.setValue(file, section, key, value); } -void Inter_v7::o7_loadLBMPalette() { +void Inter_v7::o7_loadIFFPalette() { Common::String file = _vm->_game->_script->evalString(); if (!file.contains('.')) file += ".LBM"; @@ -534,37 +535,46 @@ void Inter_v7::o7_loadLBMPalette() { if (startIndex > stopIndex) SWAP(startIndex, stopIndex); - Common::SeekableReadStream *lbmFile = _vm->_dataIO->getFile(file); - if (!lbmFile) { - warning("o7_loadLBMPalette(): No such file \"%s\"", file.c_str()); + Common::SeekableReadStream *iffFile = _vm->_dataIO->getFile(file); + if (!iffFile) { + warning("o7_loadIFFPalette(): No such file \"%s\"", file.c_str()); return; } - ImageType type = Surface::identifyImage(*lbmFile); - if (type != kImageTypeLBM) { - warning("o7_loadLBMPalette(): \"%s\" is no LBM", file.c_str()); + ImageType type = Surface::identifyImage(*iffFile); + if (type != kImageTypeIFF) { + warning("o7_loadIFFPalette(): \"%s\" is no IFF", file.c_str()); return; } - byte palette[768]; - - LBMLoader lbm(*lbmFile); - if (!lbm.loadPalette(palette)) { - warning("o7_loadLBMPalette(): Failed reading palette from LBM \"%s\"", file.c_str()); + Graphics::IFFDecoder decoder; + decoder.loadStream(*iffFile); + if (!decoder.getPalette() || decoder.getPaletteColorCount() != 256) { + warning("o7_loadIFFPalette(): Failed reading palette from IFF \"%s\"", file.c_str()); return; } - memset(palette , 0x00, 3); - memset(palette + 765, 0xFF, 3); - for (int i = 0; i < 768; i++) - palette[i] >>= 2; - - int16 count = stopIndex - startIndex + 1; + const byte *palette = decoder.getPalette(); startIndex *= 3; - count *= 3; + stopIndex *= 3; + + byte *dst = (byte *)_vm->_draw->_vgaPalette + startIndex; + const byte *src = palette + startIndex; + for (int i = startIndex; i <= stopIndex + 2; ++i) { + *dst++ = *src++ >> 2; + } + + if (startIndex == 0) { + dst = (byte *)_vm->_draw->_vgaPalette; + dst[0] = dst[1] = dst[2] = 0x00 >> 2; + } + + if (stopIndex == 765) { + dst = (byte *)_vm->_draw->_vgaPalette + 765; + dst[0] = dst[1] = dst[2] = 0xFF >> 2; + } - memcpy((char *)_vm->_draw->_vgaPalette + startIndex, palette + startIndex, count); _vm->_video->setFullPalette(_vm->_global->_pPaletteDesc); } diff --git a/engines/gob/surface.cpp b/engines/gob/surface.cpp index afbb7c3bae..6b65eb6ab9 100644 --- a/engines/gob/surface.cpp +++ b/engines/gob/surface.cpp @@ -26,112 +26,15 @@ #include "common/stream.h" #include "common/util.h" #include "common/frac.h" +#include "common/textconsole.h" #include "graphics/primitives.h" #include "graphics/pixelformat.h" #include "graphics/surface.h" +#include "graphics/decoders/iff.h" namespace Gob { -LBMLoader::LBMLoader(Common::SeekableReadStream &stream) : _parser(&stream), - _hasHeader(false), _palette(0), _image(0) { - -} - -bool LBMLoader::loadHeader(Graphics::BMHD &header) { - if (!readHeader()) - return false; - - header = _decoder._header; - return true; -} - -bool LBMLoader::loadPalette(byte *palette) { - assert(!_palette); - assert(palette); - - _palette = palette; - - Common::Functor1Mem<Common::IFFChunk&, bool, LBMLoader> c(this, &LBMLoader::callbackPalette); - _parser.parse(c); - - if (!_palette) - return false; - - _palette = 0; - return true; -} - -bool LBMLoader::loadImage(byte *image) { - assert(!_image); - assert(image); - - if (!readHeader()) - return false; - - _image = image; - - Common::Functor1Mem<Common::IFFChunk&, bool, LBMLoader> c(this, &LBMLoader::callbackImage); - _parser.parse(c); - - if (!_image) - return false; - - _image = 0; - return true; -} - -bool LBMLoader::callbackHeader(Common::IFFChunk &chunk) { - if (chunk._type == ID_BMHD) { - if (chunk._size == sizeof(Graphics::BMHD)) { - _decoder.loadHeader(chunk._stream); - _hasHeader = true; - } - - return true; // Stop the IFF parser - } - - return false; -} - -bool LBMLoader::callbackPalette(Common::IFFChunk &chunk) { - assert(_palette); - - if (chunk._type == ID_CMAP) { - if (chunk._size == 768) { - if (chunk._stream->read(_palette, chunk._size) != chunk._size) - _palette = 0; - } else - _palette = 0; - - return true; // Stop the IFF parser - } - - return false; -} - -bool LBMLoader::callbackImage(Common::IFFChunk &chunk) { - assert(_image); - - if (chunk._type == ID_BODY) { - _decoder.loadBitmap(Graphics::ILBMDecoder::ILBM_UNPACK_PLANES, _image, chunk._stream); - return true; - } - - return false; -} - -bool LBMLoader::readHeader() { - if (_hasHeader) - return true; - - Common::Functor1Mem<Common::IFFChunk&, bool, LBMLoader> c(this, &LBMLoader::callbackHeader); - _parser.parse(c); - - return _hasHeader; -} - - static void plotPixel(int x, int y, int color, void *data) { Surface *dest = (Surface *)data; @@ -841,8 +744,8 @@ bool Surface::loadImage(Common::SeekableReadStream &stream, ImageType type) { switch (type) { case kImageTypeTGA: return loadTGA(stream); - case kImageTypeLBM: - return loadLBM(stream); + case kImageTypeIFF: + return loadIFF(stream); case kImageTypeBRC: return loadBRC(stream); case kImageTypeBMP: @@ -871,7 +774,7 @@ ImageType Surface::identifyImage(Common::SeekableReadStream &stream) { stream.seek(startPos); if (!strncmp(buffer , "FORM", 4)) - return kImageTypeLBM; + return kImageTypeIFF; if (!strncmp(buffer + 6, "JFIF", 4)) return kImageTypeJPEG; if (!strncmp(buffer , "BRC" , 3)) @@ -904,20 +807,17 @@ bool Surface::loadTGA(Common::SeekableReadStream &stream) { return false; } -bool Surface::loadLBM(Common::SeekableReadStream &stream) { +bool Surface::loadIFF(Common::SeekableReadStream &stream) { + Graphics::IFFDecoder decoder; + decoder.loadStream(stream); - LBMLoader loader(stream); - - Graphics::BMHD header; - loader.loadHeader(header); - - if (header.depth != 8) - // Only 8bpp LBMs supported for now + if (!decoder.getSurface()) return false; - resize(header.width, header.height); + resize(decoder.getSurface()->w, decoder.getSurface()->h); + memcpy(_vidMem, decoder.getSurface()->pixels, decoder.getSurface()->w * decoder.getSurface()->h); - return loader.loadImage(_vidMem); + return true; } bool Surface::loadBRC(Common::SeekableReadStream &stream) { diff --git a/engines/gob/surface.h b/engines/gob/surface.h index 8f895a7910..8a1b502a95 100644 --- a/engines/gob/surface.h +++ b/engines/gob/surface.h @@ -26,9 +26,6 @@ #include "common/scummsys.h" #include "common/ptr.h" #include "common/rational.h" -#include "common/iff_container.h" - -#include "graphics/iff.h" namespace Common { class SeekableReadStream; @@ -39,37 +36,12 @@ namespace Gob { enum ImageType { kImageTypeNone = -1, kImageTypeTGA = 0, - kImageTypeLBM, + kImageTypeIFF, kImageTypeBRC, kImageTypeBMP, kImageTypeJPEG }; -class LBMLoader { -public: - LBMLoader(Common::SeekableReadStream &stream); - - bool loadHeader (Graphics::BMHD &header); - bool loadPalette(byte *palette); - bool loadImage (byte *image); - -private: - Common::IFFParser _parser; - - bool _hasHeader; - - Graphics::ILBMDecoder _decoder; - - byte *_palette; - byte *_image; - - bool callbackHeader (Common::IFFChunk &chunk); - bool callbackPalette(Common::IFFChunk &chunk); - bool callbackImage (Common::IFFChunk &chunk); - - bool readHeader(); -}; - /** An iterator over a surface's image data, automatically handles different color depths. */ class Pixel { public: @@ -182,7 +154,7 @@ private: uint16 dWidth, uint16 dHeight, uint16 sWidth, uint16 sHeight); bool loadTGA (Common::SeekableReadStream &stream); - bool loadLBM (Common::SeekableReadStream &stream); + bool loadIFF (Common::SeekableReadStream &stream); bool loadBRC (Common::SeekableReadStream &stream); bool loadBMP (Common::SeekableReadStream &stream); bool loadJPEG(Common::SeekableReadStream &stream); diff --git a/engines/groovie/detection.cpp b/engines/groovie/detection.cpp index 895686b5e0..65452f5cf3 100644 --- a/engines/groovie/detection.cpp +++ b/engines/groovie/detection.cpp @@ -25,9 +25,12 @@ #include "groovie/saveload.h" #include "common/system.h" +#include "common/translation.h" namespace Groovie { +#define GAMEOPTION_T7G_FAST_MOVIE_SPEED GUIO_GAMEOPTIONS1 + static const PlainGameDescriptor groovieGames[] = { // Games {"t7g", "The 7th Guest"}, @@ -52,7 +55,7 @@ static const GroovieGameDescription gameDescriptions[] = { "t7g", "", AD_ENTRY1s("script.grv", "d1b8033b40aa67c076039881eccce90d", 16659), Common::EN_ANY, Common::kPlatformPC, ADGF_NO_FLAGS, - GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_NOASPECT) + GUIO5(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_NOASPECT, GAMEOPTION_T7G_FAST_MOVIE_SPEED) }, kGroovieT7G, 0 }, @@ -63,7 +66,7 @@ static const GroovieGameDescription gameDescriptions[] = { "t7g", "", AD_ENTRY1s("T7GMac", "acdc4a58dd3f007f65e99b99d78e0bce", 1814029), Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, - GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_NOASPECT) + GUIO5(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_NOASPECT, GAMEOPTION_T7G_FAST_MOVIE_SPEED) }, kGroovieT7G, 0 }, @@ -79,7 +82,7 @@ static const GroovieGameDescription gameDescriptions[] = { "t7g", "", AD_ENTRY1s("T7GMac", "6bdee8d0f9eef6d58d02fcd7deec3fb2", 1830783), Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, - GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_NOASPECT) + GUIO5(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_NOASPECT, GAMEOPTION_T7G_FAST_MOVIE_SPEED) }, kGroovieT7G, 0 }, @@ -90,7 +93,7 @@ static const GroovieGameDescription gameDescriptions[] = { "t7g", "", AD_ENTRY1s("T7GMac", "0d595d4b44ae1814082938d051e5174e", 1830783), Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, - GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_NOASPECT) + GUIO5(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_NOASPECT, GAMEOPTION_T7G_FAST_MOVIE_SPEED) }, kGroovieT7G, 0 }, @@ -106,7 +109,7 @@ static const GroovieGameDescription gameDescriptions[] = { { NULL, 0, NULL, 0} }, Common::RU_RUS, Common::kPlatformPC, ADGF_NO_FLAGS, - GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_NOASPECT) + GUIO5(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_NOASPECT, GAMEOPTION_T7G_FAST_MOVIE_SPEED) }, kGroovieT7G, 0 }, @@ -120,7 +123,7 @@ static const GroovieGameDescription gameDescriptions[] = { { NULL, 0, NULL, 0} }, Common::EN_ANY, Common::kPlatformIOS, ADGF_NO_FLAGS, - GUIO2(GUIO_NOMIDI, GUIO_NOASPECT) + GUIO3(GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_T7G_FAST_MOVIE_SPEED) }, kGroovieT7G, 0 }, @@ -137,6 +140,36 @@ static const GroovieGameDescription gameDescriptions[] = { kGroovieV2, 1 }, + // The 11th Hour Macintosh English + { + { + "11h", "", + { + { "disk.1", 0, "5c0428cd3659fc7bbcd0aa16485ed5da", 227 }, + { "The 11th Hour Installer", 0, "bcdb4040b27f15b18f39fb9e496d384a", 1002987 }, + { 0, 0, 0, 0 } + }, + Common::EN_ANY, Common::kPlatformMacintosh, ADGF_UNSTABLE, + GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_NOASPECT) + }, + kGroovieV2, 1 + }, + + // The 11th Hour Macintosh English (Installed) + { + { + "11h", "Installed", + { + { "disk.1", 0, "5c0428cd3659fc7bbcd0aa16485ed5da", 227 }, + { "el01.mov", 0, "70f42dfc25b1488a08011dc45bb5145d", 6039 }, + { 0, 0, 0, 0 } + }, + Common::EN_ANY, Common::kPlatformMacintosh, ADGF_UNSTABLE, + GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_NOASPECT) + }, + kGroovieV2, 1 + }, + // The 11th Hour DOS Demo English { { @@ -159,6 +192,36 @@ static const GroovieGameDescription gameDescriptions[] = { kGroovieV2, 2 }, + // The Making of The 11th Hour Macintosh English + { + { + "11h", "Making Of", + { + { "disk.1", 0, "5c0428cd3659fc7bbcd0aa16485ed5da", 227 }, + { "The 11th Hour Installer", 0, "bcdb4040b27f15b18f39fb9e496d384a", 1002987 }, + { 0, 0, 0, 0 } + }, + Common::EN_ANY, Common::kPlatformMacintosh, ADGF_UNSTABLE, + GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_NOASPECT) + }, + kGroovieV2, 2 + }, + + // The Making of The 11th Hour Macintosh English (Installed) + { + { + "11h", "Making Of (Installed)", + { + { "disk.1", 0, "5c0428cd3659fc7bbcd0aa16485ed5da", 227 }, + { "el01.mov", 0, "70f42dfc25b1488a08011dc45bb5145d", 6039 }, + { 0, 0, 0, 0 } + }, + Common::EN_ANY, Common::kPlatformMacintosh, ADGF_UNSTABLE, + GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_NOASPECT) + }, + kGroovieV2, 2 + }, + // Clandestiny Trailer DOS English { { @@ -170,6 +233,36 @@ static const GroovieGameDescription gameDescriptions[] = { kGroovieV2, 3 }, + // Clandestiny Trailer Macintosh English + { + { + "clandestiny", "Trailer", + { + { "disk.1", 0, "5c0428cd3659fc7bbcd0aa16485ed5da", 227 }, + { "The 11th Hour Installer", 0, "bcdb4040b27f15b18f39fb9e496d384a", 1002987 }, + { 0, 0, 0, 0 } + }, + Common::EN_ANY, Common::kPlatformMacintosh, ADGF_UNSTABLE, + GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_NOASPECT) + }, + kGroovieV2, 3 + }, + + // Clandestiny Trailer Macintosh English (Installed) + { + { + "clandestiny", "Trailer (Installed)", + { + { "disk.1", 0, "5c0428cd3659fc7bbcd0aa16485ed5da", 227 }, + { "el01.mov", 0, "70f42dfc25b1488a08011dc45bb5145d", 6039 }, + { 0, 0, 0, 0 } + }, + Common::EN_ANY, Common::kPlatformMacintosh, ADGF_UNSTABLE, + GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_NOASPECT) + }, + kGroovieV2, 3 + }, + // Clandestiny DOS English { { @@ -207,9 +300,28 @@ static const GroovieGameDescription gameDescriptions[] = { {AD_TABLE_END_MARKER, kGroovieT7G, 0} }; +static const char *directoryGlobs[] = { + "MIDI", + 0 +}; + +static const ADExtraGuiOptionsMap optionsList[] = { + { + GAMEOPTION_T7G_FAST_MOVIE_SPEED, + { + _s("Fast movie speed"), + _s("Play movies at an increased speed"), + "fast_movie_speed", + false + } + }, + + AD_EXTRA_GUI_OPTIONS_TERMINATOR +}; + class GroovieMetaEngine : public AdvancedMetaEngine { public: - GroovieMetaEngine() : AdvancedMetaEngine(gameDescriptions, sizeof(GroovieGameDescription), groovieGames) { + GroovieMetaEngine() : AdvancedMetaEngine(gameDescriptions, sizeof(GroovieGameDescription), groovieGames, optionsList) { _singleid = "groovie"; // Use kADFlagUseExtraAsHint in order to distinguish the 11th hour from @@ -222,6 +334,10 @@ public: // replaced with an according explanation. _flags = kADFlagUseExtraAsHint; _guioptions = GUIO3(GUIO_NOSUBTITLES, GUIO_NOSFX, GUIO_NOASPECT); + + // Need MIDI directory to detect 11H Mac Installed + _maxScanDepth = 2; + _directoryGlobs = directoryGlobs; } const char *getName() const { diff --git a/engines/groovie/groovie.cpp b/engines/groovie/groovie.cpp index 726e7cbede..5ade442742 100644 --- a/engines/groovie/groovie.cpp +++ b/engines/groovie/groovie.cpp @@ -30,6 +30,7 @@ #include "groovie/music.h" #include "groovie/resource.h" #include "groovie/roq.h" +#include "groovie/stuffit.h" #include "groovie/vdx.h" #include "common/config-manager.h" @@ -56,15 +57,11 @@ GroovieEngine::GroovieEngine(OSystem *syst, const GroovieGameDescription *gd) : SearchMan.addSubDirectoryMatching(gameDataDir, "groovie"); SearchMan.addSubDirectoryMatching(gameDataDir, "media"); SearchMan.addSubDirectoryMatching(gameDataDir, "system"); + SearchMan.addSubDirectoryMatching(gameDataDir, "MIDI"); _modeSpeed = kGroovieSpeedNormal; - if (ConfMan.hasKey("t7g_speed")) { - Common::String speed = ConfMan.get("t7g_speed"); - if (speed.equals("im_an_ios")) - _modeSpeed = kGroovieSpeediOS; - else if (speed.equals("tweaked")) - _modeSpeed = kGroovieSpeedTweaked; - } + if (ConfMan.hasKey("fast_movie_speed") && ConfMan.getBool("fast_movie_speed")) + _modeSpeed = kGroovieSpeedFast; // Initialize the custom debug levels DebugMan.addDebugChannel(kGroovieDebugAll, "All", "Debug everything"); @@ -93,6 +90,15 @@ GroovieEngine::~GroovieEngine() { } Common::Error GroovieEngine::run() { + if (_gameDescription->version == kGroovieV2 && getPlatform() == Common::kPlatformMacintosh) { + // Load the Mac installer with the lowest priority (in case the user has installed + // the game and has the MIDI folder present; faster to just load them) + Common::Archive *archive = createStuffItArchive("The 11th Hour Installer"); + + if (archive) + SearchMan.add("The 11th Hour Installer", archive); + } + _script = new Script(this, _gameDescription->version); // Initialize the graphics @@ -160,10 +166,10 @@ Common::Error GroovieEngine::run() { // Create the music player switch (getPlatform()) { case Common::kPlatformMacintosh: - // TODO: The 11th Hour Mac uses QuickTime MIDI files - // Right now, since the XMIDI are present and it is still detected as - // the DOS version, we don't have to do anything here. - _musicPlayer = new MusicPlayerMac(this); + if (_gameDescription->version == kGroovieT7G) + _musicPlayer = new MusicPlayerMac_t7g(this); + else + _musicPlayer = new MusicPlayerMac_v2(this); break; case Common::kPlatformIOS: _musicPlayer = new MusicPlayerIOS(this); diff --git a/engines/groovie/groovie.h b/engines/groovie/groovie.h index df2f062757..79abc13b1c 100644 --- a/engines/groovie/groovie.h +++ b/engines/groovie/groovie.h @@ -72,10 +72,16 @@ enum DebugLevels { // the current limitation is 32 debug levels (1 << 31 is the last one) }; +/** + * This enum reflects the available movie speed settings: + * - Normal: play videos at a normal speed + * - Fast: play videos with audio at a fast speed. Videos without audio, + * like teeth animations, are played at their regular speed to avoid + * audio sync issues + */ enum GameSpeed { kGroovieSpeedNormal, - kGroovieSpeediOS, - kGroovieSpeedTweaked + kGroovieSpeedFast }; struct GroovieGameDescription; diff --git a/engines/groovie/module.mk b/engines/groovie/module.mk index 1e89ff66f5..b47eed912b 100644 --- a/engines/groovie/module.mk +++ b/engines/groovie/module.mk @@ -15,6 +15,7 @@ MODULE_OBJS := \ roq.o \ saveload.o \ script.o \ + stuffit.o \ vdx.o # This module can be built as a plugin diff --git a/engines/groovie/music.cpp b/engines/groovie/music.cpp index af929d439b..95637fc407 100644 --- a/engines/groovie/music.cpp +++ b/engines/groovie/music.cpp @@ -678,9 +678,9 @@ void MusicPlayerXMI::setTimbreMT(byte channel, const Timbre &timbre) { } -// MusicPlayerMac +// MusicPlayerMac_t7g -MusicPlayerMac::MusicPlayerMac(GroovieEngine *vm) : MusicPlayerMidi(vm) { +MusicPlayerMac_t7g::MusicPlayerMac_t7g(GroovieEngine *vm) : MusicPlayerMidi(vm) { // Create the parser _midiParser = MidiParser::createParser_SMF(); @@ -701,7 +701,7 @@ MusicPlayerMac::MusicPlayerMac(GroovieEngine *vm) : MusicPlayerMidi(vm) { assert(_vm->_macResFork); } -bool MusicPlayerMac::load(uint32 fileref, bool loop) { +bool MusicPlayerMac_t7g::load(uint32 fileref, bool loop) { debugC(1, kGroovieDebugMIDI | kGroovieDebugAll, "Groovie::Music: Starting the playback of song: %04X", fileref); // First try for compressed MIDI @@ -722,7 +722,7 @@ bool MusicPlayerMac::load(uint32 fileref, bool loop) { return loadParser(file, loop); } -Common::SeekableReadStream *MusicPlayerMac::decompressMidi(Common::SeekableReadStream *stream) { +Common::SeekableReadStream *MusicPlayerMac_t7g::decompressMidi(Common::SeekableReadStream *stream) { // Initialize an output buffer of the given size uint32 size = stream->readUint32BE(); byte *output = (byte *)malloc(size); @@ -768,6 +768,52 @@ Common::SeekableReadStream *MusicPlayerMac::decompressMidi(Common::SeekableReadS return new Common::MemoryReadStream(output, size, DisposeAfterUse::YES); } +// MusicPlayerMac_v2 + +MusicPlayerMac_v2::MusicPlayerMac_v2(GroovieEngine *vm) : MusicPlayerMidi(vm) { + // Create the parser + _midiParser = MidiParser::createParser_QT(); + + // Create the driver + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM); + _driver = MidiDriver::createMidi(dev); + assert(_driver); + + _driver->open(); // TODO: Handle return value != 0 (indicating an error) + + // Set the parser's driver + _midiParser->setMidiDriver(this); + + // Set the timer rate + _midiParser->setTimerRate(_driver->getBaseTempo()); +} + +bool MusicPlayerMac_v2::load(uint32 fileref, bool loop) { + debugC(1, kGroovieDebugMIDI | kGroovieDebugAll, "Groovie::Music: Starting the playback of song: %04X", fileref); + + // Find correct filename + ResInfo info; + _vm->_resMan->getResInfo(fileref, info); + uint len = info.filename.size(); + if (len < 4) + return false; // This shouldn't actually occur + + // Remove the extension and add ".mov" + info.filename.deleteLastChar(); + info.filename.deleteLastChar(); + info.filename.deleteLastChar(); + info.filename += "mov"; + + Common::SeekableReadStream *file = SearchMan.createReadStreamForMember(info.filename); + + if (!file) { + warning("Could not find file '%s'", info.filename.c_str()); + return false; + } + + return loadParser(file, loop); +} + MusicPlayerIOS::MusicPlayerIOS(GroovieEngine *vm) : MusicPlayer(vm) { vm->getTimerManager()->installTimerProc(&onTimer, 50 * 1000, this, "groovieMusic"); } diff --git a/engines/groovie/music.h b/engines/groovie/music.h index cc852aa8dc..92e9c8b487 100644 --- a/engines/groovie/music.h +++ b/engines/groovie/music.h @@ -150,9 +150,9 @@ private: void setTimbreMT(byte channel, const Timbre &timbre); }; -class MusicPlayerMac : public MusicPlayerMidi { +class MusicPlayerMac_t7g : public MusicPlayerMidi { public: - MusicPlayerMac(GroovieEngine *vm); + MusicPlayerMac_t7g(GroovieEngine *vm); protected: bool load(uint32 fileref, bool loop); @@ -161,6 +161,14 @@ private: Common::SeekableReadStream *decompressMidi(Common::SeekableReadStream *stream); }; +class MusicPlayerMac_v2 : public MusicPlayerMidi { +public: + MusicPlayerMac_v2(GroovieEngine *vm); + +protected: + bool load(uint32 fileref, bool loop); +}; + class MusicPlayerIOS : public MusicPlayer { public: MusicPlayerIOS(GroovieEngine *vm); diff --git a/engines/groovie/stuffit.cpp b/engines/groovie/stuffit.cpp new file mode 100644 index 0000000000..37f12585e7 --- /dev/null +++ b/engines/groovie/stuffit.cpp @@ -0,0 +1,537 @@ +/* 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. + * + */ + +// Based on the StuffIt code in ResidualVM +// StuffIt parsing based on http://code.google.com/p/theunarchiver/wiki/StuffItFormat +// Compression 14 based on libxad (http://sourceforge.net/projects/libxad/) + +#include "groovie/stuffit.h" + +#include "common/archive.h" +#include "common/bitstream.h" +#include "common/debug.h" +#include "common/hash-str.h" +#include "common/hashmap.h" +#include "common/memstream.h" +#include "common/substream.h" + +namespace Groovie { + +struct SIT14Data; + +class StuffItArchive : public Common::Archive { +public: + StuffItArchive(); + ~StuffItArchive(); + + bool open(const Common::String &filename); + void close(); + bool isOpen() const { return _stream != 0; } + + // Common::Archive API implementation + bool hasFile(const Common::String &name) const; + int listMembers(Common::ArchiveMemberList &list) const; + const Common::ArchiveMemberPtr getMember(const Common::String &name) const; + Common::SeekableReadStream *createReadStreamForMember(const Common::String &name) const; + +private: + struct FileEntry { + byte compression; + uint32 uncompressedSize; + uint32 compressedSize; + uint32 offset; + }; + + Common::SeekableReadStream *_stream; + + typedef Common::HashMap<Common::String, FileEntry, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> FileMap; + FileMap _map; + + // Decompression Functions + Common::SeekableReadStream *decompress14(Common::SeekableReadStream *src, uint32 uncompressedSize) const; + + // Decompression Helpers + void update14(uint16 first, uint16 last, byte *code, uint16 *freq) const; + void readTree14(Common::BitStream *bits, SIT14Data *dat, uint16 codesize, uint16 *result) const; +}; + +StuffItArchive::StuffItArchive() : Common::Archive() { + _stream = 0; +} + +StuffItArchive::~StuffItArchive() { + close(); +} + +// Some known values of StuffIt FourCC's +// 11H Mac in particular uses ST46 +static const uint32 s_magicNumbers[] = { + MKTAG('S', 'I', 'T', '!'), MKTAG('S', 'T', '6', '5'), MKTAG('S', 'T', '5', '0'), + MKTAG('S', 'T', '6', '0'), MKTAG('S', 'T', 'i', 'n'), MKTAG('S', 'T', 'i', '2'), + MKTAG('S', 'T', 'i', '3'), MKTAG('S', 'T', 'i', '4'), MKTAG('S', 'T', '4', '6') +}; + +bool StuffItArchive::open(const Common::String &filename) { + close(); + + _stream = SearchMan.createReadStreamForMember(filename); + + if (!_stream) + return false; + + uint32 tag = _stream->readUint32BE(); + + // Check all the possible FourCC's + bool found = false; + for (int i = 0; i < ARRAYSIZE(s_magicNumbers); i++) { + if (tag == s_magicNumbers[i]) { + found = true; + break; + } + } + + // Didn't find one, let's bail out + if (!found) { + close(); + return false; + } + + /* uint16 fileCount = */ _stream->readUint16BE(); + /* uint32 archiveSize = */ _stream->readUint32BE(); + + // Some sort of second magic number + if (_stream->readUint32BE() != MKTAG('r', 'L', 'a', 'u')) { + close(); + return false; + } + + /* byte version = */ _stream->readByte(); // meaning not clear + + _stream->skip(7); // unknown + + while (_stream->pos() < _stream->size() && !_stream->eos()) { + byte resForkCompression = _stream->readByte(); + byte dataForkCompression = _stream->readByte(); + + byte fileNameLength = _stream->readByte(); + Common::String name; + + for (byte i = 0; i < fileNameLength; i++) + name += (char)_stream->readByte(); + + // Skip remaining bytes + _stream->skip(63 - fileNameLength); + + /* uint32 fileType = */ _stream->readUint32BE(); + /* uint32 fileCreator = */ _stream->readUint32BE(); + /* uint16 finderFlags = */ _stream->readUint16BE(); + /* uint32 creationDate = */ _stream->readUint32BE(); + /* uint32 modificationDate = */ _stream->readUint32BE(); + uint32 resForkUncompressedSize = _stream->readUint32BE(); + uint32 dataForkUncompressedSize = _stream->readUint32BE(); + uint32 resForkCompressedSize = _stream->readUint32BE(); + uint32 dataForkCompressedSize = _stream->readUint32BE(); + /* uint16 resForkCRC = */ _stream->readUint16BE(); + /* uint16 dataForkCRC = */ _stream->readUint16BE(); + _stream->skip(6); // unknown + /* uint16 headerCRC = */ _stream->readUint16BE(); + + // Ignore directories for now + if (dataForkCompression == 32 || dataForkCompression == 33) + continue; + + if (dataForkUncompressedSize != 0) { + // We have a data fork + + FileEntry entry; + entry.compression = dataForkCompression; + entry.uncompressedSize = dataForkUncompressedSize; + entry.compressedSize = dataForkCompressedSize; + entry.offset = _stream->pos() + resForkCompressedSize; + _map[name] = entry; + + debug(0, "StuffIt file '%s', Compression = %d", name.c_str(), entry.compression); + } + + if (resForkUncompressedSize != 0) { + // We have a resource fork + + // Add a .rsrc extension so we know it's the resource fork + name += ".rsrc"; + + FileEntry entry; + entry.compression = resForkCompression; + entry.uncompressedSize = resForkUncompressedSize; + entry.compressedSize = resForkCompressedSize; + entry.offset = _stream->pos(); + _map[name] = entry; + + debug(0, "StuffIt file '%s', Compression = %d", name.c_str(), entry.compression); + } + + // Go to the next entry + _stream->skip(dataForkCompressedSize + resForkCompressedSize); + } + + return true; +} + +void StuffItArchive::close() { + delete _stream; _stream = 0; + _map.clear(); +} + +bool StuffItArchive::hasFile(const Common::String &name) const { + return _map.contains(name); +} + +int StuffItArchive::listMembers(Common::ArchiveMemberList &list) const { + for (FileMap::const_iterator it = _map.begin(); it != _map.end(); it++) + list.push_back(getMember(it->_key)); + + return _map.size(); +} + +const Common::ArchiveMemberPtr StuffItArchive::getMember(const Common::String &name) const { + return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this)); +} + +Common::SeekableReadStream *StuffItArchive::createReadStreamForMember(const Common::String &name) const { + if (!_stream || !_map.contains(name)) + return 0; + + const FileEntry &entry = _map[name]; + + if (entry.compression & 0xF0) + error("Unhandled StuffIt encryption"); + + Common::SeekableSubReadStream subStream(_stream, entry.offset, entry.offset + entry.compressedSize); + + // We currently only support type 14 compression + switch (entry.compression) { + case 0: // Uncompressed + return subStream.readStream(subStream.size()); + case 14: // Installer + return decompress14(&subStream, entry.uncompressedSize); + default: + error("Unhandled StuffIt compression %d", entry.compression); + } + + return 0; +} + +void StuffItArchive::update14(uint16 first, uint16 last, byte *code, uint16 *freq) const { + uint16 i, j; + + while (last - first > 1) { + i = first; + j = last; + + do { + while (++i < last && code[first] > code[i]) + ; + + while (--j > first && code[first] < code[j]) + ; + + if (j > i) { + SWAP(code[i], code[j]); + SWAP(freq[i], freq[j]); + } + } while (j > i); + + if (first != j) { + SWAP(code[first], code[j]); + SWAP(freq[first], freq[j]); + + i = j + 1; + + if (last - i <= j - first) { + update14(i, last, code, freq); + last = j; + } else { + update14(first, j, code, freq); + first = i; + } + } else { + ++first; + } + } +} + +struct SIT14Data { + byte code[308]; + byte codecopy[308]; + uint16 freq[308]; + uint32 buff[308]; + + byte var1[52]; + uint16 var2[52]; + uint16 var3[75 * 2]; + + byte var4[76]; + uint32 var5[75]; + byte var6[1024]; + uint16 var7[308 * 2]; + byte var8[0x4000]; + + byte window[0x40000]; +}; + +// Realign to a byte boundary +#define ALIGN_BITS(b) \ + if (b->pos() & 7) \ + b->skip(8 - (b->pos() & 7)) + +void StuffItArchive::readTree14(Common::BitStream *bits, SIT14Data *dat, uint16 codesize, uint16 *result) const { + uint32 i, l, n; + uint32 k = bits->getBit(); + uint32 j = bits->getBits(2) + 2; + uint32 o = bits->getBits(3) + 1; + uint32 size = 1 << j; + uint32 m = size - 1; + k = k ? (m - 1) : 0xFFFFFFFF; + + if (bits->getBits(2) & 1) { // skip 1 bit! + // requirements for this call: dat->buff[32], dat->code[32], dat->freq[32*2] + readTree14(bits, dat, size, dat->freq); + + for (i = 0; i < codesize; ) { + l = 0; + + do { + l = dat->freq[l + bits->getBit()]; + n = size << 1; + } while (n > l); + + l -= n; + + if (k != l) { + if (l == m) { + l = 0; + + do { + l = dat->freq[l + bits->getBit()]; + n = size << 1; + } while (n > l); + + l += 3 - n; + + while (l--) { + dat->code[i] = dat->code[i - 1]; + ++i; + } + } else { + dat->code[i++] = l + o; + } + } else { + dat->code[i++] = 0; + } + } + } else { + for (i = 0; i < codesize; ) { + l = bits->getBits(j); + + if (k != l) { + if (l == m) { + l = bits->getBits(j) + 3; + + while (l--) { + dat->code[i] = dat->code[i - 1]; + ++i; + } + } else { + dat->code[i++] = l+o; + } + } else { + dat->code[i++] = 0; + } + } + } + + for (i = 0; i < codesize; ++i) { + dat->codecopy[i] = dat->code[i]; + dat->freq[i] = i; + } + + update14(0, codesize, dat->codecopy, dat->freq); + + for (i = 0; i < codesize && !dat->codecopy[i]; ++i) + ; // find first nonempty + + for (j = 0; i < codesize; ++i, ++j) { + if (i) + j <<= (dat->codecopy[i] - dat->codecopy[i - 1]); + + k = dat->codecopy[i]; m = 0; + + for (l = j; k--; l >>= 1) + m = (m << 1) | (l & 1); + + dat->buff[dat->freq[i]] = m; + } + + for (i = 0; i < (uint32)codesize * 2; ++i) + result[i] = 0; + + j = 2; + + for (i = 0; i < codesize; ++i) { + l = 0; + m = dat->buff[i]; + + for (k = 0; k < dat->code[i]; ++k) { + l += (m & 1); + + if (dat->code[i] - 1 <= (int32)k) { + result[l] = codesize * 2 + i; + } else { + if (!result[l]) { + result[l] = j; + j += 2; + } + + l = result[l]; + } + + m >>= 1; + } + } + + ALIGN_BITS(bits); +} + +#define OUTPUT_VAL(x) \ + out.writeByte(x); \ + dat->window[j++] = x; \ + j &= 0x3FFFF + +Common::SeekableReadStream *StuffItArchive::decompress14(Common::SeekableReadStream *src, uint32 uncompressedSize) const { + byte *dst = (byte *)malloc(uncompressedSize); + Common::MemoryWriteStream out(dst, uncompressedSize); + + Common::BitStream *bits = new Common::BitStream8LSB(src); + + uint32 i, j, k, l, m, n; + + SIT14Data *dat = new SIT14Data(); + + // initialization + for (i = k = 0; i < 52; ++i) { + dat->var2[i] = k; + k += (1 << (dat->var1[i] = ((i >= 4) ? ((i - 4) >> 2) : 0))); + } + + for (i = 0; i < 4; ++i) + dat->var8[i] = i; + + for (m = 1, l = 4; i < 0x4000; m <<= 1) // i is 4 + for (n = l+4; l < n; ++l) + for (j = 0; j < m; ++j) + dat->var8[i++] = l; + + for (i = 0, k = 1; i < 75; ++i) { + dat->var5[i] = k; + k += (1 << (dat->var4[i] = (i >= 3 ? ((i - 3) >> 2) : 0))); + } + + for (i = 0; i < 4; ++i) + dat->var6[i] = i - 1; + + for (m = 1, l = 3; i < 0x400; m <<= 1) // i is 4 + for (n = l + 4; l < n; ++l) + for (j = 0; j < m; ++j) + dat->var6[i++] = l; + + m = bits->getBits(16); // number of blocks + j = 0; // window position + + while (m-- && !bits->eos()) { + bits->getBits(16); // skip crunched block size + bits->getBits(16); + n = bits->getBits(16); // number of uncrunched bytes + n |= bits->getBits(16) << 16; + readTree14(bits, dat, 308, dat->var7); + readTree14(bits, dat, 75, dat->var3); + + while (n && !bits->eos()) { + for (i = 0; i < 616;) + i = dat->var7[i + bits->getBit()]; + + i -= 616; + + if (i < 0x100) { + OUTPUT_VAL(i); + --n; + } else { + i -= 0x100; + k = dat->var2[i]+4; + i = dat->var1[i]; + + if (i) + k += bits->getBits(i); + + for (i = 0; i < 150;) + i = dat->var3[i + bits->getBit()]; + + i -= 150; + l = dat->var5[i]; + i = dat->var4[i]; + + if (i) + l += bits->getBits(i); + + n -= k; + l = j + 0x40000 - l; + + while (k--) { + l &= 0x3FFFF; + OUTPUT_VAL(dat->window[l]); + l++; + } + } + } + + ALIGN_BITS(bits); + } + + delete dat; + delete bits; + + return new Common::MemoryReadStream(dst, uncompressedSize, DisposeAfterUse::YES); +} + +#undef OUTPUT_VAL +#undef ALIGN_BITS + +Common::Archive *createStuffItArchive(const Common::String &fileName) { + StuffItArchive *archive = new StuffItArchive(); + + if (!archive->open(fileName)) { + delete archive; + return 0; + } + + return archive; +} + +} // End of namespace Groovie diff --git a/engines/groovie/stuffit.h b/engines/groovie/stuffit.h new file mode 100644 index 0000000000..44f593dbea --- /dev/null +++ b/engines/groovie/stuffit.h @@ -0,0 +1,43 @@ +/* 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. + * + */ + +#ifndef GROOVIE_STUFFIT_H +#define GROOVIE_STUFFIT_H + +namespace Common { +class Archive; +class String; +} + +namespace Groovie { + +/** + * This factory method creates an Archive instance corresponding to the content + * of the StuffIt compressed file. + * + * May return 0 in case of a failure. + */ +Common::Archive *createStuffItArchive(const Common::String &fileName); + +} // End of namespace Groovie + +#endif diff --git a/engines/groovie/vdx.cpp b/engines/groovie/vdx.cpp index b3fcf462b2..8786e75488 100644 --- a/engines/groovie/vdx.cpp +++ b/engines/groovie/vdx.cpp @@ -88,7 +88,7 @@ uint16 VDXPlayer::loadInternal() { // Enable highspeed if we're not obeying fps, and not marked as special // This will be disabled in chunk audio if we're actually an audio vdx - if ( _vm->_modeSpeed == kGroovieSpeediOS || (_vm->_modeSpeed == kGroovieSpeedTweaked && ((_flags & (1 << 15)) == 0))) + if (_vm->_modeSpeed == kGroovieSpeedFast && ((_flags & (1 << 15)) == 0)) setOverrideSpeed(true); if (_flagOnePrev && !_flagOne && !_flagEight) { diff --git a/engines/hugo/parser.cpp b/engines/hugo/parser.cpp index 5fdb2026a7..2585c64fd8 100644 --- a/engines/hugo/parser.cpp +++ b/engines/hugo/parser.cpp @@ -235,7 +235,7 @@ void Parser::charHandler() { if (_cmdLineIndex >= kMaxLineSize) { //MessageBeep(MB_ICONASTERISK); warning("STUB: MessageBeep() - Command line too long"); - } else if (isprint(static_cast<unsigned char>(c))) { + } else if (Common::isPrint(c)) { _cmdLine[_cmdLineIndex++] = c; _cmdLine[_cmdLineIndex] = '\0'; } diff --git a/engines/kyra/chargen.cpp b/engines/kyra/chargen.cpp index 54e1abcc2c..80a95da047 100644 --- a/engines/kyra/chargen.cpp +++ b/engines/kyra/chargen.cpp @@ -193,7 +193,7 @@ bool CharacterGenerator::start(EoBCharacter *characters, uint8 ***faceShapes) { } if (inputFlag & 0x8000) { - inputFlag = (inputFlag & 0x0f) - 1; + inputFlag = (inputFlag & 0x0F) - 1; if (inputFlag == 4) { loop = false; } else { @@ -402,7 +402,7 @@ int CharacterGenerator::viewDeleteCharacter() { } if (inputFlag & 0x8000) { - inputFlag = (inputFlag & 0x0f) - 1; + inputFlag = (inputFlag & 0x0F) - 1; if (inputFlag == 4) { res = 1; loop = false; @@ -524,7 +524,7 @@ int CharacterGenerator::classMenu(int raceSex) { while (res == -1 && !_vm->shouldQuit()) { updateMagicShapes(); - int in = getInput(0) & 0xff; + int in = getInput(0) & 0xFF; Common::Point mp = _vm->getMousePos(); if (in == _vm->_keyMap[Common::KEYCODE_ESCAPE] || _vm->_gui->_menuLastInFlags == _vm->_keyMap[Common::KEYCODE_ESCAPE] || _vm->_gui->_menuLastInFlags == _vm->_keyMap[Common::KEYCODE_b]) { @@ -572,7 +572,7 @@ int CharacterGenerator::alignmentMenu(int cClass) { while (res == -1 && !_vm->shouldQuit()) { updateMagicShapes(); - int in = getInput(0) & 0xff; + int in = getInput(0) & 0xFF; Common::Point mp = _vm->getMousePos(); if (in == _vm->_keyMap[Common::KEYCODE_ESCAPE] || _vm->_gui->_menuLastInFlags == _vm->_keyMap[Common::KEYCODE_ESCAPE] || _vm->_gui->_menuLastInFlags == _vm->_keyMap[Common::KEYCODE_b]) { @@ -658,14 +658,14 @@ void CharacterGenerator::generateStats(int index) { sv[i] = _chargenMaxStats[i]; } - c->strengthCur = c->strengthMax = sv[0] & 0xff; + c->strengthCur = c->strengthMax = sv[0] & 0xFF; c->strengthExtCur = c->strengthExtMax = sv[0] >> 8; - c->intelligenceCur = c->intelligenceMax = sv[1] & 0xff; - c->wisdomCur = c->wisdomMax = sv[2] & 0xff; - c->dexterityCur = c->dexterityMax = sv[3] & 0xff; - c->constitutionCur = c->constitutionMax = sv[4] & 0xff; - c->charismaCur = c->charismaMax = sv[5] & 0xff; - c->armorClass = 10 + _vm->getDexterityArmorClassModifier(sv[3] & 0xff); + c->intelligenceCur = c->intelligenceMax = sv[1] & 0xFF; + c->wisdomCur = c->wisdomMax = sv[2] & 0xFF; + c->dexterityCur = c->dexterityMax = sv[3] & 0xFF; + c->constitutionCur = c->constitutionMax = sv[4] & 0xFF; + c->charismaCur = c->charismaMax = sv[5] & 0xFF; + c->armorClass = 10 + _vm->getDexterityArmorClassModifier(sv[3] & 0xFF); c->hitPointsCur = 0; for (int l = 0; l < 3; l++) { @@ -817,7 +817,7 @@ void CharacterGenerator::faceSelectMenu() { } else if (in == _vm->_keyMap[Common::KEYCODE_RETURN] || in == _vm->_keyMap[Common::KEYCODE_KP5]) { in = 3; } else if (in & 0x8000) { - in &= 0xff; + in &= 0xFF; } else { in = 0; } @@ -1017,7 +1017,7 @@ int CharacterGenerator::modifyStat(int index, int8 *stat1, int8 *stat2) { ci = -2; } else if (inputFlag & 0x8000) { - inputFlag = (inputFlag & 0x0f) - 1; + inputFlag = (inputFlag & 0x0F) - 1; if (index != inputFlag) { ci = inputFlag; loop = false; @@ -1037,7 +1037,7 @@ int CharacterGenerator::modifyStat(int index, int8 *stat1, int8 *stat2) { v2--; } - v1 = CLIP<uint8>(v1, _chargenMinStats[index], _chargenMaxStats[index] & 0xff); + v1 = CLIP<uint8>(v1, _chargenMinStats[index], _chargenMaxStats[index] & 0xFF); v2 = (v1 == 18 && _chargenMaxStats[index] >= 19) ? CLIP<uint8>(v2, 0, 100) : 0; if (s2) *s2 = v2; @@ -1206,7 +1206,7 @@ void CharacterGenerator::finish() { static const int8 itemList1[] = { 1, 2, 0, 17, -1, 0, 0 }; static const int8 itemList2[] = { 2, 56, 1, 17, 31, 0, 1, 23, 1, 17, 31, 0, 1 }; static const int8 itemList3[] = { 2, 1, 1, 17, 31, 1, 1, 1, 0, 17, 31, 2, 1 }; - static const int8 *itemList[] = { itemList0, itemList1, itemList2, itemList3 }; + static const int8 *const itemList[] = { itemList0, itemList1, itemList2, itemList3 }; for (int i = 0; i < 4; i++) { EoBCharacter *c = &_characters[i]; @@ -1496,7 +1496,7 @@ TransferPartyWiz::~TransferPartyWiz() { } bool TransferPartyWiz::start() { - _screen->copyPage(0, _vm->_useHiResDithering ? 1 : 12); + _screen->copyPage(0, 12); if (!selectAndLoadTransferFile()) return false; @@ -1536,7 +1536,7 @@ bool TransferPartyWiz::start() { bool TransferPartyWiz::selectAndLoadTransferFile() { do { - _screen->copyPage(_vm->_useHiResDithering ? 1 : 12, 0); + _screen->copyPage(12, 0); if (transferFileDialogue(_vm->_savegameFilename)) break; } while (_vm->_gui->confirmDialogue2(15, 68, 1)); @@ -1566,7 +1566,7 @@ bool TransferPartyWiz::selectAndLoadTransferFile() { return false; Common::String target = _vm->_gui->transferTargetMenu(eobTargets); - _screen->copyPage(_vm->_useHiResDithering ? 1 : 12, 0); + _screen->copyPage(12, 0); if (target.empty()) return true; @@ -1579,10 +1579,10 @@ bool TransferPartyWiz::selectAndLoadTransferFile() { return true; } - _screen->copyPage(_vm->_useHiResDithering ? 1 : 12, 0); + _screen->copyPage(12, 0); bool result = _vm->_gui->transferFileMenu(target, dest); - _screen->copyPage(_vm->_useHiResDithering ? 1 : 12, 0); + _screen->copyPage(12, 0); return result; } @@ -1614,7 +1614,7 @@ int TransferPartyWiz::selectCharactersMenu() { bool update = false; for (bool loop = true; loop && (!_vm->shouldQuit());) { - int inputFlag = _vm->checkInput(0, false, 0) & 0x8ff; + int inputFlag = _vm->checkInput(0, false, 0) & 0x8FF; _vm->removeInputTop(); if (inputFlag) { @@ -1827,7 +1827,7 @@ Item TransferPartyWiz::convertItem(Item eob1Item) { itm2->flags = itm1->flags | 0x40; itm2->icon = itm1->icon; itm2->type = itm1->type; - itm2->level = 0xff; + itm2->level = 0xFF; switch (itm2->type) { case 35: @@ -1850,7 +1850,7 @@ Item TransferPartyWiz::convertItem(Item eob1Item) { return 0; } itm2->value = itm1->value; - itm2->flags = ((itm1->flags & 0x3f) + 3) | 0x40; + itm2->flags = ((itm1->flags & 0x3F) + 3) | 0x40; break; case 18: itm2->icon = 19; @@ -1860,7 +1860,7 @@ Item TransferPartyWiz::convertItem(Item eob1Item) { break; } - switch ((_vm->_itemTypes[itm2->type].extraProperties & 0x7f) - 1) { + switch ((_vm->_itemTypes[itm2->type].extraProperties & 0x7F) - 1) { case 0: case 1: case 2: diff --git a/engines/kyra/darkmoon.cpp b/engines/kyra/darkmoon.cpp index 16bd3dad58..130fb10df3 100644 --- a/engines/kyra/darkmoon.cpp +++ b/engines/kyra/darkmoon.cpp @@ -136,7 +136,7 @@ void DarkMoonEngine::updateUsedCharacterHandItem(int charIndex, int slot) { if (itm->type == 48 || itm->type == 62) { if (itm->value == 5) return; - int charges = itm->flags & 0x3f; + int charges = itm->flags & 0x3F; if (--charges) --itm->flags; else @@ -158,10 +158,7 @@ void DarkMoonEngine::generateMonsterPalettes(const char *file, int16 monsterInde int colx = 302 + 3 * i; for (int ii = 0; ii < 16; ii++) { - // Don't use getPagePixel() here, since in EGA mode it will try to - // undither the pixel (although the shape bitmap is undithered already) - uint8 col = _screen->getCPagePtr(_screen->_curPage | 1)[(184 + ii) * Screen::SCREEN_W + colx]; - + uint8 col = _screen->getPagePixel(_screen->_curPage, colx, 184 + ii); int iii = 0; for (; iii < 16; iii++) { if (tmpPal[iii] == col) { @@ -178,9 +175,7 @@ void DarkMoonEngine::generateMonsterPalettes(const char *file, int16 monsterInde memcpy(tmpPal, _monsterShapes[dci] + 4, 16); for (int iii = 0; iii < 16; iii++) { - // Don't use getPagePixel() here, since in EGA mode it will try to - // undither the pixel (although the shape bitmap is undithered already) - uint8 col = _screen->getCPagePtr(_screen->_curPage | 1)[(184 + iii) * Screen::SCREEN_W + colx + ii]; + uint8 col = _screen->getPagePixel(_screen->_curPage, colx + ii, 184 + iii); if (newPal[iii]) tmpPal[newPal[iii]] = col; } @@ -455,7 +450,7 @@ void DarkMoonEngine::characterLevelGain(int charIndex) { int s = _numLevelsPerClass[c->cClass]; for (int i = 0; i < s; i++) { uint32 er = getRequiredExperience(c->cClass, i, c->level[i] + 1); - if (er == 0xffffffff) + if (er == 0xFFFFFFFF) continue; increaseCharacterExperience(charIndex, er - c->experience[i] + 1); diff --git a/engines/kyra/darkmoon.h b/engines/kyra/darkmoon.h index f6e7b3ed2c..f0057ddd66 100644 --- a/engines/kyra/darkmoon.h +++ b/engines/kyra/darkmoon.h @@ -72,21 +72,21 @@ private: void seq_playFinale(); void seq_playCredits(DarkmoonSequenceHelper *sq, const uint8 *data, int sd, int backupPage, int tempPage, int speed); - const char * const *_introStrings; - const char * const *_cpsFilesIntro; + const char *const *_introStrings; + const char *const *_cpsFilesIntro; const DarkMoonAnimCommand **_animIntro; const DarkMoonShapeDef **_shapesIntro; - const char * const *_finaleStrings; + const char *const *_finaleStrings; const uint8 *_creditsData; - const char * const *_cpsFilesFinale; + const char *const *_cpsFilesFinale; const DarkMoonAnimCommand **_animFinale; const DarkMoonShapeDef **_shapesFinale; - static const char *_palFilesIntroVGA[]; - static const char *_palFilesIntroEGA[]; - static const char *_palFilesFinaleVGA[]; - static const char *_palFilesFinaleEGA[]; + static const char *const _palFilesIntroVGA[]; + static const char *const _palFilesIntroEGA[]; + static const char *const _palFilesFinaleVGA[]; + static const char *const _palFilesFinaleEGA[]; // Ingame sequence void seq_nightmare(); @@ -140,7 +140,7 @@ private: static const uint8 _egaDefaultPalette[]; }; -} // End of namespace Kyra +} // End of namespace Kyra #endif diff --git a/engines/kyra/detection.cpp b/engines/kyra/detection.cpp index e422f3ea19..95c4accd29 100644 --- a/engines/kyra/detection.cpp +++ b/engines/kyra/detection.cpp @@ -298,7 +298,7 @@ SaveStateDescriptor KyraMetaEngine::querySaveMetaInfos(const char *target, int s if (in) { Kyra::KyraEngine_v1::SaveHeader header; - Kyra::KyraEngine_v1::kReadSaveHeaderError error; + Kyra::KyraEngine_v1::ReadSaveHeaderError error; error = Kyra::KyraEngine_v1::readSaveHeader(in, true, header); delete in; diff --git a/engines/kyra/detection_tables.h b/engines/kyra/detection_tables.h index e2162f20e2..d948f7d12d 100644 --- a/engines/kyra/detection_tables.h +++ b/engines/kyra/detection_tables.h @@ -53,7 +53,8 @@ namespace { #define LOL_FLOPPY_FLAGS FLAGS(false, false, false, false, false, false, false, false, Kyra::GI_LOL) #define LOL_FLOPPY_FAN_FLAGS(x, y) FLAGS_FAN(x, y, false, false, false, false, false, false, false, false, Kyra::GI_LOL) #define LOL_FLOPPY_CMP_FLAGS FLAGS(false, false, false, false, false, false, false, true, Kyra::GI_LOL) -#define LOL_PC98_SJIS_FLAGS FLAGS(false, false, false, false, true, true, false, false, Kyra::GI_LOL) +#define LOL_PC9801_FLAGS FLAGS(false, false, false, false, true, true, false, false, Kyra::GI_LOL) +#define LOL_FMTOWNS_FLAGS FLAGS(false, false, false, false, true, false, false, false, Kyra::GI_LOL) #define LOL_DEMO_FLAGS FLAGS(true, true, false, false, false, false, false, false, Kyra::GI_LOL) #define LOL_KYRA2_DEMO_FLAGS FLAGS(true, false, false, false, false, false, false, false, Kyra::GI_KYRA2) @@ -1462,7 +1463,24 @@ const KYRAGameDescription adGameDescs[] = { ADGF_NO_FLAGS, GUIO5(GUIO_NOSPEECH, GUIO_MIDIPC98, GUIO_RENDERPC9801, GAMEOPTION_LOL_SCROLLING, GAMEOPTION_LOL_CURSORS) }, - LOL_PC98_SJIS_FLAGS + LOL_PC9801_FLAGS + }, + + { + { + "lol", + 0, + { + { "GENERAL.PAK", 0, "2e4d4ce54bac9162e11fcba6907b576e", -1 }, + { "TMUS.PAK", 0, "5543dae575164e51856f5a49cfd6b368", -1 }, + { 0, 0, 0, 0 } + }, + Common::JA_JPN, + Common::kPlatformFMTowns, + ADGF_NO_FLAGS, + GUIO5(GUIO_NOSPEECH, GUIO_MIDITOWNS, GUIO_RENDERFMTOWNS, GAMEOPTION_LOL_SCROLLING, GAMEOPTION_LOL_CURSORS) + }, + LOL_FMTOWNS_FLAGS }, { @@ -1495,7 +1513,7 @@ const KYRAGameDescription adGameDescs[] = { ADGF_DEMO, GUIO5(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK, GUIO_RENDERVGA) }, - LOL_KYRA2_DEMO_FLAGS + LOL_DEMO_FLAGS }, #endif // ENABLE_LOL #ifdef ENABLE_EOB diff --git a/engines/kyra/eob.cpp b/engines/kyra/eob.cpp index a7bde9f1ee..4e1707b1ac 100644 --- a/engines/kyra/eob.cpp +++ b/engines/kyra/eob.cpp @@ -316,7 +316,7 @@ void EoBEngine::runNpcDialogue(int npcIndex) { void EoBEngine::updateUsedCharacterHandItem(int charIndex, int slot) { EoBItem *itm = &_items[_characters[charIndex].inventory[slot]]; if (itm->type == 48) { - int charges = itm->flags & 0x3f; + int charges = itm->flags & 0x3F; if (--charges) --itm->flags; else @@ -359,7 +359,7 @@ void EoBEngine::loadDoorShapes(int doorType1, int shapeId1, int doorType2, int s _screen->loadShapeSetBitmap("DOOR", 5, 3); _screen->_curPage = 2; - if (doorType1 != 0xff) { + if (doorType1 != 0xFF) { for (int i = 0; i < 3; i++) { const uint8 *enc = &_doorShapeEncodeDefs[(doorType1 * 3 + i) << 2]; _doorShapes[shapeId1 + i] = _screen->encodeShape(enc[0], enc[1], enc[2], enc[3], false, (_flags.gameID == GI_EOB1) ? _cgaMappingLevel[_cgaLevelMappingIndex[_currentLevel - 1]] : 0); @@ -370,7 +370,7 @@ void EoBEngine::loadDoorShapes(int doorType1, int shapeId1, int doorType2, int s } } - if (doorType2 != 0xff) { + if (doorType2 != 0xFF) { for (int i = 0; i < 3; i++) { const uint8 *enc = &_doorShapeEncodeDefs[(doorType2 * 3 + i) << 2]; _doorShapes[shapeId2 + i] = _screen->encodeShape(enc[0], enc[1], enc[2], enc[3], false, (_flags.gameID == GI_EOB1) ? _cgaMappingLevel[_cgaLevelMappingIndex[_currentLevel - 1]] : 0); @@ -460,7 +460,7 @@ void EoBEngine::turnUndeadAuto() { int oc = _openBookChar; for (int i = 0; i < 6; i++) { - if (!testCharacter(i, 0x0d)) + if (!testCharacter(i, 0x0D)) continue; EoBCharacter *c = &_characters[i]; @@ -505,7 +505,7 @@ bool EoBEngine::checkPartyStatusExtra() { _txt->printMessage(_menuStringsDefeat[0]); while (!shouldQuit()) { removeInputTop(); - if (checkInput(0, false, 0) & 0xff) + if (checkInput(0, false, 0) & 0xFF) break; } _screen->copyPage(10, 0); diff --git a/engines/kyra/eob.h b/engines/kyra/eob.h index 37ce483702..bf5440b942 100644 --- a/engines/kyra/eob.h +++ b/engines/kyra/eob.h @@ -99,7 +99,7 @@ private: void turnUndeadAuto(); void turnUndeadAutoHit(); - const char * const *_turnUndeadString; + const char *const *_turnUndeadString; // Misc bool checkPartyStatusExtra(); @@ -113,8 +113,7 @@ private: static const uint8 _egaDefaultPalette[]; }; - -} // End of namespace Kyra +} // End of namespace Kyra #endif diff --git a/engines/kyra/eobcommon.cpp b/engines/kyra/eobcommon.cpp index fadb1066e0..d477209e5b 100644 --- a/engines/kyra/eobcommon.cpp +++ b/engines/kyra/eobcommon.cpp @@ -57,7 +57,7 @@ EoBCoreEngine::EoBCoreEngine(OSystem *system, const GameFlags &flags) _configMouse = true; _loading = false; - _useHiResDithering = false; + _enableHiResDithering = false; _envAudioTimer = 0; _flashShapeTimer = 0; @@ -364,14 +364,14 @@ void EoBCoreEngine::initKeymap() { } Common::Error EoBCoreEngine::init() { - // In EOB the timer proc is directly invoked via interrupt 0x1c, 18.2 times per second. + // In EOB the timer proc is directly invoked via interrupt 0x1C, 18.2 times per second. // This makes a tick length of 54.94. _tickLength = 55; if (ConfMan.hasKey("render_mode")) _configRenderMode = Common::parseRenderMode(ConfMan.get("render_mode")); - _useHiResDithering = (_configRenderMode == Common::kRenderEGA && _flags.useHiRes); + _enableHiResDithering = (_configRenderMode == Common::kRenderEGA && _flags.useHiRes); _screen = new Screen_EoB(this, _system); assert(_screen); @@ -417,12 +417,6 @@ Common::Error EoBCoreEngine::init() { _screen->loadFont(Screen::FID_6_FNT, "FONT6.FNT"); _screen->loadFont(Screen::FID_8_FNT, "FONT8.FNT"); - if (_useHiResDithering) { - _vcnBlockWidth <<= 1; - _vcnBlockHeight <<= 1; - SWAP(_vcnFlip0, _vcnFlip1); - } - Common::Error err = KyraRpgEngine::init(); if (err.getCode() != Common::kNoError) return err; @@ -494,8 +488,8 @@ Common::Error EoBCoreEngine::init() { _monsterFlashOverlay = new uint8[16]; _monsterStoneOverlay = new uint8[16]; - memset(_monsterFlashOverlay, (_configRenderMode == Common::kRenderCGA) ? 0xff : 0x0f, 16 * sizeof(uint8)); - memset(_monsterStoneOverlay, 0x0d, 16 * sizeof(uint8)); + memset(_monsterFlashOverlay, (_configRenderMode == Common::kRenderCGA) ? 0xFF : 0x0F, 16 * sizeof(uint8)); + memset(_monsterStoneOverlay, 0x0D, 16 * sizeof(uint8)); _monsterFlashOverlay[0] = _monsterStoneOverlay[0] = 0; // Prevent autosave on game startup @@ -991,7 +985,7 @@ void EoBCoreEngine::recalcArmorClass(int index) { int tp = _items[itm].type; - if (!(_itemTypes[tp].allowedClasses & _classModifierFlags[c->cClass]) || (_itemTypes[tp].extraProperties & 0x7f) || (i >= 1 && i <= 2 && tp != 27 && !(_flags.gameID == GI_EOB2 && tp == 57))) + if (!(_itemTypes[tp].allowedClasses & _classModifierFlags[c->cClass]) || (_itemTypes[tp].extraProperties & 0x7F) || (i >= 1 && i <= 2 && tp != 27 && !(_flags.gameID == GI_EOB2 && tp == 57))) continue; c->armorClass += _itemTypes[tp].armorClass; @@ -1003,12 +997,12 @@ void EoBCoreEngine::recalcArmorClass(int index) { int8 m2 = 0; if (c->inventory[25]) { - if (!(_itemTypes[_items[c->inventory[25]].type].extraProperties & 0x7f)) + if (!(_itemTypes[_items[c->inventory[25]].type].extraProperties & 0x7F)) m1 = _items[c->inventory[25]].value; } if (c->inventory[26]) { - if (!(_itemTypes[_items[c->inventory[26]].type].extraProperties & 0x7f)) + if (!(_itemTypes[_items[c->inventory[26]].type].extraProperties & 0x7F)) m2 = _items[c->inventory[26]].value; } @@ -1060,7 +1054,7 @@ int EoBCoreEngine::validateWeaponSlotItem(int index, int slot) { if (!itm2) return 1; - int f = (_itemTypes[tp2].extraProperties & 0x7f); + int f = (_itemTypes[tp2].extraProperties & 0x7F); if (f <= 0 || f > 3) return r; @@ -1275,12 +1269,12 @@ void EoBCoreEngine::removeCharacterFromParty(int charIndex) { if (i == 16 || !c->inventory[i]) continue; - setItemPosition((Item *)&_levelBlockProperties[_currentBlock & 0x3ff].drawObjects, _currentBlock, c->inventory[i], _dropItemDirIndex[(_currentDirection << 2) + rollDice(1, 2, -1)]); + setItemPosition((Item *)&_levelBlockProperties[_currentBlock & 0x3FF].drawObjects, _currentBlock, c->inventory[i], _dropItemDirIndex[(_currentDirection << 2) + rollDice(1, 2, -1)]); c->inventory[i] = 0; } while (c->inventory[16]) - setItemPosition((Item *)&_levelBlockProperties[_currentBlock & 0x3ff].drawObjects, _currentBlock, getQueuedItem(&c->inventory[16], 0, -1), _dropItemDirIndex[(_currentDirection << 2) + rollDice(1, 2, -1)]); + setItemPosition((Item *)&_levelBlockProperties[_currentBlock & 0x3FF].drawObjects, _currentBlock, getQueuedItem(&c->inventory[16], 0, -1), _dropItemDirIndex[(_currentDirection << 2) + rollDice(1, 2, -1)]); c->inventory[16] = 0; @@ -1326,7 +1320,7 @@ void EoBCoreEngine::increaseCharacterExperience(int charIndex, int32 points) { _characters[charIndex].experience[i] += points; uint32 er = getRequiredExperience(cl, i, _characters[charIndex].level[i] + 1); - if (er == 0xffffffff) + if (er == 0xFFFFFFFF) continue; if (_characters[charIndex].experience[i] >= er) @@ -1337,7 +1331,7 @@ void EoBCoreEngine::increaseCharacterExperience(int charIndex, int32 points) { uint32 EoBCoreEngine::getRequiredExperience(int cClass, int levelIndex, int level) { cClass = getCharacterClassType(cClass, levelIndex); if (cClass == -1) - return 0xffffffff; + return 0xFFFFFFFF; const uint32 *tbl = _expRequirementTables[cClass]; return tbl[level - 1]; @@ -1625,7 +1619,7 @@ void EoBCoreEngine::displayParchment(int id) { removeInputTop(); while (!shouldQuit()) { delay(_tickLength); - if (checkInput(0, false, 0) & 0xff) + if (checkInput(0, false, 0) & 0xFF) break; removeInputTop(); } @@ -1658,7 +1652,7 @@ int EoBCoreEngine::countResurrectionCandidates() { if (!inv) continue; - if ((_flags.gameID == GI_EOB1 && ((_itemTypes[_items[inv].type].extraProperties & 0x7f) != 8)) || (_flags.gameID == GI_EOB2 && _items[inv].type != 33)) + if ((_flags.gameID == GI_EOB1 && ((_itemTypes[_items[inv].type].extraProperties & 0x7F) != 8)) || (_flags.gameID == GI_EOB2 && _items[inv].type != 33)) continue; _rrNames[_rrCount] = _npcPreset[_items[inv].value - 1].name; @@ -1667,7 +1661,7 @@ int EoBCoreEngine::countResurrectionCandidates() { } if (_itemInHand > 0) { - if ((_flags.gameID == GI_EOB1 && ((_itemTypes[_items[_itemInHand].type].extraProperties & 0x7f) == 8)) || (_flags.gameID == GI_EOB2 && _items[_itemInHand].type == 33)) { + if ((_flags.gameID == GI_EOB1 && ((_itemTypes[_items[_itemInHand].type].extraProperties & 0x7F) == 8)) || (_flags.gameID == GI_EOB2 && _items[_itemInHand].type == 33)) { _rrNames[_rrCount] = _npcPreset[_items[_itemInHand].value - 1].name; _rrId[_rrCount++] = -_items[_itemInHand].value; } @@ -1748,7 +1742,7 @@ void EoBCoreEngine::seq_portal() { bool EoBCoreEngine::checkPassword() { char answ[20]; Screen::FontId of = _screen->setFont(Screen::FID_8_FNT); - _screen->copyPage(0, _useHiResDithering ? 4 : 10); + _screen->copyPage(0, 10); _screen->setScreenDim(13); gui_drawBox(_screen->_curDim->sx << 3, _screen->_curDim->sy, _screen->_curDim->w << 3, _screen->_curDim->h, guiSettings()->colors.frame1, guiSettings()->colors.frame2, -1); @@ -1775,7 +1769,7 @@ bool EoBCoreEngine::checkPassword() { _screen->modifyScreenDim(13, _screen->_curDim->sx - 1, _screen->_curDim->sy - 2, _screen->_curDim->w + 2, _screen->_curDim->h + 16); _screen->setFont(of); - _screen->copyPage(_useHiResDithering ? 4 : 10, 0); + _screen->copyPage(10, 0); return true; } @@ -1786,7 +1780,7 @@ void EoBCoreEngine::useSlotWeapon(int charIndex, int slotIndex, Item item) { if (c->effectFlags & 0x40) removeCharacterEffect(10, charIndex, 1); // remove invisibility effect - int ep = _itemTypes[tp].extraProperties & 0x7f; + int ep = _itemTypes[tp].extraProperties & 0x7F; int8 inflict = 0; if (ep == 1) { @@ -1829,14 +1823,14 @@ int EoBCoreEngine::closeDistanceAttack(int charIndex, Item item) { if (r == -1) { uint8 w = _specialWallTypes[_levelBlockProperties[d].walls[_sceneDrawVarDown]]; - if (w == 0xff) { + if (w == 0xFF) { if (_flags.gameID == GI_EOB1) { _levelBlockProperties[d].walls[_sceneDrawVarDown]++; _levelBlockProperties[d].walls[_sceneDrawVarDown ^ 2]++; } else { for (int i = 0; i < 4; i++) { - if (_specialWallTypes[_levelBlockProperties[d].walls[i]] == 0xff) + if (_specialWallTypes[_levelBlockProperties[d].walls[i]] == 0xFF) _levelBlockProperties[d].walls[i]++; } } @@ -1927,7 +1921,7 @@ int EoBCoreEngine::projectileWeaponAttack(int charIndex, Item item) { void EoBCoreEngine::inflictMonsterDamage(EoBMonsterInPlay *m, int damage, bool giveExperience) { m->hitPointsCur -= damage; - m->flags = (m->flags & 0xf7) | 1; + m->flags = (m->flags & 0xF7) | 1; if (_monsterProps[m->type].capsFlags & 0x2000) { explodeMonster(m); @@ -2033,7 +2027,7 @@ bool EoBCoreEngine::characterAttackHitTest(int charIndex, int monsterIndex, int if (charIndex < 0) return true; - int p = item ? (_flags.gameID == GI_EOB1 ? _items[item].type : (_itemTypes[_items[item].type].extraProperties & 0x7f)) : 0; + int p = item ? (_flags.gameID == GI_EOB1 ? _items[item].type : (_itemTypes[_items[item].type].extraProperties & 0x7F)) : 0; if (_monsters[monsterIndex].flags & 0x20) return true;// EOB 2 only ? @@ -2212,7 +2206,7 @@ void EoBCoreEngine::statusAttack(int charIndex, int attackStatusFlags, const cha c->flags |= attackStatusFlags; } - if ((attackStatusFlags & 0x0c) && (_openBookChar == charIndex) && _updateFlags) { + if ((attackStatusFlags & 0x0C) && (_openBookChar == charIndex) && _updateFlags) { Button b; clickedSpellbookAbort(&b); } @@ -2318,7 +2312,7 @@ int EoBCoreEngine::getSaveThrowModifier(int hpModifier, int level, int type) { } bool EoBCoreEngine::calcDamageCheckItemType(int itemType) { - itemType = _itemTypes[itemType].extraProperties & 0x7f; + itemType = _itemTypes[itemType].extraProperties & 0x7F; return (itemType == 2 || itemType == 3) ? true : false; } diff --git a/engines/kyra/eobcommon.h b/engines/kyra/eobcommon.h index f60e755dd7..70200d3049 100644 --- a/engines/kyra/eobcommon.h +++ b/engines/kyra/eobcommon.h @@ -722,21 +722,21 @@ protected: void gui_processWeaponSlotClickRight(int charIndex, int slotIndex); void gui_processInventorySlotClick(int slot); - static const int16 _buttonList1[]; + static const uint8 _buttonList1[]; int _buttonList1Size; - static const int16 _buttonList2[]; + static const uint8 _buttonList2[]; int _buttonList2Size; - static const int16 _buttonList3[]; + static const uint8 _buttonList3[]; int _buttonList3Size; - static const int16 _buttonList4[]; + static const uint8 _buttonList4[]; int _buttonList4Size; - static const int16 _buttonList5[]; + static const uint8 _buttonList5[]; int _buttonList5Size; - static const int16 _buttonList6[]; + static const uint8 _buttonList6[]; int _buttonList6Size; - static const int16 _buttonList7[]; + static const uint8 _buttonList7[]; int _buttonList7Size; - static const int16 _buttonList8[]; + static const uint8 _buttonList8[]; int _buttonList8Size; const EoBGuiButtonDef *_buttonDefs; @@ -845,7 +845,7 @@ protected: const uint8 *_cgaMappingLevel[5]; const uint8 *_cgaLevelMappingIndex; - bool _useHiResDithering; + bool _enableHiResDithering; // Default parameters will import all present original save files and push them to the top of the save dialog. bool importOriginalSaveFile(int destSlot, const char *sourceFile = 0); @@ -858,11 +858,11 @@ protected: void restoreWallOfForceTempData(LevelTempData *tmp); void releaseWallOfForceTempData(LevelTempData *tmp); - const char * const *_saveLoadStrings; + const char *const *_saveLoadStrings; const uint8 *_mnDef; - const char * const *_mnWord; - const char * const *_mnPrompt; + const char *const *_mnWord; + const char *const *_mnPrompt; int _mnNumWord; int _rrCount; diff --git a/engines/kyra/gui_eob.cpp b/engines/kyra/gui_eob.cpp index e3c0743e5c..ed3aaefbd9 100644 --- a/engines/kyra/gui_eob.cpp +++ b/engines/kyra/gui_eob.cpp @@ -86,7 +86,7 @@ void EoBCoreEngine::gui_drawCharPortraitWithStats(int index) { int txtCol1 = 12; int txtCol2 = 15; - if ((_flags.gameID == GI_EOB1 && c->flags & 6) || (_flags.gameID == GI_EOB2 && c->flags & 0x0e)) { + if ((_flags.gameID == GI_EOB1 && c->flags & 6) || (_flags.gameID == GI_EOB2 && c->flags & 0x0E)) { txtCol1 = 8; txtCol2 = 6; } @@ -285,7 +285,7 @@ void EoBCoreEngine::gui_drawWeaponSlot(int charIndex, int slot) { else _screen->drawShape(_screen->_curPage, _itemIconShapes[85 + slot], x + 8, y, 0); - if ((_characters[charIndex].disabledSlots & (1 << slot)) || !validateWeaponSlotItem(charIndex, slot) || (_characters[charIndex].hitPointsCur <= 0) || (_characters[charIndex].flags & 0x0c)) + if ((_characters[charIndex].disabledSlots & (1 << slot)) || !validateWeaponSlotItem(charIndex, slot) || (_characters[charIndex].hitPointsCur <= 0) || (_characters[charIndex].flags & 0x0C)) _screen->drawShape(_screen->_curPage, _weaponSlotGrid, x, y, 0); } @@ -321,7 +321,7 @@ void EoBCoreEngine::gui_drawWeaponSlotStatus(int x, int y, int status) { break; } - int textColor= (_configRenderMode == Common::kRenderCGA) ? 2 : 15; + int textColor = (_configRenderMode == Common::kRenderCGA) ? 2 : 15; if (!tmpStr2.empty()) { _screen->printText(tmpStr.c_str(), x + (16 - tmpStr.size() * 3), y + 2, textColor, 0); @@ -485,7 +485,7 @@ void EoBCoreEngine::gui_drawInventoryItem(int slot, int special, int pageNum) { uint8 col1 = guiSettings()->colors.frame1; uint8 col2 = guiSettings()->colors.frame2; - if (_configRenderMode == Common::kRenderCGA ) { + if (_configRenderMode == Common::kRenderCGA) { col1 = 1; col2 = 3; } @@ -777,11 +777,11 @@ int EoBCoreEngine::clickedCamp(Button *button) { } _screen->copyPage(0, 7); - _screen->copyRegion(0, 120, 0, 0, 176, 24, 0, _useHiResDithering ? 1 : 12, Screen::CR_NO_P_CHECK); + _screen->copyRegion(0, 120, 0, 0, 176, 24, 0, 12, Screen::CR_NO_P_CHECK); _gui->runCampMenu(); - _screen->copyRegion(0, 0, 0, 120, 176, 24, _useHiResDithering ? 1 : 12, 2, Screen::CR_NO_P_CHECK); + _screen->copyRegion(0, 0, 0, 120, 176, 24, 12, 2, Screen::CR_NO_P_CHECK); _screen->setScreenDim(cd); drawScene(0); @@ -808,13 +808,13 @@ int EoBCoreEngine::clickedSceneDropPickupItem(Button *button) { if (button->arg > 1) { block = calcNewBlockPosition(_currentBlock, _currentDirection); int f = _wllWallFlags[_levelBlockProperties[block].walls[_sceneDrawVarDown]]; - if (!(f & 0x0b)) + if (!(f & 0x0B)) return 1; } int d = _dropItemDirIndex[(_currentDirection << 2) + button->arg]; if (_itemInHand) { - setItemPosition((Item *)&_levelBlockProperties[block & 0x3ff].drawObjects, block, _itemInHand, d); + setItemPosition((Item *)&_levelBlockProperties[block & 0x3FF].drawObjects, block, _itemInHand, d); setHandItem(0); runLevelScript(block, 4); } else { @@ -856,7 +856,7 @@ int EoBCoreEngine::clickedWeaponSlot(Button *button) { static const uint8 sY[] = { 27, 27, 79, 79, 131, 131 }; int slot = sY[button->arg] > _mouseY ? 0 : 1; - if ((_gui->_flagsMouseLeft & 0x7f) == 1) + if ((_gui->_flagsMouseLeft & 0x7F) == 1) gui_processWeaponSlotClickLeft(button->arg, slot); else gui_processWeaponSlotClickRight(button->arg, slot); @@ -1031,9 +1031,9 @@ int EoBCoreEngine::clickedSpellbookList(Button *button) { } int EoBCoreEngine::clickedCastSpellOnCharacter(Button *button) { - _activeSpellCharId = button->arg & 0xff; + _activeSpellCharId = button->arg & 0xFF; - if (_activeSpellCharId == 0xff) { + if (_activeSpellCharId == 0xFF) { printWarning(_magicStrings3[_flags.gameID == GI_EOB1 ? 2 : 1]); if (_castScrollSlot) { gui_updateSlotAfterScrollUse(); @@ -1170,7 +1170,7 @@ int EoBCoreEngine::clickedSceneSpecial(Button *button) { int EoBCoreEngine::clickedSpellbookAbort(Button *button) { _updateFlags = 0; - _screen->copyRegion(0, 0, 64, 121, 112, 56, _useHiResDithering ? 4 : 10, 0, Screen::CR_NO_P_CHECK); + _screen->copyRegion(0, 0, 64, 121, 112, 56, 10, 0, Screen::CR_NO_P_CHECK); _screen->updateScreen(); gui_drawCompass(true); gui_toggleButtons(); @@ -1215,7 +1215,7 @@ void EoBCoreEngine::gui_processWeaponSlotClickLeft(int charIndex, int slotIndex) int ih = _itemInHand; int t = _items[ih].type; - uint16 v = (ih) ? _itemTypes[t].invFlags : 0xffff; + uint16 v = (ih) ? _itemTypes[t].invFlags : 0xFFFF; if (v & _slotValidationFlags[slotIndex]) { setHandItem(itm); @@ -1227,7 +1227,7 @@ void EoBCoreEngine::gui_processWeaponSlotClickLeft(int charIndex, int slotIndex) } void EoBCoreEngine::gui_processWeaponSlotClickRight(int charIndex, int slotIndex) { - if (!testCharacter(charIndex, 0x0d)) + if (!testCharacter(charIndex, 0x0D)) return; Item itm = _characters[charIndex].inventory[slotIndex]; @@ -1244,7 +1244,7 @@ void EoBCoreEngine::gui_processWeaponSlotClickRight(int charIndex, int slotIndex int8 tp = _items[itm].type; int8 vl = _items[itm].value; - uint8 ep = _itemTypes[tp].extraProperties & 0x7f; + uint8 ep = _itemTypes[tp].extraProperties & 0x7F; switch (ep) { case 0: @@ -1376,7 +1376,7 @@ GUI_EoB::GUI_EoB(EoBCoreEngine *vm) : GUI(vm), _vm(vm), _screen(vm->_screen) { _backupButtonList = 0; _progress = 0; _prcButtonUnk3 = 1; - _cflag = 0xffff; + _cflag = 0xFFFF; _menuLineSpacing = 0; _menuLastInFlags = 0; @@ -1385,8 +1385,8 @@ GUI_EoB::GUI_EoB(EoBCoreEngine *vm) : GUI(vm), _vm(vm), _screen(vm->_screen) { _numPages = (_vm->game() == GI_EOB2) ? 8 : 5; _numVisPages = (_vm->game() == GI_EOB2) ? 6 : 5; - _clericSpellAvltyFlags = (_vm->game() == GI_EOB2) ? 0xf7ffffff : 0x7bffff; - _paladinSpellAvltyFlags = (_vm->game() == GI_EOB2) ? 0xa9bbd1d : 0x800ff2; + _clericSpellAvltyFlags = (_vm->game() == GI_EOB2) ? 0xF7FFFFFF : 0x7BFFFF; + _paladinSpellAvltyFlags = (_vm->game() == GI_EOB2) ? 0xA9BBD1D : 0x800FF2; _numAssignedSpellsOfType = new int8[72]; memset(_numAssignedSpellsOfType, 0, 72); @@ -1524,7 +1524,7 @@ void GUI_EoB::processButton(Button *button) { int GUI_EoB::processButtonList(Kyra::Button *buttonList, uint16 inputFlags, int8 mouseWheel) { _progress = 0; - uint16 in = inputFlags & 0xff; + uint16 in = inputFlags & 0xFF; uint16 buttonReleaseFlag = 0; bool clickEvt = false; //_vm->_processingButtons = true; @@ -1543,13 +1543,13 @@ int GUI_EoB::processButtonList(Kyra::Button *buttonList, uint16 inputFlags, int8 //////////////////////////// if (!buttonList && !(inputFlags & 0x800)) - return inputFlags & 0xff; + return inputFlags & 0xFF; //////////////////////////// inputFlags = 0; clickEvt = true; } else if (inputFlags & 0x8000) { - inputFlags &= 0xff; + inputFlags &= 0xFF; } uint16 result = 0; @@ -1568,8 +1568,8 @@ int GUI_EoB::processButtonList(Kyra::Button *buttonList, uint16 inputFlags, int8 // UNUSED //if (buttonList->flags2 & 0x20) { - //if (_processButtonListExtraCallback) - // this->*_processButtonListExtraCallback(buttonList); + // if (_processButtonListExtraCallback) + // this->*_processButtonListExtraCallback(buttonList); //} if (buttonList->nextButton) @@ -1582,7 +1582,7 @@ int GUI_EoB::processButtonList(Kyra::Button *buttonList, uint16 inputFlags, int8 _specialProcessButton = 0; _prcButtonUnk3 = 1; - _cflag = 0xffff; + _cflag = 0xFFFF; } int sd = 0; @@ -1616,12 +1616,12 @@ int GUI_EoB::processButtonList(Kyra::Button *buttonList, uint16 inputFlags, int8 if (flgs2 & 1) flgs2 |= 8; else - flgs2 &= 0xfff7; + flgs2 &= 0xFFF7; if (flgs2 & 4) flgs2 |= 0x10; else - flgs2 &= 0xffef; + flgs2 &= 0xFFEF; uint16 vL = 0; uint16 vR = 0; @@ -1640,8 +1640,8 @@ int GUI_EoB::processButtonList(Kyra::Button *buttonList, uint16 inputFlags, int8 v6 = 1; } } else if (_flagsModifier || clickEvt) { - vL = flgs & 0xf00; - vR = flgs & 0xf000; + vL = flgs & 0xF00; + vR = flgs & 0xF000; if (_prcButtonUnk3) { if (sd != buttonList->dimTableIndex) { @@ -1675,7 +1675,7 @@ int GUI_EoB::processButtonList(Kyra::Button *buttonList, uint16 inputFlags, int8 flgs2 |= 4; vc = 1; } else { - flgs2 &= 0xfffb; + flgs2 &= 0xFFFB; } if (flgs & 0x100) { @@ -1702,7 +1702,7 @@ int GUI_EoB::processButtonList(Kyra::Button *buttonList, uint16 inputFlags, int8 flgs2 |= 4; vc = 1; } else { - flgs2 &= 0xfffb; + flgs2 &= 0xFFFB; } if (!(flgs & 0x200)) @@ -1730,12 +1730,12 @@ int GUI_EoB::processButtonList(Kyra::Button *buttonList, uint16 inputFlags, int8 } if ((flgs & 2) && (flgs2 & 1)) - flgs2 &= 0xfffe; + flgs2 &= 0xFFFE; break; case 3: if ((flgs & 4) || (!buttonList->data2Val1)) - flgs2 &= 0xfffb; + flgs2 &= 0xFFFB; else flgs2 |= 4; @@ -1745,7 +1745,7 @@ int GUI_EoB::processButtonList(Kyra::Button *buttonList, uint16 inputFlags, int8 } if ((flgs & 2) && (flgs2 & 1)) - flgs2 &= 0xfffe; + flgs2 &= 0xFFFE; break; default: @@ -1761,7 +1761,7 @@ int GUI_EoB::processButtonList(Kyra::Button *buttonList, uint16 inputFlags, int8 if ((flgs & 4) && buttonList->data2Val1) flgs2 |= 4; else - flgs2 &= 0xfffb; + flgs2 &= 0xFFFB; if (flgs & 0x1000) { v6 = 1; @@ -1786,7 +1786,7 @@ int GUI_EoB::processButtonList(Kyra::Button *buttonList, uint16 inputFlags, int8 if ((flgs & 4) && buttonList->data2Val1) flgs2 |= 4; else - flgs2 &= 0xfffb; + flgs2 &= 0xFFFB; if (!(flgs & 0x2000)) break; @@ -1812,12 +1812,12 @@ int GUI_EoB::processButtonList(Kyra::Button *buttonList, uint16 inputFlags, int8 } if ((flgs & 2) && (flgs2 & 1)) - flgs2 &= 0xfffe; + flgs2 &= 0xFFFE; break; case 3: if ((flgs & 4) || (!buttonList->data2Val1)) - flgs2 &= 0xfffb; + flgs2 &= 0xFFFB; else flgs2 |= 4; @@ -1827,7 +1827,7 @@ int GUI_EoB::processButtonList(Kyra::Button *buttonList, uint16 inputFlags, int8 } if ((flgs & 2) && (flgs2 & 1)) - flgs2 &= 0xfffe; + flgs2 &= 0xFFFE; break; default: @@ -1835,7 +1835,7 @@ int GUI_EoB::processButtonList(Kyra::Button *buttonList, uint16 inputFlags, int8 } } } else { // if (_vm->_mouseX >= x2 && _vm->_mouseX <= (x2 + buttonList->width)....) - flgs2 &= 0xfff9; + flgs2 &= 0xFFF9; if ((flgs & 0x40) && (!(flgs & 0x80)) && _specialProcessButton && !v8) { static const uint16 flagsTable[] = { 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000 }; @@ -1859,7 +1859,7 @@ int GUI_EoB::processButtonList(Kyra::Button *buttonList, uint16 inputFlags, int8 } if ((flgs & 2) && (flgs2 & 1)) - flgs2 &= 0xfffe; + flgs2 &= 0xFFFE; } // end if (_vm->_mouseX >= x2 && _vm->_mouseX <= (x2 + buttonList->width)....) } // end if (_prcButtonUnk3) } // end if (_flagsModifier || clickEvt) @@ -1896,7 +1896,7 @@ int GUI_EoB::processButtonList(Kyra::Button *buttonList, uint16 inputFlags, int8 }; if ((_flagsMouseLeft == 1 || _flagsMouseRight == 1) && !v18) - _cflag = 0xffff; + _cflag = 0xFFFF; if (!result) result = inputFlags; @@ -1938,7 +1938,7 @@ int GUI_EoB::simpleMenu_process(int sd, const char *const *strings, void *b, int int x = (_screen->_curDim->sx + dm->sx) << 3; int y = _screen->_curDim->sy + dm->sy; - int inFlag = _vm->checkInput(0, false, 0) & 0x8ff; + int inFlag = _vm->checkInput(0, false, 0) & 0x8FF; _vm->removeInputTop(); Common::Point mousePos = _vm->getMousePos(); @@ -2051,7 +2051,7 @@ void GUI_EoB::runCampMenu() { newMenu = -1; } - int inputFlag = _vm->checkInput(buttonList, false, 0) & 0x80ff; + int inputFlag = _vm->checkInput(buttonList, false, 0) & 0x80FF; _vm->removeInputTop(); if (inputFlag == _vm->_keyMap[Common::KEYCODE_ESCAPE]) @@ -2060,7 +2060,7 @@ void GUI_EoB::runCampMenu() { inputFlag = 0x8000 + prevHighlightButton->index; } - Button *clickedButton = _vm->gui_getButton(buttonList, inputFlag & 0x7fff); + Button *clickedButton = _vm->gui_getButton(buttonList, inputFlag & 0x7FFF); if (clickedButton) { drawMenuButton(prevHighlightButton, false, false, true); @@ -2140,8 +2140,8 @@ void GUI_EoB::runCampMenu() { displayTextBox(44); // fall through - case 0x800c: - case 0x800f: + case 0x800C: + case 0x800F: if (lastMenu == 1 || lastMenu == 2) newMenu = 0; else if (inputFlag == _vm->_keyMap[Common::KEYCODE_ESCAPE]) @@ -2163,7 +2163,7 @@ void GUI_EoB::runCampMenu() { newMenu = 1; break; - case 0x800a: + case 0x800A: for (; i < 6; i++) { if (_vm->testCharacter(i, 1)) cnt++; @@ -2172,7 +2172,7 @@ void GUI_EoB::runCampMenu() { if (cnt > 4) { _vm->dropCharacter(selectCharacterDialogue(53)); _vm->gui_drawPlayField(false); - _screen->copyRegion(0, 120, 0, 0, 176, 24, 0, _vm->_useHiResDithering ? 1 : 12, Screen::CR_NO_P_CHECK); + _screen->copyRegion(0, 120, 0, 0, 176, 24, 0, 12, Screen::CR_NO_P_CHECK); _screen->setFont(Screen::FID_6_FNT); _vm->gui_drawAllCharPortraitsWithStats(); _screen->setFont(Screen::FID_8_FNT); @@ -2183,19 +2183,19 @@ void GUI_EoB::runCampMenu() { newMenu = 0; break; - case 0x800b: + case 0x800B: if (confirmDialogue(46)) _vm->quitGame(); newMenu = 0; break; - case 0x800d: + case 0x800D: _vm->_configSounds ^= true; _vm->_configMusic = _vm->_configSounds ? 1 : 0; newMenu = 2; break; - case 0x800e: + case 0x800E: _vm->_configHpBarGraphs ^= true; newMenu = 2; redrawPortraits = true; @@ -2290,7 +2290,7 @@ bool GUI_EoB::confirmDialogue2(int dim, int id, int deflt) { else if (_vm->posWithinRect(p.x, p.y, x[1], y, x[1] + 32, y + 14)) newHighlight = 1; - int inputFlag = _vm->checkInput(0, false, 0) & 0x8ff; + int inputFlag = _vm->checkInput(0, false, 0) & 0x8FF; _vm->removeInputTop(); if (inputFlag == _vm->_keyMap[Common::KEYCODE_SPACE] || inputFlag == _vm->_keyMap[Common::KEYCODE_RETURN]) { @@ -2351,7 +2351,7 @@ void GUI_EoB::messageDialogue(int dim, int id, int buttonTextCol) { _screen->updateScreen(); for (bool runLoop = true; runLoop && !_vm->shouldQuit();) { - int inputFlag = _vm->checkInput(0, false, 0) & 0x8ff; + int inputFlag = _vm->checkInput(0, false, 0) & 0x8FF; _vm->removeInputTop(); if (inputFlag == 199 || inputFlag == 201) { @@ -2392,7 +2392,7 @@ void GUI_EoB::messageDialogue2(int dim, int id, int buttonTextCol) { _screen->updateScreen(); for (bool runLoop = true; runLoop && !_vm->shouldQuit();) { - int inputFlag = _vm->checkInput(0, false, 0) & 0x8ff; + int inputFlag = _vm->checkInput(0, false, 0) & 0x8FF; _vm->removeInputTop(); if (inputFlag == 199 || inputFlag == 201) { @@ -2607,7 +2607,7 @@ Common::String GUI_EoB::transferTargetMenu(Common::Array<Common::String> &target break; } while (_saveSlotIdTemp[slot] == -1); - _screen->copyRegion(72, 14, 72, 14, 176, 144, _vm->_useHiResDithering ? 7 : 12, 0, Screen::CR_NO_P_CHECK); + _screen->copyRegion(72, 14, 72, 14, 176, 144, 12, 0, Screen::CR_NO_P_CHECK); _screen->modifyScreenDim(11, xo, yo, dm->w, dm->h); return (slot < 6) ? _savegameList[_savegameOffset + slot] : Common::String(); @@ -2650,7 +2650,7 @@ void GUI_EoB::createScreenThumbnail(Graphics::Surface &dst) { _screen->getRealPalette(0, screenPal); uint16 width = Screen::SCREEN_W; uint16 height = Screen::SCREEN_H; - if (_vm->_useHiResDithering) { + if (_vm->gameFlags().useHiRes) { width <<= 1; height <<= 1; } @@ -2705,11 +2705,20 @@ bool GUI_EoB::runSaveMenu(int x, int y) { for (int in = -1; in == -1 && !_vm->shouldQuit();) { _screen->fillRect(fx - 2, fy, fx + 160, fy + 8, _vm->guiSettings()->colors.fill); in = getTextInput(_saveSlotStringsTemp[slot], x + 1, fy, 19, 2, 0, 8); + if (in == -1) { + useSlot = false; + break; + } + if (!strlen(_saveSlotStringsTemp[slot])) { messageDialogue(11, 54, 6); in = -1; } - }; + } + + if (!useSlot) { + continue; + } _screen->fillRect(fx - 2, fy, fx + 160, fy + 8, _vm->guiSettings()->colors.fill); _screen->printShadedText(_saveSlotStringsTemp[slot], (x + 1) << 3, fy, 15, 0); @@ -2755,7 +2764,7 @@ int GUI_EoB::selectSaveSlotDialogue(int x, int y, int id) { int slot = -1; for (bool runLoop = true; runLoop && !_vm->shouldQuit();) { - int inputFlag = _vm->checkInput(0, false, 0) & 0x8ff; + int inputFlag = _vm->checkInput(0, false, 0) & 0x8FF; _vm->removeInputTop(); if (inputFlag == _vm->_keyMap[Common::KEYCODE_SPACE] || inputFlag == _vm->_keyMap[Common::KEYCODE_RETURN]) { @@ -2999,11 +3008,11 @@ void GUI_EoB::runMemorizePrayMenu(int charIndex, int spellType) { lastHighLightText = newHighLightText; } - int inputFlag = _vm->checkInput(buttonList, false, 0) & 0x80ff; + int inputFlag = _vm->checkInput(buttonList, false, 0) & 0x80FF; _vm->removeInputTop(); if (inputFlag == _vm->_keyMap[Common::KEYCODE_KP6] || inputFlag == _vm->_keyMap[Common::KEYCODE_RIGHT]) { - inputFlag = 0x801a + ((lastHighLightButton + 1) % _numVisPages); + inputFlag = 0x801A + ((lastHighLightButton + 1) % _numVisPages); } else if (inputFlag == _vm->_keyMap[Common::KEYCODE_KP4] || inputFlag == _vm->_keyMap[Common::KEYCODE_LEFT]) { inputFlag = lastHighLightButton ? 0x8019 + lastHighLightButton : 0x8019 + _numVisPages; } else if (inputFlag == _vm->_keyMap[Common::KEYCODE_ESCAPE]) { @@ -3018,7 +3027,7 @@ void GUI_EoB::runMemorizePrayMenu(int charIndex, int spellType) { } if (inputFlag & 0x8000) { - b = _vm->gui_getButton(buttonList, inputFlag & 0x7fff); + b = _vm->gui_getButton(buttonList, inputFlag & 0x7FFF); drawMenuButton(b, true, true, true); _screen->updateScreen(); _vm->_system->delayMillis(80); @@ -3065,9 +3074,9 @@ void GUI_EoB::runMemorizePrayMenu(int charIndex, int spellType) { runLoop = false; } else if (inputFlag & 0x8000) { - newHighLightButton = inputFlag - 0x801a; + newHighLightButton = inputFlag - 0x801A; if (newHighLightButton == lastHighLightButton) - drawMenuButton(_vm->gui_getButton(buttonList, inputFlag & 0x7fff), false, true, true); + drawMenuButton(_vm->gui_getButton(buttonList, inputFlag & 0x7FFF), false, true, true); } } @@ -3544,7 +3553,7 @@ bool GUI_EoB::confirmDialogue(int id) { lastHighlight = newHighlight; } - int inputFlag = _vm->checkInput(buttonList, false, 0) & 0x80ff; + int inputFlag = _vm->checkInput(buttonList, false, 0) & 0x80FF; _vm->removeInputTop(); if (inputFlag == _vm->_keyMap[Common::KEYCODE_KP5] || inputFlag == _vm->_keyMap[Common::KEYCODE_SPACE] || inputFlag == _vm->_keyMap[Common::KEYCODE_RETURN]) { diff --git a/engines/kyra/gui_eob.h b/engines/kyra/gui_eob.h index f6be18ffbb..1b7bdf3482 100644 --- a/engines/kyra/gui_eob.h +++ b/engines/kyra/gui_eob.h @@ -156,7 +156,7 @@ private: static const uint8 _highlightColorTableEGA[]; }; -} // End of namespace Kyra +} // End of namespace Kyra #endif // ENABLE_EOB diff --git a/engines/kyra/gui_hof.cpp b/engines/kyra/gui_hof.cpp index 36fbb0b40a..3a2c07beff 100644 --- a/engines/kyra/gui_hof.cpp +++ b/engines/kyra/gui_hof.cpp @@ -521,7 +521,7 @@ void KyraEngine_HoF::bookPrintText(int dstPage, const uint8 *str, int x, int y, Screen::FontId oldFont = _screen->setFont(_flags.lang == Common::JA_JPN ? Screen::FID_SJIS_FNT : Screen::FID_BOOKFONT_FNT); _screen->_charWidth = -2; - _screen->printText((const char *)str, x, y, color, (_flags.lang == Common::JA_JPN) ? 0xf6 : 0); + _screen->printText((const char *)str, x, y, color, (_flags.lang == Common::JA_JPN) ? 0xF6 : 0); _screen->_charWidth = 0; _screen->setFont(oldFont); diff --git a/engines/kyra/gui_lol.cpp b/engines/kyra/gui_lol.cpp index a79da0681e..f7a5386574 100644 --- a/engines/kyra/gui_lol.cpp +++ b/engines/kyra/gui_lol.cpp @@ -120,7 +120,7 @@ void LoLEngine::gui_drawScroll() { if (h) { _screen->copyRegion(201, 1, 17, 15, 6, h, 2, 2, Screen::CR_NO_P_CHECK); _screen->copyRegion(208, 1, 89, 15, 6, h, 2, 2, Screen::CR_NO_P_CHECK); - _screen->fillRect(21, 15, 89, h + 15, _flags.use16ColorMode ? 0xbb : 206); + _screen->fillRect(21, 15, 89, h + 15, _flags.use16ColorMode ? 0xBB : 206); } _screen->copyRegion(112, 16, 12, h + 15, 87, 14, 2, 2, Screen::CR_NO_P_CHECK); @@ -172,7 +172,7 @@ void LoLEngine::gui_displayCharInventory(int charNum) { gui_drawAllCharPortraitsWithStats(); if (_flags.use16ColorMode) - _screen->fprintString("%s", 156, 8, 0xe1, 0, 1, l->name); + _screen->fprintString("%s", 156, 8, 0xE1, 0, 1, l->name); else _screen->fprintString("%s", 157, 9, 254, 0, 5, l->name); @@ -182,7 +182,7 @@ void LoLEngine::gui_displayCharInventory(int charNum) { gui_drawCharInventoryItem(i); Screen::FontId of = _screen->setFont(Screen::FID_9_FNT); - _screen->fprintString("%s", 182, 103, _flags.use16ColorMode ? 0xbb : 172, 0, 5, getLangString(0x4033)); + _screen->fprintString("%s", 182, 103, _flags.use16ColorMode ? 0xBB : 172, 0, 5, getLangString(0x4033)); _screen->setFont(of); static const uint16 statusFlags[] = { 0x0080, 0x0000, 0x1000, 0x0002, 0x100, 0x0001, 0x0000, 0x0000 }; @@ -206,7 +206,7 @@ void LoLEngine::gui_displayCharInventory(int charNum) { int32 b = l->experiencePts[i] - _expRequirements[l->skillLevels[i] - 1]; int32 e = _expRequirements[l->skillLevels[i]] - _expRequirements[l->skillLevels[i] - 1]; - while (e & 0xffff8000) { + while (e & 0xFFFF8000) { e >>= 1; c = b; b >>= 1; @@ -245,7 +245,7 @@ void LoLEngine::gui_printCharacterStats(int index, int redraw, int value) { // protection if (_flags.use16ColorMode) { y = (index + 2) << 3; - col = 0xa1; + col = 0xA1; if (redraw) _screen->fprintString("%s", offs + 108, y, col, 0, 0, getLangString(0x4014 + index)); } else { @@ -260,7 +260,7 @@ void LoLEngine::gui_printCharacterStats(int index, int redraw, int value) { y = s * 10 + 62; if (_flags.use16ColorMode) { y = (s + 8) << 3; - col = _characters[_selectedCharacter].flags & (0x200 << s) ? 0xe1 : 0x81; + col = _characters[_selectedCharacter].flags & (0x200 << s) ? 0xE1 : 0x81; if (redraw) _screen->fprintString("%s", offs + 108, y, col, 0, 0, getLangString(0x4014 + index)); } else { @@ -274,7 +274,7 @@ void LoLEngine::gui_printCharacterStats(int index, int redraw, int value) { if (offs) _screen->copyRegion(294, y, 182 + offs, y, 18, 8, 6, _screen->_curPage, Screen::CR_NO_P_CHECK); - Screen::FontId of = _flags.use16ColorMode ? _screen->setFont(Screen::FID_SJIS_FNT) : _screen->_currentFont; + Screen::FontId of = (_flags.lang == Common::JA_JPN && _flags.use16ColorMode) ? _screen->setFont(Screen::FID_SJIS_FNT) : _screen->_currentFont; _screen->fprintString("%d", 200 + offs, y, col, 0, _flags.use16ColorMode ? 2 : 6, value); _screen->setFont(of); } @@ -322,12 +322,12 @@ void LoLEngine::gui_changeCharacterStats(int charNum) { void LoLEngine::gui_drawCharInventoryItem(int itemIndex) { static const uint8 slotShapes[] = { 0x30, 0x34, 0x30, 0x34, 0x2E, 0x2F, 0x32, 0x33, 0x31, 0x35, 0x35 }; - + //2Eh, 32h, 2Eh, 32h, 2Ch, 2Dh, 30h, 31h, 2Fh, 33h, 33h const uint8 *coords = &_charInvDefs[_charInvIndex[_characters[_selectedCharacter].raceClassSex] * 22 + itemIndex * 2]; uint8 x = *coords++; uint8 y = *coords; - if (y == 0xff) + if (y == 0xFF) return; if (!_screen->_curPage) @@ -366,7 +366,7 @@ void LoLEngine::gui_drawCharPortraitWithStats(int charNum) { gui_drawCharFaceShape(charNum, 0, 1, _screen->_curPage); if (_flags.use16ColorMode) { - gui_drawLiveMagicBar(33, 32, _characters[charNum].magicPointsCur, 0, _characters[charNum].magicPointsMax, 5, 32, 0xaa, 0x44, 0); + gui_drawLiveMagicBar(33, 32, _characters[charNum].magicPointsCur, 0, _characters[charNum].magicPointsMax, 5, 32, 0xAA, 0x44, 0); gui_drawLiveMagicBar(39, 32, _characters[charNum].hitPointsCur, 0, _characters[charNum].hitPointsMax, 5, 32, 0x66, 0x44, 1); _screen->printText(getLangString(0x4253), 33, 1, 0x99, 0); _screen->printText(getLangString(0x4254), 39, 1, 0x55, 0); @@ -493,7 +493,7 @@ void LoLEngine::gui_drawLiveMagicBar(int x, int y, int curPoints, int unk, int m if (flag) { t = maxPoints >> 1; if (t > curPoints) - col1 = _flags.use16ColorMode ? 0xbb : 144; + col1 = _flags.use16ColorMode ? 0xBB : 144; t = maxPoints >> 2; if (t > curPoints) col1 = _flags.use16ColorMode ? 0x88 : 132; @@ -525,9 +525,9 @@ void LoLEngine::calcCharPortraitXpos() { } void LoLEngine::gui_drawMoneyBox(int pageNum) { - static const uint16 moneyX256[] = { 0x128, 0x134, 0x12b, 0x131, 0x12e}; + static const uint16 moneyX256[] = { 0x128, 0x134, 0x12B, 0x131, 0x12E}; static const uint16 moneyY256[] = { 0x73, 0x73, 0x74, 0x74, 0x75}; - static const uint16 moneyX16[] = { 0x127, 0x133, 0x12a, 0x130, 0x12d}; + static const uint16 moneyX16[] = { 0x127, 0x133, 0x12A, 0x130, 0x12D}; static const uint16 moneyY16[] = { 0x74, 0x74, 0x75, 0x75, 0x76}; int backupPage = _screen->_curPage; @@ -551,11 +551,11 @@ void LoLEngine::gui_drawMoneyBox(int pageNum) { continue; uint8 h = _moneyColumnHeight[i] - 1; - _screen->drawClippedLine(moneyX[i], moneyY[i], moneyX[i], moneyY[i] - h, _flags.use16ColorMode ? 1 : 0xd2); - _screen->drawClippedLine(moneyX[i] + 1, moneyY[i], moneyX[i] + 1, moneyY[i] - h, _flags.use16ColorMode ? 2 : 0xd1); - _screen->drawClippedLine(moneyX[i] + 2, moneyY[i], moneyX[i] + 2, moneyY[i] - h, _flags.use16ColorMode ? 3 : 0xd0); - _screen->drawClippedLine(moneyX[i] + 3, moneyY[i], moneyX[i] + 3, moneyY[i] - h, _flags.use16ColorMode ? 2 : 0xd1); - _screen->drawClippedLine(moneyX[i] + 4, moneyY[i], moneyX[i] + 4, moneyY[i] - h, _flags.use16ColorMode ? 1 : 0xd2); + _screen->drawClippedLine(moneyX[i], moneyY[i], moneyX[i], moneyY[i] - h, _flags.use16ColorMode ? 1 : 0xD2); + _screen->drawClippedLine(moneyX[i] + 1, moneyY[i], moneyX[i] + 1, moneyY[i] - h, _flags.use16ColorMode ? 2 : 0xD1); + _screen->drawClippedLine(moneyX[i] + 2, moneyY[i], moneyX[i] + 2, moneyY[i] - h, _flags.use16ColorMode ? 3 : 0xD0); + _screen->drawClippedLine(moneyX[i] + 3, moneyY[i], moneyX[i] + 3, moneyY[i] - h, _flags.use16ColorMode ? 2 : 0xD1); + _screen->drawClippedLine(moneyX[i] + 4, moneyY[i], moneyX[i] + 4, moneyY[i] - h, _flags.use16ColorMode ? 1 : 0xD2); } Screen::FontId backupFont = _screen->setFont(Screen::FID_6_FNT); @@ -584,7 +584,7 @@ void LoLEngine::gui_drawCompass() { _compassDirection = _currentDirection << 6; } - int t = ((_compassDirection + 4) >> 3) & 0x1f; + int t = ((_compassDirection + 4) >> 3) & 0x1F; if (t == _compassDirectionIndex) return; @@ -744,13 +744,13 @@ void LoLEngine::gui_toggleFightButtons(bool disable) { if (disable) _characters[i].flags |= 0x2000; else - _characters[i].flags &= 0xdfff; + _characters[i].flags &= 0xDFFF; if (disable && !textEnabled()) { int u = _selectedCharacter; _selectedCharacter = 99; int f = _updateFlags; - _updateFlags &= 0xfffd; + _updateFlags &= 0xFFFD; gui_drawCharPortraitWithStats(i); @@ -774,7 +774,7 @@ void LoLEngine::gui_updateInput() { if (inputFlag && _activeMagicMenu != -1 && !(inputFlag & 0x8800)) { gui_enableDefaultPlayfieldButtons(); - _characters[_activeMagicMenu].flags &= 0xffef; + _characters[_activeMagicMenu].flags &= 0xFFEF; gui_drawCharPortraitWithStats(_activeMagicMenu); gui_triggerEvent(inputFlag); _preserveEvents = false; @@ -875,7 +875,7 @@ void LoLEngine::gui_initCharInventorySpecialButtons(int charNum) { const uint8 *s = &_charInvDefs[_charInvIndex[_characters[charNum].raceClassSex] * 22]; for (int i = 0; i < 11; i++) { - if (*s != 0xff) + if (*s != 0xFF) gui_initButton(33 + i, s[0], s[1], i); s += 2; } @@ -916,7 +916,7 @@ void LoLEngine::gui_initButton(int index, int x, int y, int val) { *b = Button(); b->nextButton = 0; - b->data0Val2 = b->data1Val2 = b->data2Val2 = 0xfe; + b->data0Val2 = b->data1Val2 = b->data2Val2 = 0xFE; b->data0Val3 = b->data1Val3 = b->data2Val3 = 0x01; b->index = cnt; @@ -925,7 +925,7 @@ void LoLEngine::gui_initButton(int index, int x, int y, int val) { b->dimTableIndex = _buttonData[index].screenDim; b->flags = _buttonData[index].buttonflags; - b->arg = (val != -1) ? (uint8)(val & 0xff) : _buttonData[index].index; + b->arg = (val != -1) ? (uint8)(val & 0xFF) : _buttonData[index].index; if (index == 15) { // magic sub menu @@ -1100,17 +1100,17 @@ int LoLEngine::clickedMagicSubmenu(Button *button) { gui_enableDefaultPlayfieldButtons(); if (checkMagic(c, _availableSpells[_selectedSpell], spellLevel)) { - _characters[c].flags &= 0xffef; + _characters[c].flags &= 0xFFEF; gui_drawCharPortraitWithStats(c); } else { _characters[c].flags |= 4; - _characters[c].flags &= 0xffef; + _characters[c].flags &= 0xFFEF; if (castSpell(c, _availableSpells[_selectedSpell], spellLevel)) { setCharacterUpdateEvent(c, 1, 8, 1); increaseExperience(c, 2, spellLevel * spellLevel); } else { - _characters[c].flags &= 0xfffb; + _characters[c].flags &= 0xFFFB; gui_drawCharPortraitWithStats(c); } } @@ -1120,7 +1120,7 @@ int LoLEngine::clickedMagicSubmenu(Button *button) { } int LoLEngine::clickedScreen(Button *button) { - _characters[_activeMagicMenu].flags &= 0xffef; + _characters[_activeMagicMenu].flags &= 0xFFEF; gui_drawCharPortraitWithStats(_activeMagicMenu); _activeMagicMenu = -1; @@ -1178,12 +1178,12 @@ int LoLEngine::clickedPortraitEtcRight(Button *button) { runItemScript(c, _itemInHand, 0x400, 0, 0); runLevelScriptCustom(_currentBlock, 0x400, c, _itemInHand, 0, 0); } else { - _txt->printMessage(2, getLangString(0x402c), _characters[c].name); + _txt->printMessage(2, getLangString(0x402C), _characters[c].name); } return 1; } - _txt->printMessage(2, "%s", getLangString((flg & 8) ? 0x4029 : ((flg & 0x10) ? 0x402a : 0x402b))); + _txt->printMessage(2, "%s", getLangString((flg & 8) ? 0x4029 : ((flg & 0x10) ? 0x402A : 0x402B))); return 1; } @@ -1235,13 +1235,13 @@ int LoLEngine::clickedCharInventorySlot(Button *button) { } int LoLEngine::clickedExitCharInventory(Button *button) { - _updateFlags &= 0xfff3; + _updateFlags &= 0xFFF3; gui_enableDefaultPlayfieldButtons(); _weaponsDisabled = false; for (int i = 0; i < 4; i++) { if (_charInventoryUnk & (1 << i)) - _characters[i].flags &= 0xf1ff; + _characters[i].flags &= 0xF1FF; } _screen->copyBlockToPage(2, 0, 0, 320, 200, _pageBuffer1); @@ -1315,7 +1315,7 @@ int LoLEngine::clickedScenePickupItem(Button *button) { uint16 block = (p <= 128) ? calcNewBlockPosition(_currentBlock, _currentDirection) : _currentBlock; - int found = checkSceneForItems(&_levelBlockProperties[block].drawObjects, p & 0x7f); + int found = checkSceneForItems(&_levelBlockProperties[block].drawObjects, p & 0x7F); if (found != -1) { removeLevelItem(found, block); @@ -1465,7 +1465,7 @@ int LoLEngine::clickedSpellTargetCharacter(Button *button) { int t = button->arg; _txt->printMessage(0, "%s.\r", _characters[t].name); - if ((_spellProperties[_activeSpell.spell].flags & 0xff) == 1) { + if ((_spellProperties[_activeSpell.spell].flags & 0xFF) == 1) { _activeSpell.target = t; castHealOnSingleCharacter(&_activeSpell); } @@ -1504,7 +1504,7 @@ int LoLEngine::clickedSceneThrowItem(Button *button) { uint16 y = 0; calcCoordinates(x, y, _currentBlock, 0x80, 0x80); - if (launchObject(0, _itemInHand, x, y, 12, _currentDirection << 1, 6, _selectedCharacter, 0x3f)) { + if (launchObject(0, _itemInHand, x, y, 12, _currentDirection << 1, 6, _selectedCharacter, 0x3F)) { snd_playSoundEffect(18, -1); setHandItem(0); } @@ -1520,7 +1520,7 @@ int LoLEngine::clickedOptions(Button *button) { _updateFlags |= 4; Button b; - b.data0Val2 = b.data1Val2 = b.data2Val2 = 0xfe; + b.data0Val2 = b.data1Val2 = b.data2Val2 = 0xFE; b.data0Val3 = b.data1Val3 = b.data2Val3 = 0x01; if (_weaponsDisabled) @@ -1540,7 +1540,7 @@ int LoLEngine::clickedOptions(Button *button) { _gui->runMenu(_gui->_mainMenu); - _updateFlags &= 0xfffb; + _updateFlags &= 0xFFFB; setMouseCursorToItemInHand(); resetLampStatus(); gui_enableDefaultPlayfieldButtons(); @@ -1564,7 +1564,7 @@ int LoLEngine::clickedRestParty(Button *button) { gui_toggleButtonDisplayMode(_flags.isTalkie ? 77 : 75, 1); Button b; - b.data0Val2 = b.data1Val2 = b.data2Val2 = 0xfe; + b.data0Val2 = b.data1Val2 = b.data2Val2 = 0xFE; b.data0Val3 = b.data1Val3 = b.data2Val3 = 0x01; if (_weaponsDisabled) @@ -1710,7 +1710,7 @@ int LoLEngine::clickedRestParty(Button *button) { bool setframe = true; if (_characters[i].flags & 0x1000) { - _characters[i].flags &= 0xefff; + _characters[i].flags &= 0xEFFF; if (_partyAwake) { if (_characters[i].damageSuffered) { @@ -1733,7 +1733,7 @@ int LoLEngine::clickedRestParty(Button *button) { setTemporaryFaceFrame(i, frm, upd, 1); } - _updateFlags &= 0xfffe; + _updateFlags &= 0xFFFE; _partyAwake = true; updateDrawPage2(); gui_drawScene(0); @@ -1742,7 +1742,7 @@ int LoLEngine::clickedRestParty(Button *button) { } else { for (int i = 0; i < 4; i++) - _characters[i].flags &= 0xefff; + _characters[i].flags &= 0xEFFF; if (needPoisoningFlags) { setTemporaryFaceFrameForAllCharacters(0, 0, 0); @@ -1750,7 +1750,7 @@ int LoLEngine::clickedRestParty(Button *button) { if (needPoisoningFlags & (1 << i)) setTemporaryFaceFrame(i, 3, 8, 0); } - _txt->printMessage(0x8000, "%s", getLangString(0x405a)); + _txt->printMessage(0x8000, "%s", getLangString(0x405A)); gui_drawAllCharPortraitsWithStats(); } else { @@ -1773,10 +1773,10 @@ int LoLEngine::clickedCompass(Button *button) { return 0; if (_compassBroken) { - if (characterSays(0x425b, -1, true)) - _txt->printMessage(4, "%s", getLangString(0x425b)); + if (characterSays(0x425B, -1, true)) + _txt->printMessage(4, "%s", getLangString(0x425B)); } else { - _txt->printMessage(0, "%s", getLangString(0x402f + _currentDirection)); + _txt->printMessage(0, "%s", getLangString(0x402F + _currentDirection)); } return 1; @@ -1813,8 +1813,8 @@ int LoLEngine::clickedLamp(Button *button) { _lampOilStatus += 100; } else { - uint16 s = (_lampOilStatus >= 100) ? 0x4060 : ((!_lampOilStatus) ? 0x405c : (_lampOilStatus / 33) + 0x405d); - _txt->printMessage(0, getLangString(0x405b), getLangString(s)); + uint16 s = (_lampOilStatus >= 100) ? 0x4060 : ((!_lampOilStatus) ? 0x405C : (_lampOilStatus / 33) + 0x405D); + _txt->printMessage(0, getLangString(0x405B), getLangString(s)); } if (_brightness) @@ -1836,7 +1836,7 @@ int LoLEngine::clickedStatusIcon(Button *button) { if (str == 0 || str > 3) return 1; - _txt->printMessage(0x8002, "%s", getLangString(str == 1 ? 0x424c : (str == 2 ? 0x424e : 0x424d))); + _txt->printMessage(0x8002, "%s", getLangString(str == 1 ? 0x424C : (str == 2 ? 0x424E : 0x424D))); return 1; } @@ -2239,7 +2239,7 @@ int GUI_LoL::runMenu(Menu &menu) { if (_currentMenu == &_gameOptions) { char *s = (char *)_vm->_tempBuffer5120; - Common::strlcpy(s, _vm->getLangString(0x406f + _vm->_monsterDifficulty), 30); + Common::strlcpy(s, _vm->getLangString(0x406F + _vm->_monsterDifficulty), 30); _currentMenu->item[_vm->gameFlags().isTalkie ? 0 : 2].itemString = s; s += (strlen(s) + 1); @@ -2252,7 +2252,7 @@ int GUI_LoL::runMenu(Menu &menu) { s += (strlen(s) + 1); if (_vm->gameFlags().isTalkie) { - Common::strlcpy(s, _vm->getLangString(0x42d6 + _vm->_lang), 30); + Common::strlcpy(s, _vm->getLangString(0x42D6 + _vm->_lang), 30); _currentMenu->item[3].itemString = s; s += (strlen(s) + 1); @@ -2315,7 +2315,7 @@ int GUI_LoL::runMenu(Menu &menu) { for (int ii = 0; ii < 3; ++ii) { Button *b = getButtonListData() + 1 + (i - 1) * 3 + ii; b->nextButton = 0; - b->data0Val2 = b->data1Val2 = b->data2Val2 = 0xfe; + b->data0Val2 = b->data1Val2 = b->data2Val2 = 0xFE; b->data0Val3 = b->data1Val3 = b->data2Val3 = 0x01; b->index = ii; @@ -2367,9 +2367,9 @@ int GUI_LoL::runMenu(Menu &menu) { int mw = (d->w << 3) + 1; int mh = d->h + 1; if (_vm->gameFlags().use16ColorMode) { - _screen->drawShadedBox(mx, my, mx + mw + 1, my + mh + 1, 0xdd, 0xff); - _screen->drawLine(true, mx + mw + 1, my, mh + 1, 0xcc); - _screen->drawLine(false, mx, my + mh + 1, mw + 2, 0xcc); + _screen->drawShadedBox(mx, my, mx + mw + 1, my + mh + 1, 0xDD, 0xFF); + _screen->drawLine(true, mx + mw + 1, my, mh + 1, 0xCC); + _screen->drawLine(false, mx, my + mh + 1, mw + 2, 0xCC); } else { _screen->drawShadedBox(mx, my, mx + mw, my + mh, 227, 223); } @@ -2622,7 +2622,7 @@ int GUI_LoL::clickedMainMenu(Button *button) { _newMenu = &_audioOptions; break; case 0x4006: - _choiceMenu.menuNameId = 0x400a; + _choiceMenu.menuNameId = 0x400A; _newMenu = &_choiceMenu; break; case 0x4005: @@ -2677,7 +2677,7 @@ int GUI_LoL::clickedDeleteMenu(Button *button) { return 1; } - _choiceMenu.menuNameId = 0x400b; + _choiceMenu.menuNameId = 0x400B; _newMenu = &_choiceMenu; int16 s = (int16)button->arg; _menuResult = _deleteMenu.item[-s - 2].saveSlot + 1; @@ -2689,7 +2689,7 @@ int GUI_LoL::clickedOptionsMenu(Button *button) { updateMenuButton(button); switch (button->arg) { - case 0xfff9: + case 0xFFF9: _vm->_configMusic ^= 1; _vm->sound()->enableMusic(_vm->_configMusic); @@ -2698,23 +2698,23 @@ int GUI_LoL::clickedOptionsMenu(Button *button) { else _vm->_sound->beginFadeOut(); break; - case 0xfff8: + case 0xFFF8: _vm->_configSounds ^= true; _vm->sound()->enableSFX(_vm->_configSounds); break; - case 0xfff7: + case 0xFFF7: _vm->_monsterDifficulty = (_vm->_monsterDifficulty + 1) % 3; break; - case 0xfff6: + case 0xFFF6: _vm->_smoothScrollingEnabled ^= true; break; - case 0xfff5: + case 0xFFF5: _vm->_floatingCursorsEnabled ^= true; break; - case 0xfff4: + case 0xFFF4: _vm->_lang = (_vm->_lang + 1) % 3; break; - case 0xfff3: + case 0xFFF3: _vm->_configVoice ^= 3; break; case 0x4072: { @@ -2793,7 +2793,7 @@ int GUI_LoL::clickedAudioMenu(Button *button) { } while (1); } else if (button->arg == 5) { _vm->_lastSpeechId = -1; - _vm->snd_playCharacterSpeech(0x42e0, 0, 0); + _vm->snd_playCharacterSpeech(0x42E0, 0, 0); } } diff --git a/engines/kyra/gui_lol.h b/engines/kyra/gui_lol.h index dbf54e41f0..79d4b6b4c9 100644 --- a/engines/kyra/gui_lol.h +++ b/engines/kyra/gui_lol.h @@ -36,9 +36,9 @@ namespace Kyra { menu.width = (dim->w << 3); \ menu.height = (dim->h); \ if (_vm->gameFlags().use16ColorMode) { \ - menu.bkgdColor = 0xcc; \ - menu.color1 = 0xff; \ - menu.color2 = 0xdd; \ + menu.bkgdColor = 0xCC; \ + menu.color1 = 0xFF; \ + menu.color2 = 0xDD; \ } else { \ menu.bkgdColor = 225; \ menu.color1 = 223; \ @@ -49,7 +49,7 @@ namespace Kyra { menu.numberOfItems = d; \ menu.titleX = (dim->sx << 3) + (dim->w << 2); \ menu.titleY = 6; \ - menu.textColor = _vm->gameFlags().use16ColorMode ? 0xe1 : 254; \ + menu.textColor = _vm->gameFlags().use16ColorMode ? 0xE1 : 254; \ menu.scrollUpButtonX = e; \ menu.scrollUpButtonY = f; \ menu.scrollDownButtonX = g; \ @@ -65,13 +65,13 @@ namespace Kyra { item.y = c; \ item.width = d; \ item.height = e; \ - item.textColor = _vm->gameFlags().use16ColorMode ? 0xc1 : 204; \ - item.highlightColor = _vm->gameFlags().use16ColorMode ? 0xe1 : 254; \ + item.textColor = _vm->gameFlags().use16ColorMode ? 0xC1 : 204; \ + item.highlightColor = _vm->gameFlags().use16ColorMode ? 0xE1 : 254; \ item.titleX = -1; \ if (_vm->gameFlags().use16ColorMode) { \ - item.bkgdColor = 0xcc; \ - item.color1 = 0xff; \ - item.color2 = 0xdd; \ + item.bkgdColor = 0xCC; \ + item.color1 = 0xFF; \ + item.color2 = 0xDD; \ } else { \ item.bkgdColor = 225; \ item.color1 = 223; \ diff --git a/engines/kyra/gui_mr.cpp b/engines/kyra/gui_mr.cpp index 37526f9a5f..bcbfe27b69 100644 --- a/engines/kyra/gui_mr.cpp +++ b/engines/kyra/gui_mr.cpp @@ -25,7 +25,7 @@ #include "kyra/text_mr.h" #include "kyra/resource.h" #include "kyra/timer.h" -#include "kyra/sound.h" +#include "kyra/sound_digital.h" #include "common/system.h" diff --git a/engines/kyra/gui_rpg.cpp b/engines/kyra/gui_rpg.cpp index be40050bb1..ab25f95df8 100644 --- a/engines/kyra/gui_rpg.cpp +++ b/engines/kyra/gui_rpg.cpp @@ -76,8 +76,8 @@ void KyraRpgEngine::gui_drawHorizontalBarGraph(int x, int y, int w, int h, int32 screen()->fillRect(x + t, y, x + w - 1, y + h, col2); } -void KyraRpgEngine::gui_initButtonsFromList(const int16 *list) { - while (*list != -1) +void KyraRpgEngine::gui_initButtonsFromList(const uint8 *list) { + while (*list != 0xFF) gui_initButton(*list++); } @@ -107,7 +107,7 @@ bool KyraRpgEngine::clickedShape(int shapeIndex) { uint16 s = _levelDecorationProperties[shapeIndex].shapeIndex[1]; - if (s == 0xffff) + if (s == 0xFFFF) continue; int w = _flags.gameID == GI_LOL ? _levelDecorationShapes[s][3] : (_levelDecorationShapes[s][2] << 3); diff --git a/engines/kyra/items_eob.cpp b/engines/kyra/items_eob.cpp index 0994e12e4f..6c7ccf14dc 100644 --- a/engines/kyra/items_eob.cpp +++ b/engines/kyra/items_eob.cpp @@ -118,7 +118,7 @@ void EoBCoreEngine::setItemPosition(Item *itemQueue, int block, Item item, int p EoBItem *itm = &_items[item]; itm->pos = pos; itm->block = block; - itm->level = block < 0 ? 0xff : _currentLevel; + itm->level = block < 0 ? 0xFF : _currentLevel; if (!*itemQueue) { *itemQueue = itm->next = itm->prev = item; @@ -141,7 +141,7 @@ void EoBCoreEngine::createInventoryItem(EoBCharacter *c, Item itemIndex, int16 i if (itemValue != -1) _items[itemIndex].value = itemValue; - if (itemValue && ((_itemTypes[_items[itemIndex].type].extraProperties & 0x7f) < 4)) + if (itemValue && ((_itemTypes[_items[itemIndex].type].extraProperties & 0x7F) < 4)) _items[itemIndex].flags |= 0x80; if (c->inventory[preferedInventorySlot]) { @@ -208,7 +208,7 @@ int EoBCoreEngine::validateInventorySlotForItem(Item item, int charIndex, int sl } int itm = _characters[charIndex].inventory[slot]; - int ex = _itemTypes[_items[itm].type].extraProperties & 0x7f; + int ex = _itemTypes[_items[itm].type].extraProperties & 0x7F; if (_items[itm].flags & 0x20 && (_flags.gameID == GI_EOB1 || slot < 2)) { if (_flags.gameID == GI_EOB2 && ex > 0 && ex < 4) @@ -216,7 +216,7 @@ int EoBCoreEngine::validateInventorySlotForItem(Item item, int charIndex, int sl return 0; } - uint16 v = item ? _itemTypes[_items[item].type].invFlags : 0xffff; + uint16 v = item ? _itemTypes[_items[item].type].invFlags : 0xFFFF; if (v & _slotValidationFlags[slot]) return 1; @@ -359,7 +359,7 @@ void EoBCoreEngine::printFullItemName(Item item) { EoBItem *itm = &_items[item]; const char *nameUnid = _itemNames[itm->nameUnid]; const char *nameId = _itemNames[itm->nameId]; - uint8 f = _itemTypes[itm->type].extraProperties & 0x7f; + uint8 f = _itemTypes[itm->type].extraProperties & 0x7F; int8 v = itm->value; const char *tstr2 = 0; diff --git a/engines/kyra/items_hof.cpp b/engines/kyra/items_hof.cpp index ef2c50c0c5..e1d3c659de 100644 --- a/engines/kyra/items_hof.cpp +++ b/engines/kyra/items_hof.cpp @@ -84,7 +84,7 @@ bool KyraEngine_HoF::dropItem(int unk1, Item item, int x, int y, int unk2) { bool success = processItemDrop(_mainCharacter.sceneId, item, x, y, unk1, unk2); if (!success) { - snd_playSoundEffect(0x0d); + snd_playSoundEffect(0x0D); if (countAllItems() >= 30) showMessageFromCCode(5, 0x84, 0); } @@ -205,7 +205,7 @@ void KyraEngine_HoF::itemDropDown(int startX, int startY, int dstX, int dstY, in if (startX == dstX && startY == dstY) { if (_layerFlagTable[_screen->getLayer(dstX, dstY)] && item != 13) { updateCharFacing(); - snd_playSoundEffect(0x2d); + snd_playSoundEffect(0x2D); removeHandItem(); objectChat(getTableString(0xFF, _cCodeBuffer, 1), 0, 0x83, 0xFF); } else { @@ -213,7 +213,7 @@ void KyraEngine_HoF::itemDropDown(int startX, int startY, int dstX, int dstY, in _itemList[itemSlot].y = dstY; _itemList[itemSlot].id = item; _itemList[itemSlot].sceneId = _mainCharacter.sceneId; - snd_playSoundEffect(0x0c); + snd_playSoundEffect(0x0C); addItemToAnimList(itemSlot); } } else { @@ -283,7 +283,7 @@ void KyraEngine_HoF::itemDropDown(int startX, int startY, int dstX, int dstY, in if (_layerFlagTable[_screen->getLayer(dstX, dstY)] && item != 13) { updateCharFacing(); - snd_playSoundEffect(0x2d); + snd_playSoundEffect(0x2D); removeHandItem(); _screen->showMouse(); objectChat(getTableString(0xFF, _cCodeBuffer, 1), 0, 0x83, 0xFF); @@ -292,7 +292,7 @@ void KyraEngine_HoF::itemDropDown(int startX, int startY, int dstX, int dstY, in _itemList[itemSlot].y = dstY; _itemList[itemSlot].id = item; _itemList[itemSlot].sceneId = _mainCharacter.sceneId; - snd_playSoundEffect(0x0c); + snd_playSoundEffect(0x0C); addItemToAnimList(itemSlot); _screen->showMouse(); } @@ -307,7 +307,7 @@ void KyraEngine_HoF::exchangeMouseItem(int itemPos) { _itemInHand = itemId; addItemToAnimList(itemPos); - snd_playSoundEffect(0x0b); + snd_playSoundEffect(0x0B); setMouseCursor(_itemInHand); int str2 = 7; @@ -331,7 +331,7 @@ bool KyraEngine_HoF::pickUpItem(int x, int y) { deleteItemAnimEntry(itemPos); int itemId = _itemList[itemPos].id; _itemList[itemPos].id = kItemNone; - snd_playSoundEffect(0x0b); + snd_playSoundEffect(0x0B); setMouseCursor(itemId); int str2 = 7; diff --git a/engines/kyra/items_lok.cpp b/engines/kyra/items_lok.cpp index b92cd616c1..8ee07e8271 100644 --- a/engines/kyra/items_lok.cpp +++ b/engines/kyra/items_lok.cpp @@ -29,9 +29,9 @@ namespace Kyra { int KyraEngine_LoK::findDuplicateItemShape(int shape) { static const uint8 dupTable[] = { - 0x48, 0x46, 0x49, 0x47, 0x4a, 0x46, 0x4b, 0x47, - 0x4c, 0x46, 0x4d, 0x47, 0x5b, 0x5a, 0x5c, 0x5a, - 0x5d, 0x5a, 0x5e, 0x5a, 0xFF, 0xFF + 0x48, 0x46, 0x49, 0x47, 0x4A, 0x46, 0x4B, 0x47, + 0x4C, 0x46, 0x4D, 0x47, 0x5B, 0x5A, 0x5C, 0x5A, + 0x5D, 0x5A, 0x5E, 0x5A, 0xFF, 0xFF }; int i = 0; diff --git a/engines/kyra/items_lol.cpp b/engines/kyra/items_lol.cpp index 409b53f6f0..f7fd04bab8 100644 --- a/engines/kyra/items_lol.cpp +++ b/engines/kyra/items_lol.cpp @@ -29,7 +29,7 @@ namespace Kyra { LoLObject *LoLEngine::findObject(uint16 index) { if (index & 0x8000) - return &_monsters[index & 0x7fff]; + return &_monsters[index & 0x7FFF]; else return &_itemsInPlay[index]; } @@ -221,7 +221,7 @@ Item LoLEngine::makeItem(int itemType, int curFrame, int flags) { memset(&_itemsInPlay[slot], 0, sizeof(LoLItem)); _itemsInPlay[slot].itemPropertyIndex = itemType; - _itemsInPlay[slot].shpCurFrame_flg = (curFrame & 0x1fff) | flags; + _itemsInPlay[slot].shpCurFrame_flg = (curFrame & 0x1FFF) | flags; _itemsInPlay[slot].level = -1; return slot; @@ -292,7 +292,7 @@ void LoLEngine::runItemScript(int charNum, Item item, int flags, int next, int r memset(&scriptState, 0, sizeof(EMCState)); uint8 func = item ? _itemProperties[_itemsInPlay[item].itemPropertyIndex].itemScriptFunc : 3; - if (func == 0xff) + if (func == 0xFF) return; _emc->init(&scriptState, &_itemScript); @@ -351,8 +351,8 @@ bool LoLEngine::itemEquipped(int charNum, uint16 itemType) { void LoLEngine::setItemPosition(Item item, uint16 x, uint16 y, int flyingHeight, int moveable) { if (!flyingHeight) { - x = (x & 0xffc0) | 0x40; - y = (y & 0xffc0) | 0x40; + x = (x & 0xFFC0) | 0x40; + y = (y & 0xFFC0) | 0x40; } uint16 block = calcBlockIndex(x, y); @@ -364,7 +364,7 @@ void LoLEngine::setItemPosition(Item item, uint16 x, uint16 y, int flyingHeight, if (moveable) _itemsInPlay[item].shpCurFrame_flg |= 0x4000; else - _itemsInPlay[item].shpCurFrame_flg &= 0xbfff; + _itemsInPlay[item].shpCurFrame_flg &= 0xBFFF; assignItemToBlock(&_levelBlockProperties[block].assignedObjects, item); @@ -429,9 +429,9 @@ bool LoLEngine::launchObject(int objectType, Item item, int startX, int startY, if (attackerId != -1) { if (attackerId & 0x8000) { - t->flags &= 0xfd; + t->flags &= 0xFD; } else { - t->flags &= 0xfb; + t->flags &= 0xFB; increaseExperience(attackerId, 1, 2); } } @@ -455,8 +455,8 @@ void LoLEngine::endObjectFlight(FlyingObject *t, int x, int y, int collisionType if (t->objectType == 0 || t->objectType == 1) { objectFlightProcessHits(t, cx, cy, collisionType); - t->x = (cx & 0xffc0) | 0x40; - t->y = (cy & 0xffc0) | 0x40; + t->x = (cx & 0xFFC0) | 0x40; + t->y = (cy & 0xFFC0) | 0x40; t->flyingHeight = 0; updateObjectFlightPosition(t); } diff --git a/engines/kyra/kyra_hof.cpp b/engines/kyra/kyra_hof.cpp index 7fbecb7f53..b180285ffc 100644 --- a/engines/kyra/kyra_hof.cpp +++ b/engines/kyra/kyra_hof.cpp @@ -52,13 +52,6 @@ KyraEngine_HoF::KyraEngine_HoF(OSystem *system, const GameFlags &flags) : KyraEn _screen = 0; _text = 0; - _seqProcessedString = 0; - _activeWSA = 0; - _activeText = 0; - _seqWsa = 0; - _sequences = 0; - _sequenceSoundList = 0; - _gamePlayBuffer = 0; _cCodeBuffer = _optionsBuffer = _chapterBuffer = 0; @@ -89,7 +82,6 @@ KyraEngine_HoF::KyraEngine_HoF(OSystem *system, const GameFlags &flags) : KyraEn memset(&_invWsa, 0, sizeof(_invWsa)); _itemAnimDefinition = 0; - _demoAnimData = 0; _nextAnimItem = 0; for (int i = 0; i < 15; i++) @@ -136,7 +128,6 @@ KyraEngine_HoF::KyraEngine_HoF(OSystem *system, const GameFlags &flags) : KyraEn memset(_cauldronStateTables, 0, sizeof(_cauldronStateTables)); _menuDirectlyToLoad = false; - _menu = 0; _chatIsNote = false; memset(&_npcScriptData, 0, sizeof(_npcScriptData)); @@ -148,7 +139,6 @@ KyraEngine_HoF::KyraEngine_HoF(OSystem *system, const GameFlags &flags) : KyraEn KyraEngine_HoF::~KyraEngine_HoF() { cleanup(); - seq_uninit(); delete _screen; delete _text; @@ -157,15 +147,6 @@ KyraEngine_HoF::~KyraEngine_HoF() { _text = 0; delete _invWsa.wsa; - if (_sequenceSoundList) { - for (int i = 0; i < _sequenceSoundListSize; i++) { - if (_sequenceSoundList[i]) - delete[] _sequenceSoundList[i]; - } - delete[] _sequenceSoundList; - _sequenceSoundList = NULL; - } - delete[] _dlgBuffer; for (int i = 0; i < 19; i++) delete[] _conversationState[i]; @@ -179,41 +160,13 @@ KyraEngine_HoF::~KyraEngine_HoF() { void KyraEngine_HoF::pauseEngineIntern(bool pause) { KyraEngine_v2::pauseEngineIntern(pause); + seq_pausePlayer(pause); + if (!pause) { uint32 pausedTime = _system->getMillis() - _pauseStart; _pauseStart = 0; - // sequence player - // - // Timers in KyraEngine_HoF::seq_cmpFadeFrame() and KyraEngine_HoF::seq_animatedSubFrame() - // have been left out for now. I think we don't need them here. - - _seqStartTime += pausedTime; - _seqSubFrameStartTime += pausedTime; - _seqEndTime += pausedTime; - _seqSubFrameEndTimeInternal += pausedTime; - _seqWsaChatTimeout += pausedTime; - _seqWsaChatFrameTimeout += pausedTime; - - if (_activeText) { - for (int x = 0; x < 10; x++) { - if (_activeText[x].duration != -1) - _activeText[x].startTime += pausedTime; - } - } - - if (_activeWSA) { - for (int x = 0; x < 8; x++) { - if (_activeWSA[x].flags != -1) - _activeWSA[x].nextFrame += pausedTime; - } - } - _nextIdleAnim += pausedTime; - - for (int x = 0; x < _itemAnimDefinitionSize; x++) - _activeItemAnim[x].nextFrameTime += pausedTime; - _tim->refreshTimersAfterPause(pausedTime); } } @@ -244,8 +197,6 @@ Common::Error KyraEngine_HoF::init() { _screen->loadFont(_screen->FID_8_FNT, "8FAT.FNT"); _screen->loadFont(_screen->FID_BOOKFONT_FNT, "BOOKFONT.FNT"); } - _screen->loadFont(_screen->FID_GOLDFONT_FNT, "GOLDFONT.FNT"); - _screen->setFont(_flags.lang == Common::JA_JPN ? Screen::FID_SJIS_FNT : _screen->FID_8_FNT); _screen->setAnimBlockPtr(3504); @@ -254,13 +205,6 @@ Common::Error KyraEngine_HoF::init() { if (!_sound->init()) error("Couldn't init sound"); - _abortIntroFlag = false; - - if (_sequenceStrings) { - for (int i = 0; i < MIN(33, _sequenceStringsSize); i++) - _sequenceStringsDuration[i] = (int) strlen(_sequenceStrings[i]) * 8; - } - // No mouse display in demo if (_flags.isDemo && !_flags.isTalkie) return Common::kNoError; @@ -279,28 +223,24 @@ Common::Error KyraEngine_HoF::init() { } Common::Error KyraEngine_HoF::go() { + int menuChoice = 0; + if (_gameToLoad == -1) { if (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98) seq_showStarcraftLogo(); if (_flags.isDemo && !_flags.isTalkie) { -#ifdef ENABLE_LOL - if (_flags.gameID == GI_LOL) - seq_playSequences(kSequenceLoLDemoScene1, kSequenceLoLDemoScene6); - else -#endif // ENABLE_LOL - seq_playSequences(kSequenceDemoVirgin, kSequenceDemoFisher); - _menuChoice = 4; + menuChoice = seq_playDemo(); } else { - seq_playSequences(kSequenceVirgin, kSequenceZanfaun); + menuChoice = seq_playIntro(); } } else { - _menuChoice = 1; + menuChoice = 1; } _res->unloadAllPakFiles(); - if (_menuChoice != 4) { + if (menuChoice != 4) { // load just the pak files needed for ingame _staticres->loadStaticResourceFile(); @@ -317,24 +257,24 @@ Common::Error KyraEngine_HoF::go() { } } - _menuDirectlyToLoad = (_menuChoice == 3) ? true : false; + _menuDirectlyToLoad = (menuChoice == 3) ? true : false; _menuDirectlyToLoad &= saveFileLoadable(0); - if (_menuChoice & 1) { + if (menuChoice & 1) { startup(); if (!shouldQuit()) runLoop(); cleanup(); if (_showOutro) - seq_playSequences(kSequenceFunters, kSequenceFrash); + seq_playOutro(); } return Common::kNoError; } void KyraEngine_HoF::startup() { - _sound->setSoundList(&_soundData[kMusicIngame]); + _sound->selectAudioResourceSet(kMusicIngame); // The track map is exactly the same // for FM-TOWNS and DOS _trackMap = _dosTrackMap; @@ -1508,7 +1448,7 @@ void KyraEngine_HoF::snd_playSoundEffect(int track, int volume) { int16 vocIndex = (int16)READ_LE_UINT16(&_ingameSoundIndex[track * 2]); if (vocIndex != -1) { - _sound->voicePlay(_ingameSoundList[vocIndex], 0, 255, true); + _sound->voicePlay(_ingameSoundList[vocIndex], 0, 255, 255, true); } else if (_flags.platform == Common::kPlatformPC) { if (_sound->getSfxType() == Sound::kMidiMT32) track = track < _mt32SfxMapSize ? _mt32SfxMap[track] - 1 : -1; diff --git a/engines/kyra/kyra_hof.h b/engines/kyra/kyra_hof.h index 182854cdf1..1b84e5b56f 100644 --- a/engines/kyra/kyra_hof.h +++ b/engines/kyra/kyra_hof.h @@ -35,158 +35,13 @@ namespace Kyra { -enum Sequences { - kSequenceVirgin = 0, - kSequenceWestwood, - kSequenceTitle, - kSequenceOverview, - kSequenceLibrary, - kSequenceHand, - kSequencePoint, - kSequenceZanfaun, - - kSequenceFunters, - kSequenceFerb, - kSequenceFish, - kSequenceFheep, - kSequenceFarmer, - kSequenceFuards, - kSequenceFirates, - kSequenceFrash, - - kSequenceArraySize -}; - -enum NestedSequences { - kSequenceFiggle = 0, - kSequenceOver1, - kSequenceOver2, - kSequenceForest, - kSequenceDragon, - kSequenceDarm, - kSequenceLibrary2, - kSequenceLibrary3, - kSequenceMarco, - kSequenceHand1a, - kSequenceHand1b, - kSequenceHand1c, - kSequenceHand2, - kSequenceHand3, - kSequenceHand4 -}; - -enum SequencesDemo { - kSequenceDemoVirgin = 0, - kSequenceDemoWestwood, - kSequenceDemoTitle, - kSequenceDemoHill, - kSequenceDemoOuthome, - kSequenceDemoWharf, - kSequenceDemoDinob, - kSequenceDemoFisher -}; - -enum NestedSequencesDemo { - kSequenceDemoWharf2 = 0, - kSequenceDemoDinob2, - kSequenceDemoWater, - kSequenceDemoBail, - kSequenceDemoDig -}; - -#ifdef ENABLE_LOL -enum SequencesLoLDemo { - kSequenceLoLDemoScene1 = 0, - kSequenceLoLDemoText1, - kSequenceLoLDemoScene2, - kSequenceLoLDemoText2, - kSequenceLoLDemoScene3, - kSequenceLoLDemoText3, - kSequenceLoLDemoScene4, - kSequenceLoLDemoText4, - kSequenceLoLDemoScene5, - kSequenceLoLDemoText5, - kSequenceLoLDemoScene6 -}; -#endif // ENABLE_LOL - -class WSAMovie_v2; -class KyraEngine_HoF; +//class WSAMovie_v2; +//class KyraEngine_HoF; class TextDisplayer_HoF; +class SeqPlayer_HOF; struct TIM; -typedef int (KyraEngine_HoF::*SeqProc)(WSAMovie_v2 *, int, int, int); - -struct ActiveWSA { - SeqProc callback; - WSAMovie_v2 *movie; - const FrameControl *control; - int16 flags; - uint16 startFrame; - uint16 endFrame; - uint16 frameDelay; - uint32 nextFrame; - uint16 currentFrame; - uint16 lastFrame; - uint16 x; - uint16 y; - uint16 startupCommand; - uint16 finalCommand; -}; - -struct ActiveText { - uint16 strIndex; - uint16 x; - uint16 y; - uint16 width; - int32 duration; - uint32 startTime; - int16 textcolor; -}; - -struct Sequence { - const char *wsaFile; - const char *cpsFile; - uint16 flags; - uint8 startupCommand; - uint8 finalCommand; - int16 stringIndex1; - int16 stringIndex2; - uint16 startFrame; - uint16 numFrames; - uint16 frameDelay; - uint16 xPos; - uint16 yPos; - uint16 duration; -}; - -struct NestedSequence { - const char *wsaFile; - const FrameControl *wsaControl; - uint16 flags; - uint16 startframe; - uint16 endFrame; - uint16 frameDelay; - uint16 x; - uint16 y; - uint16 startupCommand; - uint16 finalCommand; -}; - -struct HofSeqData { - const Sequence *seq; - int numSeq; - const NestedSequence *seqn; - int numSeqn; -}; - -struct ItemAnimData_v1 { - int16 itemIndex; - uint16 y; - const uint16 *frames; -}; - class KyraEngine_HoF : public KyraEngine_v2 { friend class Debugger_HoF; friend class TextDisplayer_HoF; @@ -202,98 +57,18 @@ public: GUI *gui() const { return _gui; } virtual TextDisplayer *text() { return _text; } int language() const { return _lang; } + protected: static const EngineDesc _hofEngineDesc; // intro/outro - void seq_playSequences(int startSeq, int endSeq = -1); - - int seq_introWestwood(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_introTitle(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_introOverview(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_introLibrary(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_introHand(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_introPoint(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_introZanfaun(WSAMovie_v2 *wsaObj, int x, int y, int frm); - - int seq_introOver1(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_introOver2(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_introForest(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_introDragon(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_introDarm(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_introLibrary2(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_introMarco(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_introHand1a(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_introHand1b(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_introHand1c(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_introHand2(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_introHand3(WSAMovie_v2 *wsaObj, int x, int y, int frm); - - int seq_finaleFunters(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_finaleFerb(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_finaleFish(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_finaleFheep(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_finaleFarmer(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_finaleFuards(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_finaleFirates(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_finaleFrash(WSAMovie_v2 *wsaObj, int x, int y, int frm); - - int seq_finaleFiggle(WSAMovie_v2 *wsaObj, int x, int y, int frm); - - int seq_demoVirgin(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_demoWestwood(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_demoTitle(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_demoHill(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_demoOuthome(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_demoWharf(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_demoDinob(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_demoFisher(WSAMovie_v2 *wsaObj, int x, int y, int frm); - - int seq_demoWharf2(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_demoDinob2(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_demoWater(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_demoBail(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_demoDig(WSAMovie_v2 *wsaObj, int x, int y, int frm); - -#ifdef ENABLE_LOL - int seq_lolDemoScene1(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_lolDemoScene2(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_lolDemoScene3(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_lolDemoScene4(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_lolDemoScene5(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_lolDemoText5(WSAMovie_v2 *wsaObj, int x, int y, int frm); - int seq_lolDemoScene6(WSAMovie_v2 *wsaObj, int x, int y, int frm); -#endif // ENABLE_LOL - - void seq_sequenceCommand(int command); - void seq_loadNestedSequence(int wsaNum, int seqNum); - void seq_nestedSequenceFrame(int command, int wsaNum); - void seq_animatedSubFrame(int srcPage, int dstPage, int delaytime, - int steps, int x, int y, int w, int h, int openClose, int directionFlags); - bool seq_processNextSubFrame(int wsaNum); - void seq_resetActiveWSA(int wsaNum); - void seq_unloadWSA(int wsaNum); - void seq_processWSAs(); - void seq_cmpFadeFrame(const char *cmpFile); - void seq_playTalkText(uint8 chatNum); - void seq_resetAllTextEntries(); - uint32 seq_activeTextsTimeLeft(); - void seq_waitForTextsTimeout(); - int seq_setTextEntry(uint16 strIndex, uint16 posX, uint16 posY, int duration, uint16 width); - void seq_processText(); - char *seq_preprocessString(const char *str, int width); - void seq_printCreditsString(uint16 strIndex, int x, int y, const uint8 *colorMap, uint8 textcolor); - void seq_playWsaSyncDialogue(uint16 strIndex, uint16 vocIndex, int textColor, int x, int y, int width, - WSAMovie_v2 * wsa, int firstframe, int lastframe, int wsaXpos, int wsaYpos); - void seq_finaleActorScreen(); - void seq_displayScrollText(uint8 *data, const ScreenDim *d, int tempPage1, int tempPage2, int speed, int step, Screen::FontId fid1, Screen::FontId fid2, const uint8 *shapeData = 0, const char *const *specialData = 0); - void seq_scrollPage(int bottom, int top); void seq_showStarcraftLogo(); - MainMenu *_menu; + int seq_playIntro(); + int seq_playOutro(); + int seq_playDemo(); - void seq_init(); - void seq_uninit(); + void seq_pausePlayer(bool toggle); Common::Error init(); Common::Error go(); @@ -311,7 +86,6 @@ protected: static const int8 _pcSpkSfxMap[]; static const int _pcSpkSfxMapSize; - AudioDataStruct _soundData[3]; protected: // game initialization void startup(); @@ -841,19 +615,19 @@ protected: bool _chatAltFlag; // sequence player - ActiveWSA *_activeWSA; +/* ActiveWSA *_activeWSA; ActiveText *_activeText; - - const char * const *_sequencePakList; - int _sequencePakListSize; - const char * const *_ingamePakList; + */ + /*const char *const *_sequencePakList; + int _sequencePakListSize;*/ + const char *const *_ingamePakList; int _ingamePakListSize; - const char * const *_musicFileListIntro; + const char *const *_musicFileListIntro; int _musicFileListIntroSize; - const char * const *_musicFileListFinale; + const char *const *_musicFileListFinale; int _musicFileListFinaleSize; - const char * const *_musicFileListIngame; + const char *const *_musicFileListIngame; int _musicFileListIngameSize; const uint8 *_cdaTrackTableIntro; int _cdaTrackTableIntroSize; @@ -861,34 +635,33 @@ protected: int _cdaTrackTableIngameSize; const uint8 *_cdaTrackTableFinale; int _cdaTrackTableFinaleSize; - const char * const *_sequenceSoundList; - int _sequenceSoundListSize; - const char * const *_ingameSoundList; + const char *const *_ingameSoundList; int _ingameSoundListSize; const uint16 *_ingameSoundIndex; int _ingameSoundIndexSize; - const char * const *_sequenceStrings; - int _sequenceStringsSize; const uint16 *_ingameTalkObjIndex; int _ingameTalkObjIndexSize; - const char * const *_ingameTimJpStr; + const char *const *_ingameTimJpStr; int _ingameTimJpStrSize; - const HofSeqData *_sequences; + const ItemAnimDefinition *_itemAnimDefinition; int _itemAnimDefinitionSize; + + /*const HofSeqData *_sequences; + const ItemAnimData_v1 *_demoAnimData; int _demoAnimSize; - int _sequenceStringsDuration[33]; + int _sequenceStringsDuration[33];*/ - static const uint8 _seqTextColorPresets[]; +/* static const uint8 _seqTextColorPresets[]; char *_seqProcessedString; WSAMovie_v2 *_seqWsa; bool _abortIntroFlag; - int _menuChoice; + int _menuChoice;*/ - uint32 _seqFrameDelay; + /*uint32 _seqFrameDelay; uint32 _seqStartTime; uint32 _seqSubFrameStartTime; uint32 _seqEndTime; @@ -902,10 +675,7 @@ protected: bool _seqSpecialFlag; bool _seqSubframePlaying; uint8 _seqTextColor[2]; - uint8 _seqTextColorMap[16]; - - const SeqProc *_callbackS; - const SeqProc *_callbackN; + uint8 _seqTextColorMap[16];*/ static const uint8 _rainbowRoomData[]; diff --git a/engines/kyra/kyra_lok.cpp b/engines/kyra/kyra_lok.cpp index 27bc2ad22a..7d4e35092f 100644 --- a/engines/kyra/kyra_lok.cpp +++ b/engines/kyra/kyra_lok.cpp @@ -98,8 +98,6 @@ KyraEngine_LoK::KyraEngine_LoK(OSystem *system, const GameFlags &flags) _malcolmFrame = 0; _malcolmTimer1 = _malcolmTimer2 = 0; - - _soundFiles = 0; } KyraEngine_LoK::~KyraEngine_LoK() { @@ -123,8 +121,6 @@ KyraEngine_LoK::~KyraEngine_LoK() { delete _animator; delete _seq; - delete[] _soundFiles; - delete[] _characterList; delete[] _roomTable; @@ -194,7 +190,7 @@ Common::Error KyraEngine_LoK::init() { initStaticResource(); - _sound->setSoundList(&_soundData[kMusicIntro]); + _sound->selectAudioResourceSet(kMusicIntro); if (_flags.platform == Common::kPlatformAmiga) { _trackMap = _amigaTrackMap; @@ -349,7 +345,7 @@ void KyraEngine_LoK::startup() { static const uint8 colorMap[] = { 0, 0, 0, 0, 12, 12, 12, 0, 0, 0, 0, 0 }; _screen->setTextColorMap(colorMap); - _sound->setSoundList(&_soundData[kMusicIngame]); + _sound->selectAudioResourceSet(kMusicIngame); if (_flags.platform == Common::kPlatformPC98) _sound->loadSoundFile("SE.DAT"); else diff --git a/engines/kyra/kyra_lok.h b/engines/kyra/kyra_lok.h index e5fb3cddca..def5cbcf6f 100644 --- a/engines/kyra/kyra_lok.h +++ b/engines/kyra/kyra_lok.h @@ -126,13 +126,13 @@ public: typedef bool (KyraEngine_LoK::*IntroProc)(); // static data access - const char * const *seqWSATable() { return _seq_WSATable; } - const char * const *seqCPSTable() { return _seq_CPSTable; } - const char * const *seqCOLTable() { return _seq_COLTable; } - const char * const *seqTextsTable() { return _seq_textsTable; } + const char *const *seqWSATable() { return _seq_WSATable; } + const char *const *seqCPSTable() { return _seq_CPSTable; } + const char *const *seqCOLTable() { return _seq_COLTable; } + const char *const *seqTextsTable() { return _seq_textsTable; } - const uint8 * const *palTable1() { return &_specialPalettes[0]; } - const uint8 * const *palTable2() { return &_specialPalettes[29]; } + const uint8 *const *palTable1() { return &_specialPalettes[0]; } + const uint8 *const *palTable2() { return &_specialPalettes[29]; } protected: virtual Common::Error go(); @@ -538,12 +538,12 @@ protected: const uint8 *_seq_Demo4; const uint8 *_seq_Reunion; - const char * const *_seq_WSATable; - const char * const *_seq_CPSTable; - const char * const *_seq_COLTable; - const char * const *_seq_textsTable; + const char *const *_seq_WSATable; + const char *const *_seq_CPSTable; + const char *const *_seq_COLTable; + const char *const *_seq_textsTable; - const char * const *_storyStrings; + const char *const *_storyStrings; int _seq_WSATable_Size; int _seq_CPSTable_Size; @@ -552,25 +552,25 @@ protected: int _storyStringsSize; - const char * const *_itemList; - const char * const *_takenList; - const char * const *_placedList; - const char * const *_droppedList; - const char * const *_noDropList; - const char * const *_putDownFirst; - const char * const *_waitForAmulet; - const char * const *_blackJewel; - const char * const *_poisonGone; - const char * const *_healingTip; - const char * const *_thePoison; - const char * const *_fluteString; - const char * const *_wispJewelStrings; - const char * const *_magicJewelString; - const char * const *_flaskFull; - const char * const *_fullFlask; - const char * const *_veryClever; - const char * const *_homeString; - const char * const *_newGameString; + const char *const *_itemList; + const char *const *_takenList; + const char *const *_placedList; + const char *const *_droppedList; + const char *const *_noDropList; + const char *const *_putDownFirst; + const char *const *_waitForAmulet; + const char *const *_blackJewel; + const char *const *_poisonGone; + const char *const *_healingTip; + const char *const *_thePoison; + const char *const *_fluteString; + const char *const *_wispJewelStrings; + const char *const *_magicJewelString; + const char *const *_flaskFull; + const char *const *_fullFlask; + const char *const *_veryClever; + const char *const *_homeString; + const char *const *_newGameString; int _itemList_Size; int _takenList_Size; @@ -592,13 +592,13 @@ protected: int _homeString_Size; int _newGameString_Size; - const char * const *_characterImageTable; + const char *const *_characterImageTable; int _characterImageTableSize; - const char * const *_guiStrings; + const char *const *_guiStrings; int _guiStringsSize; - const char * const *_configStrings; + const char *const *_configStrings; int _configStringsSize; Shape *_defaultShapeTable; @@ -636,20 +636,12 @@ protected: Room *_roomTable; int _roomTableSize; - const char * const *_roomFilenameTable; + const char *const *_roomFilenameTable; int _roomFilenameTableSize; const uint8 *_amuleteAnim; - const uint8 * const *_specialPalettes; - - const char * const *_soundFiles; - int _soundFilesSize; - const char * const *_soundFilesIntro; - int _soundFilesIntroSize; - const int32 *_cdaTrackTable; - int _cdaTrackTableSize; - AudioDataStruct _soundData[3]; + const uint8 *const *_specialPalettes; // positions of the inventory static const uint16 _itemPosX[]; diff --git a/engines/kyra/kyra_mr.cpp b/engines/kyra/kyra_mr.cpp index 448e4ef70d..48ba96ec8b 100644 --- a/engines/kyra/kyra_mr.cpp +++ b/engines/kyra/kyra_mr.cpp @@ -28,7 +28,7 @@ #include "kyra/debugger.h" #include "kyra/gui_mr.h" #include "kyra/resource.h" -#include "kyra/sound.h" +#include "kyra/sound_digital.h" #include "common/system.h" #include "common/config-manager.h" @@ -213,8 +213,6 @@ Common::Error KyraEngine_MR::init() { _soundDigital = new SoundDigital(this, _mixer); assert(_soundDigital); - if (!_soundDigital->init()) - error("_soundDigital->init() failed"); KyraEngine_v1::_text = _text = new TextDisplayer_MR(this, _screen); assert(_text); _gui = new GUI_MR(this); @@ -724,7 +722,7 @@ void KyraEngine_MR::loadCharacterShapes(int newShapes) { static const uint8 numberOffset[] = { 3, 3, 4, 4, 3, 3 }; static const uint8 startShape[] = { 0x32, 0x58, 0x78, 0x98, 0xB8, 0xD8 }; static const uint8 endShape[] = { 0x57, 0x77, 0x97, 0xB7, 0xD7, 0xF7 }; - static const char * const filenames[] = { + static const char *const filenames[] = { "MSW##.SHP", "MTA##.SHP", "MTFL##.SHP", diff --git a/engines/kyra/kyra_mr.h b/engines/kyra/kyra_mr.h index 004236ca04..d194fedd4d 100644 --- a/engines/kyra/kyra_mr.h +++ b/engines/kyra/kyra_mr.h @@ -182,11 +182,11 @@ private: private: // main menu - const char * const *_mainMenuStrings; + const char *const *_mainMenuStrings; int _mainMenuStringsSize; - static const char * const _mainMenuSpanishFan[]; - static const char * const _mainMenuItalianFan[]; + static const char *const _mainMenuSpanishFan[]; + static const char *const _mainMenuItalianFan[]; // animator uint8 *_gamePlayBuffer; diff --git a/engines/kyra/kyra_rpg.cpp b/engines/kyra/kyra_rpg.cpp index f1d9550e8f..f8eb7d00cd 100644 --- a/engines/kyra/kyra_rpg.cpp +++ b/engines/kyra/kyra_rpg.cpp @@ -46,12 +46,7 @@ KyraRpgEngine::KyraRpgEngine(OSystem *system, const GameFlags &flags) : KyraEngi _vcnTransitionMask = 0; _vcnShift = 0; _vcnColTable = 0; - _vcnBlockWidth = 4; - _vcnBlockHeight = 8; - _vcnFlip0 = 0; - _vcnFlip1 = 1; _vmpPtr = 0; - _vmpSize = 0; _blockBrightness = _wllVcnOffset = 0; _blockDrawingBuffer = 0; _sceneWindowBuffer = 0; @@ -173,9 +168,8 @@ Common::Error KyraRpgEngine::init() { _blockDrawingBuffer = new uint16[1320]; memset(_blockDrawingBuffer, 0, 1320 * sizeof(uint16)); - uint32 swbSize = 22 * _vcnBlockWidth * 2 * 15 * _vcnBlockHeight; - _sceneWindowBuffer = new uint8[swbSize]; - memset(_sceneWindowBuffer, 0, swbSize); + _sceneWindowBuffer = new uint8[21120]; + memset(_sceneWindowBuffer, 0, 21120); _lvlShapeTop = new int16[18]; memset(_lvlShapeTop, 0, 18 * sizeof(int16)); @@ -186,7 +180,7 @@ Common::Error KyraRpgEngine::init() { _vcnColTable = new uint8[128]; for (int i = 0; i < 128; i++) - _vcnColTable[i] = i & 0x0f; + _vcnColTable[i] = i & 0x0F; _doorShapes = new uint8*[6]; memset(_doorShapes, 0, 6 * sizeof(uint8 *)); @@ -210,18 +204,19 @@ bool KyraRpgEngine::posWithinRect(int posX, int posY, int x1, int y1, int x2, in void KyraRpgEngine::drawDialogueButtons() { int cp = screen()->setCurPage(0); - Screen::FontId of = screen()->setFont(gameFlags().use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_6_FNT); + Screen::FontId of = screen()->setFont(_flags.lang == Common::JA_JPN && _flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_6_FNT); for (int i = 0; i < _dialogueNumButtons; i++) { int x = _dialogueButtonPosX[i]; - if (gameFlags().use16ColorMode) { - gui_drawBox(x, ((_dialogueButtonYoffs + _dialogueButtonPosY[i]) & ~7) - 1, 74, 10, 0xee, 0xcc, -1); + if (_flags.lang == Common::JA_JPN && _flags.use16ColorMode) { + gui_drawBox(x, ((_dialogueButtonYoffs + _dialogueButtonPosY[i]) & ~7) - 1, 74, 10, 0xEE, 0xCC, -1); screen()->printText(_dialogueButtonString[i], (x + 37 - (screen()->getTextWidth(_dialogueButtonString[i])) / 2) & ~3, - ((_dialogueButtonYoffs + _dialogueButtonPosY[i]) + 2) & ~7, _dialogueHighlightedButton == i ? 0xc1 : 0xe1, 0); + ((_dialogueButtonYoffs + _dialogueButtonPosY[i]) + 2) & ~7, _dialogueHighlightedButton == i ? 0xC1 : 0xE1, 0); } else { + int sjisYOffset = (_flags.lang == Common::JA_JPN && _dialogueButtonString[i][0] < 0) ? 2 : 0; gui_drawBox(x, (_dialogueButtonYoffs + _dialogueButtonPosY[i]), _dialogueButtonWidth, guiSettings()->buttons.height, guiSettings()->colors.frame1, guiSettings()->colors.frame2, guiSettings()->colors.fill); screen()->printText(_dialogueButtonString[i], x + (_dialogueButtonWidth >> 1) - (screen()->getTextWidth(_dialogueButtonString[i])) / 2, - (_dialogueButtonYoffs + _dialogueButtonPosY[i]) + 2, _dialogueHighlightedButton == i ? _dialogueButtonLabelColor1 : _dialogueButtonLabelColor2, 0); + (_dialogueButtonYoffs + _dialogueButtonPosY[i]) + 2 - sjisYOffset, _dialogueHighlightedButton == i ? _dialogueButtonLabelColor1 : _dialogueButtonLabelColor2, 0); } } screen()->setFont(of); @@ -234,7 +229,7 @@ uint16 KyraRpgEngine::processDialogue() { for (int i = 0; i < _dialogueNumButtons; i++) { int x = _dialogueButtonPosX[i]; - int y = (gameFlags().use16ColorMode ? ((_dialogueButtonYoffs + _dialogueButtonPosY[i]) & ~7) - 1 : (_dialogueButtonYoffs + _dialogueButtonPosY[i])); + int y = ((_flags.lang == Common::JA_JPN && _flags.use16ColorMode) ? ((_dialogueButtonYoffs + _dialogueButtonPosY[i]) & ~7) - 1 : (_dialogueButtonYoffs + _dialogueButtonPosY[i])); Common::Point p = getMousePos(); if (posWithinRect(p.x, p.y, x, y, x + _dialogueButtonWidth, y + guiSettings()->buttons.height)) { _dialogueHighlightedButton = i; diff --git a/engines/kyra/kyra_rpg.h b/engines/kyra/kyra_rpg.h index 50a4c9bdc1..cd36d2a5cd 100644 --- a/engines/kyra/kyra_rpg.h +++ b/engines/kyra/kyra_rpg.h @@ -222,7 +222,6 @@ protected: uint16 _decorationCount; int16 _mappedDecorationsCount; uint16 *_vmpPtr; - uint16 _vmpSize; uint8 *_vcnBlocks; uint8 *_vcfBlocks; uint8 *_vcnTransitionMask; @@ -232,10 +231,6 @@ protected: uint8 *_sceneWindowBuffer; uint8 _blockBrightness; uint8 _wllVcnOffset; - uint8 _vcnBlockWidth; - uint8 _vcnBlockHeight; - uint8 _vcnFlip0; - uint8 _vcnFlip1; uint8 **_doorShapes; @@ -288,7 +283,7 @@ protected: void removeInputTop(); void gui_drawBox(int x, int y, int w, int h, int frameColor1, int frameColor2, int fillColor); virtual void gui_drawHorizontalBarGraph(int x, int y, int w, int h, int32 curVal, int32 maxVal, int col1, int col2); - void gui_initButtonsFromList(const int16 *list); + void gui_initButtonsFromList(const uint8 *list); virtual void gui_initButton(int index, int x = -1, int y = -1, int val = -1) = 0; void gui_resetButtonList(); void gui_notifyButtonListChanged(); @@ -385,7 +380,7 @@ protected: bool lineIsPassable(int, int) { return false; } }; -} // End of namespace Kyra +} // End of namespace Kyra #endif // ENABLE_EOB || ENABLE_LOL diff --git a/engines/kyra/kyra_v1.cpp b/engines/kyra/kyra_v1.cpp index 2672618c67..9194b64155 100644 --- a/engines/kyra/kyra_v1.cpp +++ b/engines/kyra/kyra_v1.cpp @@ -172,19 +172,6 @@ Common::Error KyraEngine_v1::init() { assert(_res); _res->reset(); - if (_flags.isDemo) { - // HACK: check whether this is the HOF demo or the LOL demo. - // The LOL demo needs to be detected and run as KyraEngine_HoF, - // but the static resource loader and the sequence player will - // need correct IDs. - if (_res->exists("scene1.cps")) -#ifdef ENABLE_LOL - _flags.gameID = GI_LOL; -#else - error("Lands of Lore demo is not supported in this build"); -#endif // !ENABLE_LOL - } - _staticres = new StaticResource(this); assert(_staticres); if (!_staticres->init()) @@ -366,84 +353,88 @@ void KyraEngine_v1::setupKeyMap() { Common::KeyCode kcScummVM; int16 kcDOS; int16 kcPC98; + int16 kcFMTowns; }; +#define UNKNOWN_KEYCODE -1 #define KC(x) Common::KEYCODE_##x static const KeyCodeMapEntry keys[] = { - { KC(SPACE), 61, 53 }, - { KC(RETURN), 43, 29 }, - { KC(UP), 96, 68 }, - { KC(KP8), 96, 68 }, - { KC(RIGHT), 102, 73 }, - { KC(KP6), 102, 73 }, - { KC(DOWN), 98, 76 }, - { KC(KP2), 98, 76 }, - { KC(KP5), 97, 72 }, - { KC(LEFT), 92, 71 }, - { KC(KP4), 92, 71 }, - { KC(HOME), 91, 67 }, - { KC(KP7), 91, 67 }, - { KC(PAGEUP), 101, 69 }, - { KC(KP9), 101, 69 }, - { KC(END), 93, 0/*unknown*/ }, - { KC(KP1), 93, 0/*unknown*/ }, - { KC(PAGEDOWN), 103, 0/*unknown*/ }, - { KC(KP3), 103, 0/*unknown*/ }, - { KC(F1), 112, 99 }, - { KC(F2), 113, 100 }, - { KC(F3), 114, 101 }, - { KC(F4), 115, 102 }, - { KC(F5), 116, 103 }, - { KC(F6), 117, 104 }, - { KC(a), 31, 31 }, - { KC(b), 50, 50 }, - { KC(c), 48, 48 }, - { KC(d), 33, 33 }, - { KC(e), 19, 19 }, - { KC(f), 34, 34 }, - { KC(i), 24, 24 }, - { KC(k), 38, 38 }, - { KC(m), 52, 52 }, - { KC(n), 51, 51 }, - { KC(o), 25, 25 }, - { KC(p), 26, 26 }, - { KC(r), 20, 20 }, - { KC(s), 32, 32 }, - { KC(w), 18, 18 }, - { KC(y), 22, 22 }, - { KC(z), 46, 46 }, - { KC(1), 2, 0/*unknown*/ }, - { KC(2), 3, 0/*unknown*/ }, - { KC(3), 4, 0/*unknown*/ }, - { KC(4), 5, 0/*unknown*/ }, - { KC(5), 6, 0/*unknown*/ }, - { KC(6), 7, 0/*unknown*/ }, - { KC(7), 8, 0/*unknown*/ }, - { KC(SLASH), 55, 55 }, - { KC(ESCAPE), 110, 1 }, - { KC(MINUS), 12, 0/*unknown*/ }, - { KC(KP_MINUS), 105, 0/*unknown*/ }, - { KC(PLUS), 13, 0/*unknown*/ }, - { KC(KP_PLUS), 106, 0/*unknown*/ }, + { KC(SPACE), 61, 53, 32 }, + { KC(RETURN), 43, 29, 13 }, + { KC(UP), 96, 68, 30 }, + { KC(KP8), 96, 68, 30 }, + { KC(RIGHT), 102, 73, 28 }, + { KC(KP6), 102, 73, 28 }, + { KC(DOWN), 98, 76, 31 }, + { KC(KP2), 98, 76, 31 }, + { KC(KP5), 97, 72, UNKNOWN_KEYCODE }, + { KC(LEFT), 92, 71, 29 }, + { KC(KP4), 92, 71, 29 }, + { KC(HOME), 91, 67, 127 }, + { KC(KP7), 91, 67, 127 }, + { KC(PAGEUP), 101, 69, 18 }, + { KC(KP9), 101, 69, 18 }, + { KC(END), 93, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE }, + { KC(KP1), 93, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE }, + { KC(PAGEDOWN), 103, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE }, + { KC(KP3), 103, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE }, + { KC(F1), 112, 99, UNKNOWN_KEYCODE }, + { KC(F2), 113, 100, UNKNOWN_KEYCODE }, + { KC(F3), 114, 101, UNKNOWN_KEYCODE }, + { KC(F4), 115, 102, UNKNOWN_KEYCODE }, + { KC(F5), 116, 103, UNKNOWN_KEYCODE }, + { KC(F6), 117, 104, UNKNOWN_KEYCODE }, + { KC(a), 31, 31, UNKNOWN_KEYCODE }, + { KC(b), 50, 50, UNKNOWN_KEYCODE }, + { KC(c), 48, 48, 67 }, + { KC(d), 33, 33, UNKNOWN_KEYCODE }, + { KC(e), 19, 19, UNKNOWN_KEYCODE }, + { KC(f), 34, 34, UNKNOWN_KEYCODE }, + { KC(i), 24, 24, UNKNOWN_KEYCODE }, + { KC(k), 38, 38, UNKNOWN_KEYCODE }, + { KC(m), 52, 52, UNKNOWN_KEYCODE }, + { KC(n), 51, 51, UNKNOWN_KEYCODE }, + { KC(o), 25, 25, 79 }, + { KC(p), 26, 26, 80 }, + { KC(r), 20, 20, 82 }, + { KC(s), 32, 32, UNKNOWN_KEYCODE }, + { KC(w), 18, 18, UNKNOWN_KEYCODE }, + { KC(y), 22, 22, UNKNOWN_KEYCODE }, + { KC(z), 46, 46, UNKNOWN_KEYCODE }, + { KC(0), UNKNOWN_KEYCODE, UNKNOWN_KEYCODE, 48 }, + { KC(1), 2, UNKNOWN_KEYCODE, 49 }, + { KC(2), 3, UNKNOWN_KEYCODE, 50 }, + { KC(3), 4, UNKNOWN_KEYCODE, 51 }, + { KC(4), 5, UNKNOWN_KEYCODE, 52 }, + { KC(5), 6, UNKNOWN_KEYCODE, 53 }, + { KC(6), 7, UNKNOWN_KEYCODE, 54 }, + { KC(7), 8, UNKNOWN_KEYCODE, 55 }, + { KC(SLASH), 55, 55, 47 }, + { KC(ESCAPE), 110, 1, 27 }, + { KC(MINUS), 12, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE }, + { KC(KP_MINUS), 105, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE }, + { KC(PLUS), 13, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE }, + { KC(KP_PLUS), 106, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE }, // Multiple mappings for the keys to the right of the 'M' key, // since these are different for QWERTZ, QWERTY and AZERTY keyboards. // QWERTZ - { KC(COMMA), 53, 0/*unknown*/ }, - { KC(PERIOD), 54, 0/*unknown*/ }, + { KC(COMMA), 53, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE }, + { KC(PERIOD), 54, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE }, // AZERTY - { KC(SEMICOLON), 53, 0/*unknown*/ }, - { KC(COLON), 54, 0/*unknown*/ }, + { KC(SEMICOLON), 53, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE }, + { KC(COLON), 54, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE }, // QWERTY - { KC(LESS), 53, 0/*unknown*/ }, - { KC(GREATER), 54, 0/*unknown*/ } + { KC(LESS), 53, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE }, + { KC(GREATER), 54, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE } }; #undef KC +#undef UNKNOWN_KEYCODE _keyMap.clear(); for (int i = 0; i < ARRAYSIZE(keys); i++) - _keyMap[keys[i].kcScummVM] = (_flags.platform == Common::kPlatformPC98) ? keys[i].kcPC98 : keys[i].kcDOS; + _keyMap[keys[i].kcScummVM] = (_flags.platform == Common::kPlatformPC98) ? keys[i].kcPC98 : ((_flags.platform == Common::kPlatformFMTowns) ? keys[i].kcFMTowns : keys[i].kcDOS); } void KyraEngine_v1::updateInput() { diff --git a/engines/kyra/kyra_v1.h b/engines/kyra/kyra_v1.h index 0033969047..cd048563ca 100644 --- a/engines/kyra/kyra_v1.h +++ b/engines/kyra/kyra_v1.h @@ -140,14 +140,6 @@ enum { GI_EOB2 = 6 }; -struct AudioDataStruct { - const char *const *fileList; - int fileListLen; - const void *cdaTracks; - int cdaNumTracks; - int extraOffset; -}; - // TODO: this is just the start of makeing the debug output of the kyra engine a bit more useable // in the future we maybe merge some flags and/or create new ones enum DebugLevels { @@ -164,7 +156,7 @@ enum DebugLevels { kDebugLevelTimer = 1 << 10 ///< debug level for "TimerManager" functions }; -enum MusicDataID { +enum AudioResourceSet { kMusicIntro = 0, kMusicIngame, kMusicFinale @@ -188,6 +180,7 @@ friend class GUI; friend class GUI_v1; friend class GUI_EoB; friend class SoundMidiPC; // For _eventMan +friend class SeqPlayer_HOF; // For skipFlag() friend class TransferPartyWiz; // For save state API public: KyraEngine_v1(OSystem *system, const GameFlags &flags); @@ -415,14 +408,14 @@ protected: Graphics::Surface *thumbnail; }; - enum kReadSaveHeaderError { + enum ReadSaveHeaderError { kRSHENoError = 0, kRSHEInvalidType = 1, kRSHEInvalidVersion = 2, kRSHEIoError = 3 }; - static kReadSaveHeaderError readSaveHeader(Common::SeekableReadStream *file, bool loadThumbnail, SaveHeader &header); + static ReadSaveHeaderError readSaveHeader(Common::SeekableReadStream *file, bool loadThumbnail, SaveHeader &header); void loadGameStateCheck(int slot); virtual Common::Error loadGameState(int slot) = 0; diff --git a/engines/kyra/lol.cpp b/engines/kyra/lol.cpp index d3028c5e2d..f7696d45b5 100644 --- a/engines/kyra/lol.cpp +++ b/engines/kyra/lol.cpp @@ -114,7 +114,7 @@ LoLEngine::LoLEngine(OSystem *system, const GameFlags &flags) : KyraRpgEngine(sy _selectedSpell = 0; _updateCharNum = _portraitSpeechAnimMode = _textColorFlag = 0; _palUpdateTimer = _updatePortraitNext = 0; - _lampStatusTimer = 0xffffffff; + _lampStatusTimer = 0xFFFFFFFF; _weaponsDisabled = false; _charInventoryUnk = 0; @@ -381,10 +381,10 @@ Common::Error LoLEngine::init() { _screen->setAnimBlockPtr(10000); _screen->setScreenDim(0); - _pageBuffer1 = new uint8[0xfa00]; - memset(_pageBuffer1, 0, 0xfa00); - _pageBuffer2 = new uint8[0xfa00]; - memset(_pageBuffer2, 0, 0xfa00); + _pageBuffer1 = new uint8[0xFA00]; + memset(_pageBuffer1, 0, 0xFA00); + _pageBuffer2 = new uint8[0xFA00]; + memset(_pageBuffer2, 0, 0xFA00); _itemsInPlay = new LoLItem[400]; memset(_itemsInPlay, 0, sizeof(LoLItem) * 400); @@ -499,6 +499,11 @@ void LoLEngine::initKeymap() { #endif } +void LoLEngine::pauseEngineIntern(bool pause) { + KyraEngine_v1::pauseEngineIntern(pause); + pauseDemoPlayer(pause); +} + Common::Error LoLEngine::go() { int action = -1; @@ -519,7 +524,7 @@ Common::Error LoLEngine::go() { // the prologue code we need to setup them manually here. if (_gameToLoad != -1 && action != 3) { preInit(); - _screen->setFont(_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_9_FNT); + _screen->setFont((_flags.lang == Common::JA_JPN && _flags.use16ColorMode) ? Screen::FID_SJIS_FNT : Screen::FID_9_FNT); } // We have three sound.dat files, one for the intro, one for the @@ -529,7 +534,7 @@ Common::Error LoLEngine::go() { if (_flags.platform == Common::kPlatformPC98) _sound->loadSoundFile("sound.dat"); - _sound->setSoundList(&_soundData[kMusicIngame]); + _sound->selectAudioResourceSet(kMusicIngame); if (_flags.platform != Common::kPlatformPC) _sound->loadSoundFile(0); @@ -669,7 +674,7 @@ void LoLEngine::checkFloatingPointerRegions() { uint8 *LoLEngine::getItemIconShapePtr(int index) { int ix = _itemProperties[_itemsInPlay[index].itemPropertyIndex].shpIndex; if (_itemProperties[_itemsInPlay[index].itemPropertyIndex].flags & 0x200) - ix += (_itemsInPlay[index].shpCurFrame_flg & 0x1fff) - 1; + ix += (_itemsInPlay[index].shpCurFrame_flg & 0x1FFF) - 1; return _itemIconShapes[ix]; } @@ -678,14 +683,14 @@ int LoLEngine::mainMenu() { bool hasSave = saveFileLoadable(0); MainMenu::StaticData data[] = { - // 256 color mode + // 256 color ASCII mode { { 0, 0, 0, 0, 0 }, { 0x01, 0x04, 0x0C, 0x04, 0x00, 0x3D, 0x9F }, { 0x2C, 0x19, 0x48, 0x2C }, Screen::FID_9_FNT, 1 }, - // 16 color mode + // 16 color SJIS mode { { 0, 0, 0, 0, 0 }, { 0x01, 0x04, 0x0C, 0x04, 0x00, 0xC1, 0xE1 }, @@ -928,7 +933,7 @@ void LoLEngine::writeSettings() { case 0: default: - if (_flags.platform == Common::kPlatformPC98) + if (_flags.platform == Common::kPlatformPC98 || _flags.platform == Common::kPlatformFMTowns) _flags.lang = Common::JA_JPN; else _flags.lang = Common::EN_ANY; @@ -1024,7 +1029,7 @@ void LoLEngine::decodeSjis(const char *src, char *dst) { uint8 cmd = 0; while ((cmd = *src++) != 0) { if (cmd == 27) { - cmd = *src++ & 0x7f; + cmd = *src++ & 0x7F; memcpy(dst, src, cmd * 2); dst += cmd * 2; src += cmd * 2; @@ -1336,7 +1341,7 @@ int LoLEngine::calculateProtection(int index) { int c = 0; if (index & 0x8000) { // Monster - index &= 0x7fff; + index &= 0x7FFF; c = (_monsters[index].properties->itemProtection * _monsters[index].properties->fightingStats[2]) >> 8; } else { // Character @@ -1485,7 +1490,7 @@ void LoLEngine::increaseCharacterHitpoints(int charNum, int points, bool ignoreD points = 1; _characters[charNum].hitPointsCur = CLIP<int16>(_characters[charNum].hitPointsCur + points, 1, _characters[charNum].hitPointsMax); - _characters[charNum].flags &= 0xfff7; + _characters[charNum].flags &= 0xFFF7; } void LoLEngine::setupScreenDims() { @@ -1556,10 +1561,10 @@ void LoLEngine::gui_specialSceneSuspendControls(int controlMode) { void LoLEngine::gui_specialSceneRestoreControls(int restoreLamp) { if (restoreLamp) { - _updateFlags &= 0xfffa; + _updateFlags &= 0xFFFA; resetLampStatus(); } - _updateFlags &= 0xfffe; + _updateFlags &= 0xFFFE; _specialSceneFlag = 0; checkFloatingPointerRegions(); } @@ -1567,7 +1572,7 @@ void LoLEngine::gui_specialSceneRestoreControls(int restoreLamp) { void LoLEngine::restoreAfterSceneWindowDialogue(int redraw) { gui_enableControls(); _txt->setupField(false); - _updateFlags &= 0xffdf; + _updateFlags &= 0xFFDF; setDefaultButtonState(); @@ -1596,8 +1601,8 @@ void LoLEngine::initDialogueSequence(int controlMode, int pageNum) { if (_flags.use16ColorMode) { _screen->fillRect(0, 128, 319, 199, 0x44); - gui_drawBox(0, 129, 320, 71, 0xee, 0xcc, -1); - gui_drawBox(1, 130, 318, 69, 0xee, 0xcc, 0x11); + gui_drawBox(0, 129, 320, 71, 0xEE, 0xCC, -1); + gui_drawBox(1, 130, 318, 69, 0xEE, 0xCC, 0x11); } else { _screen->fillRect(0, 128, 319, 199, 1); gui_drawBox(0, 129, 320, 71, 136, 251, -1); @@ -1646,7 +1651,7 @@ void LoLEngine::restoreAfterDialogueSequence(int controlMode) { if (_currentControlMode) { _screen->modifyScreenDim(4, 11, 124, 28, 45); _screen->modifyScreenDim(5, 85, 123, 233, 54); - _updateFlags &= 0xfffd; + _updateFlags &= 0xFFFD; } else { const ScreenDim *d = _screen->getScreenDim(5); _screen->fillRect(d->sx, d->sy, d->sx + d->w - (_flags.use16ColorMode ? 3 : 2), d->sy + d->h - 2, d->unkA); @@ -1709,14 +1714,14 @@ void LoLEngine::generateBrightnessPalette(const Palette &src, Palette &dst, int brightness = (8 - brightness) << 5; if (modifier >= 0 && modifier < 8 && (_flagsTable[31] & 0x08)) { - brightness = 256 - ((((modifier & 0xfffe) << 5) * (256 - brightness)) >> 8); + brightness = 256 - ((((modifier & 0xFFFE) << 5) * (256 - brightness)) >> 8); if (brightness < 0) brightness = 0; } for (int i = 0; i < 384; i++) { uint16 c = (dst[i] * brightness) >> 8; - dst[i] = c & 0xff; + dst[i] = c & 0xFF; } } } @@ -1726,9 +1731,9 @@ void LoLEngine::generateFlashPalette(const Palette &src, Palette &dst, int color for (int i = 2; i < 128; i++) { for (int ii = 0; ii < 3; ii++) { - uint8 t = src[i * 3 + ii] & 0x3f; + uint8 t = src[i * 3 + ii] & 0x3F; if (colorFlags & (1 << ii)) - t += ((0x3f - t) >> 1); + t += ((0x3F - t) >> 1); else t -= (t >> 1); dst[i * 3 + ii] = t; @@ -1750,7 +1755,7 @@ void LoLEngine::createTransparencyTables() { 0x88, 0x00, 0x99, 0x00, 0xAA, 0x00, 0xBB, 0x00, 0xCC, 0x00, 0xDD, 0x00, 0xEE, 0x00, 0xFF, 0x00 }; - memset(tpal, 0xff, 768); + memset(tpal, 0xFF, 768); _res->loadFileToBuf("LOL.NOL", tpal, 48); for (int i = 15; i > -1; i--) { @@ -1758,7 +1763,7 @@ void LoLEngine::createTransparencyTables() { tpal[s] = tpal[i * 3]; tpal[s + 1] = tpal[i * 3 + 1]; tpal[s + 2] = tpal[i * 3 + 2]; - tpal[i * 3 + 2] = tpal[i * 3 + 1] = tpal[i * 3] = 0xff; + tpal[i * 3 + 2] = tpal[i * 3 + 1] = tpal[i * 3] = 0xFF; } _screen->createTransparencyTablesIntern(colTbl, 16, tpal, tpal, _transparencyTable1, _transparencyTable2, 80); @@ -1948,15 +1953,15 @@ void LoLEngine::giveItemToMonster(LoLMonster *monster, Item item) { } const uint16 *LoLEngine::getCharacterOrMonsterStats(int id) { - return (id & 0x8000) ? (const uint16 *)_monsters[id & 0x7fff].properties->fightingStats : _characters[id].defaultModifiers; + return (id & 0x8000) ? (const uint16 *)_monsters[id & 0x7FFF].properties->fightingStats : _characters[id].defaultModifiers; } uint16 *LoLEngine::getCharacterOrMonsterItemsMight(int id) { - return (id & 0x8000) ? _monsters[id & 0x7fff].properties->itemsMight : _characters[id].itemsMight; + return (id & 0x8000) ? _monsters[id & 0x7FFF].properties->itemsMight : _characters[id].itemsMight; } uint16 *LoLEngine::getCharacterOrMonsterProtectionAgainstItems(int id) { - return (id & 0x8000) ? _monsters[id & 0x7fff].properties->protectionAgainstItems : _characters[id].protectionAgainstItems; + return (id & 0x8000) ? _monsters[id & 0x7FFF].properties->protectionAgainstItems : _characters[id].protectionAgainstItems; } void LoLEngine::delay(uint32 millis, bool doUpdate, bool) { @@ -2093,7 +2098,7 @@ int LoLEngine::processMagicSpark(int charNum, int spellLevel) { uint16 target = getNearestMonsterFromCharacterForBlock(targetBlock, charNum); static const uint8 dmg[] = { 7, 15, 25, 60 }; - if (target != 0xffff) { + if (target != 0xFFFF) { inflictMagicalDamage(target, charNum, dmg[spellLevel], 5, 0); updateDrawPage2(); gui_drawScene(0); @@ -2111,8 +2116,8 @@ int LoLEngine::processMagicSpark(int charNum, int spellLevel) { const uint16 height = mov->height(); for (int i = 0; i < 6; i++) { - wX[i] = (_rnd.getRandomNumber(0x7fff) % 64) + ((176 - width) >> 1) + 80; - wY[i] = (_rnd.getRandomNumber(0x7fff) % 32) + ((120 - height) >> 1) - 16; + wX[i] = (_rnd.getRandomNumber(0x7FFF) % 64) + ((176 - width) >> 1) + 80; + wY[i] = (_rnd.getRandomNumber(0x7FFF) % 32) + ((120 - height) >> 1) - 16; wFrames[i] = i << 1; } @@ -2162,7 +2167,7 @@ int LoLEngine::processMagicHeal(int charNum, int spellLevel) { tpal.copy(_screen->getPalette(1)); if (_flags.use16ColorMode) { - tpal.fill(16, 240, 0xff); + tpal.fill(16, 240, 0xFF); uint8 *dst = tpal.getData(); for (int i = 1; i < 16; i++) { int s = ((i << 4) | i) * 3; @@ -2245,7 +2250,7 @@ int LoLEngine::processMagicHeal(int charNum, int spellLevel) { _screen->copyRegion(charNum * 77, 32, pX[charNum], pY, 77, 44, 2, 2, Screen::CR_NO_P_CHECK); - pts[charNum] &= 0xff; + pts[charNum] &= 0xFF; pts[charNum] += ((diff[charNum] << 8) / 16); increaseCharacterHitpoints(charNum, pts[charNum] / 256, true); gui_drawCharPortraitWithStats(charNum); @@ -2328,8 +2333,8 @@ int LoLEngine::processMagicIce(int charNum, int spellLevel) { tpal[i * 3 + 1] = v; tpal[i * 3 + 2] = v << 1; - if (tpal[i * 3 + 2] > 0x3f) - tpal[i * 3 + 2] = 0x3f; + if (tpal[i * 3 + 2] > 0x3F) + tpal[i * 3 + 2] = 0x3F; } } @@ -2361,7 +2366,7 @@ int LoLEngine::processMagicIce(int charNum, int spellLevel) { playSpellAnimation(0, 0, 0, 2, 0, 0, 0, s.getData(), tpal.getData(), 40, false); - _screen->fadePaletteStep(s.getData(), tpal.getData(), _system->getMillis(), _tickLength); + _screen->timedPaletteFadeStep(s.getData(), tpal.getData(), _system->getMillis(), _tickLength); if (mov->opened()) { int r = true; if (spellLevel > 2) { @@ -2390,7 +2395,7 @@ int LoLEngine::processMagicIce(int charNum, int spellLevel) { int might = rollDice(iceDamageMin[spellLevel], iceDamageMax[spellLevel]) + iceDamageAdd[spellLevel]; int dmg = calcInflictableDamagePerItem(charNum, 0, might, 3, 2); - LoLMonster *m = &_monsters[o & 0x7fff]; + LoLMonster *m = &_monsters[o & 0x7FFF]; if (m->hitPoints <= dmg) { increaseExperience(charNum, 2, m->hitPoints); o = m->nextAssignedObject; @@ -2430,7 +2435,7 @@ int LoLEngine::processMagicIce(int charNum, int spellLevel) { playSpellAnimation(0, 0, 0, 2, 0, 0, 0, tpal.getData(), swampCol.getData(), 40, 0); - _screen->fadePaletteStep(tpal.getData(), swampCol.getData(), _system->getMillis(), _tickLength); + _screen->timedPaletteFadeStep(tpal.getData(), swampCol.getData(), _system->getMillis(), _tickLength); if (breakWall) breakIceWall(tpal.getData(), swampCol.getData()); @@ -2469,7 +2474,7 @@ int LoLEngine::processMagicFireball(int charNum, int spellLevel) { while (o & 0x8000) { static const uint8 fireballDamage[] = { 20, 40, 80, 100 }; int dmg = calcInflictableDamagePerItem(charNum, o, fireballDamage[spellLevel], 4, 1); - LoLMonster *m = &_monsters[o & 0x7fff]; + LoLMonster *m = &_monsters[o & 0x7FFF]; o = m->nextAssignedObject; _envSfxUseQueue = true; inflictDamage(m->id | 0x8000, dmg, charNum, 2, 4); @@ -2519,8 +2524,8 @@ int LoLEngine::processMagicFireball(int charNum, int spellLevel) { static const int8 finShpIndex2[] = { -1, 1, 2, 3, 4, -1 }; uint8 *shp = fb->finalize ? _fireballShapes[finShpIndex1[fb->finProgress]] : _fireballShapes[0]; - int fX = (((fb->progress * _fireBallCoords[fb->tblIndex & 0xff]) >> 16) + fb->destX) - ((fb->progress / 8 + shp[3] + fireBallWH) >> 1); - int fY = (((fb->progress * _fireBallCoords[(fb->tblIndex + 64) & 0xff]) >> 16) + fb->destY) - ((fb->progress / 8 + shp[2] + fireBallWH) >> 1); + int fX = (((fb->progress * _fireBallCoords[fb->tblIndex & 0xFF]) >> 16) + fb->destX) - ((fb->progress / 8 + shp[3] + fireBallWH) >> 1); + int fY = (((fb->progress * _fireBallCoords[(fb->tblIndex + 64) & 0xFF]) >> 16) + fb->destY) - ((fb->progress / 8 + shp[2] + fireBallWH) >> 1); int sW = ((fb->progress / 8 + shp[3] + fireBallWH) << 8) / shp[3]; int sH = ((fb->progress / 8 + shp[2] + fireBallWH) << 8) / shp[2]; @@ -2532,8 +2537,8 @@ int LoLEngine::processMagicFireball(int charNum, int spellLevel) { if (finShpIndex2[fb->finProgress] != -1) { shp = _fireballShapes[finShpIndex2[fb->finProgress]]; - fX = (((fb->progress * _fireBallCoords[fb->tblIndex & 0xff]) >> 16) + fb->destX) - ((fb->progress / 8 + shp[3] + fireBallWH) >> 1); - fY = (((fb->progress * _fireBallCoords[(fb->tblIndex + 64) & 0xff]) >> 16) + fb->destY) - ((fb->progress / 8 + shp[2] + fireBallWH) >> 1); + fX = (((fb->progress * _fireBallCoords[fb->tblIndex & 0xFF]) >> 16) + fb->destX) - ((fb->progress / 8 + shp[3] + fireBallWH) >> 1); + fY = (((fb->progress * _fireBallCoords[(fb->tblIndex + 64) & 0xFF]) >> 16) + fb->destY) - ((fb->progress / 8 + shp[2] + fireBallWH) >> 1); sW = ((fb->progress / 8 + shp[3] + fireBallWH) << 8) / shp[3]; sH = ((fb->progress / 8 + shp[2] + fireBallWH) << 8) / shp[2]; _screen->drawShape(_screen->_curPage, shp, fX, fY, 0, 4, sW, sH); @@ -2634,7 +2639,7 @@ int LoLEngine::processMagicHandOfFate(int spellLevel) { uint16 o = _levelBlockProperties[b1].assignedObjects; while (o & 0x8000) { uint16 o2 = o; - LoLMonster *m = &_monsters[o & 0x7fff]; + LoLMonster *m = &_monsters[o & 0x7FFF]; o = findObject(o)->nextAssignedObject; int nX = 0; int nY = 0; @@ -2662,7 +2667,7 @@ int LoLEngine::processMagicHandOfFate(int spellLevel) { // This might be a bug in the original code, but using // the hand of fate spell won't give any experience points int dmg = calcInflictableDamagePerItem(-1, t, damage[spellLevel - 2], 0x80, 1); - inflictDamage(t, dmg, 0xffff, 3, 0x80); + inflictDamage(t, dmg, 0xFFFF, 3, 0x80); } } @@ -2778,7 +2783,7 @@ int LoLEngine::processMagicFog() { uint16 o = _levelBlockProperties[calcNewBlockPosition(_currentBlock, _currentDirection)].assignedObjects; while (o & 0x8000) { inflictMagicalDamage(o, -1, 15, 6, 0); - o = _monsters[o & 0x7fff].nextAssignedObject; + o = _monsters[o & 0x7FFF].nextAssignedObject; } gui_drawScene(0); @@ -2803,7 +2808,7 @@ int LoLEngine::processMagicSwarm(int charNum, int damage) { int t = 0; uint16 o = _levelBlockProperties[calcNewBlockPosition(_currentBlock, _currentDirection)].assignedObjects; while (o & 0x8000) { - o &= 0x7fff; + o &= 0x7FFF; if (_monsters[o].mode != 13) { destIds[t++] = o; @@ -2811,7 +2816,7 @@ int LoLEngine::processMagicSwarm(int charNum, int damage) { _envSfxUseQueue = true; inflictMagicalDamage(o | 0x8000, charNum, damage, 0, 0); _envSfxUseQueue = false; - _monsters[o].flags &= 0xffef; + _monsters[o].flags &= 0xFFEF; } } o = _monsters[o].nextAssignedObject; @@ -2886,7 +2891,7 @@ int LoLEngine::processMagicVaelansCube() { uint32 endTime = _system->getMillis() + 70 * _tickLength; while (_system->getMillis() < endTime) { - _screen->fadePaletteStep(tmpPal1, tmpPal2, _system->getMillis() - ctime, 70 * _tickLength); + _screen->timedPaletteFadeStep(tmpPal1, tmpPal2, _system->getMillis() - ctime, 70 * _tickLength); updateInput(); } @@ -2903,9 +2908,9 @@ int LoLEngine::processMagicVaelansCube() { uint16 o = _levelBlockProperties[bl].assignedObjects; while (o & 0x8000) { - LoLMonster *m = &_monsters[o & 0x7fff]; + LoLMonster *m = &_monsters[o & 0x7FFF]; if (m->properties->flags & 0x1000) { - inflictDamage(o, 100, 0xffff, 0, 0x80); + inflictDamage(o, 100, 0xFFFF, 0, 0x80); res = 1; } o = m->nextAssignedObject; @@ -2915,7 +2920,7 @@ int LoLEngine::processMagicVaelansCube() { endTime = _system->getMillis() + 70 * _tickLength; while (_system->getMillis() < endTime) { - _screen->fadePaletteStep(tmpPal2, tmpPal1, _system->getMillis() - ctime, 70 * _tickLength); + _screen->timedPaletteFadeStep(tmpPal2, tmpPal1, _system->getMillis() - ctime, 70 * _tickLength); updateInput(); } @@ -3031,7 +3036,7 @@ void LoLEngine::drinkBezelCup(int numUses, int charNum) { uint16 step = 0; do { - step = (step & 0xff) + (hpDiff * 256) / (bezelAnimData[numUses * 3 + 1]); + step = (step & 0xFF) + (hpDiff * 256) / (bezelAnimData[numUses * 3 + 1]); increaseCharacterHitpoints(charNum, step / 256, true); gui_drawCharPortraitWithStats(charNum); @@ -3068,7 +3073,7 @@ void LoLEngine::addSpellToScroll(int spell, int charNum) { } if (_availableSpells[i] == spell) { - _txt->printMessage(2, "%s", getLangString(0x42d0)); + _txt->printMessage(2, "%s", getLangString(0x42D0)); return; } } @@ -3096,7 +3101,7 @@ void LoLEngine::transferSpellToScollAnimation(int charNum, int spell, int slot) _screen->copyRegion(201, 1, 17, 15, 6, h, 2, 2, Screen::CR_NO_P_CHECK); _screen->copyRegion(208, 1, 89, 15, 6, h, 2, 2, Screen::CR_NO_P_CHECK); int cp = _screen->setCurPage(2); - _screen->fillRect(21, 15, 89, h + 15, _flags.use16ColorMode ? 0xbb : 206); + _screen->fillRect(21, 15, 89, h + 15, _flags.use16ColorMode ? 0xBB : 206); _screen->copyRegion(112, 16, 12, h + 15, 87, 14, 2, 2, Screen::CR_NO_P_CHECK); int y = 15; @@ -3244,7 +3249,7 @@ void LoLEngine::playSpellAnimation(WSAMovie_v2 *mov, int firstFrame, int lastFra continue; } - if (!_screen->fadePaletteStep(pal1, pal2, _system->getMillis() - startTime, _tickLength * fadeDelay) && !mov) + if (!_screen->timedPaletteFadeStep(pal1, pal2, _system->getMillis() - startTime, _tickLength * fadeDelay) && !mov) return; if (del) { @@ -3284,7 +3289,7 @@ int LoLEngine::checkMagic(int charNum, int spellNum, int spellLevel) { } int LoLEngine::getSpellTargetBlock(int currentBlock, int direction, int maxDistance, uint16 &targetBlock) { - targetBlock = 0xffff; + targetBlock = 0xFFFF; uint16 c = calcNewBlockPosition(currentBlock, direction); int i = 0; @@ -3316,9 +3321,9 @@ void LoLEngine::inflictMagicalDamageForBlock(int block, int attacker, int damage uint16 o = _levelBlockProperties[block].assignedObjects; while (o & 0x8000) { inflictDamage(o, calcInflictableDamagePerItem(attacker, o, damage, index, 2), attacker, 2, index); - if ((_monsters[o & 0x7fff].flags & 0x20) && (_currentLevel != 22)) + if ((_monsters[o & 0x7FFF].flags & 0x20) && (_currentLevel != 22)) break; - o = _monsters[o & 0x7fff].nextAssignedObject; + o = _monsters[o & 0x7FFF].nextAssignedObject; } } @@ -3331,7 +3336,7 @@ int LoLEngine::battleHitSkillTest(int16 attacker, int16 target, int skill) { return 1; if (target & 0x8000) { - if (_monsters[target & 0x7fff].mode >= 13) + if (_monsters[target & 0x7FFF].mode >= 13) return 0; } @@ -3340,8 +3345,8 @@ int LoLEngine::battleHitSkillTest(int16 attacker, int16 target, int skill) { int sk = 0; if (attacker & 0x8000) { - hitChanceModifier = _monsters[target & 0x7fff].properties->fightingStats[0]; - sk = 100 - _monsters[target & 0x7fff].properties->skillLevel; + hitChanceModifier = _monsters[target & 0x7FFF].properties->fightingStats[0]; + sk = 100 - _monsters[target & 0x7FFF].properties->skillLevel; } else { hitChanceModifier = _characters[attacker].defaultModifiers[0]; int8 m = _characters[attacker].skillModifiers[skill]; @@ -3351,8 +3356,10 @@ int LoLEngine::battleHitSkillTest(int16 attacker, int16 target, int skill) { } if (target & 0x8000) { - evadeChanceModifier = (_monsterModifiers[9 + _monsterDifficulty] * _monsters[target & 0x7fff].properties->fightingStats[3]) >> 8; - _monsters[target & 0x7fff].flags |= 0x10; + evadeChanceModifier = _monsters[target & 0x7FFF].properties->fightingStats[3]; + if (_monsterModifiers4) + evadeChanceModifier = (evadeChanceModifier * _monsterModifiers4[_monsterDifficulty]) >> 8; + _monsters[target & 0x7FFF].flags |= 0x10; } else { evadeChanceModifier = _characters[target].defaultModifiers[3]; } @@ -3387,7 +3394,7 @@ int LoLEngine::inflictDamage(uint16 target, int damage, uint16 attacker, int ski LoLCharacter *c = 0; if (target & 0x8000) { - m = &_monsters[target & 0x7fff]; + m = &_monsters[target & 0x7FFF]; if (m->mode >= 13) return 0; @@ -3477,7 +3484,7 @@ void LoLEngine::removeCharacterEffects(LoLCharacter *c, int first, int last) { for (int i = first; i <= last; i++) { switch (i - 1) { case 0: - c->flags &= 0xfffb; + c->flags &= 0xFFFB; c->weaponHit = 0; break; @@ -3486,19 +3493,19 @@ void LoLEngine::removeCharacterEffects(LoLCharacter *c, int first, int last) { break; case 2: - c->flags &= 0xffbf; + c->flags &= 0xFFBF; break; case 3: - c->flags &= 0xff7f; + c->flags &= 0xFF7F; break; case 4: - c->flags &= 0xfeff; + c->flags &= 0xFEFF; break; case 6: - c->flags &= 0xefff; + c->flags &= 0xEFFF; break; default: @@ -3552,7 +3559,7 @@ int LoLEngine::calcInflictableDamagePerItem(int16 attacker, int16 target, uint16 void LoLEngine::checkForPartyDeath() { Button b; - b.data0Val2 = b.data1Val2 = b.data2Val2 = 0xfe; + b.data0Val2 = b.data1Val2 = b.data2Val2 = 0xFE; b.data0Val3 = b.data1Val3 = b.data2Val3 = 0x01; for (int i = 0; i < 4; i++) { @@ -3591,7 +3598,7 @@ void LoLEngine::checkForPartyDeath() { _gui->runMenu(_gui->_deathMenu); setMouseCursorToItemInHand(); - _updateFlags &= 0xfffb; + _updateFlags &= 0xFFFB; resetLampStatus(); gui_enableDefaultPlayfieldButtons(); @@ -3608,7 +3615,7 @@ void LoLEngine::applyMonsterAttackSkill(LoLMonster *monster, int16 target, int16 switch (monster->properties->attackSkillType - 1) { case 0: - t = removeCharacterItem(target, 0x7ff); + t = removeCharacterItem(target, 0x7FF); if (t) { giveItemToMonster(monster, t); if (characterSays(0x4019, _characters[target].id, true)) @@ -3625,16 +3632,16 @@ void LoLEngine::applyMonsterAttackSkill(LoLMonster *monster, int16 target, int16 t = removeCharacterItem(target, 0x20); if (t) { deleteItem(t); - if (characterSays(0x401b, _characters[target].id, true)) - _txt->printMessage(6, "%s", getLangString(0x401b)); + if (characterSays(0x401B, _characters[target].id, true)) + _txt->printMessage(6, "%s", getLangString(0x401B)); } break; case 3: - t = removeCharacterItem(target, 0x0f); + t = removeCharacterItem(target, 0x0F); if (t) { - if (characterSays(0x401e, _characters[target].id, true)) - _txt->printMessage(6, getLangString(0x401e), _characters[target].name); + if (characterSays(0x401E, _characters[target].id, true)) + _txt->printMessage(6, getLangString(0x401E), _characters[target].name); setItemPosition(t, monster->x, monster->y, 0, 1); } break; @@ -3679,27 +3686,27 @@ void LoLEngine::applyMonsterDefenseSkill(LoLMonster *monster, int16 attacker, in switch (monster->properties->defenseSkillType - 1) { case 0: case 1: - if ((flags & 0x3f) == 2 || skill) + if ((flags & 0x3F) == 2 || skill) return; for (int i = 0; i < 3; i++) { itm = _characters[attacker].items[i]; if (!itm) continue; - if ((_itemProperties[_itemsInPlay[itm].itemPropertyIndex].protection & 0x3f) != flags) + if ((_itemProperties[_itemsInPlay[itm].itemPropertyIndex].protection & 0x3F) != flags) continue; - removeCharacterItem(attacker, 0x7fff); + removeCharacterItem(attacker, 0x7FFF); if (monster->properties->defenseSkillType == 1) { giveItemToMonster(monster, itm); - if (characterSays(0x401c, _characters[attacker].id, true)) - _txt->printMessage(6, "%s", getLangString(0x401c)); + if (characterSays(0x401C, _characters[attacker].id, true)) + _txt->printMessage(6, "%s", getLangString(0x401C)); } else { deleteItem(itm); - if (characterSays(0x401d, _characters[attacker].id, true)) - _txt->printMessage(6, "%s", getLangString(0x401d)); + if (characterSays(0x401D, _characters[attacker].id, true)) + _txt->printMessage(6, "%s", getLangString(0x401D)); } } break; @@ -3890,7 +3897,7 @@ void LoLEngine::launchMagicViper() { void LoLEngine::breakIceWall(uint8 *pal1, uint8 *pal2) { _screen->hideMouse(); uint16 bl = calcNewBlockPosition(_currentBlock, _currentDirection); - _levelBlockProperties[bl].flags &= 0xef; + _levelBlockProperties[bl].flags &= 0xEF; _screen->copyPage(0, 2); gui_drawScene(2); _screen->copyPage(2, 10); @@ -3918,10 +3925,10 @@ uint16 LoLEngine::getNearestMonsterFromCharacterForBlock(uint16 block, int charN uint16 cX = 0; uint16 cY = 0; - uint16 id = 0xffff; - int minDist = 0x7fff; + uint16 id = 0xFFFF; + int minDist = 0x7FFF; - if (block == 0xffff) + if (block == 0xFFFF) return id; calcCoordinatesForSingleCharacter(charNum, cX, cY); @@ -3929,7 +3936,7 @@ uint16 LoLEngine::getNearestMonsterFromCharacterForBlock(uint16 block, int charN int o = _levelBlockProperties[block].assignedObjects; while (o & 0x8000) { - LoLMonster *m = &_monsters[o & 0x7fff]; + LoLMonster *m = &_monsters[o & 0x7FFF]; if (m->mode >= 13) { o = m->nextAssignedObject; continue; @@ -3948,8 +3955,8 @@ uint16 LoLEngine::getNearestMonsterFromCharacterForBlock(uint16 block, int charN } uint16 LoLEngine::getNearestMonsterFromPos(int x, int y) { - uint16 id = 0xffff; - int minDist = 0x7fff; + uint16 id = 0xFFFF; + int minDist = 0x7FFF; for (int i = 0; i < 30; i++) { if (_monsters[i].mode > 13) @@ -3966,8 +3973,8 @@ uint16 LoLEngine::getNearestMonsterFromPos(int x, int y) { } uint16 LoLEngine::getNearestPartyMemberFromPos(int x, int y) { - uint16 id = 0xffff; - int minDist = 0x7fff; + uint16 id = 0xFFFF; + int minDist = 0x7FFF; for (int i = 0; i < 4; i++) { if (!(_characters[i].flags & 1) || _characters[i].hitPointsCur <= 0) @@ -4049,7 +4056,7 @@ void LoLEngine::displayAutomap() { delayTimer = _system->getMillis() + 8 * _tickLength; } - int f = checkInput(0) & 0xff; + int f = checkInput(0) & 0xFF; removeInputTop(); if (f) { @@ -4057,7 +4064,7 @@ void LoLEngine::displayAutomap() { gui_notifyButtonListChanged(); } - if (f == 0x30) { + if (f == _keyMap[Common::KEYCODE_c]) { for (int i = 0; i < 1024; i++) _levelBlockProperties[i].flags |= 7; _mapUpdateNeeded = true; @@ -4089,7 +4096,7 @@ void LoLEngine::updateAutoMap(uint16 block) { return; _levelBlockProperties[block].flags |= 7; - uint16 x = block & 0x1f; + uint16 x = block & 0x1F; uint16 y = block >> 5; updateAutoMapIntern(block, x, y, -1, -1); @@ -4107,7 +4114,7 @@ bool LoLEngine::updateAutoMapIntern(uint16 block, uint16 x, uint16 y, int16 xOff x += xOffs; y += yOffs; - if ((x & 0xffe0) || (y & 0xffe0)) + if ((x & 0xFFE0) || (y & 0xFFE0)) return false; xOffs++; @@ -4117,7 +4124,7 @@ bool LoLEngine::updateAutoMapIntern(uint16 block, uint16 x, uint16 y, int16 xOff uint16 b = block + blockPosTable[6 + xOffs]; if (fx != -1) { - if (_wllAutomapData[_levelBlockProperties[b].walls[fx]] & 0xc0) + if (_wllAutomapData[_levelBlockProperties[b].walls[fx]] & 0xC0) return false; } @@ -4125,13 +4132,13 @@ bool LoLEngine::updateAutoMapIntern(uint16 block, uint16 x, uint16 y, int16 xOff b = block + blockPosTable[9 + yOffs]; if (fy != -1) { - if (_wllAutomapData[_levelBlockProperties[b].walls[fy]] & 0xc0) + if (_wllAutomapData[_levelBlockProperties[b].walls[fy]] & 0xC0) return false; } b = block + blockPosTable[6 + xOffs] + blockPosTable[9 + yOffs]; - if ((fx != -1) && (fy != -1) && (_wllAutomapData[_levelBlockProperties[b].walls[fx]] & 0xc0) && (_wllAutomapData[_levelBlockProperties[b].walls[fy]] & 0xc0)) + if ((fx != -1) && (fy != -1) && (_wllAutomapData[_levelBlockProperties[b].walls[fx]] & 0xC0) && (_wllAutomapData[_levelBlockProperties[b].walls[fy]] & 0xC0)) return false; _levelBlockProperties[b].flags |= 7; @@ -4142,8 +4149,8 @@ bool LoLEngine::updateAutoMapIntern(uint16 block, uint16 x, uint16 y, int16 xOff void LoLEngine::loadMapLegendData(int level) { uint16 *legendData = (uint16 *)_tempBuffer5120; for (int i = 0; i < 32; i++) { - legendData[i * 6] = 0xffff; - legendData[i * 6 + 5] = 0xffff; + legendData[i * 6] = 0xFFFF; + legendData[i * 6 + 5] = 0xFFFF; } Common::String file = Common::String::format("level%d.xxx", level); @@ -4184,7 +4191,7 @@ void LoLEngine::drawMapPage(int pageNum) { _screen->copyRegion(236, 16, 236 + xOffset, 16, -xOffset, 1, pageNum, pageNum, Screen::CR_NO_P_CHECK); int cp = _screen->setCurPage(pageNum); - Screen::FontId of = _screen->setFont(_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_9_FNT); + Screen::FontId of = _screen->setFont((_flags.lang == Common::JA_JPN && _flags.use16ColorMode) ? Screen::FID_SJIS_FNT : Screen::FID_9_FNT); _screen->printText(getLangString(_autoMapStrings[_currentMapLevel]), 236 + xOffset, 8, 1, 0); uint16 blX = mapGetStartPosX(); uint16 bl = (mapGetStartPosY() << 5) + blX; @@ -4194,7 +4201,7 @@ void LoLEngine::drawMapPage(int pageNum) { for (; bl < 1024; bl++) { uint8 *w = _levelBlockProperties[bl].walls; - if ((_levelBlockProperties[bl].flags & 7) == 7 && (!(_wllAutomapData[w[0]] & 0xc0)) && (!(_wllAutomapData[w[2]] & 0xc0)) && (!(_wllAutomapData[w[1]] & 0xc0)) && (!(_wllAutomapData[w[3]] & 0xc0))) { + if ((_levelBlockProperties[bl].flags & 7) == 7 && (!(_wllAutomapData[w[0]] & 0xC0)) && (!(_wllAutomapData[w[2]] & 0xC0)) && (!(_wllAutomapData[w[1]] & 0xC0)) && (!(_wllAutomapData[w[3]] & 0xC0))) { uint16 b0 = calcNewBlockPosition(bl, 0); uint16 b2 = calcNewBlockPosition(bl, 2); uint16 b1 = calcNewBlockPosition(bl, 1); @@ -4211,25 +4218,25 @@ void LoLEngine::drawMapPage(int pageNum) { // draw north wall drawMapBlockWall(b3, w31, sx, sy, 3); drawMapShape(w31, sx, sy, 3); - if (_wllAutomapData[w31] & 0xc0) + if (_wllAutomapData[w31] & 0xC0) _screen->copyBlockAndApplyOverlay(_screen->_curPage, sx, sy, _screen->_curPage, sx, sy, 1, 6, 0, _mapOverlay); // draw west wall drawMapBlockWall(b1, w13, sx, sy, 1); drawMapShape(w13, sx, sy, 1); - if (_wllAutomapData[w13] & 0xc0) + if (_wllAutomapData[w13] & 0xC0) _screen->copyBlockAndApplyOverlay(_screen->_curPage, sx + 6, sy, _screen->_curPage, sx + 6, sy, 1, 6, 0, _mapOverlay); // draw east wall drawMapBlockWall(b0, w02, sx, sy, 0); drawMapShape(w02, sx, sy, 0); - if (_wllAutomapData[w02] & 0xc0) + if (_wllAutomapData[w02] & 0xC0) _screen->copyBlockAndApplyOverlay(_screen->_curPage, sx, sy, _screen->_curPage, sx, sy, 7, 1, 0, _mapOverlay); //draw south wall drawMapBlockWall(b2, w20, sx, sy, 2); drawMapShape(w20, sx, sy, 2); - if (_wllAutomapData[w20] & 0xc0) + if (_wllAutomapData[w20] & 0xC0) _screen->copyBlockAndApplyOverlay(_screen->_curPage, sx, sy + 5, _screen->_curPage, sx, sy + 5, 7, 1, 0, _mapOverlay); } @@ -4244,7 +4251,7 @@ void LoLEngine::drawMapPage(int pageNum) { _screen->setFont(of); _screen->setCurPage(cp); - of = _screen->setFont(_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_6_FNT); + of = _screen->setFont((_flags.lang == Common::JA_JPN && _flags.use16ColorMode) ? Screen::FID_SJIS_FNT : Screen::FID_6_FNT); int tY = 0; sx = mapGetStartPosX(); @@ -4255,19 +4262,19 @@ void LoLEngine::drawMapPage(int pageNum) { for (int ii = 0; ii < 32; ii++) { uint16 *l = &legendData[ii * 6]; - if (l[0] == 0xffff) + if (l[0] == 0xFFFF) break; uint16 cbl = l[0] + (l[1] << 5); if ((_levelBlockProperties[cbl].flags & 7) != 7) continue; - if (l[2] == 0xffff) + if (l[2] == 0xFFFF) continue; printMapText(l[2], 244 + xOffset, (tY << 3) + 22 + yOffset); - if (l[5] == 0xffff) { + if (l[5] == 0xFFFF) { tY++; continue; } @@ -4338,7 +4345,7 @@ bool LoLEngine::automapProcessButtons(int inputFlag) { void LoLEngine::automapForwardButton() { int i = _currentMapLevel + 1; while (!(_hasTempDataFlags & (1 << (i - 1)))) - i = (i + 1) & 0x1f; + i = (i + 1) & 0x1F; if (i == _currentMapLevel) return; @@ -4355,7 +4362,7 @@ void LoLEngine::automapForwardButton() { void LoLEngine::automapBackButton() { int i = _currentMapLevel - 1; while (!(_hasTempDataFlags & (1 << (i - 1)))) - i = (i - 1) & 0x1f; + i = (i - 1) & 0x1F; if (i == _currentMapLevel) return; @@ -4396,7 +4403,7 @@ void LoLEngine::redrawMapCursor() { } void LoLEngine::drawMapBlockWall(uint16 block, uint8 wall, int x, int y, int direction) { - if (((1 << direction) & _levelBlockProperties[block].flags) || ((_wllAutomapData[wall] & 0x1f) != 13)) + if (((1 << direction) & _levelBlockProperties[block].flags) || ((_wllAutomapData[wall] & 0x1F) != 13)) return; int cp = _screen->_curPage; @@ -4406,8 +4413,8 @@ void LoLEngine::drawMapBlockWall(uint16 block, uint8 wall, int x, int y, int dir } void LoLEngine::drawMapShape(uint8 wall, int x, int y, int direction) { - int l = _wllAutomapData[wall] & 0x1f; - if (l == 0x1f) + int l = _wllAutomapData[wall] & 0x1F; + if (l == 0x1F) return; _screen->drawShape(_screen->_curPage, _automapShapes[(l << 2) + direction], x + _mapCoords[10][direction] - 2, y + _mapCoords[11][direction] - 2, 0, 0); @@ -4473,7 +4480,7 @@ int LoLEngine::mapGetStartPosY() { } void LoLEngine::mapIncludeLegendData(int type) { - type &= 0x7f; + type &= 0x7F; for (int i = 0; i < 11; i++) { if (_defaultLegendData[i].shapeIndex != type) continue; @@ -4494,7 +4501,7 @@ void LoLEngine::printMapText(uint16 stringId, int x, int y) { void LoLEngine::printMapExitButtonText() { int cp = _screen->setCurPage(2); Screen::FontId of = _screen->setFont(Screen::FID_9_FNT); - _screen->fprintString("%s", 295, 182, _flags.use16ColorMode ? 0xbb : 172, 0, 5, getLangString(0x4033)); + _screen->fprintString("%s", 295, 182, _flags.use16ColorMode ? 0xBB : 172, 0, 5, getLangString(0x4033)); _screen->setFont(of); _screen->setCurPage(cp); } diff --git a/engines/kyra/lol.h b/engines/kyra/lol.h index dcd13804b3..4002346d31 100644 --- a/engines/kyra/lol.h +++ b/engines/kyra/lol.h @@ -270,6 +270,8 @@ public: virtual void initKeymap(); + void pauseEngineIntern(bool pause); + Screen *screen(); GUI *gui() const; @@ -334,9 +336,9 @@ private: static const char *const _charPreviewNamesDefault[]; static const char *const _charPreviewNamesRussianFloppy[]; - // PC98 specific data + // PC98/FM-TOWNS specific data static const uint16 _charPosXPC98[]; - static const uint8 _charNamesPC98[][11]; + static const char *const _charNamesJapanese[]; WSAMovie_v2 *_chargenWSA; static const uint8 _chargenFrameTableTalkie[]; @@ -389,7 +391,7 @@ private: uint8 _outroShapeTable[256]; // TODO: Consider moving these tables to kyra.dat - static const char * const _outroShapeFileTable[]; + static const char *const _outroShapeFileTable[]; static const uint8 _outroFrameTable[]; static const int16 _outroRightMonsterPos[]; @@ -400,6 +402,10 @@ private: static const int _outroMonsterScaleTableX[]; static const int _outroMonsterScaleTableY[]; + // Non-interactive demo + int playDemo(); + void pauseDemoPlayer(bool toggle); + // timers void setupTimers(); @@ -464,8 +470,6 @@ private: const uint8 *_ingamePCSpeakerSoundIndex; int _ingamePCSpeakerSoundIndexSize; - AudioDataStruct _soundData[3]; - // gui void gui_drawPlayField(); void gui_drawScene(int pageNum); @@ -554,14 +558,14 @@ private: int clickedStatusIcon(Button *button); const LoLButtonDef *_buttonData; - const int16 *_buttonList1; - const int16 *_buttonList2; - const int16 *_buttonList3; - const int16 *_buttonList4; - const int16 *_buttonList5; - const int16 *_buttonList6; - const int16 *_buttonList7; - const int16 *_buttonList8; + const uint8 *_buttonList1; + const uint8 *_buttonList2; + const uint8 *_buttonList3; + const uint8 *_buttonList4; + const uint8 *_buttonList5; + const uint8 *_buttonList6; + const uint8 *_buttonList7; + const uint8 *_buttonList8; // text int characterSays(int track, int charId, bool redraw); @@ -810,7 +814,7 @@ private: void decodeSjis(const char *src, char *dst); int decodeCyrillic(const char *src, char *dst); - static const char * const _languageExt[]; + static const char *const _languageExt[]; // graphics void setupScreenDims(); @@ -1009,8 +1013,8 @@ private: uint8 *_tempBuffer5120; - const char * const *_levelDatList; - const char * const *_levelShpList; + const char *const *_levelDatList; + const char *const *_levelShpList; const int8 *_dscWalls; @@ -1133,7 +1137,11 @@ private: uint16 _monsterCurBlock; int _objectLastDirection; - const uint16 *_monsterModifiers; + const uint16 *_monsterModifiers1; + const uint16 *_monsterModifiers2; + const uint16 *_monsterModifiers3; + const uint16 *_monsterModifiers4; + const int8 *_monsterShiftOffs; const uint8 *_monsterDirFlags; const uint8 *_monsterScaleX; diff --git a/engines/kyra/magic_eob.cpp b/engines/kyra/magic_eob.cpp index 985286854b..2180c5359d 100644 --- a/engines/kyra/magic_eob.cpp +++ b/engines/kyra/magic_eob.cpp @@ -60,7 +60,7 @@ void EoBCoreEngine::useMagicBookOrSymbol(int charIndex, int type) { } if (!_updateFlags) - _screen->copyRegion(64, 121, 0, 0, 112, 56, 0, _useHiResDithering ? 4 : 10, Screen::CR_NO_P_CHECK); + _screen->copyRegion(64, 121, 0, 0, 112, 56, 0, 10, Screen::CR_NO_P_CHECK); _updateFlags = 1; gui_setPlayFieldButtons(); gui_drawSpellbook(); @@ -179,7 +179,7 @@ void EoBCoreEngine::castSpell(int spell, int weaponSlot) { if ((s->flags & 0x100) && (c->effectFlags & 0x40)) // remove invisibility effect - removeCharacterEffect(10, _openBookChar, 1); + removeCharacterEffect(_flags.gameID == GI_EOB1 ? 8 : 10, _openBookChar, 1); int ci = _openBookChar; if (ci > 3) @@ -308,7 +308,7 @@ void EoBCoreEngine::startSpell(int spell) { EoBCharacter *c = &_characters[_activeSpellCharId]; snd_playSoundEffect(s->sound); - if (s->flags & 0xa0) + if (s->flags & 0xA0) sparkEffectDefensive(_activeSpellCharId); else if (s->flags & 0x40) sparkEffectDefensive(-1); @@ -623,7 +623,7 @@ bool EoBCoreEngine::turnUndeadHit(EoBMonsterInPlay *m, int hitChance, int caster assert(_monsterProps[m->type].tuResist > 0); uint8 e = _turnUndeadEffect[_monsterProps[m->type].tuResist * 14 + MIN(casterLevel, 14)]; - if (e == 0xff) { + if (e == 0xFF) { calcAndInflictMonsterDamage(m, 0, 0, 500, 0x200, 5, 3); } else if (hitChance < e) { return false; @@ -711,7 +711,7 @@ Item EoBCoreEngine::createMagicWeaponItem(int flags, int icon, int value, int ty void EoBCoreEngine::removeMagicWeaponItem(Item item) { _itemTypes[_items[item].type].armorClass = -30; _items[item].block = -2; - _items[item].level = 0xff; + _items[item].level = 0xFF; } void EoBCoreEngine::updateWallOfForceTimers() { @@ -841,7 +841,7 @@ bool EoBCoreEngine::spellCallback_end_magicMissile(void *obj) { } void EoBCoreEngine::spellCallback_start_shockingGrasp() { - int t = createMagicWeaponType(0, 0, 0, 0x0f, 1, 8, getMageLevel(_openBookChar), 1); + int t = createMagicWeaponType(0, 0, 0, 0x0F, 1, 8, getMageLevel(_openBookChar), 1); Item i = (t != -1) ? createMagicWeaponItem(0x10, 82, 0, t) : -1; if (t == -1 || i == -1) { if (_flags.gameID == GI_EOB2) @@ -948,7 +948,7 @@ bool EoBCoreEngine::spellCallback_end_lightningBolt(void *obj) { } void EoBCoreEngine::spellCallback_start_vampiricTouch() { - int t = createMagicWeaponType(0, 0, 0, 0x0f, getMageLevel(_openBookChar) >> 1, 6, 0, 1); + int t = createMagicWeaponType(0, 0, 0, 0x0F, getMageLevel(_openBookChar) >> 1, 6, 0, 1); Item i = (t != -1) ? createMagicWeaponItem(0x18, 83, 0, t) : -1; if (t == -1 || i == -1) { if (_flags.gameID == GI_EOB2) @@ -989,7 +989,7 @@ bool EoBCoreEngine::spellCallback_end_iceStorm(void *obj) { if (res) { for (int i = 0; i < 4; i++) { uint16 bl = fo->curBlock; - fo->curBlock = (fo->curBlock + blockAdv[i]) & 0x3ff; + fo->curBlock = (fo->curBlock + blockAdv[i]) & 0x3FF; magicObjectDamageHit(fo, 1, 6, 0, getMageLevel(fo->attackerId)); fo->curBlock = bl; } @@ -1027,7 +1027,7 @@ void EoBCoreEngine::spellCallback_start_coneOfCold() { _preventMonsterFlash = true; for (int i = 0; i < 7; i++) { - for (const int16 *m = findBlockMonsters((_currentBlock + tbl[i]) & 0x3ff, 4, _currentDirection, 1, 1); *m != -1; m++) + for (const int16 *m = findBlockMonsters((_currentBlock + tbl[i]) & 0x3FF, 4, _currentDirection, 1, 1); *m != -1; m++) calcAndInflictMonsterDamage(&_monsters[*m], cl, 4, cl, 0x41, 5, 0); } @@ -1054,7 +1054,7 @@ void EoBCoreEngine::spellCallback_start_wallOfForce() { return; } - uint32 dur = 0xffffffff; + uint32 dur = 0xFFFFFFFF; int s = 0; int i = 0; @@ -1158,7 +1158,7 @@ bool EoBCoreEngine::spellCallback_end_aid(void *obj) { } void EoBCoreEngine::spellCallback_start_flameBlade() { - int t = createMagicWeaponType(0, 0, 0, 0x0f, 1, 4, 4, 1); + int t = createMagicWeaponType(0, 0, 0, 0x0F, 1, 4, 4, 1); Item i = (t != -1) ? createMagicWeaponItem(0, 84, 0, t) : -1; if (t == -1 || i == -1) { if (_flags.gameID == GI_EOB2) diff --git a/engines/kyra/resource.h b/engines/kyra/resource.h index f2bc4e8146..5c179a7864 100644 --- a/engines/kyra/resource.h +++ b/engines/kyra/resource.h @@ -62,7 +62,7 @@ public: bool isInCacheList(Common::String name); bool loadFileList(const Common::String &filedata); - bool loadFileList(const char * const *filelist, uint32 numFiles); + bool loadFileList(const char *const *filelist, uint32 numFiles); // This unloads *all* pakfiles, even kyra.dat and protected ones. // It does not remove files from cache though! @@ -87,7 +87,7 @@ protected: Common::Archive *loadArchive(const Common::String &name, Common::ArchiveMemberPtr member); Common::Archive *loadInstallerArchive(const Common::String &file, const Common::String &ext, const uint8 offset); - bool loadProtectedFiles(const char * const * list); + bool loadProtectedFiles(const char *const * list); void initializeLoaders(); @@ -679,7 +679,10 @@ enum KyraResources { kLoLCharDefsKieran, kLoLCharDefsAkshel, kLoLExpRequirements, - kLoLMonsterModifiers, + kLoLMonsterModifiers1, + kLoLMonsterModifiers2, + kLoLMonsterModifiers3, + kLoLMonsterModifiers4, kLoLMonsterShiftOffsets, kLoLMonsterDirFlags, kLoLMonsterScaleY, @@ -742,6 +745,8 @@ enum KyraResources { struct Shape; struct Room; struct AmigaSfxTable; +struct HoFSeqData; +struct HoFSeqItemAnimData; class StaticResource { public: @@ -755,13 +760,13 @@ public: bool init(); void deinit(); - const char * const *loadStrings(int id, int &strings); + const char *const *loadStrings(int id, int &strings); const uint8 *loadRawData(int id, int &size); const Shape *loadShapeTable(int id, int &entries); const AmigaSfxTable *loadAmigaSfxTable(int id, int &entries); const Room *loadRoomTable(int id, int &entries); - const HofSeqData *loadHofSequenceData(int id, int &entries); - const ItemAnimData_v1 *loadShapeAnimData_v1(int id, int &entries); + const HoFSeqData *loadHoFSequenceData(int id, int &entries); + const HoFSeqItemAnimData *loadHoFSeqItemAnimData(int id, int &entries); const ItemAnimDefinition *loadItemAnimDefinition(int id, int &entries); #if defined(ENABLE_EOB) || defined(ENABLE_LOL) const uint16 *loadRawDataBe16(int id, int &entries); @@ -803,8 +808,8 @@ private: bool loadShapeTable(Common::SeekableReadStream &stream, void *&ptr, int &size); bool loadAmigaSfxTable(Common::SeekableReadStream &stream, void *&ptr, int &size); bool loadRoomTable(Common::SeekableReadStream &stream, void *&ptr, int &size); - bool loadHofSequenceData(Common::SeekableReadStream &stream, void *&ptr, int &size); - bool loadShapeAnimData_v1(Common::SeekableReadStream &stream, void *&ptr, int &size); + bool loadHoFSequenceData(Common::SeekableReadStream &stream, void *&ptr, int &size); + bool loadHoFSeqItemAnimData(Common::SeekableReadStream &stream, void *&ptr, int &size); bool loadItemAnimDefinition(Common::SeekableReadStream &stream, void *&ptr, int &size); #if defined(ENABLE_EOB) || defined(ENABLE_LOL) bool loadRawDataBe16(Common::SeekableReadStream &stream, void *&ptr, int &size); @@ -829,8 +834,8 @@ private: void freeShapeTable(void *&ptr, int &size); void freeAmigaSfxTable(void *&ptr, int &size); void freeRoomTable(void *&ptr, int &size); - void freeHofSequenceData(void *&ptr, int &size); - void freeHofShapeAnimDataV1(void *&ptr, int &size); + void freeHoFSequenceData(void *&ptr, int &size); + void freeHoFSeqItemAnimData(void *&ptr, int &size); void freeItemAnimDefinition(void *&ptr, int &size); #if defined(ENABLE_EOB) || defined(ENABLE_LOL) void freeRawDataBe16(void *&ptr, int &size); @@ -857,7 +862,7 @@ private: kAmigaSfxTable = 4, k2SeqData = 5, - k2ShpAnimDataV1 = 6, + k2SeqItemAnimData = 6, k2ItemAnimDefinition = 7, kLoLCharData = 8, diff --git a/engines/kyra/resource_intern.cpp b/engines/kyra/resource_intern.cpp index 6f7591ccf1..4c413487ff 100644 --- a/engines/kyra/resource_intern.cpp +++ b/engines/kyra/resource_intern.cpp @@ -496,7 +496,7 @@ public: void advSrcBitsBy1(); void advSrcBitsByIndex(uint8 newIndex); - uint8 getKeyLower() const { return _key & 0xff; } + uint8 getKeyLower() const { return _key & 0xFF; } void setIndex(uint8 index) { _index = index; } uint16 getKeyMasked(uint8 newIndex); uint16 keyMaskedAlign(uint16 val); @@ -515,7 +515,7 @@ void FileExpanderSource::advSrcBitsBy1() { _key >>= 1; if (!--_bitsLeft) { if (_dataPtr < _endofBuffer) - _key = ((*_dataPtr++) << 8) | (_key & 0xff); + _key = ((*_dataPtr++) << 8) | (_key & 0xFF); _bitsLeft = 8; } } @@ -528,7 +528,7 @@ void FileExpanderSource::advSrcBitsByIndex(uint8 newIndex) { _index = -_bitsLeft; _bitsLeft = 8 - _index; if (_dataPtr < _endofBuffer) - _key = (*_dataPtr++ << 8) | (_key & 0xff); + _key = (*_dataPtr++ << 8) | (_key & 0xFF); } _key >>= _index; } @@ -540,13 +540,13 @@ uint16 FileExpanderSource::getKeyMasked(uint8 newIndex) { if (_index > 8) { newIndex = _index - 8; - res = (_key & 0xff) & mskTable[8]; + res = (_key & 0xFF) & mskTable[8]; advSrcBitsByIndex(8); _index = newIndex; - res |= (((_key & 0xff) & mskTable[_index]) << 8); + res |= (((_key & 0xFF) & mskTable[_index]) << 8); advSrcBitsByIndex(_index); } else { - res = (_key & 0xff) & mskTable[_index]; + res = (_key & 0xFF) & mskTable[_index]; advSrcBitsByIndex(_index); } @@ -568,10 +568,10 @@ void FileExpanderSource::copyBytes(uint8 *& dst) { uint16 FileExpanderSource::keyMaskedAlign(uint16 val) { val -= 0x101; - _index = (val & 0xff) >> 2; + _index = (val & 0xFF) >> 2; int16 b = ((_bitsLeft << 8) | _index) - 1; _bitsLeft = b >> 8; - _index = b & 0xff; + _index = b & 0xFF; uint16 res = (((val & 3) + 4) << _index) + 0x101; return res + getKeyMasked(_index); } @@ -727,20 +727,20 @@ bool FileExpander::process(uint8 *dst, const uint8 *src, uint32 outsize, uint32 cmd = ((int16 *)_tables[2])[_src->getKeyLower()]; _src->advSrcBitsByIndex(cmd < 0 ? calcCmdAndIndex(_tables[3], cmd) : _tables[0][cmd]); - if (cmd == 0x11d) { + if (cmd == 0x11D) { cmd = 0x200; } else if (cmd > 0x108) { cmd = _src->keyMaskedAlign(cmd); } if (!(cmd >> 8)) { - *d++ = cmd & 0xff; + *d++ = cmd & 0xFF; } else if (cmd != 0x100) { - cmd -= 0xfe; + cmd -= 0xFE; int16 offset = ((int16 *)_tables[4])[_src->getKeyLower()]; _src->advSrcBitsByIndex(offset < 0 ? calcCmdAndIndex(_tables[5], offset) : _tables[1][offset]); - if ((offset & 0xff) >= 4) { - uint8 newIndex = ((offset & 0xff) >> 1) - 1; + if ((offset & 0xFF) >= 4) { + uint8 newIndex = ((offset & 0xFF) >> 1) - 1; offset = (((offset & 1) + 2) << newIndex); offset += _src->getKeyMasked(newIndex); } @@ -775,7 +775,7 @@ bool FileExpander::process(uint8 *dst, const uint8 *src, uint32 outsize, uint32 void FileExpander::generateTables(uint8 srcIndex, uint8 dstIndex, uint8 dstIndex2, int cnt) { uint8 *tbl1 = _tables[srcIndex]; uint8 *tbl2 = _tables[dstIndex]; - uint8 *tbl3 = dstIndex2 == 0xff ? 0 : _tables[dstIndex2]; + uint8 *tbl3 = dstIndex2 == 0xFF ? 0 : _tables[dstIndex2]; if (!cnt) return; @@ -859,7 +859,7 @@ void FileExpander::generateTables(uint8 srcIndex, uint8 dstIndex, uint8 dstIndex do { s2[o] = cnt; o += inc; - } while (!(o & 0xf00)); + } while (!(o & 0xF00)); } else if (t > 8) { if (!bt) @@ -868,7 +868,7 @@ void FileExpander::generateTables(uint8 srcIndex, uint8 dstIndex, uint8 dstIndex t -= 8; uint8 shiftCnt = 1; uint8 v = (*d) >> 8; - s2 = &((uint16 *)tbl2)[*d & 0xff]; + s2 = &((uint16 *)tbl2)[*d & 0xFF]; do { if (!*s2) { @@ -897,7 +897,7 @@ uint8 FileExpander::calcCmdAndIndex(const uint8 *tbl, int16 ¶) { do { newIndex++; - para = t[((~para) & 0xfffe) | (v & 1)]; + para = t[((~para) & 0xFFFE) | (v & 1)]; v >>= 1; } while (para < 0); @@ -1020,7 +1020,7 @@ Common::Archive *InstallerLoader::load(Resource *owner, const Common::String &fi pos = 0; - const uint32 kExecSize = 0x0bba; + const uint32 kExecSize = 0x0BBA; const uint32 kHeaderSize = 30; const uint32 kHeaderSize2 = 46; diff --git a/engines/kyra/resource_intern.h b/engines/kyra/resource_intern.h index 9d9574d823..e63eab7d6a 100644 --- a/engines/kyra/resource_intern.h +++ b/engines/kyra/resource_intern.h @@ -75,7 +75,7 @@ private: const uint32 *findFile(const Common::String &name) const; const uint16 _entryCount; - const uint32 * const _fileEntries; + const uint32 *const _fileEntries; }; class CachedArchive : public Common::Archive { diff --git a/engines/kyra/saveload.cpp b/engines/kyra/saveload.cpp index 41ba1e5e50..bacfb62c16 100644 --- a/engines/kyra/saveload.cpp +++ b/engines/kyra/saveload.cpp @@ -37,7 +37,7 @@ namespace Kyra { -KyraEngine_v1::kReadSaveHeaderError KyraEngine_v1::readSaveHeader(Common::SeekableReadStream *in, bool loadThumbnail, SaveHeader &header) { +KyraEngine_v1::ReadSaveHeaderError KyraEngine_v1::readSaveHeader(Common::SeekableReadStream *in, bool loadThumbnail, SaveHeader &header) { uint32 type = in->readUint32BE(); header.originalSave = false; header.oldHeader = false; @@ -140,7 +140,7 @@ Common::SeekableReadStream *KyraEngine_v1::openSaveForReading(const char *filena if (!(in = _saveFileMan->openForLoading(filename))) return 0; - kReadSaveHeaderError errorCode = KyraEngine_v1::readSaveHeader(in, false, header); + ReadSaveHeaderError errorCode = KyraEngine_v1::readSaveHeader(in, false, header); if (errorCode != kRSHENoError) { if (errorCode == kRSHEInvalidType) warning("No ScummVM Kyra engine savefile header"); diff --git a/engines/kyra/saveload_eob.cpp b/engines/kyra/saveload_eob.cpp index f7d7d95b57..e4f53a852d 100644 --- a/engines/kyra/saveload_eob.cpp +++ b/engines/kyra/saveload_eob.cpp @@ -298,7 +298,7 @@ Common::Error EoBCoreEngine::loadGameState(int slot) { useMagicBookOrSymbol(_openBookChar, _openBookType); } - _screen->copyRegion(0, 120, 0, 0, 176, 24, 0, _useHiResDithering ? 1 : 12, Screen::CR_NO_P_CHECK); + _screen->copyRegion(0, 120, 0, 0, 176, 24, 0, 12, Screen::CR_NO_P_CHECK); gui_toggleButtons(); setHandItem(_itemInHand); @@ -453,7 +453,7 @@ Common::Error EoBCoreEngine::saveGameStateIntern(int slot, const char *saveName, out->write(l->wallsXorData, 4096); for (int ii = 0; ii < 1024; ii++) - out->writeByte(l->flags[ii] & 0xff); + out->writeByte(l->flags[ii] & 0xFF); EoBMonsterInPlay *lm = (EoBMonsterInPlay *)_lvlTempData[i]->monsters; EoBFlyingObject *lf = (EoBFlyingObject *)_lvlTempData[i]->flyingObjects; @@ -680,7 +680,7 @@ Common::String EoBCoreEngine::readOriginalSaveFile(Common::String &file) { in.skip(4); delete[] c->faceShape; c->faceShape = 0; - in.read(c->mageSpells, (_flags.gameID == GI_EOB1) ? 30 :80); + in.read(c->mageSpells, (_flags.gameID == GI_EOB1) ? 30 : 80); in.read(c->clericSpells, (_flags.gameID == GI_EOB1) ? 30 : 80); c->mageSpellsAvailableFlags = in.readUint32(); for (int ii = 0; ii < 27; ii++) diff --git a/engines/kyra/saveload_lok.cpp b/engines/kyra/saveload_lok.cpp index b76d1da52a..f8cca1ab7b 100644 --- a/engines/kyra/saveload_lok.cpp +++ b/engines/kyra/saveload_lok.cpp @@ -150,7 +150,7 @@ Common::Error KyraEngine_LoK::loadGameState(int slot) { // it wasn't made sure that _curSfxFile was initialized // so if it's out of bounds we just set it to 0. if (_flags.platform == Common::kPlatformFMTowns) { - if (_curSfxFile >= _soundData->fileListLen || _curSfxFile < 0) + if (!_sound->hasSoundFile(_curSfxFile)) _curSfxFile = 0; _sound->loadSoundFile(_curSfxFile); } diff --git a/engines/kyra/saveload_lol.cpp b/engines/kyra/saveload_lol.cpp index b6840663e9..6c83ebd51b 100644 --- a/engines/kyra/saveload_lol.cpp +++ b/engines/kyra/saveload_lol.cpp @@ -41,7 +41,7 @@ Common::Error LoLEngine::loadGameState(int slot) { SaveHeader header; Common::InSaveFile *saveFile = openSaveForReading(fileName, header); if (!saveFile) { - _txt->printMessage(2, "%s", getLangString(0x425d)); + _txt->printMessage(2, "%s", getLangString(0x425D)); return Common::kNoError; } @@ -437,7 +437,7 @@ Common::Error LoLEngine::saveGameStateIntern(int slot, const char *saveName, con out->write(l->wallsXorData, 4096); for (int ii = 0; ii < 1024; ii++) - out->writeByte(l->flags[ii] & 0xff); + out->writeByte(l->flags[ii] & 0xFF); LoLMonster *lm = (LoLMonster *)_lvlTempData[i]->monsters; FlyingObject *lf = (FlyingObject *)_lvlTempData[i]->flyingObjects; @@ -547,7 +547,7 @@ void LoLEngine::restoreTempDataAdjustMonsterStrength(int index) { if (_lvlTempData[index]->monsterDifficulty == _monsterDifficulty) return; - uint16 d = (_monsterModifiers[_lvlTempData[index]->monsterDifficulty] << 8) / _monsterModifiers[_monsterDifficulty]; + uint16 d = (_monsterModifiers1[_lvlTempData[index]->monsterDifficulty] << 8) / _monsterModifiers1[_monsterDifficulty]; for (int i = 0; i < 30; i++) { if (_monsters[i].mode >= 14 || _monsters[i].block == 0 || _monsters[i].hitPoints <= 0) diff --git a/engines/kyra/scene_eob.cpp b/engines/kyra/scene_eob.cpp index 3db055db90..84cf4a3809 100644 --- a/engines/kyra/scene_eob.cpp +++ b/engines/kyra/scene_eob.cpp @@ -100,7 +100,7 @@ void EoBCoreEngine::loadLevel(int level, int sub) { void EoBCoreEngine::readLevelFileData(int level) { Common::String file; Common::SeekableReadStream *s = 0; - static const char *suffix[] = { "INF", "DRO", "ELO", 0 }; + static const char *const suffix[] = { "INF", "DRO", "ELO", 0 }; for (const char *const *sf = suffix; *sf && !s; sf++) { file = Common::String::format("LEVEL%d.%s", level, *sf); @@ -144,10 +144,10 @@ Common::String EoBCoreEngine::initLevelData(int sub) { const char *vmpPattern = (_flags.gameID == GI_EOB1 && (_configRenderMode == Common::kRenderEGA || _configRenderMode == Common::kRenderCGA)) ? "%s.EMP" : "%s.VMP"; Common::SeekableReadStream *s = _res->createReadStream(Common::String::format(vmpPattern, (const char *)pos)); - _vmpSize = s->readUint16LE(); + uint16 size = s->readUint16LE(); delete[] _vmpPtr; - _vmpPtr = new uint16[_vmpSize]; - for (int i = 0; i < _vmpSize; i++) + _vmpPtr = new uint16[size]; + for (int i = 0; i < size; i++) _vmpPtr[i] = s->readUint16LE(); delete s; @@ -157,7 +157,7 @@ Common::String EoBCoreEngine::initLevelData(int sub) { _curGfxFile = (const char *)pos; pos += slen; - if (*pos++ != 0xff && _flags.gameID == GI_EOB2) { + if (*pos++ != 0xFF && _flags.gameID == GI_EOB2) { tmpStr = Common::String::format(paletteFilePattern, (const char *)pos); pos += 13; } @@ -174,7 +174,7 @@ Common::String EoBCoreEngine::initLevelData(int sub) { if (_configRenderMode != Common::kRenderCGA) { Palette backupPal(256); backupPal.copy(_screen->getPalette(0), 224, 32, 224); - _screen->getPalette(0).fill(224, 32, 0x3f); + _screen->getPalette(0).fill(224, 32, 0x3F); uint8 *src = _screen->getPalette(0).getData(); _screen->createFadeTable(src, _screen->getFadeTable(0), 4, 75); // green @@ -271,7 +271,7 @@ void EoBCoreEngine::addLevelItems() { for (int i = 0; i < 600; i++) { if (_items[i].level != _currentLevel || _items[i].block <= 0) continue; - setItemPosition((Item *)&_levelBlockProperties[_items[i].block & 0x3ff].drawObjects, _items[i].block, i, _items[i].pos); + setItemPosition((Item *)&_levelBlockProperties[_items[i].block & 0x3FF].drawObjects, _items[i].block, i, _items[i].pos); } } @@ -283,7 +283,7 @@ void EoBCoreEngine::loadVcnData(const char *file, const uint8 *cgaMapping) { _screen->loadBitmap(Common::String::format(filePattern, _lastBlockDataFile).c_str(), 3, 3, 0); const uint8 *pos = _screen->getCPagePtr(3); - uint32 vcnSize = READ_LE_UINT16(pos) * _vcnBlockWidth * _vcnBlockHeight; + uint32 vcnSize = READ_LE_UINT16(pos) << 5; pos += 2; const uint8 *colMap = pos; @@ -292,78 +292,28 @@ void EoBCoreEngine::loadVcnData(const char *file, const uint8 *cgaMapping) { delete[] _vcnBlocks; _vcnBlocks = new uint8[vcnSize]; - if (_flags.gameID == GI_EOB2 && _configRenderMode == Common::kRenderEGA) { - const uint8 *egaTable = _screen->getEGADitheringTable(); - assert(_vmpPtr); - assert(egaTable); - - delete[] _vcnTransitionMask; - _vcnTransitionMask = new uint8[vcnSize]; - - for (int i = 0; i < _vmpSize; i++) { - uint16 vcnOffs = _vmpPtr[i] & 0x3FFF; - const uint8 *src = &pos[vcnOffs << 5]; - uint8 *dst1 = &_vcnBlocks[vcnOffs << 7]; - uint8 *dst3 = &_vcnTransitionMask[vcnOffs << 7]; - int palOffset = (i < 330) ? 0 : _wllVcnOffset; - - for (int y = 0; y < 8; y++) { - uint8 *dst2 = dst1 + 8; - uint8 *dst4 = dst3 + 8; - - for (int x = 0; x < 4; x++) { - uint8 in = *src++; - - dst1[0] = dst2[0] = egaTable[colMap[(in >> 4) + palOffset]]; - dst1[1] = dst2[1] = egaTable[colMap[(in & 0x0f) + palOffset]]; - dst3[0] = dst4[0] = (in & 0xf0) ? 0 : 0xff; - dst3[1] = dst4[1] = (in & 0x0f) ? 0 : 0xff; - - dst1 += 2; - dst2 += 2; - dst3 += 2; - dst4 += 2; - } - - dst1 += 8; - dst3 += 8; - } - } - } else if (_configRenderMode == Common::kRenderCGA) { + if (_configRenderMode == Common::kRenderCGA) { uint8 *tmp = _screen->encodeShape(0, 0, 1, 8, false, cgaMapping); delete[] tmp; delete[] _vcnTransitionMask; _vcnTransitionMask = new uint8[vcnSize]; - uint8 tblSwitch = 0; + uint8 tblSwitch = 1; uint8 *dst = _vcnBlocks; uint8 *dst2 = _vcnTransitionMask; while (dst < _vcnBlocks + vcnSize) { const uint16 *table = _screen->getCGADitheringTable((tblSwitch++) & 1); for (int ii = 0; ii < 2; ii++) { - *dst++ = ((table[pos[0]] & 0x000f) << 4) | ((table[pos[0]] & 0x0f00) >> 8); - *dst++= ((table[pos[1]] & 0x000f) << 4) | ((table[pos[1]] & 0x0f00) >> 8); - - uint8 msk = 0; - if (pos[0] & 0xf0) - msk |= 0x30; - if (pos[0] & 0x0f) - msk |= 0x03; - *dst2++ = msk ^ 0x33; - - msk = 0; - if (pos[1] & 0xf0) - msk |= 0x30; - if (pos[1] & 0x0f) - msk |= 0x03; - *dst2++ = msk ^ 0x33; - + *dst++ = (table[pos[0]] & 0x000F) | ((table[pos[0]] & 0x0F00) >> 4); + *dst++ = (table[pos[1]] & 0x000F) | ((table[pos[1]] & 0x0F00) >> 4); + *dst2++ = ((pos[0] & 0xF0 ? 0x30 : 0) | (pos[0] & 0x0F ? 0x03 : 0)) ^ 0x33; + *dst2++ = ((pos[1] & 0xF0 ? 0x30 : 0) | (pos[1] & 0x0F ? 0x03 : 0)) ^ 0x33; pos += 2; } } } else { - if (_configRenderMode != Common::kRenderEGA) + if (!(_flags.gameID == GI_EOB1 && _configRenderMode == Common::kRenderEGA)) memcpy(_vcnColTable, colMap, 32); memcpy(_vcnBlocks, pos, vcnSize); } @@ -429,8 +379,8 @@ void EoBCoreEngine::loadDecorations(const char *cpsFile, const char *decFile) { LevelDecorationProperty *l = &_levelDecorationData[i]; for (int ii = 0; ii < 10; ii++) { l->shapeIndex[ii] = s->readByte(); - if (l->shapeIndex[ii] == 0xff) - l->shapeIndex[ii] = 0xffff; + if (l->shapeIndex[ii] == 0xFF) + l->shapeIndex[ii] = 0xFFFF; } l->next = s->readByte(); l->flags = s->readByte(); @@ -477,7 +427,7 @@ void EoBCoreEngine::assignWallsAndDecorations(int wallIndex, int vmpIndex, int d for (int i = 0; i < 10; i++) { uint16 t = _levelDecorationProperties[_mappedDecorationsCount].shapeIndex[i]; - if (t == 0xffff) + if (t == 0xFFFF) continue; if (_levelDecorationShapes[t]) @@ -529,7 +479,7 @@ void EoBCoreEngine::toggleWallState(int wall, int toggle) { if (toggle) _wllWallFlags[wall + i] |= 2; else - _wllWallFlags[wall + i] &= 0xfd; + _wllWallFlags[wall + i] &= 0xFD; } } @@ -643,7 +593,7 @@ void EoBCoreEngine::drawDecorations(int index) { if ((i == 0) && (flg & 1 || ((flg & 2) && _wllProcessFlag))) ix = -ix; - if (_levelDecorationProperties[l].shapeIndex[shpIx] == 0xffff) { + if (_levelDecorationProperties[l].shapeIndex[shpIx] == 0xFFFF) { l = _levelDecorationProperties[l].next; continue; } @@ -758,7 +708,7 @@ int EoBCoreEngine::clickedNiche(uint16 block, uint16 direction) { if (_dscItemShapeMap[_items[_itemInHand].icon] <= 14) { _txt->printMessage(_pryDoorStrings[5]); } else { - setItemPosition((Item *)&_levelBlockProperties[block & 0x3ff].drawObjects, block, _itemInHand, 8); + setItemPosition((Item *)&_levelBlockProperties[block & 0x3FF].drawObjects, block, _itemInHand, 8); runLevelScript(block, 4); setHandItem(0); _sceneUpdateRequired = true; @@ -781,7 +731,7 @@ int EoBCoreEngine::clickedDoorPry(uint16 block, uint16 direction) { int d = -1; for (int i = 0; i < 6; i++) { - if (!testCharacter(i, 0x0d)) + if (!testCharacter(i, 0x0D)) continue; if (d >= 0) { int s1 = _characters[i].strengthCur + _characters[i].strengthExtCur; @@ -826,7 +776,7 @@ int EoBCoreEngine::clickedDoorNoPry(uint16 block, uint16 direction) { int EoBCoreEngine::specialWallAction(int block, int direction) { direction ^= 2; uint8 type = _specialWallTypes[_levelBlockProperties[block].walls[direction]]; - if (!type || !(_clickedSpecialFlag & (((_levelBlockProperties[block].flags & 0xf8) >> 3) | 0xe0))) + if (!type || !(_clickedSpecialFlag & (((_levelBlockProperties[block].flags & 0xF8) >> 3) | 0xE0))) return 0; int res = 0; diff --git a/engines/kyra/scene_lol.cpp b/engines/kyra/scene_lol.cpp index 628654f127..f1045d2ddf 100644 --- a/engines/kyra/scene_lol.cpp +++ b/engines/kyra/scene_lol.cpp @@ -193,7 +193,7 @@ int LoLEngine::assignLevelDecorationShapes(int index) { for (int i = 0; i < 10; i++) { uint16 t = _levelDecorationProperties[o].shapeIndex[i]; - if (t == 0xffff) + if (t == 0xFFFF) continue; uint16 pv = p1[t]; @@ -254,7 +254,7 @@ void LoLEngine::loadBlockProperties(const char *cmzFile) { _levelBlockProperties[i].direction = 5; if (_wllAutomapData[_levelBlockProperties[i].walls[0]] == 17) { - _levelBlockProperties[i].flags &= 0xef; + _levelBlockProperties[i].flags &= 0xEF; _levelBlockProperties[i].flags |= 0x20; } } @@ -315,9 +315,9 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight if (_lastSpecialColor == 1) _lastSpecialColor = 0x44; else if (_lastSpecialColor == 0x66) - _lastSpecialColor = scumm_stricmp(file, "YVEL2") ? 0xcc : 0x44; - else if (_lastSpecialColor == 0x6b) - _lastSpecialColor = 0xcc; + _lastSpecialColor = scumm_stricmp(file, "YVEL2") ? 0xCC : 0x44; + else if (_lastSpecialColor == 0x6B) + _lastSpecialColor = 0xCC; else _lastSpecialColor = 0x44; } @@ -431,17 +431,17 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight } for (int ii = l; ii < 256; ii++) - levelOverlay[ii] = ii & 0xff; + levelOverlay[ii] = ii & 0xFF; } uint8 *levelOverlay = _screen->getLevelOverlay(7); for (int i = 0; i < 256; i++) - levelOverlay[i] = i & 0xff; + levelOverlay[i] = i & 0xFF; if (_flags.use16ColorMode) { - _screen->getLevelOverlay(6)[0xee] = 0xee; + _screen->getLevelOverlay(6)[0xEE] = 0xEE; if (_lastSpecialColor == 0x44) - _screen->getLevelOverlay(5)[0xee] = 0xee; + _screen->getLevelOverlay(5)[0xEE] = 0xEE; for (int i = 0; i < 7; i++) memcpy(_screen->getLevelOverlay(i), _screen->getLevelOverlay(i + 1), 256); @@ -505,14 +505,14 @@ void LoLEngine::resetBlockProperties() { for (int i = 0; i < 1024; i++) { LevelBlockProperty *l = &_levelBlockProperties[i]; if (l->flags & 0x10) { - l->flags &= 0xef; + l->flags &= 0xEF; if (testWallInvisibility(i, 0) && testWallInvisibility(i, 1)) l->flags |= 0x40; } else { if (l->flags & 0x40) - l->flags &= 0xbf; + l->flags &= 0xBF; else if (l->flags & 0x80) - l->flags &= 0x7f; + l->flags &= 0x7F; } } } @@ -574,7 +574,7 @@ void LoLEngine::updateLampStatus() { setPaletteBrightness(_screen->getPalette(0), _brightness, newLampEffect); _lampStatusTimer = _system->getMillis() + (10 + rollDice(1, 30)) * _tickLength; } else { - if ((_lampEffect & 0xfe) == (newLampEffect & 0xfe)) { + if ((_lampEffect & 0xFE) == (newLampEffect & 0xFE)) { if (_system->getMillis() <= _lampStatusTimer) { newLampEffect = _lampEffect; } else { @@ -702,7 +702,7 @@ void LoLEngine::moveParty(uint16 direction, int unk1, int unk2, int buttonShape) runLevelScript(opos, 8); runLevelScript(npos, 2); - if (_levelBlockProperties[npos].walls[0] == 0x1a) + if (_levelBlockProperties[npos].walls[0] == 0x1A) memset(_levelBlockProperties[npos].walls, 0, 4); } } @@ -711,12 +711,12 @@ void LoLEngine::moveParty(uint16 direction, int unk1, int unk2, int buttonShape) } uint16 LoLEngine::calcBlockIndex(uint16 x, uint16 y) { - return (((y & 0xff00) >> 3) | (x >> 8)) & 0x3ff; + return (((y & 0xFF00) >> 3) | (x >> 8)) & 0x3FF; } void LoLEngine::calcCoordinates(uint16 &x, uint16 &y, int block, uint16 xOffs, uint16 yOffs) { - x = (block & 0x1f) << 8 | xOffs; - y = ((block & 0xffe0) << 3) | yOffs; + x = (block & 0x1F) << 8 | xOffs; + y = ((block & 0xFFE0) << 3) | yOffs; } void LoLEngine::calcCoordinatesForSingleCharacter(int charNum, uint16 &x, uint16 &y) { @@ -732,8 +732,8 @@ void LoLEngine::calcCoordinatesForSingleCharacter(int charNum, uint16 &x, uint16 calcCoordinatesAddDirectionOffset(x, y, _currentDirection); - x |= (_partyPosX & 0xff00); - y |= (_partyPosY & 0xff00); + x |= (_partyPosX & 0xFF00); + y |= (_partyPosY & 0xFF00); } void LoLEngine::calcCoordinatesAddDirectionOffset(uint16 &x, uint16 &y, int direction) { @@ -777,7 +777,7 @@ void LoLEngine::notifyBlockNotPassable(int scrollFlag) { movePartySmoothScrollBlocked(2); snd_stopSpeech(true); - _txt->printMessage(0x8002, "%s", getLangString(0x403f)); + _txt->printMessage(0x8002, "%s", getLangString(0x403F)); snd_playSoundEffect(19, -1); } @@ -804,7 +804,7 @@ int LoLEngine::clickedNiche(uint16 block, uint16 direction) { return 0; uint16 x = 0x80; - uint16 y = 0xff; + uint16 y = 0xFF; calcCoordinatesAddDirectionOffset(x, y, _currentDirection); calcCoordinates(x, y, block, x, y); setItemPosition(_itemInHand, x, y, 8, 1); @@ -1180,14 +1180,14 @@ void LoLEngine::processGasExplosion(int soundId) { memcpy(p2, p1, 768); for (int i = 1; i < 128; i++) - p2[i * 3] = 0x3f; + p2[i * 3] = 0x3F; uint32 ctime = _system->getMillis(); - while (_screen->fadePaletteStep(_screen->getPalette(0).getData(), p2, _system->getMillis() - ctime, 10)) + while (_screen->timedPaletteFadeStep(_screen->getPalette(0).getData(), p2, _system->getMillis() - ctime, 10)) updateInput(); ctime = _system->getMillis(); - while (_screen->fadePaletteStep(p2, _screen->getPalette(0).getData(), _system->getMillis() - ctime, 50)) + while (_screen->timedPaletteFadeStep(p2, _screen->getPalette(0).getData(), _system->getMillis() - ctime, 50)) updateInput(); } @@ -1244,10 +1244,10 @@ void LoLEngine::setWallType(int block, int wall, int val) { for (int i = 0; i < 4; i++) _levelBlockProperties[block].walls[i] = val; if (_wllAutomapData[val] == 17) { - _levelBlockProperties[block].flags &= 0xef; + _levelBlockProperties[block].flags &= 0xEF; _levelBlockProperties[block].flags |= 0x20; } else { - _levelBlockProperties[block].flags &= 0xdf; + _levelBlockProperties[block].flags &= 0xDF; } } else { _levelBlockProperties[block].walls[wall] = val; @@ -1491,7 +1491,7 @@ void LoLEngine::drawDecorations(int index) { ov = 0; } ovl = _screen->getLevelOverlay(ov); - } else if (_levelDecorationProperties[l].shapeIndex[shpIx] != 0xffff) { + } else if (_levelDecorationProperties[l].shapeIndex[shpIx] != 0xFFFF) { scaleW = scaleH = 0x100; int ov = 7; if (_flags.use16ColorMode) { @@ -1504,7 +1504,7 @@ void LoLEngine::drawDecorations(int index) { ovl = _screen->getLevelOverlay(ov); } - if (_levelDecorationProperties[l].shapeIndex[shpIx] != 0xffff) { + if (_levelDecorationProperties[l].shapeIndex[shpIx] != 0xFFFF) { shapeData = _levelDecorationShapes[_levelDecorationProperties[l].shapeIndex[shpIx]]; if (shapeData) { if (ix < 0) { @@ -1538,10 +1538,10 @@ void LoLEngine::drawDecorations(int index) { } void LoLEngine::drawBlockEffects(int index, int type) { - static const uint16 yOffs[] = { 0xff, 0xff, 0x80, 0x80 }; + static const uint16 yOffs[] = { 0xFF, 0xFF, 0x80, 0x80 }; uint8 flg = _visibleBlocks[index]->flags; // flags: 0x10 = ice wall, 0x20 = teleporter, 0x40 = blue slime spot, 0x80 = blood spot - if (!(flg & 0xf0)) + if (!(flg & 0xF0)) return; type = (type == 0) ? 2 : 0; @@ -1562,8 +1562,8 @@ void LoLEngine::drawBlockEffects(int index, int type) { calcCoordinatesAddDirectionOffset(x, y, _currentDirection); - x |= ((_visibleBlockIndex[index] & 0x1f) << 8); - y |= ((_visibleBlockIndex[index] & 0xffe0) << 3); + x |= ((_visibleBlockIndex[index] & 0x1F) << 8); + y |= ((_visibleBlockIndex[index] & 0xFFE0) << 3); drawItemOrMonster(_effectShapes[type], ovl, x, y, 0, (type == 1) ? -20 : 0, drawFlag, -1, false); } diff --git a/engines/kyra/scene_mr.cpp b/engines/kyra/scene_mr.cpp index d6df523f82..c9486d9c45 100644 --- a/engines/kyra/scene_mr.cpp +++ b/engines/kyra/scene_mr.cpp @@ -22,7 +22,7 @@ #include "kyra/kyra_mr.h" #include "kyra/screen_mr.h" -#include "kyra/sound.h" +#include "kyra/sound_digital.h" #include "kyra/resource.h" #include "common/system.h" diff --git a/engines/kyra/scene_rpg.cpp b/engines/kyra/scene_rpg.cpp index 3a694e05fe..6d724efed0 100644 --- a/engines/kyra/scene_rpg.cpp +++ b/engines/kyra/scene_rpg.cpp @@ -151,7 +151,7 @@ void KyraRpgEngine::generateBlockDrawingBuffer() { memset(_blockDrawingBuffer, 0, 660 * sizeof(uint16)); - _wllProcessFlag = ((_currentBlock >> 5) + (_currentBlock & 0x1f) + _currentDirection) & 1; + _wllProcessFlag = ((_currentBlock >> 5) + (_currentBlock & 0x1F) + _currentDirection) & 1; if (_wllProcessFlag) // floor and ceiling generateVmpTileDataFlipped(0, 15, 1, -330, 22, 15); @@ -318,7 +318,7 @@ bool KyraRpgEngine::hasWall(int index) { void KyraRpgEngine::assignVisibleBlocks(int block, int direction) { for (int i = 0; i < 18; i++) { - uint16 t = (block + _dscBlockIndex[direction * 18 + i]) & 0x3ff; + uint16 t = (block + _dscBlockIndex[direction * 18 + i]) & 0x3FF; _visibleBlockIndex[i] = t; _visibleBlocks[i] = &_levelBlockProperties[t]; @@ -348,9 +348,6 @@ bool KyraRpgEngine::checkSceneUpdateNeed(int block) { void KyraRpgEngine::drawVcnBlocks() { uint8 *d = _sceneWindowBuffer; uint16 *bdb = _blockDrawingBuffer; - uint16 pitch = 22 * _vcnBlockWidth * 2; - uint8 pxl[2]; - pxl[0] = pxl[1] = 0; for (int y = 0; y < 15; y++) { for (int x = 0; x < 22; x++) { @@ -369,96 +366,95 @@ void KyraRpgEngine::drawVcnBlocks() { if (vcnOffset & 0x4000) { horizontalFlip = true; - vcnOffset &= 0x3fff; + vcnOffset &= 0x3FFF; } uint8 *src = 0; if (vcnOffset) { - src = &_vcnBlocks[vcnOffset * _vcnBlockWidth * _vcnBlockHeight]; + src = &_vcnBlocks[vcnOffset << 5]; wllVcnOffset = _wllVcnOffset; } else { // floor/ceiling blocks vcnOffset = bdb[329]; if (vcnOffset & 0x4000) { horizontalFlip = true; - vcnOffset &= 0x3fff; + vcnOffset &= 0x3FFF; } - src = (_vcfBlocks ? _vcfBlocks : _vcnBlocks) + (vcnOffset * _vcnBlockWidth * _vcnBlockHeight); + src = (_vcfBlocks ? _vcfBlocks : _vcnBlocks) + (vcnOffset << 5); } uint8 shift = _vcnShift ? _vcnShift[vcnOffset] : _blockBrightness; if (horizontalFlip) { - for (int blockY = 0; blockY < _vcnBlockHeight; blockY++) { - src += (_vcnBlockWidth - 1); - for (int blockX = 0; blockX < _vcnBlockWidth; blockX++) { + for (int blockY = 0; blockY < 8; blockY++) { + src += 3; + for (int blockX = 0; blockX < 4; blockX++) { uint8 bl = *src--; - d[_vcnFlip0] = _vcnColTable[((bl & 0x0f) + wllVcnOffset) | shift]; - d[_vcnFlip1] = _vcnColTable[((bl >> 4) + wllVcnOffset) | shift]; - d += 2; + *d++ = _vcnColTable[((bl & 0x0F) + wllVcnOffset) | shift]; + *d++ = _vcnColTable[((bl >> 4) + wllVcnOffset) | shift]; } - src += (_vcnBlockWidth + 1); - d += (pitch - 2 * _vcnBlockWidth); + src += 5; + d += 168; } } else { - for (int blockY = 0; blockY < _vcnBlockHeight; blockY++) { - for (int blockX = 0; blockX < _vcnBlockWidth; blockX++) { + for (int blockY = 0; blockY < 8; blockY++) { + for (int blockX = 0; blockX < 4; blockX++) { uint8 bl = *src++; *d++ = _vcnColTable[((bl >> 4) + wllVcnOffset) | shift]; - *d++ = _vcnColTable[((bl & 0x0f) + wllVcnOffset) | shift]; + *d++ = _vcnColTable[((bl & 0x0F) + wllVcnOffset) | shift]; } - d += (pitch - 2 * _vcnBlockWidth); + d += 168; } } - d -= (pitch * _vcnBlockHeight - 2 * _vcnBlockWidth); + d -= 1400; if (vcnExtraOffsetWll) { - d -= (2 * _vcnBlockWidth); + d -= 8; horizontalFlip = false; if (vcnExtraOffsetWll & 0x4000) { - vcnExtraOffsetWll &= 0x3fff; + vcnExtraOffsetWll &= 0x3FFF; horizontalFlip = true; } shift = _vcnShift ? _vcnShift[vcnExtraOffsetWll] : _blockBrightness; - src = &_vcnBlocks[vcnExtraOffsetWll * _vcnBlockWidth * _vcnBlockHeight]; - uint8 *maskTable = _vcnTransitionMask ? &_vcnTransitionMask[vcnExtraOffsetWll * _vcnBlockWidth * _vcnBlockHeight] : 0; + src = &_vcnBlocks[vcnExtraOffsetWll << 5]; + uint8 *maskTable = _vcnTransitionMask ? &_vcnTransitionMask[vcnExtraOffsetWll << 5] : 0; if (horizontalFlip) { - for (int blockY = 0; blockY < _vcnBlockHeight; blockY++) { - src += (_vcnBlockWidth - 1); - maskTable += (_vcnBlockWidth - 1); - for (int blockX = 0; blockX < _vcnBlockWidth; blockX++) { + for (int blockY = 0; blockY < 8; blockY++) { + src += 3; + maskTable += 3; + for (int blockX = 0; blockX < 4; blockX++) { uint8 bl = *src--; uint8 mask = _vcnTransitionMask ? *maskTable-- : 0; - pxl[_vcnFlip0] = _vcnColTable[((bl & 0x0f) + wllVcnRmdOffset) | shift]; - pxl[_vcnFlip1] = _vcnColTable[((bl >> 4) + wllVcnRmdOffset) | shift]; + uint8 h = _vcnColTable[((bl & 0x0F) + wllVcnRmdOffset) | shift]; + uint8 l = _vcnColTable[((bl >> 4) + wllVcnRmdOffset) | shift]; if (_vcnTransitionMask) - *d = (*d & (mask & 0x0f)) | pxl[0]; - else if (pxl[0]) - *d = pxl[0]; + *d = (*d & (mask & 0x0F)) | h; + else if (h) + *d = h; d++; if (_vcnTransitionMask) - *d = (*d & (mask >> 4)) | pxl[1]; - else if (pxl[1]) - *d = pxl[1]; + *d = (*d & (mask >> 4)) | l; + else if (l) + *d = l; d++; } - src += (_vcnBlockWidth + 1); - maskTable += (_vcnBlockWidth + 1); - d += (pitch - 2 * _vcnBlockWidth); + src += 5; + maskTable += 5; + d += 168; } } else { - for (int blockY = 0; blockY < _vcnBlockHeight; blockY++) { - for (int blockX = 0; blockX < _vcnBlockWidth; blockX++) { + for (int blockY = 0; blockY < 8; blockY++) { + for (int blockX = 0; blockX < 4; blockX++) { uint8 bl = *src++; uint8 mask = _vcnTransitionMask ? *maskTable++ : 0; uint8 h = _vcnColTable[((bl >> 4) + wllVcnRmdOffset) | shift]; - uint8 l = _vcnColTable[((bl & 0x0f) + wllVcnRmdOffset) | shift]; + uint8 l = _vcnColTable[((bl & 0x0F) + wllVcnRmdOffset) | shift]; if (_vcnTransitionMask) *d = (*d & (mask >> 4)) | h; @@ -467,18 +463,18 @@ void KyraRpgEngine::drawVcnBlocks() { d++; if (_vcnTransitionMask) - *d = (*d & (mask & 0x0f)) | l; + *d = (*d & (mask & 0x0F)) | l; else if (l) *d = l; d++; } - d += (pitch - 2 * _vcnBlockWidth); + d += 168; } } - d -= (pitch * _vcnBlockHeight - 2 * _vcnBlockWidth); + d -= 1400; } } - d += (pitch * (_vcnBlockHeight - 1)); + d += 1232; } screen()->copyBlockToPage(_sceneDrawPage1, _sceneXoffset, 0, 176, 120, _sceneWindowBuffer); @@ -486,7 +482,7 @@ void KyraRpgEngine::drawVcnBlocks() { uint16 KyraRpgEngine::calcNewBlockPosition(uint16 curBlock, uint16 direction) { static const int16 blockPosTable[] = { -32, 1, 32, -1 }; - return (curBlock + blockPosTable[direction]) & 0x3ff; + return (curBlock + blockPosTable[direction]) & 0x3FF; } int KyraRpgEngine::clickedWallShape(uint16 block, uint16 direction) { diff --git a/engines/kyra/screen.cpp b/engines/kyra/screen.cpp index 04d805737f..419b630714 100644 --- a/engines/kyra/screen.cpp +++ b/engines/kyra/screen.cpp @@ -51,13 +51,12 @@ Screen::Screen(KyraEngine_v1 *vm, OSystem *system, const ScreenDim *dimTable, co memset(_fonts, 0, sizeof(_fonts)); memset(_pagePtrs, 0, sizeof(_pagePtrs)); - // Set scale factor to 1 (no scaling) for all pages - memset(_pageScaleFactor, 1, sizeof(_pageScaleFactor)); // In VGA mode the odd and even page pointers point to the same buffers. for (int i = 0; i < SCREEN_PAGE_NUM; i++) _pageMapping[i] = i & ~1; _renderMode = Common::kRenderDefault; + _sjisMixedFontMode = false; _currentFont = FID_8_FNT; _paletteChanged = true; @@ -114,7 +113,7 @@ bool Screen::init() { } // CGA and EGA modes use additional pages to do the CGA/EGA specific graphics conversions. - if (_renderMode == Common::kRenderCGA || _renderMode == Common::kRenderEGA) { + if (_vm->game() == GI_EOB1 && (_renderMode == Common::kRenderCGA || _renderMode == Common::kRenderEGA)) { for (int i = 0; i < 8; i++) _pageMapping[i] = i; } @@ -126,6 +125,7 @@ bool Screen::init() { if (_useOverlays) { _useSJIS = (_vm->gameFlags().lang == Common::JA_JPN); _sjisInvisibleColor = (_vm->game() == GI_KYRA1) ? 0x80 : 0xF6; + _sjisMixedFontMode = !_use16ColorMode; for (int i = 0; i < SCREEN_OVLS_NUM; ++i) { if (!_sjisOverlayPtrs[i]) { @@ -141,7 +141,7 @@ bool Screen::init() { if (!font) error("Could not load any SJIS font, neither the original nor ScummVM's 'SJIS.FNT'"); - _fonts[FID_SJIS_FNT] = new SJISFont(font, _sjisInvisibleColor, _use16ColorMode, !_use16ColorMode); + _fonts[FID_SJIS_FNT] = new SJISFont(font, _sjisInvisibleColor, _use16ColorMode, !_use16ColorMode && _vm->game() != GI_LOL, _vm->game() == GI_LOL ? 1 : 0); } } @@ -154,9 +154,7 @@ bool Screen::init() { } int numPages = realPages.size(); - uint32 bufferSize = 0; - for (int i = 0; i < numPages; i++) - bufferSize += (SCREEN_PAGE_SIZE * _pageScaleFactor[realPages[i]] * _pageScaleFactor[realPages[i]]); + uint32 bufferSize = numPages * SCREEN_PAGE_SIZE; uint8 *pagePtr = new uint8[bufferSize]; memset(pagePtr, 0, bufferSize); @@ -167,7 +165,7 @@ bool Screen::init() { _pagePtrs[i] = _pagePtrs[_pageMapping[i]]; } else { _pagePtrs[i] = pagePtr; - pagePtr += (SCREEN_PAGE_SIZE * _pageScaleFactor[i] * _pageScaleFactor[i]); + pagePtr += SCREEN_PAGE_SIZE; } } @@ -292,7 +290,7 @@ void Screen::updateScreen() { needRealUpdate = true; if (!_useOverlays) - _system->copyRectToScreen(getPagePtr(2), SCREEN_W, 320, 0, SCREEN_W * _pageScaleFactor[2], SCREEN_H * _pageScaleFactor[2]); + _system->copyRectToScreen(getPagePtr(2), SCREEN_W, 320, 0, SCREEN_W, SCREEN_H); else _system->copyRectToScreen(getPagePtr(2), SCREEN_W, 640, 0, SCREEN_W, SCREEN_H); } @@ -303,12 +301,12 @@ void Screen::updateScreen() { void Screen::updateDirtyRects() { if (_forceFullUpdate) { - _system->copyRectToScreen(getCPagePtr(0), SCREEN_W * _pageScaleFactor[0], 0, 0, SCREEN_W * _pageScaleFactor[0], SCREEN_H * _pageScaleFactor[0]); + _system->copyRectToScreen(getCPagePtr(0), SCREEN_W, 0, 0, SCREEN_W, SCREEN_H); } else { const byte *page0 = getCPagePtr(0); Common::List<Common::Rect>::iterator it; for (it = _dirtyRects.begin(); it != _dirtyRects.end(); ++it) { - _system->copyRectToScreen(page0 + it->top * SCREEN_W * _pageScaleFactor[0] + it->left, SCREEN_W * _pageScaleFactor[0], it->left, it->top, it->width(), it->height()); + _system->copyRectToScreen(page0 + it->top * SCREEN_W + it->left, SCREEN_W, it->left, it->top, it->width(), it->height()); } } _forceFullUpdate = false; @@ -493,7 +491,7 @@ void Screen::clearPage(int pageNum) { assert(pageNum < SCREEN_PAGE_NUM); if (pageNum == 0 || pageNum == 1) _forceFullUpdate = true; - memset(getPagePtr(pageNum), 0, SCREEN_PAGE_SIZE * _pageScaleFactor[_curPage] * _pageScaleFactor[_curPage]); + memset(getPagePtr(pageNum), 0, SCREEN_PAGE_SIZE); clearOverlayPage(pageNum); } @@ -507,7 +505,7 @@ int Screen::setCurPage(int pageNum) { void Screen::clearCurPage() { if (_curPage == 0 || _curPage == 1) _forceFullUpdate = true; - memset(getPagePtr(_curPage), 0, SCREEN_PAGE_SIZE * _pageScaleFactor[_curPage] * _pageScaleFactor[_curPage]); + memset(getPagePtr(_curPage), 0, SCREEN_PAGE_SIZE); clearOverlayPage(_curPage); } @@ -672,7 +670,7 @@ void Screen::setPagePixel(int pageNum, int x, int y, uint8 color) { color |= (color << 4); } else if (_renderMode == Common::kRenderCGA) { color &= 0x03; - } else if (_renderMode == Common::kRenderEGA) { + } else if (_renderMode == Common::kRenderEGA && !_useHiResEGADithering) { color &= 0x0F; } @@ -881,26 +879,16 @@ void Screen::copyToPage0(int y, int h, uint8 page, uint8 *seqBuf) { } void Screen::copyRegion(int x1, int y1, int x2, int y2, int w, int h, int srcPage, int dstPage, int flags) { - // Since we don't (need to) do any actual scaling, we check for compatible pages here - assert(_pageScaleFactor[srcPage] == _pageScaleFactor[dstPage]); - - x1 *= _pageScaleFactor[srcPage]; - y1 *= _pageScaleFactor[srcPage]; - x2 *= _pageScaleFactor[dstPage]; - y2 *= _pageScaleFactor[dstPage]; - w *= _pageScaleFactor[srcPage]; - h *= _pageScaleFactor[srcPage]; - if (x2 < 0) { if (x2 <= -w) return; w += x2; x1 -= x2; x2 = 0; - } else if (x2 + w >= SCREEN_W * _pageScaleFactor[dstPage]) { - if (x2 > SCREEN_W * _pageScaleFactor[dstPage]) + } else if (x2 + w >= SCREEN_W) { + if (x2 > SCREEN_W) return; - w = SCREEN_W * _pageScaleFactor[srcPage] - x2; + w = SCREEN_W - x2; } if (y2 < 0) { @@ -909,14 +897,14 @@ void Screen::copyRegion(int x1, int y1, int x2, int y2, int w, int h, int srcPag h += y2; y1 -= y2; y2 = 0; - } else if (y2 + h >= SCREEN_H * _pageScaleFactor[dstPage]) { - if (y2 > SCREEN_H * _pageScaleFactor[dstPage]) + } else if (y2 + h >= SCREEN_H) { + if (y2 > SCREEN_H) return; - h = SCREEN_H * _pageScaleFactor[srcPage] - y2; + h = SCREEN_H - y2; } - const uint8 *src = getPagePtr(srcPage) + y1 * SCREEN_W * _pageScaleFactor[srcPage] + x1; - uint8 *dst = getPagePtr(dstPage) + y2 * SCREEN_W * _pageScaleFactor[dstPage] + x2; + const uint8 *src = getPagePtr(srcPage) + y1 * SCREEN_W + x1; + uint8 *dst = getPagePtr(dstPage) + y2 * SCREEN_W + x2; if (src == dst) return; @@ -929,8 +917,8 @@ void Screen::copyRegion(int x1, int y1, int x2, int y2, int w, int h, int srcPag if (flags & CR_NO_P_CHECK) { while (h--) { memmove(dst, src, w); - src += SCREEN_W * _pageScaleFactor[srcPage]; - dst += SCREEN_W * _pageScaleFactor[dstPage]; + src += SCREEN_W; + dst += SCREEN_W; } } else { while (h--) { @@ -938,24 +926,19 @@ void Screen::copyRegion(int x1, int y1, int x2, int y2, int w, int h, int srcPag if (src[i]) dst[i] = src[i]; } - src += SCREEN_W * _pageScaleFactor[srcPage]; - dst += SCREEN_W * _pageScaleFactor[dstPage]; + src += SCREEN_W; + dst += SCREEN_W; } } } void Screen::copyRegionToBuffer(int pageNum, int x, int y, int w, int h, uint8 *dest) { - x *= _pageScaleFactor[pageNum]; - y *= _pageScaleFactor[pageNum]; - w *= _pageScaleFactor[pageNum]; - h *= _pageScaleFactor[pageNum]; - if (y < 0) { dest += (-y) * w; h += y; y = 0; } else if (y + h > SCREEN_H) { - h = SCREEN_H * _pageScaleFactor[pageNum] - y; + h = SCREEN_H - y; } if (x < 0) { @@ -963,7 +946,7 @@ void Screen::copyRegionToBuffer(int pageNum, int x, int y, int w, int h, uint8 * w += x; x = 0; } else if (x + w > SCREEN_W) { - w = SCREEN_W * _pageScaleFactor[pageNum] - x; + w = SCREEN_W - x; } if (w < 0 || h < 0) @@ -972,17 +955,14 @@ void Screen::copyRegionToBuffer(int pageNum, int x, int y, int w, int h, uint8 * uint8 *pagePtr = getPagePtr(pageNum); for (int i = y; i < y + h; ++i) - memcpy(dest + (i - y) * w, pagePtr + i * SCREEN_W * _pageScaleFactor[pageNum] + x, w); + memcpy(dest + (i - y) * w, pagePtr + i * SCREEN_W + x, w); } void Screen::copyPage(uint8 srcPage, uint8 dstPage) { - // Since we don't (need to) do any actual scaling, we check for compatible pages here - assert(_pageScaleFactor[srcPage] == _pageScaleFactor[dstPage]); - uint8 *src = getPagePtr(srcPage); uint8 *dst = getPagePtr(dstPage); if (src != dst) - memcpy(dst, src, SCREEN_W * _pageScaleFactor[srcPage] * SCREEN_H * _pageScaleFactor[srcPage]); + memcpy(dst, src, SCREEN_W * SCREEN_H); copyOverlayRegion(0, 0, 0, 0, SCREEN_W, SCREEN_H, srcPage, dstPage); if (dstPage == 0 || dstPage == 1) @@ -1009,12 +989,7 @@ void Screen::copyBlockToPage(int pageNum, int x, int y, int w, int h, const uint if (w < 0 || h < 0) return; - x *= _pageScaleFactor[pageNum]; - y *= _pageScaleFactor[pageNum]; - w *= _pageScaleFactor[pageNum]; - h *= _pageScaleFactor[pageNum]; - - uint8 *dst = getPagePtr(pageNum) + y * SCREEN_W * _pageScaleFactor[pageNum] + x; + uint8 *dst = getPagePtr(pageNum) + y * SCREEN_W + x; if (pageNum == 0 || pageNum == 1) addDirtyRect(x, y, w, h); @@ -1023,7 +998,7 @@ void Screen::copyBlockToPage(int pageNum, int x, int y, int w, int h, const uint while (h--) { memcpy(dst, src, w); - dst += SCREEN_W * _pageScaleFactor[pageNum]; + dst += SCREEN_W; src += w; } } @@ -1101,7 +1076,7 @@ void Screen::fillRect(int x1, int y1, int x2, int y2, uint8 color, int pageNum, color |= (color << 4); } else if (_renderMode == Common::kRenderCGA) { color &= 0x03; - } else if (_renderMode == Common::kRenderEGA) { + } else if (_renderMode == Common::kRenderEGA && !_useHiResEGADithering) { color &= 0x0F; } @@ -1178,7 +1153,7 @@ void Screen::drawLine(bool vertical, int x, int y, int length, int color) { color |= (color << 4); } else if (_renderMode == Common::kRenderCGA) { color &= 0x03; - } else if (_renderMode == Common::kRenderEGA) { + } else if (_renderMode == Common::kRenderEGA && !_useHiResEGADithering) { color &= 0x0F; } @@ -1187,7 +1162,7 @@ void Screen::drawLine(bool vertical, int x, int y, int length, int color) { int currLine = 0; while (currLine < length) { *ptr = color; - ptr += SCREEN_W * _pageScaleFactor[_curPage]; + ptr += SCREEN_W; currLine++; } } else { @@ -1233,7 +1208,8 @@ bool Screen::loadFont(FontId fontId, const char *filename) { fnt = new AMIGAFont(); #ifdef ENABLE_EOB else if (_vm->game() == GI_EOB1 || _vm->game() == GI_EOB2) - fnt = new OldDOSFont(_renderMode, _vm->gameFlags().useHiRes); + // We use normal VGA rendering in EOB II, since we do the complete EGA dithering in updateScreen(). + fnt = new OldDOSFont(_useHiResEGADithering ? Common::kRenderVGA : _renderMode); #endif // ENABLE_EOB else fnt = new DOSFont(); @@ -1272,11 +1248,16 @@ int Screen::getCharWidth(uint16 c) const { return width + ((_currentFont != FID_SJIS_FNT) ? _charWidth : 0); } -int Screen::getTextWidth(const char *str) const { +int Screen::getTextWidth(const char *str) { int curLineLen = 0; int maxLineLen = 0; + FontId curFont = _currentFont; + while (1) { + if (_sjisMixedFontMode) + setFont(*str < 0 ? FID_SJIS_FNT : curFont); + uint c = fetchChar(str); if (c == 0) { @@ -1300,7 +1281,7 @@ void Screen::printText(const char *str, int x, int y, uint8 color1, uint8 color2 cmap[1] = color1; setTextColor(cmap, 0, 1); - const uint8 charHeightFnt = getFontHeight(); + FontId curFont = _currentFont; if (x < 0) x = 0; @@ -1314,6 +1295,11 @@ void Screen::printText(const char *str, int x, int y, uint8 color1, uint8 color2 return; while (1) { + if (_sjisMixedFontMode) + setFont(*str < 0 ? FID_SJIS_FNT : curFont); + + uint8 charHeightFnt = getFontHeight(); + uint c = fetchChar(str); if (c == 0) { @@ -1362,9 +1348,6 @@ void Screen::drawChar(uint16 c, int x, int y) { if (x + charWidth > SCREEN_W || y + charHeight > SCREEN_H) return; - x *= _pageScaleFactor[_curPage]; - y *= _pageScaleFactor[_curPage]; - if (useOverlay) { uint8 *destPage = getOverlayPtr(_curPage); if (!destPage) { @@ -1376,11 +1359,11 @@ void Screen::drawChar(uint16 c, int x, int y) { fnt->drawChar(c, destPage, 640); } else { - fnt->drawChar(c, getPagePtr(_curPage) + y * SCREEN_W * _pageScaleFactor[_curPage] + x, SCREEN_W * _pageScaleFactor[_curPage]); + fnt->drawChar(c, getPagePtr(_curPage) + y * SCREEN_W + x, SCREEN_W); } if (_curPage == 0 || _curPage == 1) - addDirtyRect(x, y, charWidth * _pageScaleFactor[_curPage], charHeight * _pageScaleFactor[_curPage]); + addDirtyRect(x, y, charWidth, charHeight); } void Screen::drawShape(uint8 pageNum, const uint8 *shapeData, int x, int y, int sd, int flags, ...) { @@ -1519,7 +1502,7 @@ void Screen::drawShape(uint8 pageNum, const uint8 *shapeData, int x, int y, int int scaleCounterV = 0; - const int drawFunc = flags & 0x0f; + const int drawFunc = flags & 0x0F; _dsProcessMargin = dsMarginFunc[drawFunc]; _dsScaleSkip = dsSkipFunc[drawFunc]; _dsProcessLine = dsLineFunc[drawFunc]; @@ -1776,7 +1759,7 @@ int Screen::drawShapeMarginScaleUpwind(uint8 *&dst, const uint8 *&src, int &cnt) _dsTmpWidth += cnt; int i = (_dsOffscreenLeft - cnt) * _dsScaleW; - int res = i & 0xff; + int res = i & 0xFF; i >>= 8; i -= _dsOffscreenScaleVal2; dst += i; @@ -1802,7 +1785,7 @@ int Screen::drawShapeMarginScaleDownwind(uint8 *&dst, const uint8 *&src, int &cn _dsTmpWidth += cnt; int i = (_dsOffscreenLeft - cnt) * _dsScaleW; - int res = i & 0xff; + int res = i & 0xFF; i >>= 8; i -= _dsOffscreenScaleVal2; dst -= i; @@ -1891,7 +1874,7 @@ void Screen::drawShapeProcessLineScaleUpwind(uint8 *&dst, const uint8 *&src, int int r = c * _dsScaleW + scaleState; dst += (r >> 8); cnt -= (r >> 8); - scaleState = r & 0xff; + scaleState = r & 0xFF; } } else if (scaleState) { (this->*_dsPlot)(dst++, c); @@ -1919,7 +1902,7 @@ void Screen::drawShapeProcessLineScaleDownwind(uint8 *&dst, const uint8 *&src, i int r = c * _dsScaleW + scaleState; dst -= (r >> 8); cnt -= (r >> 8); - scaleState = r & 0xff; + scaleState = r & 0xFF; } } else { (this->*_dsPlot)(dst--, c); @@ -1967,9 +1950,9 @@ void Screen::drawShapePlotType5(uint8 *dst, uint8 cmd) { void Screen::drawShapePlotType6(uint8 *dst, uint8 cmd) { int t = _drawShapeVar4 + _drawShapeVar5; - if (t & 0xff00) { + if (t & 0xFF00) { cmd = dst[_drawShapeVar3]; - t &= 0xff; + t &= 0xFF; } else { cmd = _dsTable2[cmd]; } @@ -1980,7 +1963,7 @@ void Screen::drawShapePlotType6(uint8 *dst, uint8 cmd) { void Screen::drawShapePlotType8(uint8 *dst, uint8 cmd) { uint32 relOffs = dst - _dsDstPage; - int t = (_shapePages[0][relOffs] & 0x7f) & 0x87; + int t = (_shapePages[0][relOffs] & 0x7F) & 0x87; if (_dsDrawLayer < t) cmd = _shapePages[1][relOffs]; @@ -1989,7 +1972,7 @@ void Screen::drawShapePlotType8(uint8 *dst, uint8 cmd) { void Screen::drawShapePlotType9(uint8 *dst, uint8 cmd) { uint32 relOffs = dst - _dsDstPage; - int t = (_shapePages[0][relOffs] & 0x7f) & 0x87; + int t = (_shapePages[0][relOffs] & 0x7F) & 0x87; if (_dsDrawLayer < t) { cmd = _shapePages[1][relOffs]; } else { @@ -2003,7 +1986,7 @@ void Screen::drawShapePlotType9(uint8 *dst, uint8 cmd) { void Screen::drawShapePlotType11_15(uint8 *dst, uint8 cmd) { uint32 relOffs = dst - _dsDstPage; - int t = (_shapePages[0][relOffs] & 0x7f) & 0x87; + int t = (_shapePages[0][relOffs] & 0x7F) & 0x87; if (_dsDrawLayer < t) { cmd = _shapePages[1][relOffs]; @@ -2019,7 +2002,7 @@ void Screen::drawShapePlotType11_15(uint8 *dst, uint8 cmd) { void Screen::drawShapePlotType12(uint8 *dst, uint8 cmd) { uint32 relOffs = dst - _dsDstPage; - int t = (_shapePages[0][relOffs] & 0x7f) & 0x87; + int t = (_shapePages[0][relOffs] & 0x7F) & 0x87; if (_dsDrawLayer < t) { cmd = _shapePages[1][relOffs]; } else { @@ -2031,7 +2014,7 @@ void Screen::drawShapePlotType12(uint8 *dst, uint8 cmd) { void Screen::drawShapePlotType13(uint8 *dst, uint8 cmd) { uint32 relOffs = dst - _dsDstPage; - int t = (_shapePages[0][relOffs] & 0x7f) & 0x87; + int t = (_shapePages[0][relOffs] & 0x7F) & 0x87; if (_dsDrawLayer < t) { cmd = _shapePages[1][relOffs]; } else { @@ -2046,14 +2029,14 @@ void Screen::drawShapePlotType13(uint8 *dst, uint8 cmd) { void Screen::drawShapePlotType14(uint8 *dst, uint8 cmd) { uint32 relOffs = dst - _dsDstPage; - int t = (_shapePages[0][relOffs] & 0x7f) & 0x87; + int t = (_shapePages[0][relOffs] & 0x7F) & 0x87; if (_dsDrawLayer < t) { cmd = _shapePages[1][relOffs]; } else { t = _drawShapeVar4 + _drawShapeVar5; - if (t & 0xff00) { + if (t & 0xFF00) { cmd = dst[_drawShapeVar3]; - t &= 0xff; + t &= 0xFF; } else { cmd = _dsTable2[cmd]; } @@ -2147,7 +2130,7 @@ void Screen::decodeFrame1(const uint8 *src, uint8 *dst, uint32 size) { uint8 nib = 0; uint16 code = decodeEGAGetCode(src, nib); - uint8 last = code & 0xff; + uint8 last = code & 0xFF; uint8 *dstPrev = dst; uint16 count = 1; @@ -2160,7 +2143,7 @@ void Screen::decodeFrame1(const uint8 *src, uint8 *dst, uint32 size) { uint8 cmd = code >> 8; if (cmd--) { - code = (cmd << 8) | (code & 0xff); + code = (cmd << 8) | (code & 0xFF); uint8 *tmpDst = dst; if (code < numPatterns) { @@ -2188,7 +2171,7 @@ void Screen::decodeFrame1(const uint8 *src, uint8 *dst, uint32 size) { count = countPrev; } else { - *dst++ = last = (code & 0xff); + *dst++ = last = (code & 0xFF); if (numPatterns < 3840) { patterns[numPatterns].pos = dstPrev; @@ -2209,7 +2192,7 @@ uint16 Screen::decodeEGAGetCode(const uint8 *&pos, uint8 &nib) { res >>= 4; } else { pos++; - res &= 0xfff; + res &= 0xFFF; } return res; } @@ -2891,8 +2874,6 @@ void Screen::setShapePages(int page1, int page2, int minY, int maxY) { void Screen::setMouseCursor(int x, int y, const byte *shape) { if (!shape) return; - // if mouseDisabled - // return _mouseShape if (_vm->gameFlags().useAltShapeHeader) shape += 2; @@ -3215,7 +3196,7 @@ void Screen::addDirtyRect(int x, int y, int w, int h) { Common::Rect r(x, y, x + w, y + h); // Clip rectangle - r.clip(SCREEN_W * _pageScaleFactor[0], SCREEN_H * _pageScaleFactor[0]); + r.clip(SCREEN_W, SCREEN_H); // If it is empty after clipping, we are done if (r.isEmpty()) @@ -3322,8 +3303,6 @@ void Screen::crossFadeRegion(int x1, int y1, int x2, int y2, int w, int h, int s if (srcPage > 13 || dstPage > 13) error("Screen::crossFadeRegion(): attempting to use temp page as source or dest page."); - assert(_pageScaleFactor[srcPage] == _pageScaleFactor[dstPage]); - hideMouse(); uint16 *wB = (uint16 *)_pagePtrs[14]; @@ -3341,6 +3320,9 @@ void Screen::crossFadeRegion(int x1, int y1, int x2, int y2, int w, int h, int s for (int i = 0; i < h; i++) SWAP(hB[_vm->_rnd.getRandomNumberRng(0, h - 1)], hB[i]); + uint8 *s = _pagePtrs[srcPage]; + uint8 *d = _pagePtrs[dstPage]; + for (int i = 0; i < h; i++) { int iH = i; uint32 end = _system->getMillis() + 3; @@ -3353,7 +3335,8 @@ void Screen::crossFadeRegion(int x1, int y1, int x2, int y2, int w, int h, int s if (++iH >= h) iH = 0; - setPagePixel(dstPage, dX, dY, getPagePixel(srcPage, sX, sY)); + d[dY * 320 + dX] = s[sY * 320 + sX]; + addDirtyRect(dX, dY, 1, 1); } // This tries to speed things up, to get similiar speeds as in DOSBox etc. @@ -3595,11 +3578,11 @@ void AMIGAFont::unload() { memset(_chars, 0, sizeof(_chars)); } -SJISFont::SJISFont(Graphics::FontSJIS *font, const uint8 invisColor, bool is16Color, bool outlineSize) - : _colorMap(0), _font(font), _invisColor(invisColor), _is16Color(is16Color) { +SJISFont::SJISFont(Graphics::FontSJIS *font, const uint8 invisColor, bool is16Color, bool drawOutline, int extraSpacing) + : _colorMap(0), _font(font), _invisColor(invisColor), _is16Color(is16Color), _drawOutline(drawOutline), _sjisWidthOffset(extraSpacing) { assert(_font); - _font->setDrawingMode(outlineSize ? Graphics::FontSJIS::kOutlineMode : Graphics::FontSJIS::kDefaultMode); + _font->setDrawingMode(_drawOutline ? Graphics::FontSJIS::kOutlineMode : Graphics::FontSJIS::kDefaultMode); _sjisWidth = _font->getMaxFontWidth() >> 1; _fontHeight = _font->getFontHeight() >> 1; @@ -3616,14 +3599,14 @@ int SJISFont::getHeight() const { } int SJISFont::getWidth() const { - return _sjisWidth; + return _sjisWidth + _sjisWidthOffset; } int SJISFont::getCharWidth(uint16 c) const { if (c <= 0x7F || (c >= 0xA1 && c <= 0xDF)) return _asciiWidth; else - return _sjisWidth; + return _sjisWidth + _sjisWidthOffset; } void SJISFont::setColorMap(const uint8 *src) { @@ -3633,7 +3616,7 @@ void SJISFont::setColorMap(const uint8 *src) { if (_colorMap[0] == _invisColor) _font->setDrawingMode(Graphics::FontSJIS::kDefaultMode); else - _font->setDrawingMode(Graphics::FontSJIS::kOutlineMode); + _font->setDrawingMode(_drawOutline ? Graphics::FontSJIS::kOutlineMode : Graphics::FontSJIS::kDefaultMode); } } @@ -3672,7 +3655,7 @@ void Palette::loadVGAPalette(Common::ReadStream &stream, int startIndex, int col uint8 *pos = _palData + startIndex * 3; for (int i = 0 ; i < colors * 3; i++) - *pos++ = stream.readByte() & 0x3f; + *pos++ = stream.readByte() & 0x3F; } void Palette::loadEGAPalette(Common::ReadStream &stream, int startIndex, int colors) { diff --git a/engines/kyra/screen.h b/engines/kyra/screen.h index 60bfeb3241..156b5b9a7c 100644 --- a/engines/kyra/screen.h +++ b/engines/kyra/screen.h @@ -146,7 +146,7 @@ private: */ class OldDOSFont : public Font { public: - OldDOSFont(Common::RenderMode mode, bool useHiResEGADithering); + OldDOSFont(Common::RenderMode mode); ~OldDOSFont(); bool load(Common::SeekableReadStream &file); @@ -168,8 +168,6 @@ private: int _numGlyphs; Common::RenderMode _renderMode; - bool _useHiResEGADithering; - bool _useLoResEGA; static uint16 *_cgaDitheringTable; static int _numRef; @@ -213,7 +211,7 @@ private: */ class SJISFont : public Font { public: - SJISFont(Graphics::FontSJIS *font, const uint8 invisColor, bool is16Color, bool outlineSize); + SJISFont(Graphics::FontSJIS *font, const uint8 invisColor, bool is16Color, bool drawOutline, int extraSpacing); ~SJISFont() { unload(); } bool usesOverlay() const { return true; } @@ -232,6 +230,12 @@ private: Graphics::FontSJIS *_font; const uint8 _invisColor; const bool _is16Color; + const bool _drawOutline; + // We use this for cases where the font width returned by getWidth() or getCharWidth() does not match the original. + // The original Japanese game versions use hard coded sjis font widths of 8 or 9. However, this does not necessarily + // depend on whether an outline is used or not (neither LOL/PC-9801 nor LOL/FM-TOWNS use an outline, but the first + // version uses a font width of 8 where the latter uses a font width of 9). + const int _sjisWidthOffset; int _sjisWidth, _asciiWidth; int _fontHeight; @@ -426,12 +430,12 @@ public: void copyBlockToPage(int pageNum, int x, int y, int w, int h, const uint8 *src); void shuffleScreen(int sx, int sy, int w, int h, int srcPage, int dstPage, int ticks, bool transparent); - virtual void fillRect(int x1, int y1, int x2, int y2, uint8 color, int pageNum = -1, bool xored = false); + void fillRect(int x1, int y1, int x2, int y2, uint8 color, int pageNum = -1, bool xored = false); void clearPage(int pageNum); - virtual uint8 getPagePixel(int pageNum, int x, int y); - virtual void setPagePixel(int pageNum, int x, int y, uint8 color); + uint8 getPagePixel(int pageNum, int x, int y); + void setPagePixel(int pageNum, int x, int y, uint8 color); const uint8 *getCPagePtr(int pageNum) const; uint8 *getPageRect(int pageNum, int x, int y, int w, int h); @@ -457,7 +461,7 @@ public: void copyPalette(const int dst, const int src); // gui specific (processing on _curPage) - virtual void drawLine(bool vertical, int x, int y, int length, int color); + void drawLine(bool vertical, int x, int y, int length, int color); void drawClippedLine(int x1, int y1, int x2, int y2, int color); virtual void drawShadedBox(int x1, int y1, int x2, int y2, int color1, int color2); void drawBox(int x1, int y1, int x2, int y2, int color); @@ -470,9 +474,9 @@ public: int getFontWidth() const; int getCharWidth(uint16 c) const; - int getTextWidth(const char *str) const; + int getTextWidth(const char *str); - virtual void printText(const char *str, int x, int y, uint8 color1, uint8 color2); + void printText(const char *str, int x, int y, uint8 color1, uint8 color2); virtual void setTextColorMap(const uint8 *cmap) = 0; void setTextColor(const uint8 *cmap, int a, int b); @@ -549,7 +553,7 @@ public: protected: uint8 *getPagePtr(int pageNum); - void updateDirtyRects(); + virtual void updateDirtyRects(); void updateDirtyRectsAmiga(); void updateDirtyRectsOvl(); @@ -573,18 +577,17 @@ protected: uint8 *_pagePtrs[16]; uint8 *_sjisOverlayPtrs[SCREEN_OVLS_NUM]; - uint8 _pageScaleFactor[SCREEN_PAGE_NUM]; uint8 _pageMapping[SCREEN_PAGE_NUM]; bool _useOverlays; bool _useSJIS; bool _use16ColorMode; bool _useHiResEGADithering; - bool _useLoResEGA; bool _isAmiga; Common::RenderMode _renderMode; uint8 _sjisInvisibleColor; + bool _sjisMixedFontMode; Palette *_screenPalette; Common::Array<Palette *> _palettes; @@ -600,7 +603,7 @@ protected: int _animBlockSize; // dimension handling - const ScreenDim * const _dimTable; + const ScreenDim *const _dimTable; ScreenDim **_customDimTable; const int _dimTableCount; int _curDimIndex; diff --git a/engines/kyra/screen_eob.cpp b/engines/kyra/screen_eob.cpp index ae75c111b4..b1b26357f8 100644 --- a/engines/kyra/screen_eob.cpp +++ b/engines/kyra/screen_eob.cpp @@ -52,10 +52,10 @@ Screen_EoB::Screen_EoB(EoBCoreEngine *vm, OSystem *system) : Screen(vm, system, _cgaScaleTable = 0; _gfxMaxY = 0; _egaDitheringTable = 0; - _egaPixelValueTable = 0; + _egaDitheringTempPage = 0; _cgaMappingDefault = 0; _cgaDitheringTables[0] = _cgaDitheringTables[1] = 0; - _useLoResEGA = _useHiResEGADithering = false; + _useHiResEGADithering = false; } Screen_EoB::~Screen_EoB() { @@ -63,18 +63,12 @@ Screen_EoB::~Screen_EoB() { delete[] _dsTempPage; delete[] _cgaScaleTable; delete[] _egaDitheringTable; - delete[] _egaPixelValueTable; + delete[] _egaDitheringTempPage; delete[] _cgaDitheringTables[0]; delete[] _cgaDitheringTables[1]; } bool Screen_EoB::init() { - // Define hi-res pages for EGA mode in EOB II - if (_vm->gameFlags().useHiRes) { - for (int i = 0; i < 8; i++) - _pageScaleFactor[i] = 2; - } - if (Screen::init()) { int temp; _gfxMaxY = _vm->staticres()->loadRawData(kEoBBaseExpObjectY, temp); @@ -98,13 +92,9 @@ bool Screen_EoB::init() { if (_vm->gameFlags().useHiRes && _renderMode == Common::kRenderEGA) { _useHiResEGADithering = true; _egaDitheringTable = new uint8[256]; - _egaPixelValueTable = new uint8[256]; - for (int i = 0; i < 256; i++) { - _egaDitheringTable[i] = i & 0x0f; - _egaPixelValueTable[i] = i & 0x0f; - } - } else if (_renderMode == Common::kRenderEGA) { - _useLoResEGA = true; + _egaDitheringTempPage = new uint8[SCREEN_W * 2 * SCREEN_H * 2]; + for (int i = 0; i < 256; i++) + _egaDitheringTable[i] = i & 0x0F; } else if (_renderMode == Common::kRenderCGA) { _cgaMappingDefault = _vm->staticres()->loadRawData(kEoB1CgaMappingDefault, temp); _cgaDitheringTables[0] = new uint16[256]; @@ -115,7 +105,7 @@ bool Screen_EoB::init() { _cgaScaleTable = new uint8[256]; memset(_cgaScaleTable, 0, 256 * sizeof(uint8)); for (int i = 0; i < 256; i++) - _cgaScaleTable[i] = ((i & 0xf0) >> 2) | (i & 0x03); + _cgaScaleTable[i] = ((i & 0xF0) >> 2) | (i & 0x03); } return true; @@ -144,14 +134,20 @@ void Screen_EoB::setMouseCursor(int x, int y, const byte *shape, const uint8 *ov int mouseH = (shape[3]); int colorKey = (_renderMode == Common::kRenderCGA) ? 0 : _cursorColorKey; - uint8 *cursor = new uint8[mouseW * _pageScaleFactor[6] * mouseH * _pageScaleFactor[6]]; + int scaleFactor = _useHiResEGADithering ? 2 : 1; + + uint8 *cursor = new uint8[mouseW * scaleFactor * mouseH * scaleFactor]; // We use memset and copyBlockToPage instead of fillRect to make sure that the // color key 0xFF doesn't get converted into EGA color - memset(cursor, colorKey, mouseW * _pageScaleFactor[6] * mouseH * _pageScaleFactor[6]); - copyBlockToPage(6, 0, 0, mouseW, mouseH, cursor); + memset(cursor, colorKey, mouseW * scaleFactor * mouseH * scaleFactor); + copyBlockToPage(6, 0, 0, mouseW * scaleFactor, mouseH * scaleFactor, cursor); drawShape(6, shape, 0, 0, 0, 2, ovl); CursorMan.showMouse(false); - copyRegionToBuffer(6, 0, 0, mouseW, mouseH, cursor); + + if (_useHiResEGADithering) + ditherRect(getCPagePtr(6), cursor, mouseW * scaleFactor, mouseW, mouseH, colorKey); + else + copyRegionToBuffer(6, 0, 0, mouseW, mouseH, cursor); // Mouse cursor post processing for CGA mode. Unlike the original (which uses drawShape for the mouse cursor) // the cursor manager cannot know whether a pixel value of 0 is supposed to be black or transparent. Thus, we @@ -176,7 +172,7 @@ void Screen_EoB::setMouseCursor(int x, int y, const byte *shape, const uint8 *ov } } - CursorMan.replaceCursor(cursor, mouseW * _pageScaleFactor[6], mouseH * _pageScaleFactor[6], x, y, colorKey); + CursorMan.replaceCursor(cursor, mouseW * scaleFactor, mouseH * scaleFactor, x, y, colorKey); if (isMouseVisible()) CursorMan.showMouse(true); delete[] cursor; @@ -192,19 +188,6 @@ void Screen_EoB::loadFileDataToPage(Common::SeekableReadStream *s, int pageNum, s->read(_pagePtrs[pageNum], size); } -void Screen_EoB::printText(const char *str, int x, int y, uint8 color1, uint8 color2) { - if (_useHiResEGADithering) { - // This is sort of an abuse of the text color map. But since EOB doesn't use it anyway - // and the font drawing code needs access to both the original color values and the - // EGA dithering colors we pass them on like this. - uint8 cmap[2]; - cmap[0] = _egaDitheringTable[color2]; - cmap[1] = _egaDitheringTable[color1]; - setTextColor(cmap, 2, 3); - } - Screen::printText(str, x, y, color1, color2); -} - void Screen_EoB::printShadedText(const char *string, int x, int y, int col1, int col2) { printText(string, x - 1, y, 12, col2); printText(string, x, y + 1, 12, 0); @@ -272,32 +255,19 @@ void Screen_EoB::convertPage(int srcPage, int dstPage, const uint8 *cgaMapping) if (cgaMapping) generateCGADitheringTables(cgaMapping); - uint16 *d = (uint16*)dst; + uint16 *d = (uint16 *)dst; uint8 tblSwitch = 0; for (int height = SCREEN_H; height; height--) { const uint16 *table = _cgaDitheringTables[(tblSwitch++) & 1]; for (int width = SCREEN_W / 2; width; width--) { - WRITE_LE_UINT16(d++, table[((src[1] & 0x0f) << 4) | (src[0] & 0x0f)]); + WRITE_LE_UINT16(d++, table[((src[1] & 0x0F) << 4) | (src[0] & 0x0F)]); src += 2; } } - - } else if (_useHiResEGADithering) { - for (int height = SCREEN_H; height; height--) { - uint8 *dst2 = dst + SCREEN_W * 2; - for (int width = SCREEN_W; width; width--) { - uint8 in = _egaDitheringTable[*src++]; - *dst++ = *dst2++ = in >> 4; - *dst++ = *dst2++ = in & 0x0f; - } - dst += (SCREEN_W * 2); - } - - } else if (_renderMode == Common::kRenderEGA) { + } else if (_renderMode == Common::kRenderEGA && !_useHiResEGADithering) { uint32 len = SCREEN_W * SCREEN_H; while (len--) - *dst++ = *src++ & 0x0f; - + *dst++ = *src++ & 0x0F; } else { copyPage(srcPage, dstPage); } @@ -306,111 +276,6 @@ void Screen_EoB::convertPage(int srcPage, int dstPage, const uint8 *cgaMapping) _forceFullUpdate = true; } -void Screen_EoB::fillRect(int x1, int y1, int x2, int y2, uint8 color, int pageNum, bool xored) { - if (!_useHiResEGADithering) { - Screen::fillRect(x1, y1, x2, y2, color, pageNum, xored); - return; - } - - assert(x2 < SCREEN_W && y2 < SCREEN_H); - if (pageNum == -1) - pageNum = _curPage; - - uint16 pitch = (SCREEN_W - (x2 - x1 + 1)) * _pageScaleFactor[pageNum]; - uint8 col1 = (_egaDitheringTable[color] >> 4); - uint8 col2 = (_egaDitheringTable[color] & 0x0f); - - x1 *= _pageScaleFactor[pageNum]; - y1 *= _pageScaleFactor[pageNum]; - x2 *= _pageScaleFactor[pageNum]; - y2 *= _pageScaleFactor[pageNum]; - uint16 w = x2 - x1 + _pageScaleFactor[pageNum]; - uint16 h = y2 - y1 + _pageScaleFactor[pageNum]; - - uint8 *dst = getPagePtr(pageNum) + y1 * SCREEN_W * _pageScaleFactor[pageNum] + x1; - if (pageNum == 0 || pageNum == 1) - addDirtyRect(x1, y1, w, h); - - while (h--) { - for (uint16 w1 = w; w1; w1 -= 2) { - *dst++ = col1; - *dst++ = col2; - } - dst += pitch; - } -} - -void Screen_EoB::drawLine(bool vertical, int x, int y, int length, int color) { - if (!_useHiResEGADithering) { - Screen::drawLine(vertical, x, y, length, color); - return; - } - - uint16 pitch = (SCREEN_W - 1) * _pageScaleFactor[_curPage]; - uint8 col1 = (_egaDitheringTable[color] >> 4); - uint8 col2 = (_egaDitheringTable[color] & 0x0f); - - x *= _pageScaleFactor[_curPage]; - y *= _pageScaleFactor[_curPage]; - length *= _pageScaleFactor[_curPage]; - uint8 *ptr = getPagePtr(_curPage) + y * SCREEN_W * _pageScaleFactor[_curPage] + x; - uint8 *ptr2 = ptr + SCREEN_W * _pageScaleFactor[_curPage]; - - if (vertical) { - assert((y + length) <= SCREEN_H * _pageScaleFactor[_curPage]); - int currLine = 0; - while (currLine < length) { - *ptr++ = col1; - *ptr++ = col2; - ptr += pitch; - currLine++; - } - } else { - assert((x + length) <= SCREEN_W * _pageScaleFactor[_curPage]); - int currLine = 0; - while (currLine < length) { - *ptr++ = *ptr2++ = col1; - *ptr++ = *ptr2++ = col2; - currLine += 2; - } - } - - if (_curPage == 0 || _curPage == 1) - addDirtyRect(x, y, (vertical) ? _pageScaleFactor[_curPage] : length, (vertical) ? length : _pageScaleFactor[_curPage]); -} - -uint8 Screen_EoB::getPagePixel(int pageNum, int x, int y) { - if (!_useHiResEGADithering) - return Screen::getPagePixel(pageNum, x, y); - - x *= _pageScaleFactor[_curPage]; - y *= _pageScaleFactor[_curPage]; - uint8 *pos = &_pagePtrs[pageNum][y * SCREEN_W * _pageScaleFactor[_curPage] + x]; - - return _egaPixelValueTable[(pos[0] << 4) | (pos[1] & 0x0f)]; -} - -void Screen_EoB::setPagePixel(int pageNum, int x, int y, uint8 color) { - if (!_useHiResEGADithering) { - Screen::setPagePixel(pageNum, x, y, color); - return; - } - - assert(pageNum < SCREEN_PAGE_NUM); - assert(x >= 0 && x < SCREEN_W && y >= 0 && y < SCREEN_H); - - x *= _pageScaleFactor[_curPage]; - y *= _pageScaleFactor[_curPage]; - - if (pageNum == 0 || pageNum == 1) - addDirtyRect(x, y, _pageScaleFactor[pageNum], _pageScaleFactor[pageNum]); - - uint8 *pos = &_pagePtrs[pageNum][y * SCREEN_W * _pageScaleFactor[_curPage] + x]; - uint8 *pos2 = pos + SCREEN_W * _pageScaleFactor[_curPage]; - pos[0] = pos2[0] = _egaDitheringTable[color] >> 4; - pos[1] = pos2[1] = _egaDitheringTable[color] & 0x0f; -} - void Screen_EoB::setScreenPalette(const Palette &pal) { if (_useHiResEGADithering && pal.getNumColors() != 16) { generateEGADitheringTable(pal); @@ -444,7 +309,7 @@ uint8 *Screen_EoB::encodeShape(uint16 x, uint16 y, uint16 w, uint16 h, bool enco uint8 *srcLineStart = getPagePtr(_curPage | 1) + y * 320 + (x << 3); uint8 *src = srcLineStart; - if (_useLoResEGA) + if (_renderMode == Common::kRenderEGA && !_useHiResEGADithering) encode8bit = false; if (_renderMode == Common::kRenderCGA) { @@ -456,9 +321,9 @@ uint8 *Screen_EoB::encodeShape(uint16 x, uint16 y, uint16 w, uint16 h, bool enco uint8 *dst = shp; *dst++ = 4; - *dst++ = (h & 0xff); - *dst++ = (w & 0xff); - *dst++ = (h & 0xff); + *dst++ = (h & 0xFF); + *dst++ = (w & 0xFF); + *dst++ = (h & 0xFF); uint8 *dst2 = dst + (h * (w << 1)); @@ -469,8 +334,8 @@ uint8 *Screen_EoB::encodeShape(uint16 x, uint16 y, uint16 w, uint16 h, bool enco const uint16 *table = _cgaDitheringTables[(tblSwitch++) & 1]; while (w1--) { - uint16 p0 = table[((src[1] & 0x0f) << 4) | (src[0] & 0x0f)]; - uint16 p1 = table[((src[3] & 0x0f) << 4) | (src[2] & 0x0f)]; + uint16 p0 = table[((src[1] & 0x0F) << 4) | (src[0] & 0x0F)]; + uint16 p1 = table[((src[3] & 0x0F) << 4) | (src[2] & 0x0F)]; *dst++ = ((p0 & 0x0003) << 6) | ((p0 & 0x0300) >> 4) | ((p1 & 0x0003) << 2) | ((p1 & 0x0300) >> 8); @@ -515,9 +380,9 @@ uint8 *Screen_EoB::encodeShape(uint16 x, uint16 y, uint16 w, uint16 h, bool enco uint8 *dst = shp; *dst++ = 8; - *dst++ = (h & 0xff); - *dst++ = (w & 0xff); - *dst++ = (h & 0xff); + *dst++ = (h & 0xFF); + *dst++ = (w & 0xFF); + *dst++ = (h & 0xFF); srcLineStart = getPagePtr(_curPage | 1) + y * 320 + (x << 3); src = srcLineStart; @@ -540,7 +405,7 @@ uint8 *Screen_EoB::encodeShape(uint16 x, uint16 y, uint16 w, uint16 h, bool enco *dst++ = 0; numZero -= 255; } - val = numZero & 0xff; + val = numZero & 0xFF; } *dst++ = val; } while (src != lineEnd); @@ -555,7 +420,7 @@ uint8 *Screen_EoB::encodeShape(uint16 x, uint16 y, uint16 w, uint16 h, bool enco if (_renderMode != Common::kRenderEGA || _useHiResEGADithering) { colorMap = new uint8[0x100]; - memset(colorMap, 0xff, 0x100); + memset(colorMap, 0xFF, 0x100); } shapesize = h * (w << 2) + 20; @@ -564,15 +429,15 @@ uint8 *Screen_EoB::encodeShape(uint16 x, uint16 y, uint16 w, uint16 h, bool enco uint8 *dst = shp; *dst++ = 2; - *dst++ = (h & 0xff); - *dst++ = (w & 0xff); - *dst++ = (h & 0xff); + *dst++ = (h & 0xFF); + *dst++ = (w & 0xFF); + *dst++ = (h & 0xFF); - if (_useLoResEGA) { + if (_renderMode != Common::kRenderEGA || _useHiResEGADithering) { + memset(dst, 0xFF, 0x10); + } else { for (int i = 0; i < 16; i++) dst[i] = i; - } else { - memset(dst, 0xff, 0x10); } uint8 *pal = dst; @@ -584,10 +449,10 @@ uint8 *Screen_EoB::encodeShape(uint16 x, uint16 y, uint16 w, uint16 h, bool enco uint16 w1 = w << 3; while (w1--) { uint8 s = *src++; - uint8 c = s & 0x0f; + uint8 c = s & 0x0F; if (colorMap) { c = colorMap[s]; - if (c == 0xff) { + if (c == 0xFF) { if (col < 0x10) { *pal++ = s; c = colorMap[s] = col++; @@ -632,7 +497,7 @@ void Screen_EoB::drawShape(uint8 pageNum, const uint8 *shapeData, int x, int y, y += _dsY1; } - dst += (_dsX1 << 3) * _pageScaleFactor[pageNum]; + dst += (_dsX1 << 3); int16 dX = x - (_dsX1 << 3); int16 dY = y; int16 dW = _dsX2 - _dsX1; @@ -704,11 +569,11 @@ void Screen_EoB::drawShape(uint8 pageNum, const uint8 *shapeData, int x, int y, marginRight = w2 - marginLeft - width; } - dst += (dY * SCREEN_W * _pageScaleFactor[pageNum] * _pageScaleFactor[pageNum] + dX * _pageScaleFactor[pageNum]); + dst += (dY * SCREEN_W + dX); uint8 *dstL = dst; if (pageNum == 0 || pageNum == 1) - addDirtyRect(rX * _pageScaleFactor[pageNum], rY * _pageScaleFactor[pageNum], rW * _pageScaleFactor[pageNum], rH * _pageScaleFactor[pageNum]); + addDirtyRect(rX, rY, rW, rH); while (dH--) { int16 xpos = (int16) marginLeft; @@ -743,7 +608,7 @@ void Screen_EoB::drawShape(uint8 pageNum, const uint8 *shapeData, int x, int y, } while (xpos > 0); } - dst -= (xpos * _pageScaleFactor[pageNum]); + dst -= xpos; xpos += width; while (xpos > 0) { @@ -752,12 +617,12 @@ void Screen_EoB::drawShape(uint8 pageNum, const uint8 *shapeData, int x, int y, src += pixelStep; if (m) { - drawShapeSetPixel(dst, c, SCREEN_W * _pageScaleFactor[pageNum]); - dst += _pageScaleFactor[pageNum]; + drawShapeSetPixel(dst, c); + dst++; xpos--; } else { uint8 len = (flags & 1) ? src[1] : src[0]; - dst += (len * _pageScaleFactor[pageNum]); + dst += len; xpos -= len; src += pixelStep; } @@ -783,7 +648,7 @@ void Screen_EoB::drawShape(uint8 pageNum, const uint8 *shapeData, int x, int y, } while (xpos > 0); } - dstL += SCREEN_W * _pageScaleFactor[pageNum] * _pageScaleFactor[pageNum]; + dstL += SCREEN_W; dst = dstL; if (flags & 1) src = src2 + 1; @@ -797,7 +662,7 @@ void Screen_EoB::drawShape(uint8 pageNum, const uint8 *shapeData, int x, int y, pal = ovl ? ovl : src; src += 16; } else { - static const uint8 cgaDefOvl[] = { 0x00, 0x55, 0xaa, 0xff }; + static const uint8 cgaDefOvl[] = { 0x00, 0x55, 0xAA, 0xFF }; pal = ovl ? ovl : cgaDefOvl; for (int i = 0; i < 4; i++) cgaPal[i] = pal[i] & 3; @@ -851,12 +716,12 @@ void Screen_EoB::drawShape(uint8 pageNum, const uint8 *shapeData, int x, int y, if (d < width) width = d; - dst += (dY * _pageScaleFactor[pageNum] * SCREEN_W * _pageScaleFactor[pageNum] + dX * _pageScaleFactor[pageNum]); + dst += (dY * SCREEN_W + dX); if (pageNum == 0 || pageNum == 1) - addDirtyRect(rX * _pageScaleFactor[pageNum], rY * _pageScaleFactor[pageNum], rW * _pageScaleFactor[pageNum], rH * _pageScaleFactor[pageNum]); + addDirtyRect(rX, rY, rW, rH); - int pitch = SCREEN_W * _pageScaleFactor[pageNum] * _pageScaleFactor[pageNum] - width * _pageScaleFactor[pageNum]; + int pitch = SCREEN_W - width; int16 lineSrcStep = (w2 - width) / pixelsPerByte; uint8 lineSrcStepRemainder = (w2 - width) % pixelsPerByte; @@ -899,8 +764,8 @@ void Screen_EoB::drawShape(uint8 pageNum, const uint8 *shapeData, int x, int y, } uint8 col = (pixelsPerByte == 2) ? pal[(in >> shift) & pixelPackingMask] : (*dst & ((trans >> shift) & (pixelPackingMask))) | pal[(in >> shift) & pixelPackingMask]; if (col || pixelsPerByte == 4) - drawShapeSetPixel(dst, col, SCREEN_W * _pageScaleFactor[pageNum]); - dst += _pageScaleFactor[pageNum]; + drawShapeSetPixel(dst, col); + dst++; shift = ((shift - (pixelStep * pixelPacking)) & 7); } src += lineSrcStep; @@ -922,7 +787,7 @@ const uint8 *Screen_EoB::scaleShapeStep(const uint8 *shp) { uint8 *dst = (shp != _dsTempPage) ? _dsTempPage : _dsTempPage + 6000; uint8 *d = dst; uint8 pixelsPerByte = *d++ = *shp++; - assert (pixelsPerByte > 1); + assert(pixelsPerByte > 1); uint16 h = shp[0] + 1; d[0] = d[2] = (h << 1) / 3; @@ -952,7 +817,7 @@ const uint8 *Screen_EoB::scaleShapeStep(const uint8 *shp) { else i = -i; - _dsScaleTrans = (i << 4) | (i & 0x0f); + _dsScaleTrans = (i << 4) | (i & 0x0F); for (int ii = 0; ii < 16; ii++) *d++ = *shp++; } @@ -976,7 +841,7 @@ const uint8 *Screen_EoB::scaleShapeStep(const uint8 *shp) { shp += w2; } - return (const uint8*)dst; + return (const uint8 *)dst; } const uint8 *Screen_EoB::generateShapeOverlay(const uint8 *shp, int paletteOverlayIndex) { @@ -1328,14 +1193,14 @@ void Screen_EoB::createFadeTable(uint8 *palData, uint8 *dst, uint8 rootColor, ui for (uint8 i = 1; i; i++) { uint16 tmp = (uint16)((*src - r) * weight) << 1; - tr = *src++ - ((tmp >> 8) & 0xff); + tr = *src++ - ((tmp >> 8) & 0xFF); tmp = (uint16)((*src - g) * weight) << 1; - tg = *src++ - ((tmp >> 8) & 0xff); + tg = *src++ - ((tmp >> 8) & 0xFF); tmp = (uint16)((*src - b) * weight) << 1; - tb = *src++ - ((tmp >> 8) & 0xff); + tb = *src++ - ((tmp >> 8) & 0xFF); uint8 *d = palData + 3; - uint16 v = 0xffff; + uint16 v = 0xFFFF; uint8 col = rootColor; for (uint8 ii = 1; ii; ii++) { @@ -1367,15 +1232,55 @@ const uint8 *Screen_EoB::getEGADitheringTable() { return _egaDitheringTable; } -void Screen_EoB::drawShapeSetPixel(uint8 *dst, uint8 col, uint16 pitch) { +void Screen_EoB::updateDirtyRects() { + if (!_useHiResEGADithering) { + Screen::updateDirtyRects(); + return; + } + + if (_forceFullUpdate) { + ditherRect(getCPagePtr(0), _egaDitheringTempPage, SCREEN_W * 2, SCREEN_W, SCREEN_H); + _system->copyRectToScreen(_egaDitheringTempPage, SCREEN_W * 2, 0, 0, SCREEN_W * 2, SCREEN_H * 2); + } else { + const byte *page0 = getCPagePtr(0); + Common::List<Common::Rect>::iterator it; + for (it = _dirtyRects.begin(); it != _dirtyRects.end(); ++it) { + ditherRect(page0 + it->top * SCREEN_W + it->left, _egaDitheringTempPage, SCREEN_W * 2, it->width(), it->height()); + _system->copyRectToScreen(_egaDitheringTempPage, SCREEN_W * 2, it->left * 2, it->top * 2, it->width() * 2, it->height() * 2); + } + } + _forceFullUpdate = false; + _dirtyRects.clear(); +} + +void Screen_EoB::ditherRect(const uint8 *src, uint8 *dst, int dstPitch, int srcW, int srcH, int colorKey) { + while (srcH--) { + uint8 *dst2 = dst + dstPitch; + for (int i = 0; i < srcW; i++) { + int in = *src++; + if (in != colorKey) { + in = _egaDitheringTable[in]; + *dst++ = *dst2++ = in >> 4; + *dst++ = *dst2++ = in & 0x0F; + } else { + dst[0] = dst[1] = dst2[0] = dst2[1] = colorKey; + dst += 2; + dst2 += 2; + } + } + src += (SCREEN_W - srcW); + dst += ((dstPitch - srcW) * 2); + } +} + +void Screen_EoB::drawShapeSetPixel(uint8 *dst, uint8 col) { if ((_renderMode != Common::kRenderCGA && _renderMode != Common::kRenderEGA) || _useHiResEGADithering) { if (_shapeFadeMode[0]) { if (_shapeFadeMode[1]) { - col = _useHiResEGADithering ? _egaPixelValueTable[(dst[0] << 4) | (dst[1] & 0x0f)] : *dst; + col = *dst; } else { _shapeFadeInternal &= 7; - col = _useHiResEGADithering ? _egaPixelValueTable[(dst[_shapeFadeInternal] << 4) | (dst[_shapeFadeInternal + 1] & 0x0f)] : dst[_shapeFadeInternal]; - _shapeFadeInternal++; + col = *(dst + _shapeFadeInternal++); } } @@ -1386,21 +1291,15 @@ void Screen_EoB::drawShapeSetPixel(uint8 *dst, uint8 col, uint16 pitch) { } } - if (_useHiResEGADithering) { - col = _egaDitheringTable[col]; - dst[0] = dst[pitch] = col >> 4; - dst[1] = dst[pitch + 1] = col & 0x0f; - } else { - *dst = col; - } + *dst = col; } void Screen_EoB::scaleShapeProcessLine2Bit(uint8 *&shpDst, const uint8 *&shpSrc, uint32 transOffsetDst, uint32 transOffsetSrc) { for (int i = 0; i < _dsDiv; i++) { shpDst[0] = (_cgaScaleTable[shpSrc[0]] << 2) | (shpSrc[1] >> 6); - shpDst[1] = ((shpSrc[1] & 0x0f) << 4) | ((shpSrc[2] >> 2) & 0x0f); + shpDst[1] = ((shpSrc[1] & 0x0F) << 4) | ((shpSrc[2] >> 2) & 0x0F); shpDst[transOffsetDst] = (_cgaScaleTable[shpSrc[transOffsetSrc]] << 2) | (shpSrc[transOffsetSrc + 1] >> 6); - shpDst[transOffsetDst + 1] = ((shpSrc[transOffsetSrc + 1] & 0x0f) << 4) | ((shpSrc[transOffsetSrc + 2] >> 2) & 0x0f); + shpDst[transOffsetDst + 1] = ((shpSrc[transOffsetSrc + 1] & 0x0F) << 4) | ((shpSrc[transOffsetSrc + 2] >> 2) & 0x0F); shpSrc += 3; shpDst += 2; } @@ -1409,15 +1308,15 @@ void Screen_EoB::scaleShapeProcessLine2Bit(uint8 *&shpDst, const uint8 *&shpSrc, shpDst[0] = _cgaScaleTable[shpSrc[0]] << 2; shpDst[1] = 0; shpDst[transOffsetDst] = (_cgaScaleTable[shpSrc[transOffsetSrc]] << 2) | 3; - shpDst[transOffsetDst + 1] = 0xff; + shpDst[transOffsetDst + 1] = 0xFF; shpSrc++; shpDst += 2; } else if (_dsRem == 2) { shpDst[0] = (_cgaScaleTable[shpSrc[0]] << 2) | (shpSrc[1] >> 6); - shpDst[1] = (shpSrc[1] & 0x3f) << 2; + shpDst[1] = (shpSrc[1] & 0x3F) << 2; shpDst[transOffsetDst] = (_cgaScaleTable[shpSrc[transOffsetSrc]] << 2) | (shpSrc[transOffsetSrc + 1] >> 6); - shpDst[transOffsetDst + 1] = ((shpSrc[transOffsetSrc + 1] & 0x3f) << 2) | 3; + shpDst[transOffsetDst + 1] = ((shpSrc[transOffsetSrc + 1] & 0x3F) << 2) | 3; shpSrc += 2; shpDst += 2; } @@ -1426,7 +1325,7 @@ void Screen_EoB::scaleShapeProcessLine2Bit(uint8 *&shpDst, const uint8 *&shpSrc, void Screen_EoB::scaleShapeProcessLine4Bit(uint8 *&dst, const uint8 *&src) { for (int i = 0; i < _dsDiv; i++) { *dst++ = *src++; - *dst++ = (READ_BE_UINT16(src) >> 4) & 0xff; + *dst++ = (READ_BE_UINT16(src) >> 4) & 0xFF; src += 2; } @@ -1434,7 +1333,7 @@ void Screen_EoB::scaleShapeProcessLine4Bit(uint8 *&dst, const uint8 *&src) { *dst++ = *src++; *dst++ = _dsScaleTrans; } else if (_dsRem == 2) { - *dst++ = (src[0] & 0xf0) | (src[1] >> 4); + *dst++ = (src[0] & 0xF0) | (src[1] >> 4); src += 2; *dst++ = _dsScaleTrans; *dst++ = _dsScaleTrans; @@ -1463,7 +1362,7 @@ void Screen_EoB::generateEGADitheringTable(const Palette &pal) { for (int ii = 256; ii; ii--) { const uint8 *palEntry = _egaMatchTable + (ii - 1) * 3; - if (*palEntry == 0xff) + if (*palEntry == 0xFF) continue; int e_r = palEntry[0] - r; @@ -1479,16 +1378,12 @@ void Screen_EoB::generateEGADitheringTable(const Palette &pal) { } *dst++ = col; } - - memset(_egaPixelValueTable, 0, 256); - for (int i = 0; i < 256; i++) - _egaPixelValueTable[_egaDitheringTable[i]] = i; } void Screen_EoB::generateCGADitheringTables(const uint8 *mappingData) { for (int i = 0; i < 256; i++) { - _cgaDitheringTables[0][i] = (mappingData[(i >> 4) + 16] << 8) | mappingData[i & 0x0f]; - _cgaDitheringTables[1][i] = (mappingData[i >> 4] << 8) | mappingData[(i & 0x0f) + 16]; + _cgaDitheringTables[0][i] = (mappingData[(i >> 4) + 16] << 8) | mappingData[i & 0x0F]; + _cgaDitheringTables[1][i] = (mappingData[i >> 4] << 8) | mappingData[(i & 0x0F) + 16]; } } @@ -1546,11 +1441,10 @@ const uint8 Screen_EoB::_egaMatchTable[] = { uint16 *OldDOSFont::_cgaDitheringTable = 0; int OldDOSFont::_numRef = 0; -OldDOSFont::OldDOSFont(Common::RenderMode mode, bool useHiResEGADithering) : _renderMode(mode), _useHiResEGADithering(useHiResEGADithering) { +OldDOSFont::OldDOSFont(Common::RenderMode mode) : _renderMode(mode) { _data = 0; _width = _height = _numGlyphs = 0; _bitmapOffsets = 0; - _useLoResEGA = (_renderMode == Common::kRenderEGA && !_useHiResEGADithering); _numRef++; if (!_cgaDitheringTable && _numRef == 1) { @@ -1615,42 +1509,42 @@ void OldDOSFont::drawChar(uint16 c, byte *dst, int pitch) const { if (_width == 6) { switch (c) { case 0x81: - case 0x9a: - c = 0x5d; + case 0x9A: + c = 0x5D; break; case 0x84: - case 0x8e: - c = 0x5b; + case 0x8E: + c = 0x5B; break; case 0x94: case 0x99: c = 0x40; - case 0xe1: + case 0xE1: // TODO: recheck this: no conversion for 'ß' ? break; } } else if (_width == 8) { switch (c) { case 0x81: - case 0x9a: - case 0x5d: - c = 0x1d; + case 0x9A: + case 0x5D: + c = 0x1D; break; case 0x84: - case 0x5b: - c = 0x1e; + case 0x5B: + c = 0x1E; break; case 0x94: case 0x40: - c = 0x1f; + c = 0x1F; break; - case 0x8e: - c = 0x1b; + case 0x8E: + c = 0x1B; break; case 0x99: - c = 0x1c; + c = 0x1C; break; - case 0xe1: + case 0xE1: c = 0x19; break; } @@ -1662,24 +1556,16 @@ void OldDOSFont::drawChar(uint16 c, byte *dst, int pitch) const { int w = (_width - 1) >> 3; pitch -= _width; - if (_useHiResEGADithering) - pitch *= 2; - uint8 color1 = _colorMap[1]; uint8 color2 = _colorMap[0]; - uint8 colEGA11 = _colorMap[3] >> 4; - uint8 colEGA12 = _colorMap[3] & 0x0f; - uint8 colEGA21 = _colorMap[2] >> 4; - uint8 colEGA22 = _colorMap[2] & 0x0f; - static const uint16 cgaColorMask[] = { 0, 0x5555, 0xAAAA, 0xFFFF }; uint16 cgaMask1 = cgaColorMask[color1 & 3]; uint16 cgaMask2 = cgaColorMask[color2 & 3]; - if (_renderMode == Common::kRenderCGA || _useLoResEGA) { - color1 &= 0x0f; - color2 &= 0x0f; + if (_renderMode == Common::kRenderCGA || _renderMode == Common::kRenderEGA) { + color1 &= 0x0F; + color2 &= 0x0F; } int cH = _height; @@ -1710,7 +1596,7 @@ void OldDOSFont::drawChar(uint16 c, byte *dst, int pitch) const { uint8 sh = 6; for (int i = 0; i < _width; i++) { cDst |= ((dst[i] & 3) << sh); - sh = (sh - 2) & 0x0f; + sh = (sh - 2) & 0x0F; } uint16 out = (~(cmp1 | cmp2) & cDst) | (cmp1 & cgaMask1) | (cmp2 & cgaMask2); @@ -1718,7 +1604,7 @@ void OldDOSFont::drawChar(uint16 c, byte *dst, int pitch) const { sh = 6; for (int i = 0; i < _width; i++) { *dst++ = (out >> sh) & 3; - sh = (sh - 2) & 0x0f; + sh = (sh - 2) & 0x0F; } last = s; @@ -1734,27 +1620,13 @@ void OldDOSFont::drawChar(uint16 c, byte *dst, int pitch) const { break; } - if (_useHiResEGADithering) { - if (s & i) { - if (color1) { - dst[0] = dst2[0] = colEGA11; - dst[1] = dst2[1] = colEGA12; - } - } else if (color2) { - dst[0] = dst2[0] = colEGA21; - dst[1] = dst2[1] = colEGA22; - } - dst += 2; - dst2 += 2; - } else { - if (s & i) { - if (color1) - *dst = color1; - } else if (color2) { - *dst = color2; - } - dst++; + if (s & i) { + if (color1) + *dst = color1; + } else if (color2) { + *dst = color2; } + dst++; } if (cW) diff --git a/engines/kyra/screen_eob.h b/engines/kyra/screen_eob.h index fc40cfe903..934483d146 100644 --- a/engines/kyra/screen_eob.h +++ b/engines/kyra/screen_eob.h @@ -45,7 +45,6 @@ public: void loadFileDataToPage(Common::SeekableReadStream *s, int pageNum, uint32 size); - void printText(const char *str, int x, int y, uint8 color1, uint8 color2); void printShadedText(const char *string, int x, int y, int col1, int col2); void loadEoBBitmap(const char *file, const uint8 *cgaMapping, int tempPage, int destPage, int convertToPage); @@ -53,11 +52,6 @@ public: void convertPage(int srcPage, int dstPage, const uint8 *cgaMapping); - void fillRect(int x1, int y1, int x2, int y2, uint8 color, int pageNum = -1, bool xored = false); - void drawLine(bool vertical, int x, int y, int length, int color); - uint8 getPagePixel(int pageNum, int x, int y); - void setPagePixel(int pageNum, int x, int y, uint8 color); - void setScreenPalette(const Palette &pal); void getRealPalette(int num, uint8 *dst); @@ -68,7 +62,7 @@ public: const uint8 *generateShapeOverlay(const uint8 *shp, int paletteOverlayIndex); void setShapeFrame(int x1, int y1, int x2, int y2); - void setShapeFadeMode (uint8 i, bool b); + void setShapeFadeMode(uint8 i, bool b); void setGfxParameters(int x, int y, int col); void drawExplosion(int scale, int radius, int numElements, int stepSize, int aspectRatio, const uint8 *colorTable, int colorTableSize); @@ -88,7 +82,10 @@ public: const uint8 *getEGADitheringTable(); private: - void drawShapeSetPixel(uint8 *dst, uint8 col, uint16 pitch); + void updateDirtyRects(); + void ditherRect(const uint8 *src, uint8 *dst, int dstPitch, int srcW, int srcH, int colorKey = -1); + + void drawShapeSetPixel(uint8 *dst, uint8 col); void scaleShapeProcessLine2Bit(uint8 *&shpDst, const uint8 *&shpSrc, uint32 transOffsetDst, uint32 transOffsetSrc); void scaleShapeProcessLine4Bit(uint8 *&dst, const uint8 *&src); bool posWithinRect(int posX, int posY, int x1, int y1, int x2, int y2); @@ -115,14 +112,14 @@ private: const uint8 *_cgaMappingDefault; uint8 *_egaDitheringTable; - uint8 *_egaPixelValueTable; + uint8 *_egaDitheringTempPage; static const uint8 _egaMatchTable[]; static const ScreenDim _screenDimTable[]; static const int _screenDimTableCount; }; -} // End of namespace Kyra +} // End of namespace Kyra #endif // ENABLE_EOB diff --git a/engines/kyra/screen_hof.cpp b/engines/kyra/screen_hof.cpp index ac6ee5eb77..b7de7988b8 100644 --- a/engines/kyra/screen_hof.cpp +++ b/engines/kyra/screen_hof.cpp @@ -34,16 +34,16 @@ void Screen_HoF::generateGrayOverlay(const Palette &srcPal, uint8 *grayOverlay, for (int i = 0; i != lastColor; i++) { if (flag) { - int v = ((((srcPal[3 * i] & 0x3f) + (srcPal[3 * i + 1] & 0x3f) - + (srcPal[3 * i + 2] & 0x3f)) / 3) * factor) / 0x40; - tmpPal[3 * i] = tmpPal[3 * i + 1] = tmpPal[3 * i + 2] = v & 0xff; + int v = ((((srcPal[3 * i] & 0x3F) + (srcPal[3 * i + 1] & 0x3F) + + (srcPal[3 * i + 2] & 0x3F)) / 3) * factor) / 0x40; + tmpPal[3 * i] = tmpPal[3 * i + 1] = tmpPal[3 * i + 2] = v & 0xFF; } else { - int v = (((srcPal[3 * i] & 0x3f) * factor) / 0x40) + addR; - tmpPal[3 * i] = (v > 0x3f) ? 0x3f : v & 0xff; - v = (((srcPal[3 * i + 1] & 0x3f) * factor) / 0x40) + addG; - tmpPal[3 * i + 1] = (v > 0x3f) ? 0x3f : v & 0xff; - v = (((srcPal[3 * i + 2] & 0x3f) * factor) / 0x40) + addB; - tmpPal[3 * i + 2] = (v > 0x3f) ? 0x3f : v & 0xff; + int v = (((srcPal[3 * i] & 0x3F) * factor) / 0x40) + addR; + tmpPal[3 * i] = (v > 0x3F) ? 0x3F : v & 0xFF; + v = (((srcPal[3 * i + 1] & 0x3F) * factor) / 0x40) + addG; + tmpPal[3 * i + 1] = (v > 0x3F) ? 0x3F : v & 0xFF; + v = (((srcPal[3 * i + 2] & 0x3F) * factor) / 0x40) + addB; + tmpPal[3 * i + 2] = (v > 0x3F) ? 0x3F : v & 0xFF; } } @@ -93,46 +93,4 @@ void Screen_HoF::cmpFadeFrameStep(int srcPage, int srcW, int srcH, int srcX, int } } -void Screen_HoF::copyPageMemory(int srcPage, int srcPos, int dstPage, int dstPos, int numBytes) { - const uint8 *src = getPagePtr(srcPage) + srcPos; - uint8 *dst = getPagePtr(dstPage) + dstPos; - memcpy(dst, src, numBytes); -} - -void Screen_HoF::copyRegionEx(int srcPage, int srcW, int srcH, int dstPage, int dstX, int dstY, int dstW, int dstH, const ScreenDim *dim, bool flag) { - int x0 = dim->sx << 3; - int y0 = dim->sy; - int w0 = dim->w << 3; - int h0 = dim->h; - - int x1 = dstX; - int y1 = dstY; - int w1 = dstW; - int h1 = dstH; - - int x2, y2, w2; - - calcBounds(w0, h0, x1, y1, w1, h1, x2, y2, w2); - - const uint8 *src = getPagePtr(srcPage) + (320 * srcH) + srcW; - uint8 *dst = getPagePtr(dstPage) + 320 * (y0 + y1); - - for (int y = 0; y < h1; y++) { - const uint8 *s = src + x2; - uint8 *d = dst + x0 + x1; - - if (flag) - d += (h1 >> 1); - - for (int x = 0; x < w1; x++) { - if (*s) - *d = *s; - s++; - d++; - } - dst += 320; - src += 320; - } -} - } // End of namespace Kyra diff --git a/engines/kyra/screen_hof.h b/engines/kyra/screen_hof.h index 51c6a001fa..95f461677d 100644 --- a/engines/kyra/screen_hof.h +++ b/engines/kyra/screen_hof.h @@ -37,8 +37,7 @@ public: // sequence player void generateGrayOverlay(const Palette &pal, uint8 *grayOverlay, int factor, int addR, int addG, int addB, int lastColor, bool flag); void cmpFadeFrameStep(int srcPage, int srcW, int srcH, int srcX, int srcY, int dstPage, int dstW, int dstH, int dstX, int dstY, int cmpW, int cmpH, int cmpPage); - void copyPageMemory(int srcPage, int srcPos, int dstPage, int dstPos, int numBytes); - void copyRegionEx(int srcPage, int srcW, int srcH, int dstPage, int dstX,int dstY, int dstW, int dstH, const ScreenDim *d, bool flag = false); + private: KyraEngine_HoF *_vm; diff --git a/engines/kyra/screen_lol.cpp b/engines/kyra/screen_lol.cpp index 3726b1f4b9..16a77c8fcb 100644 --- a/engines/kyra/screen_lol.cpp +++ b/engines/kyra/screen_lol.cpp @@ -133,12 +133,12 @@ void Screen_LoL::generateGrayOverlay(const Palette &srcPal, uint8 *grayOverlay, Palette tmpPal(lastColor); for (int i = 0; i != lastColor; i++) { - int v = (((srcPal[3 * i] & 0x3f) * factor) / 0x40) + addR; - tmpPal[3 * i] = (v > 0x3f) ? 0x3f : v & 0xff; - v = (((srcPal[3 * i + 1] & 0x3f) * factor) / 0x40) + addG; - tmpPal[3 * i + 1] = (v > 0x3f) ? 0x3f : v & 0xff; - v = (((srcPal[3 * i + 2] & 0x3f) * factor) / 0x40) + addB; - tmpPal[3 * i + 2] = (v > 0x3f) ? 0x3f : v & 0xff; + int v = (((srcPal[3 * i] & 0x3F) * factor) / 0x40) + addR; + tmpPal[3 * i] = (v > 0x3F) ? 0x3F : v & 0xFF; + v = (((srcPal[3 * i + 1] & 0x3F) * factor) / 0x40) + addG; + tmpPal[3 * i + 1] = (v > 0x3F) ? 0x3F : v & 0xFF; + v = (((srcPal[3 * i + 2] & 0x3F) * factor) / 0x40) + addB; + tmpPal[3 * i + 2] = (v > 0x3F) ? 0x3F : v & 0xFF; } for (int i = 0; i < lastColor; i++) @@ -149,7 +149,7 @@ void Screen_LoL::createTransparencyTablesIntern(const uint8 *ovl, int a, const u Palette screenPal(256); screenPal.copy(fxPal2, 0, 256); - memset(outTable1, 0xff, 256); + memset(outTable1, 0xFF, 256); for (int i = 0; i < a; i++) outTable1[ovl[i]] = i; @@ -233,8 +233,6 @@ void Screen_LoL::drawGridBox(int x, int y, int w, int h, int col) { *(p + tmp) = col; p += 2; } - } else { - w = 1; } if (s == 1) { @@ -270,7 +268,7 @@ void Screen_LoL::fadeClearSceneWindow(int delay) { void Screen_LoL::backupSceneWindow(int srcPageNum, int dstPageNum) { uint8 *src = getPagePtr(srcPageNum) + 112; - uint8 *dst = getPagePtr(dstPageNum) + 0xa500; + uint8 *dst = getPagePtr(dstPageNum) + 0xA500; for (int h = 0; h < 120; h++) { for (int w = 0; w < 176; w++) @@ -280,7 +278,7 @@ void Screen_LoL::backupSceneWindow(int srcPageNum, int dstPageNum) { } void Screen_LoL::restoreSceneWindow(int srcPageNum, int dstPageNum) { - uint8 *src = getPagePtr(srcPageNum) + 0xa500; + uint8 *src = getPagePtr(srcPageNum) + 0xA500; uint8 *dst = getPagePtr(dstPageNum) + 112; for (int h = 0; h < 120; h++) { @@ -294,7 +292,7 @@ void Screen_LoL::restoreSceneWindow(int srcPageNum, int dstPageNum) { } void Screen_LoL::clearGuiShapeMemory(int pageNum) { - uint8 *dst = getPagePtr(pageNum) + 0x79b0; + uint8 *dst = getPagePtr(pageNum) + 0x79B0; for (int i = 0; i < 23; i++) { memset(dst, 0, 176); dst += 320; @@ -302,7 +300,7 @@ void Screen_LoL::clearGuiShapeMemory(int pageNum) { } void Screen_LoL::copyGuiShapeFromSceneBackupBuffer(int srcPageNum, int dstPageNum) { - uint8 *src = getPagePtr(srcPageNum) + 0x79c3; + uint8 *src = getPagePtr(srcPageNum) + 0x79C3; uint8 *dst = getPagePtr(dstPageNum); for (int i = 0; i < 23; i++) { @@ -325,7 +323,7 @@ void Screen_LoL::copyGuiShapeFromSceneBackupBuffer(int srcPageNum, int dstPageN void Screen_LoL::copyGuiShapeToSurface(int srcPageNum, int dstPageNum) { uint8 *src = getPagePtr(srcPageNum); - uint8 *dst = getPagePtr(dstPageNum) + 0xe7c3; + uint8 *dst = getPagePtr(dstPageNum) + 0xE7C3; for (int i = 0; i < 23; i++) { uint8 v = *src++; @@ -344,8 +342,8 @@ void Screen_LoL::copyGuiShapeToSurface(int srcPageNum, int dstPageNum) { } void Screen_LoL::smoothScrollZoomStepTop(int srcPageNum, int dstPageNum, int x, int y) { - uint8 *src = getPagePtr(srcPageNum) + 0xa500 + y * 176 + x; - uint8 *dst = getPagePtr(dstPageNum) + 0xa500; + uint8 *src = getPagePtr(srcPageNum) + 0xA500 + y * 176 + x; + uint8 *dst = getPagePtr(dstPageNum) + 0xA500; x <<= 1; uint16 width = 176 - x; @@ -365,7 +363,7 @@ void Screen_LoL::smoothScrollZoomStepTop(int srcPageNum, int dstPageNum, int x, do { scaleXc += scaleX; int numbytes = cntW + (scaleXc >> 16); - scaleXc &= 0xffff; + scaleXc &= 0xFFFF; memset(dst, *src++, numbytes); dst += numbytes; } while (--widthCnt); @@ -387,8 +385,8 @@ void Screen_LoL::smoothScrollZoomStepTop(int srcPageNum, int dstPageNum, int x, } void Screen_LoL::smoothScrollZoomStepBottom(int srcPageNum, int dstPageNum, int x, int y) { - uint8 *src = getPagePtr(srcPageNum) + 0xc4a0 + x; - uint8 *dst = getPagePtr(dstPageNum) + 0xc4a0; + uint8 *src = getPagePtr(srcPageNum) + 0xC4A0 + x; + uint8 *dst = getPagePtr(dstPageNum) + 0xC4A0; x <<= 1; uint16 width = 176 - x; @@ -408,7 +406,7 @@ void Screen_LoL::smoothScrollZoomStepBottom(int srcPageNum, int dstPageNum, int do { scaleXc += scaleX; int numbytes = cntW + (scaleXc >> 16); - scaleXc &= 0xffff; + scaleXc &= 0xFFFF; memset(dst, *src++, numbytes); dst += numbytes; } while (--widthCnt); @@ -455,7 +453,7 @@ void Screen_LoL::smoothScrollHorizontalStep(int pageNum, int srcX, int dstX, int void Screen_LoL::smoothScrollTurnStep1(int srcPage1Num, int srcPage2Num, int dstPageNum) { uint8 *s = getPagePtr(srcPage1Num) + 273; - uint8 *d = getPagePtr(dstPageNum) + 0xa500; + uint8 *d = getPagePtr(dstPageNum) + 0xA500; for (int i = 0; i < 120; i++) { uint8 a = *s++; @@ -474,7 +472,7 @@ void Screen_LoL::smoothScrollTurnStep1(int srcPage1Num, int srcPage2Num, int dst } s = getPagePtr(srcPage2Num) + 112; - d = getPagePtr(dstPageNum) + 0xa52c; + d = getPagePtr(dstPageNum) + 0xA52C; for (int i = 0; i < 120; i++) { for (int ii = 0; ii < 33; ii++) { @@ -492,7 +490,7 @@ void Screen_LoL::smoothScrollTurnStep1(int srcPage1Num, int srcPage2Num, int dst void Screen_LoL::smoothScrollTurnStep2(int srcPage1Num, int srcPage2Num, int dstPageNum) { uint8 *s = getPagePtr(srcPage1Num) + 244; - uint8 *d = getPagePtr(dstPageNum) + 0xa500; + uint8 *d = getPagePtr(dstPageNum) + 0xA500; for (int k = 0; k < 2; k++) { for (int i = 0; i < 120; i++) { @@ -507,13 +505,13 @@ void Screen_LoL::smoothScrollTurnStep2(int srcPage1Num, int srcPage2Num, int dst } s = getPagePtr(srcPage2Num) + 112; - d = getPagePtr(dstPageNum) + 0xa558; + d = getPagePtr(dstPageNum) + 0xA558; } } void Screen_LoL::smoothScrollTurnStep3(int srcPage1Num, int srcPage2Num, int dstPageNum) { uint8 *s = getPagePtr(srcPage1Num) + 189; - uint8 *d = getPagePtr(dstPageNum) + 0xa500; + uint8 *d = getPagePtr(dstPageNum) + 0xA500; for (int i = 0; i < 120; i++) { for (int ii = 0; ii < 33; ii++) { @@ -529,7 +527,7 @@ void Screen_LoL::smoothScrollTurnStep3(int srcPage1Num, int srcPage2Num, int dst } s = getPagePtr(srcPage2Num) + 112; - d = getPagePtr(dstPageNum) + 0xa584; + d = getPagePtr(dstPageNum) + 0xA584; for (int i = 0; i < 120; i++) { for (int ii = 0; ii < 14; ii++) { @@ -783,8 +781,8 @@ bool Screen_LoL::fadeColor(int dstColorIndex, int srcColorIndex, uint32 elapsedT for (int i = 0; i < 3; i++) { if (elapsedTicks < totalTicks) { - srcV = *src & 0x3f; - dstV = *dst & 0x3f; + srcV = *src & 0x3F; + dstV = *dst & 0x3F; outV = srcV - dstV; if (outV) @@ -796,7 +794,7 @@ bool Screen_LoL::fadeColor(int dstColorIndex, int srcColorIndex, uint32 elapsedT res = false; } - tmpPalEntry[i] = outV & 0xff; + tmpPalEntry[i] = outV & 0xFF; src++; dst++; p++; @@ -810,34 +808,6 @@ bool Screen_LoL::fadeColor(int dstColorIndex, int srcColorIndex, uint32 elapsedT return res; } -bool Screen_LoL::fadePaletteStep(uint8 *pal1, uint8 *pal2, uint32 elapsedTime, uint32 targetTime) { - Palette &p1 = getPalette(1); - - bool res = false; - for (int i = 0; i < p1.getNumColors() * 3; i++) { - uint8 out = 0; - - if (elapsedTime < targetTime) { - int32 d = ((pal2[i] & 0x3f) - (pal1[i] & 0x3f)); - if (d) - res = true; - - int32 val = ((((d << 8) / (int32)targetTime) * (int32)elapsedTime) >> 8); - out = ((pal1[i] & 0x3f) + (int8)val); - } else { - out = p1[i] = (pal2[i] & 0x3f); - res = false; - } - - (*_internFadePalette)[i] = out; - } - - setScreenPalette(*_internFadePalette); - updateScreen(); - - return res; -} - Palette **Screen_LoL::generateFadeTable(Palette **dst, Palette *src1, Palette *src2, int numTabs) { int len = _use16ColorMode ? 48 : 768; if (!src1) diff --git a/engines/kyra/screen_lol.h b/engines/kyra/screen_lol.h index 09496705bb..8ceb8431bc 100644 --- a/engines/kyra/screen_lol.h +++ b/engines/kyra/screen_lol.h @@ -65,7 +65,6 @@ public: void loadSpecialColors(Palette &dst); void copyColor(int dstColorIndex, int srcColorIndex); bool fadeColor(int dstColorIndex, int srcColorIndex, uint32 elapsedTicks, uint32 totalTicks); - bool fadePaletteStep(uint8 *pal1, uint8 *pal2, uint32 elapsedTime, uint32 targetTime); 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); diff --git a/engines/kyra/screen_v2.cpp b/engines/kyra/screen_v2.cpp index 7d4b064e2a..cc7d526ffe 100644 --- a/engines/kyra/screen_v2.cpp +++ b/engines/kyra/screen_v2.cpp @@ -117,11 +117,11 @@ void Screen_v2::applyOverlay(int x, int y, int w, int h, int pageNum, const uint } int Screen_v2::findLeastDifferentColor(const uint8 *paletteEntry, const Palette &pal, uint8 firstColor, uint16 numColors, bool skipSpecialColors) { - int m = 0x7fff; + int m = 0x7FFF; int r = 0x101; for (int i = 0; i < numColors; i++) { - if (skipSpecialColors && i >= 0xc0 && i <= 0xc3) + if (skipSpecialColors && i >= 0xC0 && i <= 0xC3) continue; int v = paletteEntry[0] - pal[(i + firstColor) * 3 + 0]; @@ -162,6 +162,34 @@ void Screen_v2::getFadeParams(const Palette &pal, int delay, int &delayInc, int } } +bool Screen_v2::timedPaletteFadeStep(uint8 *pal1, uint8 *pal2, uint32 elapsedTime, uint32 totalTime) { + Palette &p1 = getPalette(1); + + bool res = false; + for (int i = 0; i < p1.getNumColors() * 3; i++) { + uint8 out = 0; + + if (elapsedTime < totalTime) { + int32 d = ((pal2[i] & 0x3F) - (pal1[i] & 0x3F)); + if (d) + res = true; + + int32 val = ((((d << 8) / (int32)totalTime) * (int32)elapsedTime) >> 8); + out = ((pal1[i] & 0x3F) + (int8)val); + } else { + out = p1[i] = (pal2[i] & 0x3F); + res = false; + } + + (*_internFadePalette)[i] = out; + } + + setScreenPalette(*_internFadePalette); + updateScreen(); + + return res; +} + const uint8 *Screen_v2::getPtrToShape(const uint8 *shpFile, int shape) { uint16 shapes = READ_LE_UINT16(shpFile); @@ -283,13 +311,13 @@ void Screen_v2::wsaFrameAnimationStep(int x1, int y1, int x2, int y2, if (w1 == 1) { memset(dt, *s, w2); } else { - t = ((((((w2 - w1 + 1) & 0xffff) << 8) / w1) + 0x100) & 0xffff) << 8; + t = ((((((w2 - w1 + 1) & 0xFFFF) << 8) / w1) + 0x100) & 0xFFFF) << 8; int bp = 0; for (int i = 0; i < w1; i++) { int cnt = (t >> 16); - bp += (t & 0xffff); - if (bp > 0xffff) { - bp -= 0xffff; + bp += (t & 0xFFFF); + if (bp > 0xFFFF) { + bp -= 0xFFFF; cnt++; } memset(dt, *s++, cnt); @@ -300,13 +328,13 @@ void Screen_v2::wsaFrameAnimationStep(int x1, int y1, int x2, int y2, if (w2 == 1) { *dt = *s; } else { - t = (((((w1 - w2) & 0xffff) << 8) / w2) & 0xffff) << 8; + t = (((((w1 - w2) & 0xFFFF) << 8) / w2) & 0xFFFF) << 8; int bp = 0; for (int i = 0; i < w2; i++) { *dt++ = *s++; - bp += (t & 0xffff); - if (bp > 0xffff) { - bp -= 0xffff; + bp += (t & 0xFFFF); + if (bp > 0xFFFF) { + bp -= 0xFFFF; s++; } s += (t >> 16); @@ -322,6 +350,48 @@ void Screen_v2::wsaFrameAnimationStep(int x1, int y1, int x2, int y2, addDirtyRect(x2, y2, w2, h2); } +void Screen_v2::copyPageMemory(int srcPage, int srcPos, int dstPage, int dstPos, int numBytes) { + const uint8 *src = getPagePtr(srcPage) + srcPos; + uint8 *dst = getPagePtr(dstPage) + dstPos; + memcpy(dst, src, numBytes); +} + +void Screen_v2::copyRegionEx(int srcPage, int srcW, int srcH, int dstPage, int dstX, int dstY, int dstW, int dstH, const ScreenDim *dim, bool flag) { + int x0 = dim->sx << 3; + int y0 = dim->sy; + int w0 = dim->w << 3; + int h0 = dim->h; + + int x1 = dstX; + int y1 = dstY; + int w1 = dstW; + int h1 = dstH; + + int x2, y2, w2; + + calcBounds(w0, h0, x1, y1, w1, h1, x2, y2, w2); + + const uint8 *src = getPagePtr(srcPage) + (320 * srcH) + srcW; + uint8 *dst = getPagePtr(dstPage) + 320 * (y0 + y1); + + for (int y = 0; y < h1; y++) { + const uint8 *s = src + x2; + uint8 *d = dst + x0 + x1; + + if (flag) + d += (h1 >> 1); + + for (int x = 0; x < w1; x++) { + if (*s) + *d = *s; + s++; + d++; + } + dst += 320; + src += 320; + } +} + bool Screen_v2::calcBounds(int w0, int h0, int &x1, int &y1, int &w1, int &h1, int &x2, int &y2, int &w2) { x2 = 0; y2 = 0; diff --git a/engines/kyra/screen_v2.h b/engines/kyra/screen_v2.h index f84c923128..6f4d67136a 100644 --- a/engines/kyra/screen_v2.h +++ b/engines/kyra/screen_v2.h @@ -43,6 +43,8 @@ public: virtual void getFadeParams(const Palette &pal, int delay, int &delayInc, int &diff); + bool timedPaletteFadeStep(uint8 *pal1, uint8 *pal2, uint32 elapsedTime, uint32 totalTime); + // shape handling uint8 *getPtrToShape(uint8 *shpFile, int shape); const uint8 *getPtrToShape(const uint8 *shpFile, int shape); @@ -66,6 +68,10 @@ public: // special WSA handling void wsaFrameAnimationStep(int x1, int y1, int x2, int y2, int w1, int h1, int w2, int h2, int srcPage, int dstPage, int dim); + + // used in non-interactive HoF/LoL demos + void copyPageMemory(int srcPage, int srcPos, int dstPage, int dstPos, int numBytes); + void copyRegionEx(int srcPage, int srcW, int srcH, int dstPage, int dstX,int dstY, int dstW, int dstH, const ScreenDim *d, bool flag = false); protected: uint8 *_wsaFrameAnimBuffer; }; diff --git a/engines/kyra/script_eob.cpp b/engines/kyra/script_eob.cpp index c07c41f706..e5ccbf2c2e 100644 --- a/engines/kyra/script_eob.cpp +++ b/engines/kyra/script_eob.cpp @@ -175,7 +175,7 @@ void EoBInfProcessor::run(int func, int flags) { uint16 f = _vm->_levelBlockProperties[func].flags; - uint16 subFlags = ((f & 0xfff8) >> 3) | 0xe0; + uint16 subFlags = ((f & 0xFFF8) >> 3) | 0xE0; if (!(flags & subFlags)) return; @@ -233,7 +233,7 @@ void EoBInfProcessor::reset() { } const char *EoBInfProcessor::getString(uint16 index) { - if (index == 0xffff) + if (index == 0xFFFF) return 0; int8 *res = _scriptData + READ_LE_UINT16(_scriptData); @@ -348,7 +348,7 @@ int EoBInfProcessor::oeob_movePartyOrObject(int8 *data) { int8 *pos = data; int8 a = *pos++; - uint16 b = 0xffff; + uint16 b = 0xFFFF; uint16 c = 0; uint16 d = 0; @@ -972,7 +972,7 @@ int EoBInfProcessor::oeob_eval_v2(int8 *data) { case 9: switch (*pos++) { case -36: - _stack[_stackIndex++] = _vm->_itemTypes[_vm->_items[_vm->_lastUsedItem].type].extraProperties & 0x7f; + _stack[_stackIndex++] = _vm->_itemTypes[_vm->_items[_vm->_lastUsedItem].type].extraProperties & 0x7F; break; case -31: _stack[_stackIndex++] = _vm->_items[_vm->_lastUsedItem].type; @@ -1097,7 +1097,7 @@ int EoBInfProcessor::oeob_eval_v2(int8 *data) { case 26: a = 0; for (i = 0; i < 6; i++) { - if (_vm->testCharacter(i, 0x0f)) + if (_vm->testCharacter(i, 0x0F)) a++; } _stack[_stackIndex++] = a; @@ -1260,7 +1260,7 @@ int EoBInfProcessor::oeob_loadNewLevelOrMonsters(int8 *data) { pos += 2; uint8 dir = (uint8)*pos++; - if (dir != 0xff) + if (dir != 0xFF) _vm->_currentDirection = dir; for (int i = 0; i < 30; i++) @@ -1328,11 +1328,11 @@ int EoBInfProcessor::oeob_createItem_v1(int8 *data) { uint8 itmPos = *pos++; if (itm) { - if (block == 0xffff && !_vm->_itemInHand) { + if (block == 0xFFFF && !_vm->_itemInHand) { _vm->setHandItem(itm); debugC(5, kDebugLevelScript, " - create hand item '%d'", itm); - } else if (block != 0xffff) { - _vm->setItemPosition((Item *)&_vm->_levelBlockProperties[block & 0x3ff].drawObjects, block, itm, itmPos); + } else if (block != 0xFFFF) { + _vm->setItemPosition((Item *)&_vm->_levelBlockProperties[block & 0x3FF].drawObjects, block, itm, itmPos); debugC(5, kDebugLevelScript, " - create item '%d' on block '0x%.04X', position '%d'", itm, block, itmPos); } } @@ -1363,19 +1363,19 @@ int EoBInfProcessor::oeob_createItem_v2(int8 *data) { if (!itm) return pos - data; - if (block == 0xffff) { + if (block == 0xFFFF) { if (!_vm->_itemInHand) { _vm->setHandItem(itm); debugC(5, kDebugLevelScript, " - create hand item '%d' (value '%d', flags '0x%X', icon number '%d')", itm, _vm->_items[itm].value, _vm->_items[itm].flags, _vm->_items[itm].icon); } else { - _vm->setItemPosition((Item *)&_vm->_levelBlockProperties[_vm->_currentBlock & 0x3ff].drawObjects, _vm->_currentBlock, itm, _itemPos[_vm->rollDice(1, 2, -1)]); + _vm->setItemPosition((Item *)&_vm->_levelBlockProperties[_vm->_currentBlock & 0x3FF].drawObjects, _vm->_currentBlock, itm, _itemPos[_vm->rollDice(1, 2, -1)]); debugC(5, kDebugLevelScript, " - create item '%d' (value '%d', flags '0x%X', icon number '%d') on current block", itm, _vm->_items[itm].value, _vm->_items[itm].flags, _vm->_items[itm].icon); } - } else if (block == 0xfffe) { - _vm->setItemPosition((Item *)&_vm->_levelBlockProperties[_vm->_currentBlock & 0x3ff].drawObjects, _vm->_currentBlock, itm, _itemPos[(_vm->_currentDirection << 2) + _vm->rollDice(1, 2, -1)]); + } else if (block == 0xFFFE) { + _vm->setItemPosition((Item *)&_vm->_levelBlockProperties[_vm->_currentBlock & 0x3FF].drawObjects, _vm->_currentBlock, itm, _itemPos[(_vm->_currentDirection << 2) + _vm->rollDice(1, 2, -1)]); debugC(5, kDebugLevelScript, " - create item '%d' (value '%d', flags '0x%X', icon number '%d') on current block", itm, _vm->_items[itm].value, _vm->_items[itm].flags, _vm->_items[itm].icon); } else { - _vm->setItemPosition((Item *)&_vm->_levelBlockProperties[block & 0x3ff].drawObjects, block, itm, itmPos); + _vm->setItemPosition((Item *)&_vm->_levelBlockProperties[block & 0x3FF].drawObjects, block, itm, itmPos); debugC(5, kDebugLevelScript, " - create item '%d' (value '%d', flags '0x%X', icon number '%d') on block '0x%.04X', position '%d'", itm, _vm->_items[itm].value, _vm->_items[itm].flags, _vm->_items[itm].icon, block, itmPos); } @@ -1530,7 +1530,7 @@ int EoBInfProcessor::oeob_dialogue(int8 *data) { break; case -40: - _dlgResult = _vm->runDialogue(READ_LE_UINT16(pos), READ_LE_UINT16(pos + 6) == 0xffff ? 2 : 3, getString(READ_LE_UINT16(pos + 2)), getString(READ_LE_UINT16(pos + 4)), getString(READ_LE_UINT16(pos + 6))); + _dlgResult = _vm->runDialogue(READ_LE_UINT16(pos), READ_LE_UINT16(pos + 6) == 0xFFFF ? 2 : 3, getString(READ_LE_UINT16(pos + 2)), getString(READ_LE_UINT16(pos + 4)), getString(READ_LE_UINT16(pos + 6))); pos += 8; break; diff --git a/engines/kyra/script_eob.h b/engines/kyra/script_eob.h index fc8b4cfc31..ff3a5e0fac 100644 --- a/engines/kyra/script_eob.h +++ b/engines/kyra/script_eob.h @@ -91,7 +91,7 @@ private: EoBCoreEngine *_vm; Screen_EoB *_screen; - typedef Common::Functor1Mem<int8*, int, EoBInfProcessor> InfProc; + typedef Common::Functor1Mem<int8 *, int, EoBInfProcessor> InfProc; struct InfOpcode : private Common::NonCopyable { InfOpcode(InfProc *p, const char *d) : proc(p), desc(d) {} ~InfOpcode() { delete proc; } diff --git a/engines/kyra/script_hof.cpp b/engines/kyra/script_hof.cpp index fca83ae632..5bf8f6e78d 100644 --- a/engines/kyra/script_hof.cpp +++ b/engines/kyra/script_hof.cpp @@ -253,7 +253,7 @@ int KyraEngine_HoF::o2_displayWsaSequentialFrames(EMCState *script) { uint16 currentFrame = stackPos(3); uint16 lastFrame = stackPos(4); uint16 index = stackPos(5); - uint16 copyParam = stackPos(6) | 0xc000; + uint16 copyParam = stackPos(6) | 0xC000; _screen->hideMouse(); @@ -278,7 +278,7 @@ int KyraEngine_HoF::o2_displayWsaSequence(EMCState *script) { const int frameDelay = stackPos(2) * _tickLength; const int index = stackPos(3); const bool doUpdate = (stackPos(4) != 0); - const uint16 copyParam = stackPos(5) | 0xc000; + const uint16 copyParam = stackPos(5) | 0xC000; _screen->hideMouse(); @@ -319,8 +319,8 @@ int KyraEngine_HoF::o2_drawShape(EMCState *script) { uint8 *shp = getShapePtr(stackPos(0) + 64); int x = stackPos(1); int y = stackPos(2); - uint8 dsFlag = stackPos(3) & 0xff; - uint8 modeFlag = stackPos(4) & 0xff; + uint8 dsFlag = stackPos(3) & 0xFF; + uint8 modeFlag = stackPos(4) & 0xFF; if (modeFlag) { _screen->drawShape(2, shp, x, y, 2, dsFlag ? 1 : 0); @@ -918,7 +918,7 @@ int KyraEngine_HoF::o2_useItemOnMainChar(EMCState *script) { tmpScript.regs[0] = _mainCharacter.sceneId; int oldVocH = _vocHigh; - _vocHigh = 0x5a; + _vocHigh = 0x5A; while (_emc->isValid(&tmpScript)) _emc->run(&tmpScript); @@ -955,7 +955,7 @@ int KyraEngine_HoF::o2_pressColorKey(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_pressColorKey(%p) (%d)", (const void *)script, stackPos(0)); for (int i = 6; i; i--) _inputColorCode[i] = _inputColorCode[i - 1]; - _inputColorCode[0] = stackPos(0) & 0xff; + _inputColorCode[0] = stackPos(0) & 0xFF; for (int i = 0; i < 7; i++) { if (_presetColorCode[i] != _inputColorCode[6 - i]) return _dbgPass; @@ -1023,8 +1023,8 @@ int KyraEngine_HoF::o2_getColorCodeValue(EMCState *script) { int KyraEngine_HoF::o2_setColorCodeValue(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_setColorCodeValue(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1)); - _presetColorCode[stackPos(0)] = stackPos(1) & 0xff; - return stackPos(1) & 0xff; + _presetColorCode[stackPos(0)] = stackPos(1) & 0xFF; + return stackPos(1) & 0xFF; } int KyraEngine_HoF::o2_countItemInstances(EMCState *script) { @@ -1495,7 +1495,7 @@ void KyraEngine_HoF::setupOpcodeTable() { OpcodeUnImpl(); OpcodeUnImpl(); Opcode(o2_setCharacterAnimFrame); - // 0x0c + // 0x0C Opcode(o2_setCharacterFacingOverwrite); Opcode(o2_trySceneChange); Opcode(o2_moveCharacter); @@ -1515,7 +1515,7 @@ void KyraEngine_HoF::setupOpcodeTable() { Opcode(o2_wsaOpen); Opcode(o2_displayWsaSequentialFrames); Opcode(o2_displayWsaSequence); - // 0x1c + // 0x1C Opcode(o2_addItemToInventory); Opcode(o2_drawShape); Opcode(o2_addItemToCurScene); @@ -1536,7 +1536,7 @@ void KyraEngine_HoF::setupOpcodeTable() { Opcode(o1_setGameFlag); Opcode(o1_setHandItem); Opcode(o1_removeHandItem); - // 0x2c + // 0x2C Opcode(o1_getMouseState); Opcode(o1_hideMouse); Opcode(o2_addSpecialExit); @@ -1556,7 +1556,7 @@ void KyraEngine_HoF::setupOpcodeTable() { Opcode(o2_setTimerDelay); Opcode(o2_setScaleTableItem); Opcode(o2_setDrawLayerTableItem); - // 0x3c + // 0x3C Opcode(o2_setCharPalEntry); Opcode(o2_loadZShapes); Opcode(o2_drawSceneShape); @@ -1576,7 +1576,7 @@ void KyraEngine_HoF::setupOpcodeTable() { Opcode(o2_restoreInventoryGfx); Opcode(o2_setSceneAnimPos2); Opcode(o2_update); - // 0x4c + // 0x4C OpcodeUnImpl(); Opcode(o2_fadeScenePal); Opcode(o2_dummy); @@ -1596,7 +1596,7 @@ void KyraEngine_HoF::setupOpcodeTable() { Opcode(o1_playSoundEffect); Opcode(o2_setSceneAnimPos); Opcode(o1_blockInWalkableRegion); - // 0x5c + // 0x5C Opcode(o1_blockOutWalkableRegion); OpcodeUnImpl(); Opcode(o2_setCauldronState); @@ -1616,7 +1616,7 @@ void KyraEngine_HoF::setupOpcodeTable() { OpcodeUnImpl(); Opcode(o2_playFireflyScore); Opcode(o2_waitForConfirmationClick); - // 0x6c + // 0x6C Opcode(o2_encodeShape); Opcode(o2_defineRoomEntrance); Opcode(o2_runAnimationScript); @@ -1636,7 +1636,7 @@ void KyraEngine_HoF::setupOpcodeTable() { Opcode(o2_defineScene); Opcode(o2_addCauldronStateTableEntry); Opcode(o2_setCountDown); - // 0x7c + // 0x7C Opcode(o2_getCountDown); Opcode(o2_dummy); Opcode(o2_dummy); @@ -1656,7 +1656,7 @@ void KyraEngine_HoF::setupOpcodeTable() { Opcode(o2_removeItemFromScene); Opcode(o2_initObject); Opcode(o2_npcChat); - // 0x8c + // 0x8C Opcode(o2_deinitObject); Opcode(o2_playTimSequence); Opcode(o2_makeBookOrCauldronAppear); @@ -1676,27 +1676,27 @@ void KyraEngine_HoF::setupOpcodeTable() { Opcode(o2_customChatFinish); Opcode(o2_setupSceneAnimation); Opcode(o2_stopSceneAnimation); - // 0x9c + // 0x9C Opcode(o2_disableTimer); Opcode(o2_enableTimer); Opcode(o2_setTimerCountdown); Opcode(o2_processPaletteIndex); - // 0xa0 + // 0xA0 Opcode(o2_updateTwoSceneAnims); Opcode(o2_getRainbowRoomData); Opcode(o2_drawSceneShapeEx); Opcode(o2_midiSoundFadeout); - // 0xa4 + // 0xA4 Opcode(o2_getSfxDriver); Opcode(o2_getVocSupport); Opcode(o2_getMusicDriver); Opcode(o2_setVocHigh); - // 0xa8 + // 0xA8 Opcode(o2_getVocHigh); Opcode(o2_zanthiaChat); Opcode(o2_isVoiceEnabled); Opcode(o2_isVoicePlaying); - // 0xac + // 0xAC Opcode(o2_stopVoicePlaying); Opcode(o2_getGameLanguage); Opcode(o2_demoFinale); diff --git a/engines/kyra/script_lok.cpp b/engines/kyra/script_lok.cpp index db9e01cabb..22d5e9fd7c 100644 --- a/engines/kyra/script_lok.cpp +++ b/engines/kyra/script_lok.cpp @@ -1774,7 +1774,7 @@ void KyraEngine_LoK::setupOpcodeTable() { Opcode(o1_blockInWalkableRegion); Opcode(o1_blockOutWalkableRegion); Opcode(o1_walkPlayerToPoint); - // 0x0c + // 0x0C Opcode(o1_dropItemInScene); Opcode(o1_drawAnimShapeIntoScene); Opcode(o1_setHandItem); @@ -1794,7 +1794,7 @@ void KyraEngine_LoK::setupOpcodeTable() { Opcode(o1_phaseInSameScene); Opcode(o1_setScenePhasingFlag); Opcode(o1_resetScenePhasingFlag); - // 0x1c + // 0x1C Opcode(o1_queryScenePhasingFlag); Opcode(o1_sceneToDirection); Opcode(o1_setBirthstoneGem); @@ -1814,7 +1814,7 @@ void KyraEngine_LoK::setupOpcodeTable() { Opcode(o1_openWSAFile); Opcode(o1_closeWSAFile); Opcode(o1_runWSAFromBeginningToEnd); - // 0x2c + // 0x2C Opcode(o1_displayWSAFrame); Opcode(o1_enterNewScene); Opcode(o1_setSpecialEnterXAndY); @@ -1834,7 +1834,7 @@ void KyraEngine_LoK::setupOpcodeTable() { Opcode(o1_getCharacterY); Opcode(o1_setCharacterFacing); Opcode(o1_copyWSARegion); - // 0x3c + // 0x3C Opcode(o1_printText); Opcode(o1_getRand); Opcode(o1_loadSoundFile); @@ -1854,7 +1854,7 @@ void KyraEngine_LoK::setupOpcodeTable() { Opcode(o1_placeCharacterInOtherScene); Opcode(o1_getKey); Opcode(o1_specificItemInInventory); - // 0x4c + // 0x4C Opcode(o1_popMobileNPCIntoScene); Opcode(o1_mobileCharacterInScene); Opcode(o1_hideMobileCharacter); @@ -1874,7 +1874,7 @@ void KyraEngine_LoK::setupOpcodeTable() { Opcode(o1_setCharacterMovementDelay); Opcode(o1_getCharacterFacing); Opcode(o1_bkgdScrollSceneAndMasksRight); - // 0x5c + // 0x5C Opcode(o1_dispelMagicAnimation); Opcode(o1_findBrightestFireberry); Opcode(o1_setFireberryGlowPalette); @@ -1894,7 +1894,7 @@ void KyraEngine_LoK::setupOpcodeTable() { Opcode(o1_addItemToInventory); Opcode(o1_intPrint); Opcode(o1_shakeScreen); - // 0x6c + // 0x6C Opcode(o1_createAmuletJewel); Opcode(o1_setSceneAnimCurrXY); Opcode(o1_poisonBrandonAndRemaps); @@ -1914,7 +1914,7 @@ void KyraEngine_LoK::setupOpcodeTable() { Opcode(o1_setMousePos); Opcode(o1_getMouseState); Opcode(o1_setEntranceMouseCursorTrack); - // 0x7c + // 0x7C Opcode(o1_itemAppearsOnGround); Opcode(o1_setNoDrawShapesFlag); Opcode(o1_fadeEntirePalette); @@ -1934,7 +1934,7 @@ void KyraEngine_LoK::setupOpcodeTable() { Opcode(o1_getScaleDepthTableValue); Opcode(o1_setScaleDepthTableValue); Opcode(o1_message); - // 0x8c + // 0x8C Opcode(o1_checkClickOnNPC); Opcode(o1_getFoyerItem); Opcode(o1_setFoyerItem); @@ -1954,7 +1954,7 @@ void KyraEngine_LoK::setupOpcodeTable() { Opcode(o1_fillRect); Opcode(o1_vocUnload); Opcode(o1_vocLoad); - // 0x9c + // 0x9C Opcode(o1_dummy); } #undef Opcode diff --git a/engines/kyra/script_lol.cpp b/engines/kyra/script_lol.cpp index 9c0fe21ad4..0bbe66f530 100644 --- a/engines/kyra/script_lol.cpp +++ b/engines/kyra/script_lol.cpp @@ -126,7 +126,7 @@ int LoLEngine::olol_moveParty(EMCState *script) { mode = (mode - 6 - _currentDirection) & 3; Button b; - b.data0Val2 = b.data1Val2 = b.data2Val2 = 0xfe; + b.data0Val2 = b.data1Val2 = b.data2Val2 = 0xFE; b.data0Val3 = b.data1Val3 = b.data2Val3 = 0x01; switch (mode) { @@ -268,7 +268,7 @@ int LoLEngine::olol_makeItem(EMCState *script) { int LoLEngine::olol_placeMoveLevelItem(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_placeMoveLevelItem(%p) (%d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5)); - placeMoveLevelItem(stackPos(0), stackPos(1), stackPos(2), stackPos(3) & 0xff, stackPos(4) & 0xff, stackPos(5)); + placeMoveLevelItem(stackPos(0), stackPos(1), stackPos(2), stackPos(3) & 0xFF, stackPos(4) & 0xFF, stackPos(5)); return 1; } @@ -321,7 +321,7 @@ int LoLEngine::olol_getItemPara(EMCState *script) { case 14: return p->unkB; case 15: - return i->shpCurFrame_flg & 0x1fff; + return i->shpCurFrame_flg & 0x1FFF; case 16: return p->flags; case 17: @@ -397,7 +397,7 @@ int LoLEngine::olol_setCharacterStat(EMCState *script) { break; case 1: - c->raceClassSex = e & 0x0f; + c->raceClassSex = e & 0x0F; break; case 5: @@ -478,19 +478,19 @@ int LoLEngine::olol_loadDoorShapes(EMCState *script) { _wllWallFlags[i + 3] |= 7; int t = i % 5; if (t == 4) - _wllWallFlags[i + 3] &= 0xf8; + _wllWallFlags[i + 3] &= 0xF8; if (t == 3) - _wllWallFlags[i + 3] &= 0xfd; + _wllWallFlags[i + 3] &= 0xFD; } if (stackPos(3)) { for (int i = 3; i < 13; i++) - _wllWallFlags[i] &= 0xfd; + _wllWallFlags[i] &= 0xFD; } if (stackPos(4)) { for (int i = 13; i < 23; i++) - _wllWallFlags[i] &= 0xfd; + _wllWallFlags[i] &= 0xFD; } return 1; @@ -683,7 +683,7 @@ int LoLEngine::olol_setGlobalVar(EMCState *script) { break; case 2: - _currentLevel = b & 0xff; + _currentLevel = b & 0xFF; break; case 3: @@ -691,7 +691,7 @@ int LoLEngine::olol_setGlobalVar(EMCState *script) { break; case 4: - _brightness = b & 0xff; + _brightness = b & 0xFF; break; case 5: @@ -717,20 +717,20 @@ int LoLEngine::olol_setGlobalVar(EMCState *script) { break; case 9: - _lampOilStatus = b & 0xff; + _lampOilStatus = b & 0xFF; break; case 10: - _sceneDefaultUpdate = b & 0xff; + _sceneDefaultUpdate = b & 0xFF; gui_toggleButtonDisplayMode(0, 0); break; case 11: - _compassBroken = a & 0xff; + _compassBroken = a & 0xFF; break; case 12: - _drainMagic = a & 0xff; + _drainMagic = a & 0xFF; break; default: @@ -763,9 +763,9 @@ int LoLEngine::olol_checkEquippedItemScriptFlags(EMCState *script) { int LoLEngine::olol_setDoorState(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_setDoorState(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1)); if (stackPos(1)) - _levelBlockProperties[stackPos(0)].flags = (_levelBlockProperties[stackPos(0)].flags & 0xef) | 0x20; + _levelBlockProperties[stackPos(0)].flags = (_levelBlockProperties[stackPos(0)].flags & 0xEF) | 0x20; else - _levelBlockProperties[stackPos(0)].flags &= 0xdf; + _levelBlockProperties[stackPos(0)].flags &= 0xDF; return 1; } @@ -784,7 +784,7 @@ int LoLEngine::olol_assignLevelDecorationShape(EMCState *script) { int LoLEngine::olol_resetBlockShapeAssignment(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_resetBlockShapeAssignment(%p) (%d)", (const void *)script, stackPos(0)); - uint8 v = stackPos(0) & 0xff; + uint8 v = stackPos(0) & 0xFF; memset(_wllShapeMap + 3, v, 5); memset(_wllShapeMap + 13, v, 5); return 1; @@ -823,7 +823,7 @@ int LoLEngine::olol_initMonster(EMCState *script) { l->type = stackPos(4); l->properties = &_monsterProperties[l->type]; l->direction = l->facing << 1; - l->hitPoints = (l->properties->hitPoints * _monsterModifiers[_monsterDifficulty]) >> 8; + l->hitPoints = (l->properties->hitPoints * _monsterModifiers1[_monsterDifficulty]) >> 8; if (_currentLevel != 12 || l->type != 2) l->hitPoints = (l->hitPoints * (rollDice(1, 128) + 192)) >> 8; @@ -842,7 +842,7 @@ int LoLEngine::olol_initMonster(EMCState *script) { l->destDirection = l->direction; for (int ii = 0; ii < 4; ii++) - l->equipmentShapes[ii] = stackPos(7 + ii) & 0xff; + l->equipmentShapes[ii] = stackPos(7 + ii) & 0xFF; checkSceneUpdateNeed(l->block); return i; @@ -927,7 +927,7 @@ int LoLEngine::olol_loadMonsterProperties(EMCState *script) { stackPos(35), stackPos(36), stackPos(37), stackPos(38), stackPos(39), stackPos(40), stackPos(41)); LoLMonsterProperty *l = &_monsterProperties[stackPos(0)]; - l->shapeIndex = stackPos(1) & 0xff; + l->shapeIndex = stackPos(1) & 0xFF; int shpWidthMax = 0; @@ -1079,7 +1079,7 @@ int LoLEngine::olol_addRemoveCharacter(EMCState *script) { if (!(_characters[i].flags & 1) || _characters[i].id != id) continue; - _characters[i].flags &= 0xfffe; + _characters[i].flags &= 0xFFFE; calcCharPortraitXpos(); if (_selectedCharacter == i) @@ -1192,7 +1192,7 @@ int LoLEngine::olol_changeMonsterStat(EMCState *script) { if (stackPos(0) == -1) return 1; - LoLMonster *m = &_monsters[stackPos(0) & 0x7fff]; + LoLMonster *m = &_monsters[stackPos(0) & 0x7FFF]; int16 d = stackPos(2); uint16 x = 0; @@ -1208,7 +1208,7 @@ int LoLEngine::olol_changeMonsterStat(EMCState *script) { break; case 2: - calcCoordinates(x, y, d, m->x & 0xff, m->y & 0xff); + calcCoordinates(x, y, d, m->x & 0xFF, m->y & 0xFF); if (!walkMonsterCheckDest(x, y, m, 7)) placeMonster(m, x, y); break; @@ -1233,7 +1233,7 @@ int LoLEngine::olol_getMonsterStat(EMCState *script) { if (stackPos(0) == -1) return 0; - LoLMonster *m = &_monsters[stackPos(0) & 0x7fff]; + LoLMonster *m = &_monsters[stackPos(0) & 0x7FFF]; int d = stackPos(1); switch (d) { @@ -1318,8 +1318,8 @@ int LoLEngine::olol_drawExitButton(EMCState *script) { int w = _screen->getTextWidth(str); if (_flags.use16ColorMode) { - gui_drawBox(x - offs - w, y - 9, w + offs, 9, 0xee, 0xcc, 0x11); - _screen->printText(str, x - (offs >> 1) - w, y - 7, 0xbb, 0); + gui_drawBox(x - offs - w, y - 9, w + offs, 9, 0xEE, 0xCC, 0x11); + _screen->printText(str, x - (offs >> 1) - w, y - 7, 0xBB, 0); } else { gui_drawBox(x - offs - w, y - 9, w + offs, 9, 136, 251, 252); _screen->printText(str, x - (offs >> 1) - w, y - 7, 144, 0); @@ -1497,7 +1497,7 @@ int LoLEngine::olol_distanceAttack(EMCState *script) { uint16 y = 0; calcCoordinates(x, y, stackPos(2), fX, fY); - if (launchObject(stackPos(0), stackPos(1), x, y, stackPos(5), stackPos(6) << 1, stackPos(7), stackPos(8), 0x3f)) + if (launchObject(stackPos(0), stackPos(1), x, y, stackPos(5), stackPos(6) << 1, stackPos(7), stackPos(8), 0x3F)) return 1; deleteItem(stackPos(1)); @@ -1532,7 +1532,7 @@ int LoLEngine::olol_moveBlockObjects(EMCState *script) { // WORKAROUND for script bug // Items would vanish when thrown towards the stairs // in white tower level 3. - if (_currentLevel == 21 && level == 21 && destBlock == 0x3e0) { + if (_currentLevel == 21 && level == 21 && destBlock == 0x3E0) { level = 20; destBlock = 0x0247; } @@ -1544,7 +1544,7 @@ int LoLEngine::olol_moveBlockObjects(EMCState *script) { if (!includeMonsters) continue; - l &= 0x7fff; + l &= 0x7FFF; LoLMonster *m = &_monsters[l]; @@ -1558,7 +1558,7 @@ int LoLEngine::olol_moveBlockObjects(EMCState *script) { if (!(_itemsInPlay[l].shpCurFrame_flg & 0x4000) || !includeItems) continue; - placeMoveLevelItem(l, level, destBlock, _itemsInPlay[l].x & 0xff, _itemsInPlay[l].y & 0xff, _itemsInPlay[l].flyingHeight); + placeMoveLevelItem(l, level, destBlock, _itemsInPlay[l].x & 0xFF, _itemsInPlay[l].y & 0xFF, _itemsInPlay[l].flyingHeight); res = 1; if (!runScript || level != _currentLevel) @@ -1617,7 +1617,7 @@ int LoLEngine::olol_dummy1(EMCState *script) { int LoLEngine::olol_suspendMonster(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_suspendMonster(%p) (%d)", (const void *)script, stackPos(0)); - LoLMonster *m = &_monsters[stackPos(0) & 0x7fff]; + LoLMonster *m = &_monsters[stackPos(0) & 0x7FFF]; setMonsterMode(m, 14); checkSceneUpdateNeed(m->block); placeMonster(m, 0, 0); @@ -1732,11 +1732,11 @@ int LoLEngine::olol_getItemOnPos(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_getItemOnPos(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3)); int pX = stackPos(1); if (pX != -1) - pX &= 0xff; + pX &= 0xFF; int pY = stackPos(2); if (pY != -1) - pY &= 0xff; + pY &= 0xFF; int o = (stackPos(3) || _emcLastItem == -1) ? stackPos(0) : _emcLastItem; @@ -1744,19 +1744,19 @@ int LoLEngine::olol_getItemOnPos(EMCState *script) { while (_emcLastItem) { if (_emcLastItem & 0x8000) { - o = _emcLastItem & 0x7fff; + o = _emcLastItem & 0x7FFF; _emcLastItem = _levelBlockProperties[o].assignedObjects; continue; } - if (pX != -1 && (_itemsInPlay[_emcLastItem].x & 0xff) != pX) { - o = _emcLastItem & 0x7fff; + if (pX != -1 && (_itemsInPlay[_emcLastItem].x & 0xFF) != pX) { + o = _emcLastItem & 0x7FFF; _emcLastItem = _levelBlockProperties[o].assignedObjects; continue; } - if (pY != -1 && (_itemsInPlay[_emcLastItem].y & 0xff) != pY) { - o = _emcLastItem & 0x7fff; + if (pY != -1 && (_itemsInPlay[_emcLastItem].y & 0xFF) != pY) { + o = _emcLastItem & 0x7FFF; _emcLastItem = _levelBlockProperties[o].assignedObjects; continue; } @@ -1835,7 +1835,7 @@ int LoLEngine::olol_assignCustomSfx(EMCState *script) { return 0; uint16 t = READ_LE_UINT16(&_ingameSoundIndex[i << 1]); - if (t == 0xffff) + if (t == 0xFFFF) return 0; strcpy(_ingameSoundList[t], c); @@ -1848,7 +1848,7 @@ int LoLEngine::olol_findAssignedMonster(EMCState *script) { uint16 o = stackPos(1) == -1 ? _levelBlockProperties[stackPos(0)].assignedObjects : findObject(stackPos(1))->nextAssignedObject; while (o) { if (o & 0x8000) - return o & 0x7fff; + return o & 0x7FFF; o = findObject(o)->nextAssignedObject; } return -1; @@ -1861,8 +1861,8 @@ int LoLEngine::olol_checkBlockForMonster(EMCState *script) { uint16 o = _levelBlockProperties[block].assignedObjects; while (o & 0x8000) { - if (id == 0xffff || id == o) - return o & 0x7fff; + if (id == 0xFFFF || id == o) + return o & 0x7FFF; o = findObject(o)->nextAssignedObject; } return -1; @@ -2040,7 +2040,7 @@ int LoLEngine::olol_changeItemTypeOrFlag(EMCState *script) { if (stackPos(1) == 4) i->itemPropertyIndex = val; else if (stackPos(1) == 15) - i->shpCurFrame_flg = (i->shpCurFrame_flg & 0xe000) | (val & 0x1fff); + i->shpCurFrame_flg = (i->shpCurFrame_flg & 0xE000) | (val & 0x1FFF); else val = -1; @@ -2129,7 +2129,7 @@ int LoLEngine::olol_paletteFlash(EMCState *script) { uint8 *d = p2.getData(); for (int i = 0; i < 16; i++) - d[i * 3] = 0x3f; + d[i * 3] = 0x3F; _screen->setScreenPalette(p2); _screen->updateScreen(); diff --git a/engines/kyra/script_mr.cpp b/engines/kyra/script_mr.cpp index 22d0bc4e95..f656b162fd 100644 --- a/engines/kyra/script_mr.cpp +++ b/engines/kyra/script_mr.cpp @@ -1144,7 +1144,7 @@ void KyraEngine_MR::setupOpcodeTable() { Opcode(o3_dummy); Opcode(o3_dummy); Opcode(o3_getCharacterFrameFromFacing); - // 0x0c + // 0x0C Opcode(o2_setCharacterFacingOverwrite); Opcode(o2_trySceneChange); Opcode(o2_moveCharacter); @@ -1164,7 +1164,7 @@ void KyraEngine_MR::setupOpcodeTable() { Opcode(o3_showAlbum); Opcode(o3_setInventorySlot); Opcode(o3_getInventorySlot); - // 0x1c + // 0x1C Opcode(o3_addItemToInventory); OpcodeUnImpl(); Opcode(o3_addItemToCurScene); @@ -1184,7 +1184,7 @@ void KyraEngine_MR::setupOpcodeTable() { Opcode(o1_setGameFlag); Opcode(o1_setHandItem); Opcode(o1_removeHandItem); - // 0x2c + // 0x2C Opcode(o1_getMouseState); Opcode(o1_hideMouse); Opcode(o2_addSpecialExit); @@ -1204,7 +1204,7 @@ void KyraEngine_MR::setupOpcodeTable() { Opcode(o3_makeSecondChanceSave); Opcode(o3_setSceneFilename); OpcodeUnImpl(); - // 0x3c + // 0x3C Opcode(o3_removeItemsFromScene); Opcode(o3_disguiseMalcolm); Opcode(o3_drawSceneShape); @@ -1224,7 +1224,7 @@ void KyraEngine_MR::setupOpcodeTable() { Opcode(o3_dummy); Opcode(o3_setSceneAnimPosAndFrame); Opcode(o2_update); - // 0x4c + // 0x4C Opcode(o3_removeItemInstances); Opcode(o3_dummy); Opcode(o3_disableInventory); @@ -1244,7 +1244,7 @@ void KyraEngine_MR::setupOpcodeTable() { Opcode(o3_playSoundEffect); Opcode(o3_getScore); Opcode(o3_daggerWarning); - // 0x5c + // 0x5C Opcode(o3_blockOutWalkableRegion); Opcode(o3_dummy); Opcode(o3_showSceneStringsMessage); @@ -1264,7 +1264,7 @@ void KyraEngine_MR::setupOpcodeTable() { Opcode(o3_dummy); Opcode(o3_dummy); Opcode(o2_waitForConfirmationClick); - // 0x6c + // 0x6C Opcode(o3_dummy); Opcode(o2_defineRoomEntrance); Opcode(o2_runAnimationScript); @@ -1284,7 +1284,7 @@ void KyraEngine_MR::setupOpcodeTable() { Opcode(o2_defineScene); Opcode(o3_setConversationState); OpcodeUnImpl(); - // 0x7c + // 0x7C OpcodeUnImpl(); Opcode(o3_getConversationState); Opcode(o3_dummy); @@ -1304,7 +1304,7 @@ void KyraEngine_MR::setupOpcodeTable() { Opcode(o3_dummy); Opcode(o3_dialogStartScript); Opcode(o3_dummy); - // 0x8c + // 0x8C Opcode(o3_dialogEndScript); Opcode(o3_dummy); Opcode(o3_dummy); @@ -1324,27 +1324,27 @@ void KyraEngine_MR::setupOpcodeTable() { Opcode(o3_customChatFinish); Opcode(o3_setupSceneAnimObject); Opcode(o3_removeSceneAnimObject); - // 0x9c + // 0x9C Opcode(o2_disableTimer); Opcode(o2_enableTimer); Opcode(o2_setTimerCountdown); OpcodeUnImpl(); - // 0xa0 + // 0xA0 Opcode(o3_dummy); Opcode(o3_dummy); Opcode(o3_dummy); Opcode(o3_dummy); - // 0xa4 + // 0xA4 OpcodeUnImpl(); OpcodeUnImpl(); OpcodeUnImpl(); Opcode(o2_setVocHigh); - // 0xa8 + // 0xA8 Opcode(o2_getVocHigh); OpcodeUnImpl(); OpcodeUnImpl(); OpcodeUnImpl(); - // 0xac + // 0xAC OpcodeUnImpl(); Opcode(o3_dummy); OpcodeUnImpl(); diff --git a/engines/kyra/script_tim.cpp b/engines/kyra/script_tim.cpp index 177d7993a0..ba0f62a2b4 100644 --- a/engines/kyra/script_tim.cpp +++ b/engines/kyra/script_tim.cpp @@ -297,20 +297,20 @@ void TIMInterpreter::displayText(uint16 textId, int16 flags) { memcpy(filename, text+1, end-1-text); } - const bool isPC98 = (_vm->gameFlags().platform == Common::kPlatformPC98); + const bool sjisMode = (_vm->gameFlags().lang == Common::JA_JPN && _vm->gameFlags().use16ColorMode); if (filename[0] && (_vm->speechEnabled() || !_vm->gameFlags().isTalkie)) - _vm->sound()->voicePlay(filename); + _vm->sound()->voicePlay(filename, 0, 255, 255, !_vm->gameFlags().isTalkie); if (text[0] == '$') text = strchr(text + 1, '$') + 1; - if (!isPC98) + if (!_vm->gameFlags().use16ColorMode) setupTextPalette((flags < 0) ? 1 : flags, 0); if (flags < 0) { static const uint8 colorMap[] = { 0x00, 0xF0, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - _screen->setFont(isPC98 ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT); + _screen->setFont(sjisMode ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT); _screen->setTextColorMap(colorMap); _screen->_charWidth = -2; } @@ -335,7 +335,7 @@ void TIMInterpreter::displayText(uint16 textId, int16 flags) { int width = _screen->getTextWidth(str); if (flags >= 0) { - if (isPC98) { + if (_vm->gameFlags().use16ColorMode) { static const uint8 colorMap[] = { 0xE1, 0xE1, 0xC1, 0xA1, 0x81, 0x61 }; _screen->printText(str, (320 - width) >> 1, 160 + heightAdd, colorMap[flags], 0x00); } else { @@ -359,7 +359,7 @@ void TIMInterpreter::displayText(uint16 textId, int16 flags) { if (flags < 0) { static const uint8 colorMap[] = { 0x00, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0x00, 0x00, 0x00, 0x00 }; - _screen->setFont(isPC98 ? Screen::FID_SJIS_FNT : Screen::FID_INTRO_FNT); + _screen->setFont(sjisMode ? Screen::FID_SJIS_FNT : Screen::FID_INTRO_FNT); _screen->setTextColorMap(colorMap); _screen->_charWidth = 0; } @@ -377,7 +377,7 @@ void TIMInterpreter::displayText(uint16 textId, int16 flags, uint8 color) { if (flags == 255) return; - _screen->setFont(_vm->gameFlags().use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_INTRO_FNT); + _screen->setFont((_vm->gameFlags().lang == Common::JA_JPN && _vm->gameFlags().use16ColorMode) ? Screen::FID_SJIS_FNT : Screen::FID_INTRO_FNT); static const uint8 colorMap[] = { 0x00, 0xA0, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; _screen->setTextColorMap(colorMap); @@ -393,14 +393,14 @@ void TIMInterpreter::displayText(uint16 textId, int16 flags, uint8 color) { int y = 0; if (_vm->gameFlags().use16ColorMode) { - if (color == 0xda) - color = 0xa1; - else if (color == 0xf2) - color = 0xe1; + if (color == 0xDA) + color = 0xA1; + else if (color == 0xF2) + color = 0xE1; else if (flags < 0) - color = 0xe1; + color = 0xE1; else - color = 0xc1; + color = 0xC1; } while (str[0]) { @@ -736,7 +736,7 @@ int TIMInterpreter::cmd_playVocFile(const uint16 *param) { const int volume = (param[1] * 255) / 100; if (index < ARRAYSIZE(_vocFiles) && !_vocFiles[index].empty()) - _vm->sound()->voicePlay(_vocFiles[index].c_str(), 0, volume, true); + _vm->sound()->voicePlay(_vocFiles[index].c_str(), 0, volume, 255, true); else if (index == 7 && !_vm->gameFlags().isTalkie) _vm->sound()->playTrack(index); else @@ -1083,7 +1083,7 @@ int TIMInterpreter_LoL::cmd_dialogueBox(const uint16 *param) { int cnt = 0; for (int i = 1; i < 4; i++) { - if (param[i] != 0xffff) { + if (param[i] != 0xFFFF) { tmpStr[i-1] = getTableString(param[i]); cnt++; } else { diff --git a/engines/kyra/sequences_darkmoon.cpp b/engines/kyra/sequences_darkmoon.cpp index d4f5c847fd..d2e6e85218 100644 --- a/engines/kyra/sequences_darkmoon.cpp +++ b/engines/kyra/sequences_darkmoon.cpp @@ -867,7 +867,7 @@ void DarkMoonEngine::seq_playCredits(DarkmoonSequenceHelper *sq, const uint8 *da int16 nextY = i ? items[i].y + items[i].size + (items[i].size >> 2) : dm->h; const char *posOld = pos; - pos = strchr(pos, 0x0d); + pos = strchr(pos, 0x0D); if (!pos) pos = strchr(posOld, 0x00); @@ -893,7 +893,7 @@ void DarkMoonEngine::seq_playCredits(DarkmoonSequenceHelper *sq, const uint8 *da items[i + 1].dataType = 0; int l = pos - posOld; - if (items[i + 1].crlf != 0x0d) + if (items[i + 1].crlf != 0x0D) l++; delete[] items[i + 1].str; @@ -1071,7 +1071,7 @@ void DarkmoonSequenceHelper::animCommand(int index, int del) { uint32 end = 0; - for (const DarkMoonAnimCommand *s = _config->animData[index]; s->command != 0xff && !_vm->skipFlag() && !_vm->shouldQuit(); s++) { + for (const DarkMoonAnimCommand *s = _config->animData[index]; s->command != 0xFF && !_vm->skipFlag() && !_vm->shouldQuit(); s++) { int palIndex = _config->mode == kFinale ? (s->pal + 1) : s->pal; int x = s->x1; int y = s->y1; @@ -1187,7 +1187,7 @@ void DarkmoonSequenceHelper::animCommand(int index, int del) { case 6: // play sound effect - if (s->obj != 0xff) + if (s->obj != 0xFF) _vm->snd_playSoundEffect(s->obj); break; diff --git a/engines/kyra/sequences_eob.cpp b/engines/kyra/sequences_eob.cpp index 4a9f7d8a65..0fec386485 100644 --- a/engines/kyra/sequences_eob.cpp +++ b/engines/kyra/sequences_eob.cpp @@ -706,7 +706,7 @@ void EoBIntroPlayer::waterdeepExit() { _vm->delay(60 * _vm->_tickLength); for (int i = 0; i < 56 && !_vm->shouldQuit() && !_vm->skipFlag(); i++) { - uint32 end = _vm->_system->getMillis() +_vm->_tickLength; + uint32 end = _vm->_system->getMillis() + _vm->_tickLength; _screen->copyRegion(0, 136 + i, 80, 16, 160, 56 - i, 2, 0, Screen::CR_NO_P_CHECK); _screen->copyRegion(160, 0, 80, 72 - i, 160, 96 + i, 2, 0, Screen::CR_NO_P_CHECK); _screen->updateScreen(); @@ -1061,7 +1061,7 @@ void EoBEngine::seq_playFinale() { gui_drawBox(0, 0, 176, 175, guiSettings()->colors.frame1, guiSettings()->colors.frame2, guiSettings()->colors.fill); _txt->printDialogueText(51, _moreStrings[0]); - if (!checkScriptFlags(0x1ffe)) { + if (!checkScriptFlags(0x1FFE)) { _screen->fadeToBlack(); return; } diff --git a/engines/kyra/sequences_hof.cpp b/engines/kyra/sequences_hof.cpp index f2abfb81dc..231337e6d4 100644 --- a/engines/kyra/sequences_hof.cpp +++ b/engines/kyra/sequences_hof.cpp @@ -21,94 +21,659 @@ */ #include "kyra/kyra_hof.h" -#include "kyra/timer.h" +#include "kyra/screen_hof.h" +#include "kyra/screen_lol.h" #include "kyra/resource.h" #include "kyra/sound.h" +#include "kyra/sequences_hof.h" +#include "kyra/timer.h" #include "common/system.h" namespace Kyra { -void KyraEngine_HoF::seq_playSequences(int startSeq, int endSeq) { - seq_init(); +enum SequenceID { + kSequenceNoLooping = -1, + kSequenceVirgin = 0, + kSequenceWestwood, + kSequenceTitle, + kSequenceOverview, + kSequenceLibrary, + kSequenceHand, + kSequencePoint, + kSequenceZanfaun, + + kSequenceFunters, + kSequenceFerb, + kSequenceFish, + kSequenceFheep, + kSequenceFarmer, + kSequenceFuards, + kSequenceFirates, + kSequenceFrash, + + kSequenceHoFDemoVirgin, + kSequenceHoFDemoWestwood, + kSequenceHoFDemoTitle, + kSequenceHoFDemoHill, + kSequenceHoFDemoOuthome, + kSequenceHoFDemoWharf, + kSequenceHoFDemoDinob, + kSequenceHoFDemoFisher, + +// The following enums remain active even if LoL is disabled + kSequenceLoLDemoScene1, + kSequenceLoLDemoText1, + kSequenceLoLDemoScene2, + kSequenceLoLDemoText2, + kSequenceLoLDemoScene3, + kSequenceLoLDemoText3, + kSequenceLoLDemoScene4, + kSequenceLoLDemoText4, + kSequenceLoLDemoScene5, + kSequenceLoLDemoText5, + kSequenceLoLDemoScene6, + + kSequenceArraySize +}; + +enum NestedSequenceID { + kNestedSequenceFiggle = 0, + + kNestedSequenceOver1, + kNestedSequenceOver2, + kNestedSequenceForest, + kNestedSequenceDragon, + kNestedSequenceDarm, + kNestedSequenceLibrary2, + kNestedSequenceLibrary3, + kNestedSequenceMarco, + kNestedSequenceHand1a, + kNestedSequenceHand1b, + kNestedSequenceHand1c, + kNestedSequenceHand2, + kNestedSequenceHand3, + kNestedSequenceHand4, + + kNestedSequenceHoFDemoWharf2, + kNestedSequenceHoFDemoDinob2, + kNestedSequenceHoFDemoWater, + kNestedSequenceHoFDemoBail, + kNestedSequenceHoFDemoDig, + + kNestedSequenceArraySize +}; + +typedef int (SeqPlayer_HOF::*SeqProc)(WSAMovie_v2 *, int, int, int); + +struct SeqPlayerConfig { + SeqPlayerConfig(const HoFSeqData *data, const SeqProc *callbacks, const SeqProc *nestedCallbacks) : seq(data->seq), seqProc(callbacks), numSeq(data->numSeq), nestedSeq(data->nestedSeq), nestedSeqProc(nestedCallbacks), numNestedSeq(data->numNestedSeq) {} + const HoFSequence *seq; + const SeqProc *seqProc; + int numSeq; + const HoFNestedSequence *nestedSeq; + const SeqProc *nestedSeqProc; + int numNestedSeq; +}; + +class SeqPlayer_HOF { +public: + SeqPlayer_HOF(KyraEngine_v1 *vm, Screen_v2 *screen, OSystem *system, bool startupSaveLoadable = false); + ~SeqPlayer_HOF(); + + int play(SequenceID firstScene, SequenceID loopStartScene); + void pause(bool toggle); + + static SeqPlayer_HOF *instance() { return _instance; } + +private: + // Init + void setupCallbacks(); + + // Playback loop + void runLoop(); + void playScenes(); + + bool checkAbortPlayback(); + bool checkPlaybackStatus(); + + bool _abortRequested; + uint32 _pauseStart; + + // Sequence transitions + void doTransition(int type); + void nestedFrameAnimTransition(int srcPage, int dstPage, int delaytime, int steps, int x, int y, int w, int h, int openClose, int directionFlags); + void nestedFrameFadeTransition(const char *cmpFile); + + // Animations + void playAnimation(WSAMovie_v2 *wsaObj, int startFrame, int numFrames, int frameRate, int x, int y, const SeqProc callback, Palette *fadePal1, Palette *fadePal2, int fadeRate, bool restoreScreen); + void playDialogueAnimation(uint16 strID, uint16 soundID, int textColor, int textPosX, int textPosY, int textWidth, WSAMovie_v2 *wsaObj, int animStartFrame, int animLastFrame, int animPosX, int animPosY); + + void startNestedAnimation(int animSlot, int sequenceID); + void closeNestedAnimation(int animSlot); + void unloadNestedAnimation(int animSlot); + void doNestedFrameTransition(int transitionType, int animSlot); + void updateAllNestedAnimations(); + bool updateNestedAnimation(int animSlot); + + struct AnimSlot { + SeqProc callback; + WSAMovie_v2 *movie; + const FrameControl *control; + int16 flags; + uint16 startFrame; + uint16 endFrame; + uint16 frameDelay; + uint32 nextFrame; + uint16 currentFrame; + uint16 lastFrame; + uint16 x; + uint16 y; + uint16 fadeInTransitionType; + uint16 fadeOutTransitionType; + }; + + AnimSlot _animSlots[8]; + + bool _updateAnimations; + uint32 _animDuration; + int _animCurrentFrame; + int _callbackCurrentFrame; + + // The only reason to declare these here (instead of just locally) is being able to increase them after pausing the Engine + uint32 _specialAnimTimeOutTotal; + uint32 _specialAnimFrameTimeOut; + + // Subtitles/Dialogue/Sound + void playSoundEffect(uint16 id, int16 vol); + void playSoundAndDisplaySubTitle(uint16 id); + void printFadingText(uint16 strID, int x, int y, const uint8 *colorMap, uint8 textcolor); + + int displaySubTitle(uint16 strID, uint16 posX, uint16 posY, int duration, uint16 width); + void updateSubTitles(); + char *preprocessString(const char *str, int width); + void waitForSubTitlesTimeout(); + uint32 ticksTillSubTitlesTimeout(); + void resetAllTextSlots(); + + void fadeOutMusic(); + + struct TextSlot { + uint16 strIndex; + uint16 x; + uint16 y; + uint16 width; + int32 duration; + uint32 startTime; + int16 textcolor; + }; - bool allowSkip = (_flags.isDemo && !_flags.isTalkie) || startSeq != kSequenceTitle; + TextSlot _textSlots[10]; - if (endSeq == -1) - endSeq = startSeq; + char *_tempString; - assert(startSeq >= 0 && endSeq < kSequenceArraySize && startSeq <= endSeq); + uint8 _textColor[2]; + uint8 _textColorMap[16]; + int _textDuration[33]; - _sound->setSoundList(&_soundData[(startSeq > kSequenceZanfaun) ? kMusicFinale : kMusicIntro]); - _sound->loadSoundFile(0); + const char *const *_sequenceStrings; + const char *const *_sequenceSoundList; + int _sequenceSoundListSize; - _screen->_charWidth = (_flags.gameID == GI_LOL) ? 0 : -2; + static const uint8 _textColorPresets[]; - memset(_activeWSA, 0, sizeof(ActiveWSA) * 8); - for (int i = 0; i < 8; ++i) - _activeWSA[i].flags = -1; + // HOF credits + void playHoFTalkieCredits(); + void displayHoFTalkieScrollText(uint8 *data, const ScreenDim *d, int tempPage1, int tempPage2, int speed, int step, Screen::FontId fid1, Screen::FontId fid2, const uint8 *shapeData = 0, const char *const *specialData = 0); + + bool _talkieFinaleExtraFlag; + + // HOF+LOL demo specific + void updateDemoAdText(int bottom, int top); + + ActiveItemAnim _hofDemoActiveItemAnim[5]; + const HoFSeqItemAnimData *_hofDemoAnimData; + + uint32 _fisherAnimCurTime; + int _scrollProgressCounter; + + uint8 *_hofDemoShapeData; + uint8 *_hofDemoItemShapes[20]; + + // Misc + void delayTicks(uint32 ticks); + void delayUntil(uint32 dest); + void setCountDown(uint32 ticks); + bool countDownRunning(); + + uint32 _countDownRemainder; + uint32 _countDownLastUpdate; + + enum SeqPlayerTargetInfo { + kHoF = 0, + kHoFDemo, + kLoLDemo + }; + + SeqPlayerTargetInfo _target; + int _firstScene, _loopStartScene, _curScene, _preventSkipBeforeScene, _lastScene; + bool _startupSaveLoadable, _isFinale, _preventLooping; + + SeqPlayerConfig *_config; + + MainMenu *_menu; + int _result; + + bool _abortPlayback; + + KyraEngine_v1 *_vm; + Screen_v2 *_screen; + // We might consider getting rid of Screen_HoF, since there are only 2 methods left in that class anyway + Screen_HoF *_screenHoF; + OSystem *_system; + + static SeqPlayer_HOF *_instance; + +private: + // Sequence specific callback functions + int cbHOF_westwood(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_title(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_overview(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_library(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_hand(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_point(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_zanfaun(WSAMovie_v2 *wsaObj, int x, int y, int frm); + + int cbHOF_over1(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_over2(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_forest(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_dragon(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_darm(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_library2(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_marco(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_hand1a(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_hand1b(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_hand1c(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_hand2(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_hand3(WSAMovie_v2 *wsaObj, int x, int y, int frm); + + int cbHOF_funters(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_ferb(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_fish(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_fheep(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_farmer(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_fuards(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_firates(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOF_frash(WSAMovie_v2 *wsaObj, int x, int y, int frm); + + int cbHOF_figgle(WSAMovie_v2 *wsaObj, int x, int y, int frm); + + int cbHOFDEMO_virgin(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOFDEMO_westwood(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOFDEMO_title(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOFDEMO_hill(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOFDEMO_outhome(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOFDEMO_wharf(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOFDEMO_dinob(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOFDEMO_fisher(WSAMovie_v2 *wsaObj, int x, int y, int frm); + + int cbHOFDEMO_wharf2(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOFDEMO_dinob2(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOFDEMO_water(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOFDEMO_bail(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbHOFDEMO_dig(WSAMovie_v2 *wsaObj, int x, int y, int frm); + +#ifdef ENABLE_LOL + int cbLOLDEMO_scene1(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbLOLDEMO_scene2(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbLOLDEMO_scene3(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbLOLDEMO_scene4(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbLOLDEMO_scene5(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbLOLDEMO_text5(WSAMovie_v2 *wsaObj, int x, int y, int frm); + int cbLOLDEMO_scene6(WSAMovie_v2 *wsaObj, int x, int y, int frm); +#endif // ENABLE_LOL +}; + +SeqPlayer_HOF *SeqPlayer_HOF::_instance = 0; + +SeqPlayer_HOF::SeqPlayer_HOF(KyraEngine_v1 *vm, Screen_v2 *screen, OSystem *system, bool startupSaveLoadable) : _vm(vm), _screen(screen), _system(system), _startupSaveLoadable(startupSaveLoadable) { + // We use a static pointer for pauseEngine functionality. Since we don't + // ever need more than one SeqPlayer_HOF object at the same time we keep + // this simple and just add an assert to detect typos, regressions, etc. + assert(_instance == 0); + + memset(_animSlots, 0, sizeof(_animSlots)); + memset(_textSlots, 0, sizeof(_textSlots)); + memset(_hofDemoActiveItemAnim, 0, sizeof(_hofDemoActiveItemAnim)); + + _screenHoF = _vm->game() == GI_KYRA2 ? (Screen_HoF*)screen : 0; + _config = 0; + _result = 0; + _sequenceSoundList = 0; + _hofDemoAnimData = 0; + _hofDemoShapeData = 0; + _isFinale = false; + _preventLooping = false; + _menu = 0; + _abortRequested = false; + _pauseStart = 0; + + _updateAnimations = false; + _animDuration = 0; + _animCurrentFrame = 0; + _callbackCurrentFrame = 0; + + _abortPlayback = false; + _curScene = 0; + _preventSkipBeforeScene = -1; + _lastScene = 0; + + _scrollProgressCounter = 0; + _fisherAnimCurTime = 0; + + _tempString = new char[200]; + + _countDownRemainder = 0; + _countDownLastUpdate = 0; + + int tempSize = 0; + _vm->resource()->unloadAllPakFiles(); + _vm->resource()->loadPakFile(StaticResource::staticDataFilename()); + const char *const *files = _vm->staticres()->loadStrings(k2SeqplayPakFiles, tempSize); + _vm->resource()->loadFileList(files, tempSize); + + _sequenceStrings = _vm->staticres()->loadStrings(k2SeqplayStrings, tempSize); + uint8 multiplier = (_vm->gameFlags().platform == Common::kPlatformFMTowns || _vm->gameFlags().platform == Common::kPlatformPC98) ? 12 : 8; + for (int i = 0; i < MIN(33, tempSize); i++) + _textDuration[i] = (int) strlen(_sequenceStrings[i]) * multiplier; + + if (_sequenceSoundList) { + for (int i = 0; i < _sequenceSoundListSize; i++) { + if (_sequenceSoundList[i]) + delete[] _sequenceSoundList[i]; + } + delete[] _sequenceSoundList; + _sequenceSoundList = 0; + } - memset(_activeText, 0, sizeof(ActiveText) * 10); - seq_resetAllTextEntries(); + const char *const *seqSoundList = _vm->staticres()->loadStrings(k2SeqplaySfxFiles, _sequenceSoundListSize); + // replace sequence talkie files with localized versions + const char *const *tlkfiles = _vm->staticres()->loadStrings(k2SeqplayTlkFiles, tempSize); + char **tmpSndLst = new char *[_sequenceSoundListSize]; + + for (int i = 0; i < _sequenceSoundListSize; i++) { + const int len = strlen(seqSoundList[i]); + + tmpSndLst[i] = new char[len + 1]; + tmpSndLst[i][0] = 0; + + if (tlkfiles && len > 1) { + for (int ii = 0; ii < tempSize; ii++) { + if (strlen(tlkfiles[ii]) > 1 && !scumm_stricmp(&seqSoundList[i][1], &tlkfiles[ii][1])) + strcpy(tmpSndLst[i], tlkfiles[ii]); + } + } + + if (tmpSndLst[i][0] == 0) + strcpy(tmpSndLst[i], seqSoundList[i]); + } + + tlkfiles = seqSoundList = 0; + _vm->staticres()->unloadId(k2SeqplayTlkFiles); + _vm->staticres()->unloadId(k2SeqplaySfxFiles); + _sequenceSoundList = tmpSndLst; + + if (_vm->gameFlags().platform == Common::kPlatformPC98) + _vm->sound()->loadSoundFile("SOUND.DAT"); + + _screen->loadFont(_screen->FID_GOLDFONT_FNT, "GOLDFONT.FNT"); + _screen->setFont(_vm->gameFlags().lang == Common::JA_JPN ? Screen::FID_SJIS_FNT : Screen::FID_GOLDFONT_FNT); + + if (_vm->gameFlags().isDemo && !_vm->gameFlags().isTalkie) { + if (_vm->game() == GI_KYRA2) { + _hofDemoAnimData = _vm->staticres()->loadHoFSeqItemAnimData(k2SeqplayShapeAnimData, tempSize); + uint8 *shp = _vm->resource()->fileData("ICONS.SHP", 0); + uint32 outsize = READ_LE_UINT16(shp + 4); + _hofDemoShapeData = new uint8[outsize]; + Screen::decodeFrame4(shp + 10, _hofDemoShapeData, outsize); + for (int i = 0; i < 20; i++) + _hofDemoItemShapes[i] = _screen->getPtrToShape(_hofDemoShapeData, i); + delete[] shp; + } + } else { + const MainMenu::StaticData data = { + { _sequenceStrings[97], _sequenceStrings[96], _sequenceStrings[95], _sequenceStrings[98], 0 }, + { 0x01, 0x04, 0x0C, 0x04, 0x00, 0xD7, 0xD6 }, + { 0xD8, 0xDA, 0xD9, 0xD8 }, + (_vm->gameFlags().lang == Common::JA_JPN) ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT, 240 + }; + + _menu = new MainMenu(_vm); + _menu->init(data, MainMenu::Animation()); + } + + _instance = this; +} + +SeqPlayer_HOF::~SeqPlayer_HOF() { + _instance = 0; + + if (_sequenceSoundList) { + for (int i = 0; i < _sequenceSoundListSize; i++) { + if (_sequenceSoundList[i]) + delete[] _sequenceSoundList[i]; + } + delete[] _sequenceSoundList; + _sequenceSoundList = NULL; + } + + delete[] _tempString; + delete[] _hofDemoShapeData; + delete _menu; + + if (_vm->game() != GI_LOL) + _screen->setFont(_vm->gameFlags().lang == Common::JA_JPN ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT); +} + +int SeqPlayer_HOF::play(SequenceID firstScene, SequenceID loopStartScene) { + bool incompatibleData = false; + AudioResourceSet soundSet = kMusicIntro; + _firstScene = firstScene; + _loopStartScene = loopStartScene; + _preventLooping = false; + _result = 0; + + if (firstScene >= kSequenceArraySize || firstScene < kSequenceVirgin || loopStartScene >= kSequenceArraySize || loopStartScene < kSequenceNoLooping) { + return 0; + } else if (firstScene >= kSequenceLoLDemoScene1) { +#ifndef ENABLE_LOL + error("SeqPlayer_HOF::play(): The Lands of Lore sub engine (including this non-interactive demo) has been disabled in this build"); +#endif + incompatibleData = (_vm->game() != GI_LOL); + _firstScene -= kSequenceLoLDemoScene1; + if (loopStartScene != kSequenceNoLooping) + _loopStartScene -= kSequenceLoLDemoScene1; + _lastScene = kSequenceLoLDemoScene6 - kSequenceLoLDemoScene1; + _target = kLoLDemo; + _screen->_charWidth = 0; + } else if (firstScene >= kSequenceHoFDemoVirgin) { + incompatibleData = (_vm->game() != GI_KYRA2 || !_vm->gameFlags().isDemo || _vm->gameFlags().isTalkie); + _firstScene -= kSequenceHoFDemoVirgin; + if (loopStartScene != kSequenceNoLooping) + _loopStartScene -= kSequenceHoFDemoVirgin; + _lastScene = kSequenceHoFDemoFisher - kSequenceHoFDemoVirgin; + _target = kHoFDemo; + _screen->_charWidth = -2; + } else { + _isFinale = _preventLooping = firstScene > kSequenceZanfaun; + incompatibleData = (_vm->game() != GI_KYRA2 || (_vm->gameFlags().isDemo && (!_vm->gameFlags().isTalkie || _isFinale))); + _target = kHoF; + _screen->_charWidth = -2; + if (_isFinale) { + soundSet = kMusicFinale; + _lastScene = kSequenceFrash; + } else { + _lastScene = kSequenceZanfaun; + } + } + + if (incompatibleData) + error("SeqPlayer_HOF::play(): Specified sequences do not match the available sequence data for this target"); + + _vm->sound()->selectAudioResourceSet(soundSet); + _vm->sound()->loadSoundFile(0); + + setupCallbacks(); + runLoop(); + + return _result; +} + +void SeqPlayer_HOF::pause(bool toggle) { + if (toggle) { + _pauseStart = _system->getMillis(); + } else { + uint32 pausedTime = _system->getMillis() - _pauseStart; + _pauseStart = 0; + + _countDownLastUpdate += pausedTime; + _fisherAnimCurTime += pausedTime; + _specialAnimTimeOutTotal += pausedTime; + _specialAnimFrameTimeOut += pausedTime; + + for (int i = 0; i < 10; i++) { + if (_textSlots[i].duration != -1) + _textSlots[i].startTime += pausedTime; + } + + for (int i = 0; i < 8; i++) { + if (_animSlots[i].flags != -1) + _animSlots[i].nextFrame += pausedTime; + } + } +} + +void SeqPlayer_HOF::setupCallbacks() { +#define SCB(x) &SeqPlayer_HOF::cbHOF_##x + static const SeqProc seqCallbacksHoF[] = { 0, SCB(westwood), SCB(title), SCB(overview), SCB(library), SCB(hand), SCB(point), SCB(zanfaun), SCB(funters), SCB(ferb), SCB(fish), SCB(fheep), SCB(farmer), SCB(fuards), SCB(firates), SCB(frash) }; + static const SeqProc nestedSeqCallbacksHoF[] = { SCB(figgle), SCB(over1), SCB(over2), SCB(forest), SCB(dragon), SCB(darm), SCB(library2), SCB(library2), SCB(marco), SCB(hand1a), SCB(hand1b), SCB(hand1c), SCB(hand2), SCB(hand3), 0 }; +#undef SCB +#define SCB(x) &SeqPlayer_HOF::cbHOFDEMO_##x + static const SeqProc seqCallbacksHoFDemo[] = { SCB(virgin), SCB(westwood), SCB(title), SCB(hill), SCB(outhome), SCB(wharf), SCB(dinob), SCB(fisher) }; + static const SeqProc nestedSeqCallbacksHoFDemo[] = { SCB(wharf2), SCB(dinob2), SCB(water), SCB(bail), SCB(dig), 0 }; +#undef SCB +#ifdef ENABLE_LOL +#define SCB(x) &SeqPlayer_HOF::cbLOLDEMO_##x + static const SeqProc seqCallbacksLoLDemo[] = { SCB(scene1), 0, SCB(scene2), 0, SCB(scene3), 0, SCB(scene4), 0, SCB(scene5), SCB(text5), SCB(scene6), 0 }; +#undef SCB +#else + static const SeqProc seqCallbacksLoLDemo[] = { 0 }; +#endif + static const SeqProc nestedSeqCallbacksLoLDemo[] = { 0 }; + + static const SeqProc *const seqCallbacks[] = { seqCallbacksHoF, seqCallbacksHoFDemo, seqCallbacksLoLDemo}; + static const SeqProc *const nestedSeqCallbacks[] = { nestedSeqCallbacksHoF, nestedSeqCallbacksHoFDemo, nestedSeqCallbacksLoLDemo}; + + int tmpSize = 0; + delete _config; + _config = new SeqPlayerConfig(_vm->staticres()->loadHoFSequenceData(k2SeqplaySeqData, tmpSize), seqCallbacks[_target], nestedSeqCallbacks[_target]); +} + +void SeqPlayer_HOF::runLoop() { + memset(_animSlots, 0, sizeof(_animSlots)); + memset(_textSlots, 0, sizeof(_textSlots)); + memset(_hofDemoActiveItemAnim, 0, sizeof(_hofDemoActiveItemAnim)); + for (int i = 0; i < 8; ++i) + _animSlots[i].flags = -1; + + _screen->clearPage(10); + _screen->clearPage(12); _screen->hideMouse(); int oldPage = _screen->setCurPage(2); for (int i = 0; i < 4; ++i) _screen->getPalette(i).clear(); - _screen->clearPage(10); - _screen->clearPage(12); + _updateAnimations = false; + _animCurrentFrame = 0; + _textColor[0] = _textColor[1] = 0; + _curScene = _firstScene; - _seqSubframePlaying = false; + do { + playScenes(); + doTransition(0); + resetAllTextSlots(); + fadeOutMusic(); + _firstScene = ((!_startupSaveLoadable || _preventLooping) && _curScene >= _loopStartScene) ? kSequenceNoLooping : _loopStartScene; + } while (!_vm->shouldQuit() && _firstScene != kSequenceNoLooping); - _seqWsaCurrentFrame = 0; - _seqTextColor[0] = _seqTextColor[1] = 0; - _seqEndTime = 0; - _menuChoice = 0; + checkPlaybackStatus(); - for (int seqNum = startSeq; seqNum <= endSeq && !((skipFlag() && allowSkip) || shouldQuit() || (_abortIntroFlag && allowSkip) || _menuChoice); seqNum++) { - _screen->clearPage(0); - _screen->clearPage(8); - _screen->copyPalette(1, 0); - _seqFrameCounter = 0; - _seqStartTime = _system->getMillis(); + for (int i = 0; i < 8; i++) + unloadNestedAnimation(i); + + if (_vm->gameFlags().isDemo && !_vm->gameFlags().isTalkie) + _screen->fadeToBlack(); - allowSkip = (_flags.isDemo && !_flags.isTalkie) || seqNum != kSequenceTitle; + if (!_result) + delayTicks(75); - Sequence cseq = _sequences->seq[seqNum]; - SeqProc cb = _callbackS[seqNum]; + _screen->setCurPage(oldPage); + _screen->_charWidth = 0; + _screen->showMouse(); +} - if (cseq.flags & 2) { - _screen->loadBitmap(cseq.cpsFile, 2, 2, &_screen->getPalette(0)); +void SeqPlayer_HOF::playScenes() { + _vm->sound()->stopAllSoundEffects(); + _curScene = _firstScene; + + _screen->copyPalette(1, 0); + WSAMovie_v2 anim(_vm); + _abortRequested = false; + + _scrollProgressCounter = 0; + + while (!_vm->shouldQuit()) { + if (checkAbortPlayback()) + if (checkPlaybackStatus()) + break; + + _callbackCurrentFrame = 0; + + if (_curScene > _lastScene) + break; + + const Kyra::HoFSequence &sq = _config->seq[_curScene]; + + if (sq.flags & 2) { + _screen->loadBitmap(sq.cpsFile, 2, 2, &_screen->getPalette(0)); _screen->setScreenPalette(_screen->getPalette(0)); } else { _screen->setCurPage(2); _screen->clearPage(2); - _screen->loadPalette("goldfont.col", _screen->getPalette(0)); + _screen->loadPalette("GOLDFONT.COL", _screen->getPalette(0)); } - if (cb && !(_flags.isDemo && !_flags.isTalkie)) - (this->*cb)(0, 0, 0, -1); + if (_config->seqProc[_curScene] && !(_vm->gameFlags().isDemo && !_vm->gameFlags().isTalkie)) + (this->*_config->seqProc[_curScene])(0, 0, 0, -1); - if (cseq.flags & 1) { - _seqWsa->close(); - _seqWsa->open(cseq.wsaFile, 0, &_screen->getPalette(0)); - _screen->setScreenPalette(_screen->getPalette(0)); - _seqWsa->displayFrame(0, 2, cseq.xPos, cseq.yPos, 0, 0, 0); + if (sq.flags & 1) { + anim.open(sq.wsaFile, 0, &_screen->getPalette(0)); + if (!(sq.flags & 2)) + anim.displayFrame(0, 2, sq.xPos, sq.yPos, 0x4000, 0, 0); } - if (cseq.flags & 4) { + if (sq.flags & 4) { int cp = _screen->setCurPage(2); - Screen::FontId cf = _screen->setFont(_flags.lang == Common::JA_JPN ? Screen::FID_SJIS_FNT : Screen::FID_GOLDFONT_FNT); - if (cseq.stringIndex1 != -1) { - int sX = (320 - _screen->getTextWidth(_sequenceStrings[cseq.stringIndex1])) / 2; - _screen->printText(_sequenceStrings[cseq.stringIndex1], sX, 100 - _screen->getFontHeight(), 1, 0); - } - if (cseq.stringIndex2 != -1) { - int sX = (320 - _screen->getTextWidth(_sequenceStrings[cseq.stringIndex2])) / 2; - _screen->printText(_sequenceStrings[cseq.stringIndex2], sX, 100, 1, 0); - } + Screen::FontId cf = _screen->setFont(_vm->gameFlags().lang == Common::JA_JPN ? Screen::FID_SJIS_FNT : Screen::FID_GOLDFONT_FNT); + + if (sq.stringIndex1 != -1) + _screen->printText(_sequenceStrings[sq.stringIndex1], (320 - _screen->getTextWidth(_sequenceStrings[sq.stringIndex1])) / 2, 100 - _screen->getFontHeight(), 1, 0); + + if (sq.stringIndex2 != -1) + _screen->printText(_sequenceStrings[sq.stringIndex2], (320 - _screen->getTextWidth(_sequenceStrings[sq.stringIndex2])) / 2, 100, 1, 0); + _screen->setFont(cf); _screen->setCurPage(cp); } @@ -118,235 +683,1107 @@ void KyraEngine_HoF::seq_playSequences(int startSeq, int endSeq) { _screen->copyPage(2, 10); _screen->copyPage(12, 2); - seq_sequenceCommand(cseq.startupCommand); + doTransition(sq.fadeInTransitionType); - if (!((skipFlag() && allowSkip) || shouldQuit() || (_abortIntroFlag && allowSkip) || _menuChoice)) { + if (!(checkAbortPlayback() || _vm->shouldQuit() || _result)) { _screen->copyPage(2, 0); _screen->updateScreen(); } - if (cseq.flags & 1) { - int x = cseq.xPos; - int y = cseq.yPos; + //_screen->copyPage(2, 6); - _seqFrameDelay = cseq.frameDelay; + if (sq.flags & 1) { + playAnimation(&anim, sq.startFrame, sq.numFrames, sq.duration, sq.xPos, sq.yPos, _config->seqProc[_curScene], &_screen->getPalette(1), &_screen->getPalette(0), 30, 0); + anim.close(); + } else { + _animDuration = sq.duration; + setCountDown(_animDuration); - if (_seqWsa) { - if (x < 0) { - _seqWsa->setWidth(_seqWsa->width() + x); - x = 0; - } + while (!checkAbortPlayback() && !_vm->shouldQuit() && (countDownRunning() || _updateAnimations)) { + uint32 endFrame = (_system->getMillis() + _vm->tickLength()) & ~(_vm->tickLength() - 1); + updateAllNestedAnimations(); - if (y < 0) { - _seqWsa->setHeight(_seqWsa->height() + y); - y = 0; - } + if (_config->seqProc[_curScene]) + (this->*_config->seqProc[_curScene])(0, 0, 0, 0); - if (cseq.xPos + _seqWsa->width() > 319) - _seqWsa->setWidth(320 - cseq.xPos); + updateSubTitles(); - if (cseq.yPos + _seqWsa->height() > 199) - _seqWsa->setHeight(199 - cseq.yPos); - } - uint8 dir = (cseq.startFrame > cseq.numFrames) ? 0 : 1; - _seqWsaCurrentFrame = cseq.startFrame; + _screen->copyPage(2, 0); + _screen->updateScreen(); + _screen->copyPage(12, 2); - bool loop = true; - while (loop && !((skipFlag() && allowSkip) || shouldQuit() || (_abortIntroFlag && allowSkip) || _menuChoice)) { - _seqEndTime = _system->getMillis() + _seqFrameDelay * _tickLength; + do { + if (checkAbortPlayback()) + if (checkPlaybackStatus()) + break; + } while (_system->getMillis() < endFrame); + } + } - if (_seqWsa || !cb) - _screen->copyPage(12, 2); + if (_config->seqProc[_curScene] && !(_vm->gameFlags().isDemo && !_vm->gameFlags().isTalkie)) + (this->*_config->seqProc[_curScene])(0, 0, 0, -2); - if (cb) { - int f = _seqWsaCurrentFrame % _seqWsa->frames(); - (this->*cb)(_seqWsa, cseq.xPos, cseq.yPos, f); - } + uint32 textTimeOut = ticksTillSubTitlesTimeout(); + setCountDown(sq.timeout < textTimeOut ? textTimeOut : sq.timeout); - if (_seqWsa) { - int f = _seqWsaCurrentFrame % _seqWsa->frames(); - _seqWsa->displayFrame(f, 2, cseq.xPos, cseq.yPos, 0, 0, 0); - } + while (!checkAbortPlayback() && !_vm->shouldQuit() && (countDownRunning() || _updateAnimations)) { + updateAllNestedAnimations(); + _screen->copyPage(2, 0); + _screen->updateScreen(); + _screen->copyPage(12, 2); + } - _screen->copyPage(2, 12); + doTransition(sq.fadeOutTransitionType); + _curScene++; + } - seq_processWSAs(); - seq_processText(); + resetAllTextSlots(); + _vm->sound()->haltTrack(); + _vm->sound()->voiceStop(); - if ((_seqWsa || !cb) && !((skipFlag() && allowSkip) || shouldQuit() || (_abortIntroFlag && allowSkip) || _menuChoice)) { - _screen->copyPage(2, 0); - _screen->updateScreen(); - } + if ((!checkAbortPlayback() || _vm->shouldQuit()) && _vm->gameFlags().isDemo) + _curScene = -1; +} - bool loop2 = true; - while (loop2 && !((skipFlag() && allowSkip) || shouldQuit() || (_abortIntroFlag && allowSkip) || _menuChoice)) { - if (_seqWsa) { - seq_processText(); - if (!((skipFlag() && allowSkip) || shouldQuit() || (_abortIntroFlag && allowSkip) || _menuChoice)) { - _screen->copyPage(2, 0); - _screen->updateScreen(); - } +bool SeqPlayer_HOF::checkAbortPlayback() { + Common::Event event; - uint32 now = _system->getMillis(); - if (now >= _seqEndTime) { - loop2 = false; - } else { - uint32 tdiff = _seqEndTime - now; - uint32 dly = tdiff < _tickLength ? tdiff : _tickLength; - delay(dly); - } - } else { - loop = loop2 = false; - } - } + if (_vm->skipFlag()) { + _abortRequested = true; + _vm->resetSkipFlag(); + } - if (loop) { - if (dir == 1) { - if (++_seqWsaCurrentFrame >= cseq.numFrames) - loop = false; - } else { - if (--_seqWsaCurrentFrame < cseq.numFrames) - loop = false; - } - } + if (_abortRequested) + return true; + + while (_system->getEventManager()->pollEvent(event)) { + switch (event.type) { + case Common::EVENT_KEYDOWN: + if (event.kbd.keycode == Common::KEYCODE_q && event.kbd.hasFlags(Common::KBD_CTRL)) { + _abortRequested = true; + _vm->quitGame(); + return true; + } else if (event.kbd.keycode != Common::KEYCODE_ESCAPE && event.kbd.keycode != Common::KEYCODE_RETURN && event.kbd.keycode != Common::KEYCODE_SPACE) { + continue; } - _seqWsa->close(); - } else { - _seqFrameDelay = cseq.frameDelay; - _seqEndTime = _system->getMillis() + _seqFrameDelay * _tickLength; - while (!((skipFlag() && allowSkip) || shouldQuit() || (_abortIntroFlag && allowSkip) || _menuChoice)) { - _seqSubFrameStartTime = _system->getMillis(); - seq_processWSAs(); - if (cb) - (this->*cb)(0, 0, 0, 0); + // fall through + case Common::EVENT_LBUTTONDOWN: + case Common::EVENT_RBUTTONDOWN: + case Common::EVENT_LBUTTONUP: + case Common::EVENT_RBUTTONUP: + _abortRequested = true; + return true; + default: + break; + } + } - seq_processText(); + return false; +} - _screen->copyPage(2, 0); - _screen->updateScreen(); - _screen->copyPage(12, 2); +bool SeqPlayer_HOF::checkPlaybackStatus() { + _updateAnimations = false; - uint32 now = _system->getMillis(); - if (now >= _seqEndTime && !_seqSubframePlaying) - break; + if (_curScene <= _preventSkipBeforeScene || (_curScene == _loopStartScene && !_isFinale)) { + _abortRequested = false; + return false; + } - uint32 tdiff = _seqEndTime - _seqSubFrameStartTime; - int32 dly = _tickLength - (now - _seqSubFrameStartTime); - if (dly > 0) - delay(MIN<uint32>(dly, tdiff)); - else - updateInput(); - } + if (_loopStartScene == kSequenceNoLooping) { + doTransition(0); + fadeOutMusic(); + _abortPlayback = true; + } else { + return true; + } + + return false; +} + +void SeqPlayer_HOF::doTransition(int type) { + for (int i = 0; i < 8; i++) + closeNestedAnimation(i); + + switch (type) { + case 0: + _screen->fadeToBlack(36); + _screen->getPalette(0).clear(); + _screen->getPalette(1).clear(); + break; + + case 1: + playSoundAndDisplaySubTitle(_vm->_rnd.getRandomBit()); + + _screen->getPalette(0).fill(0, 256, 0x3F); + _screen->fadePalette(_screen->getPalette(0), 16); + + _screen->copyPalette(1, 0); + break; + + case 3: + _screen->copyPage(2, 0); + _screen->fadePalette(_screen->getPalette(0), 16); + _screen->copyPalette(1, 0); + break; + + case 4: + _screen->copyPage(2, 0); + _screen->fadePalette(_screen->getPalette(0), 36); + _screen->copyPalette(1, 0); + break; + + case 5: + _screen->copyPage(2, 0); + break; + + case 6: + // UNUSED + // seq_loadBLD("library.bld"); + break; + + case 7: + // UNUSED + // seq_loadBLD("marco.bld"); + break; + + case 8: + _screen->fadeToBlack(16); + _screen->getPalette(0).clear(); + _screen->getPalette(1).clear(); + + delayTicks(120); + break; + + case 9: { + Palette &pal = _screen->getPalette(0); + for (int i = 0; i < 255; i++) + pal.fill(i, 1, (pal[3 * i] + pal[3 * i + 1] + pal[3 * i + 2]) / 3); + pal.fill(255, 1, 0x3F); + + _screen->fadePalette(pal, 64); + _screen->copyPalette(1, 0); + } break; + + default: + break; + } +} + +void SeqPlayer_HOF::nestedFrameAnimTransition(int srcPage, int dstPage, int delaytime, int steps, int x, int y, int w, int h, int openClose, int directionFlags) { + if (openClose) { + for (int i = 1; i < steps; i++) { + uint32 endtime = _system->getMillis() + delaytime * _vm->tickLength(); + + int w2 = (((w * 256) / steps) * i) / 256; + int h2 = (((h * 256) / steps) * i) / 256; + + int ym = (directionFlags & 2) ? (h - h2) : 0; + int xm = (directionFlags & 1) ? (w - w2) : 0; + + _screen->wsaFrameAnimationStep(0, 0, x + xm, y + ym, w, h, w2, h2, srcPage, dstPage, 0); + + _screen->copyPage(dstPage, 6); + _screen->copyPage(dstPage, 0); + _screen->updateScreen(); + + _screen->copyPage(12, dstPage); + delayUntil(endtime); } - if (cb && !(_flags.isDemo && !_flags.isTalkie)) - (this->*cb)(0, 0, 0, -2); + _screen->wsaFrameAnimationStep(0, 0, x, y, w, h, w, h, srcPage, dstPage, 0); + _screen->copyPage(dstPage, 6); + _screen->copyPage(dstPage, 0); + _screen->updateScreen(); + } else { + _screen->copyPage(12, dstPage); + for (int i = steps; i; i--) { + uint32 endtime = _system->getMillis() + delaytime * _vm->tickLength(); + + int w2 = (((w * 256) / steps) * i) / 256; + int h2 = (((h * 256) / steps) * i) / 256; + + int ym = (directionFlags & 2) ? (h - h2) : 0; + int xm = (directionFlags & 1) ? (w - w2) : 0; - uint32 ct = seq_activeTextsTimeLeft(); - uint32 dl = cseq.duration * _tickLength; - if (dl < ct) - dl = ct; - _seqEndTime = _system->getMillis() + dl; + _screen->wsaFrameAnimationStep(0, 0, x + xm, y + ym, w, h, w2, h2, srcPage, dstPage, 0); - while (!((skipFlag() && allowSkip) || shouldQuit() || (_abortIntroFlag && allowSkip) || _menuChoice)) { - _seqSubFrameStartTime = _system->getMillis(); - seq_processWSAs(); + _screen->copyPage(dstPage, 6); + _screen->copyPage(dstPage, 0); + _screen->updateScreen(); + _screen->copyPage(12, dstPage); + delayUntil(endtime); + } + } +} + +void SeqPlayer_HOF::nestedFrameFadeTransition(const char *cmpFile) { + _screen->copyPage(10, 2); + _screen->copyPage(4, 10); + _screen->clearPage(6); + _screen->loadBitmap(cmpFile, 6, 6, 0); + _screen->copyPage(12, 4); + + for (int i = 0; i < 3; i++) { + uint32 endtime = _system->getMillis() + 4 * _vm->tickLength(); + assert(_screenHoF); + _screenHoF->cmpFadeFrameStep(4, 320, 200, 0, 0, 2, 320, 200, 0, 0, 320, 200, 6); + _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0); + _screen->updateScreen(); + delayUntil(endtime); + } + + _screen->copyPage(4, 0); + _screen->updateScreen(); + _screen->copyPage(4, 2); + _screen->copyPage(4, 6); + _screen->copyPage(10, 4); +} + +void SeqPlayer_HOF::playAnimation(WSAMovie_v2 *wsaObj, int startFrame, int lastFrame, int frameRate, int x, int y, const SeqProc callback, Palette *fadePal1, Palette *fadePal2, int fadeRate, bool restoreScreen) { + bool finished = false; + uint32 startTime = _system->getMillis(); + + int origW = wsaObj->width(); + int origH = wsaObj->width(); + int drwX = x; + int drwY = y; + int drwW = origW; + int drwH = origH; + + _animDuration = frameRate; + + if (wsaObj) { + if (x < 0) { + drwW += x; + drwX = 0; + } + + if (y < 0) { + drwH += y; + drwY = 0; + } + + if (x + origW > 319) + origW = 320 - x; + + if (y + origH > 199) + origW = 200 - y; + } + + int8 frameStep = (startFrame > lastFrame) ? -1 : 1; + _animCurrentFrame = startFrame; + + while (!_vm->shouldQuit() && !finished) { + if (checkAbortPlayback()) + if (checkPlaybackStatus()) + break; + + setCountDown(_animDuration); + + if (wsaObj || callback) + _screen->copyPage(12, 2); + + int frameIndex = _animCurrentFrame; + if (wsaObj) + frameIndex %= wsaObj->frames(); + + if (callback) + (this->*callback)(wsaObj, x, y, frameIndex); + + if (wsaObj) + wsaObj->displayFrame(frameIndex, 2, x, y, 0, 0, 0); + + _screen->copyPage(2, 12); + + updateAllNestedAnimations(); + updateSubTitles(); + + if ((wsaObj || callback) && (!(checkAbortPlayback() || _vm->shouldQuit() || _result))) { _screen->copyPage(2, 0); _screen->updateScreen(); + } + + while (!_vm->shouldQuit()) { + if (checkAbortPlayback()) + if (checkPlaybackStatus()) + break; + + if (fadePal1 && fadePal2) { + if (!_screen->timedPaletteFadeStep(fadePal1->getData(), fadePal2->getData(), _system->getMillis() - startTime, fadeRate * _vm->tickLength()) && !wsaObj) + break; + } + + if ((wsaObj || callback) && (!(checkAbortPlayback() || _vm->shouldQuit() || _result))) { + _screen->copyPage(2, 0); + _screen->updateScreen(); + } + + updateSubTitles(); + + if (!countDownRunning()) + break; + } + + if (wsaObj) { + _animCurrentFrame += frameStep; + if ((frameStep > 0 && _animCurrentFrame >= lastFrame) || (frameStep < 0 && _animCurrentFrame < lastFrame)) + finished = true; + } + + if (restoreScreen && (wsaObj || callback)) { _screen->copyPage(12, 2); + _screen->copyRegion(drwX, drwY, drwX, drwY, drwW, drwH, 2, 0, Screen::CR_NO_P_CHECK); + _screen->updateScreen(); + } + } +} + +void SeqPlayer_HOF::playDialogueAnimation(uint16 strID, uint16 soundID, int textColor, int textPosX, int textPosY, int textWidth, WSAMovie_v2 *wsaObj, int animStartFrame, int animLastFrame, int animPosX, int animPosY) { + int dur = int(strlen(_sequenceStrings[strID])) * (_vm->gameFlags().isTalkie ? 7 : 15); + if (_vm->textEnabled()) { + int slot = displaySubTitle(strID, textPosX, textPosY, dur, textWidth); + _textSlots[slot].textcolor = textColor; + } + _specialAnimTimeOutTotal = _system->getMillis() + dur * _vm->tickLength(); + int curframe = animStartFrame; + + if (soundID && _vm->speechEnabled()) { + while (_vm->sound()->voiceIsPlaying() && !_abortPlayback) + delayTicks(1); + playSoundAndDisplaySubTitle(soundID); + } + + while (_system->getMillis() < _specialAnimTimeOutTotal && !_abortPlayback) { + if (animLastFrame < 0) { + int t = ABS(animLastFrame); + if (t < curframe) + curframe = t; + } + + if (ABS(animLastFrame) < curframe) + curframe = animStartFrame; - uint32 now = _system->getMillis(); - if (now >= _seqEndTime && !_seqSubframePlaying) { + _specialAnimFrameTimeOut = _system->getMillis() + _animDuration * _vm->tickLength(); + setCountDown(_animDuration); + + if (wsaObj) + wsaObj->displayFrame(curframe % wsaObj->frames(), 2, animPosX, animPosY, 0, 0, 0); + + _screen->copyPage(2, 12); + updateSubTitles(); + delayUntil(MIN(_specialAnimFrameTimeOut, _specialAnimTimeOutTotal)); + + if (_vm->speechEnabled() && !_vm->textEnabled() && !_vm->snd_voiceIsPlaying()) + break; + + if (checkAbortPlayback()) + if (checkPlaybackStatus()) break; - } - uint32 tdiff = _seqEndTime - _seqSubFrameStartTime; - int32 dly = _tickLength - (now - _seqSubFrameStartTime); - if (dly > 0) - delay(MIN<uint32>(dly, tdiff)); + _screen->copyPage(2, 0); + _screen->updateScreen(); + curframe++; + } + + if (_abortPlayback) + _vm->sound()->voiceStop(); + + if (ABS(animLastFrame) < curframe) + curframe = ABS(animLastFrame); + + if (curframe == animStartFrame) + curframe++; + + _animCurrentFrame = curframe; +} + +void SeqPlayer_HOF::startNestedAnimation(int animSlot, int sequenceID) { + if (_animSlots[animSlot].flags != -1) + return; + + if (_target == kLoLDemo) { + return; + } else if (_target == kHoFDemo) { + assert(sequenceID >= kNestedSequenceHoFDemoWharf2); + sequenceID -= kNestedSequenceHoFDemoWharf2; + } + + HoFNestedSequence s = _config->nestedSeq[sequenceID]; + + if (!_animSlots[animSlot].movie) { + _animSlots[animSlot].movie = new WSAMovie_v2(_vm); + assert(_animSlots[animSlot].movie); + } + + _animSlots[animSlot].movie->close(); + + _animSlots[animSlot].movie->open(s.wsaFile, 0, 0); + + if (!_animSlots[animSlot].movie->opened()) { + delete _animSlots[animSlot].movie; + _animSlots[animSlot].movie = 0; + return; + } + + _animSlots[animSlot].endFrame = s.endFrame; + _animSlots[animSlot].startFrame = _animSlots[animSlot].currentFrame = s.startframe; + _animSlots[animSlot].frameDelay = s.frameDelay; + _animSlots[animSlot].callback = _config->nestedSeqProc[sequenceID]; + _animSlots[animSlot].control = s.wsaControl; + + _animSlots[animSlot].flags = s.flags | 1; + _animSlots[animSlot].x = s.x; + _animSlots[animSlot].y = s.y; + _animSlots[animSlot].fadeInTransitionType = s.fadeInTransitionType; + _animSlots[animSlot].fadeOutTransitionType = s.fadeOutTransitionType; + _animSlots[animSlot].lastFrame = 0xFFFF; + + doNestedFrameTransition(s.fadeInTransitionType, animSlot); + + if (!s.fadeInTransitionType) + updateNestedAnimation(animSlot); + + _animSlots[animSlot].nextFrame = _system->getMillis() & ~(_vm->tickLength() - 1); +} + +void SeqPlayer_HOF::closeNestedAnimation(int animSlot) { + if (_animSlots[animSlot].flags == -1) + return; + + _animSlots[animSlot].flags = -1; + doNestedFrameTransition(_animSlots[animSlot].fadeOutTransitionType, animSlot); + _animSlots[animSlot].movie->close(); +} + +void SeqPlayer_HOF::unloadNestedAnimation(int animSlot) { + if (_animSlots[animSlot].movie) { + _animSlots[animSlot].movie->close(); + delete _animSlots[animSlot].movie; + _animSlots[animSlot].movie = 0; + } +} + +void SeqPlayer_HOF::doNestedFrameTransition(int transitionType, int animSlot) { + int xa = 0, ya = 0; + transitionType--; + if (!_animSlots[animSlot].movie || _abortPlayback || _vm->shouldQuit()) + return; + + switch (transitionType) { + case 0: + xa = -_animSlots[animSlot].movie->xAdd(); + ya = -_animSlots[animSlot].movie->yAdd(); + _animSlots[animSlot].movie->displayFrame(0, 8, xa, ya, 0, 0, 0); + nestedFrameAnimTransition(8, 2, 7, 8, _animSlots[animSlot].movie->xAdd(), _animSlots[animSlot].movie->yAdd(), + _animSlots[animSlot].movie->width(), _animSlots[animSlot].movie->height(), 1, 2); + break; + + case 1: + xa = -_animSlots[animSlot].movie->xAdd(); + ya = -_animSlots[animSlot].movie->yAdd(); + _animSlots[animSlot].movie->displayFrame(0, 8, xa, ya, 0, 0, 0); + nestedFrameAnimTransition(8, 2, 7, 8, _animSlots[animSlot].movie->xAdd(), _animSlots[animSlot].movie->yAdd(), + _animSlots[animSlot].movie->width(), _animSlots[animSlot].movie->height(), 1, 1); + break; + + case 2: + waitForSubTitlesTimeout(); + xa = -_animSlots[animSlot].movie->xAdd(); + ya = -_animSlots[animSlot].movie->yAdd(); + _animSlots[animSlot].movie->displayFrame(21, 8, xa, ya, 0, 0, 0); + nestedFrameAnimTransition(8, 2, 7, 8, _animSlots[animSlot].movie->xAdd(), _animSlots[animSlot].movie->yAdd(), + _animSlots[animSlot].movie->width(), _animSlots[animSlot].movie->height(), 0, 2); + break; + + case 3: + _screen->copyPage(2, 10); + _animSlots[animSlot].movie->displayFrame(0, 2, 0, 0, 0, 0, 0); + _screen->copyPage(2, 12); + nestedFrameFadeTransition("scene2.cmp"); + break; + + case 4: + _screen->copyPage(2, 10); + _animSlots[animSlot].movie->displayFrame(0, 2, 0, 0, 0, 0, 0); + _screen->copyPage(2, 12); + nestedFrameFadeTransition("scene3.cmp"); + break; + + default: + break; + } +} + +void SeqPlayer_HOF::updateAllNestedAnimations() { + for (int i = 0; i < 8; i++) { + if (_animSlots[i].flags != -1) { + if (updateNestedAnimation(i)) + closeNestedAnimation(i); + } + } +} + +bool SeqPlayer_HOF::updateNestedAnimation(int animSlot) { + uint16 currentFrame = _animSlots[animSlot].currentFrame; + uint32 curTick = _system->getMillis() & ~(_vm->tickLength() - 1); + + if (_animSlots[animSlot].callback && currentFrame != _animSlots[animSlot].lastFrame) { + _animSlots[animSlot].lastFrame = currentFrame; + currentFrame = (this->*_animSlots[animSlot].callback)(_animSlots[animSlot].movie, _animSlots[animSlot].x, _animSlots[animSlot].y, currentFrame); + } + + if (_animSlots[animSlot].movie) { + if (_animSlots[animSlot].flags & 0x20) { + _animSlots[animSlot].movie->displayFrame(_animSlots[animSlot].control[currentFrame].index, 2, _animSlots[animSlot].x, _animSlots[animSlot].y, 0x4000, 0, 0); + _animSlots[animSlot].frameDelay = _animSlots[animSlot].control[currentFrame].delay; + } else { + _animSlots[animSlot].movie->displayFrame(currentFrame % _animSlots[animSlot].movie->frames(), 2, _animSlots[animSlot].x, _animSlots[animSlot].y, 0x4000, 0, 0); + } + } + + if (_animSlots[animSlot].flags & 0x10) { + currentFrame = (curTick - _animSlots[animSlot].nextFrame) / (_animSlots[animSlot].frameDelay * _vm->tickLength()); + } else { + int diff = (curTick - _animSlots[animSlot].nextFrame) / (_animSlots[animSlot].frameDelay * _vm->tickLength()); + if (diff > 0) { + currentFrame++; + if (_vm->gameFlags().platform == Common::kPlatformFMTowns || _vm->gameFlags().platform == Common::kPlatformPC98) + _animSlots[animSlot].nextFrame += ((curTick - _animSlots[animSlot].nextFrame) * 2 / 3); else - updateInput(); + _animSlots[animSlot].nextFrame = curTick; } + } - seq_sequenceCommand(cseq.finalCommand); - seq_resetAllTextEntries(); + bool res = false; + + if (currentFrame >= _animSlots[animSlot].endFrame) { + int sw = ((_animSlots[animSlot].flags & 0x1E) - 2); + switch (sw) { + case 0: + res = true; + currentFrame = _animSlots[animSlot].endFrame; + _screen->copyPage(2, 12); + break; + + case 6: + case 8: + currentFrame = _animSlots[animSlot].endFrame - 1; + break; - if (_abortIntroFlag || skipFlag()) { - _sound->haltTrack(); - _sound->voiceStop(); + case 2: + case 10: + currentFrame = _animSlots[animSlot].startFrame; + break; + + default: + currentFrame = _animSlots[animSlot].endFrame - 1; + res = true; } + } + + _animSlots[animSlot].currentFrame = currentFrame; + return res; +} - if (!_flags.isDemo || _flags.isTalkie) { - if ((seqNum != kSequenceTitle && seqNum < kSequenceZanfaun && - (_abortIntroFlag || skipFlag())) || seqNum == kSequenceZanfaun) { - _abortIntroFlag = false; - _eventList.clear(); - seqNum = kSequenceWestwood; - } else if (seqNum < kSequenceFrash && (_abortIntroFlag || skipFlag())) { - _abortIntroFlag = false; - _eventList.clear(); - seqNum = kSequenceFirates; +void SeqPlayer_HOF::playSoundEffect(uint16 id, int16 vol) { + assert(id < _sequenceSoundListSize); + _vm->sound()->voicePlay(_sequenceSoundList[id], 0, vol); +} + +void SeqPlayer_HOF::playSoundAndDisplaySubTitle(uint16 id) { + assert(id < _sequenceSoundListSize); + + if (id < 12 && !_vm->gameFlags().isDemo && _vm->textEnabled()) + displaySubTitle(id, 160, 168, _textDuration[id], 160); + + _vm->sound()->voicePlay(_sequenceSoundList[id], 0); +} + +void SeqPlayer_HOF::printFadingText(uint16 strID, int x, int y, const uint8 *colorMap, uint8 textcolor) { + uint8 cmap[16]; + + if (checkAbortPlayback()) + checkPlaybackStatus(); + + if (_abortPlayback || _abortRequested || _vm->shouldQuit() || _result) + return; + + Screen::FontId of = _screen->setFont(Screen::FID_8_FNT); + _screen->getPalette(0).fill(254, 2, 63); + _screen->setPaletteIndex(252, 63, 32, 48); + cmap[0] = colorMap[0]; + cmap[1] = 253; + memcpy(&cmap[2], &colorMap[2], 14); + uint8 col0 = _textColor[0]; + + _textColor[0] = 253; + _screen->setTextColorMap(cmap); + resetAllTextSlots(); + displaySubTitle(strID, x, y, 128, 120); + updateSubTitles(); + _screen->copyPage(2, 0); + _screen->updateScreen(); + _screen->getPalette(0).copy(_screen->getPalette(0), textcolor, 1, 253); + _screen->fadePalette(_screen->getPalette(0), 24); + + _textColor[0] = textcolor; + _screen->setTextColorMap(colorMap); + resetAllTextSlots(); + displaySubTitle(strID, x, y, 128, 120); + updateSubTitles(); + _screen->copyPage(2, 0); + _screen->updateScreen(); + _screen->getPalette(0).fill(253, 1, 0); + _screen->fadePalette(_screen->getPalette(0), 1); + + _screen->copyPage(2, 12); + resetAllTextSlots(); + + _textColor[0] = col0; + + _screen->setFont(of); +} + +int SeqPlayer_HOF::displaySubTitle(uint16 strIndex, uint16 posX, uint16 posY, int duration, uint16 width) { + for (int i = 0; i < 10; i++) { + if (_textSlots[i].duration != -1) { + if (i < 9) + continue; + else + return -1; + } + + _textSlots[i].strIndex = strIndex; + _textSlots[i].x = posX; + _textSlots[i].y = posY; + _textSlots[i].duration = duration * _vm->tickLength(); + _textSlots[i].width = width; + _textSlots[i].startTime = _system->getMillis(); + _textSlots[i].textcolor = -1; + + return i; + } + return -1; +} + +void SeqPlayer_HOF::updateSubTitles() { + int curPage = _screen->setCurPage(2); + char outputStr[70]; + + for (int i = 0; i < 10; i++) { + if (_textSlots[i].startTime + _textSlots[i].duration > _system->getMillis() && _textSlots[i].duration != -1) { + + char *srcStr = preprocessString(_sequenceStrings[_textSlots[i].strIndex], _textSlots[i].width); + int yPos = _textSlots[i].y; + + while (*srcStr) { + uint32 linePos = 0; + for (; *srcStr; linePos++) { + if (*srcStr == '\r') + break; + outputStr[linePos] = *srcStr; + srcStr++; + } + outputStr[linePos] = 0; + if (*srcStr == '\r') + srcStr++; + + uint8 textColor = (_textSlots[i].textcolor >= 0) ? _textSlots[i].textcolor : _textColor[0]; + _screen->printText(outputStr, _textSlots[i].x - (_screen->getTextWidth(outputStr) / 2), yPos, textColor, 0); + yPos += 10; } - } else if (seqNum == endSeq && !(_abortIntroFlag || skipFlag())) { - seqNum = 0; + } else { + _textSlots[i].duration = -1; + } + } + + _screen->setCurPage(curPage); +} + +char *SeqPlayer_HOF::preprocessString(const char *srcStr, int width) { + char *dstStr = _tempString; + int lineStart = 0; + int linePos = 0; + + while (*srcStr) { + while (*srcStr && *srcStr != ' ') + dstStr[lineStart + linePos++] = *srcStr++; + dstStr[lineStart + linePos] = 0; + + int len = _screen->getTextWidth(&dstStr[lineStart]); + if (width >= len && *srcStr) { + dstStr[lineStart + linePos++] = *srcStr++; + } else { + dstStr[lineStart + linePos] = '\r'; + lineStart += linePos + 1; + linePos = 0; + if (*srcStr) + srcStr++; } + } + dstStr[lineStart + linePos] = 0; - if (_menuChoice) { - _abortIntroFlag = false; - _eventList.clear(); + return strlen(_tempString) ? dstStr : 0; +} + +void SeqPlayer_HOF::waitForSubTitlesTimeout() { + uint32 timeOut = _system->getMillis() + ticksTillSubTitlesTimeout() * _vm->tickLength(); - if (_menuChoice == 2) { - seqNum = kSequenceTitle; - _menuChoice = 0; + if (_vm->textEnabled()) { + delayUntil(timeOut); + } else if (_vm->speechEnabled()) { + while (_vm->snd_voiceIsPlaying()) + delayTicks(1); + } + + resetAllTextSlots(); +} + +uint32 SeqPlayer_HOF::ticksTillSubTitlesTimeout() { + uint32 longest = 0; + + for (int i = 0; i < 10; i++) { + uint32 timeOut = (_textSlots[i].duration + _textSlots[i].startTime); + uint32 curtime = _system->getMillis(); + if (_textSlots[i].duration != -1 && timeOut > curtime) { + timeOut -= curtime; + if (longest < timeOut) + longest = timeOut; + } + } + + uint32 tl = _vm->tickLength(); + return (longest + (tl - 1)) / tl; +} + +void SeqPlayer_HOF::resetAllTextSlots() { + for (int i = 0; i < 10; i++) + _textSlots[i].duration = -1; +} + +void SeqPlayer_HOF::fadeOutMusic() { + _vm->sound()->beginFadeOut(); + delayTicks(80); +} + +void SeqPlayer_HOF::playHoFTalkieCredits() { + static const uint8 colormap[] = {0, 0, 102, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + static const ScreenDim d = { 0x00, 0x0C, 0x28, 0xB4, 0xFF, 0x00, 0x00, 0x00 }; + + _screen->loadBitmap("finale.cps", 3, 3, &_screen->getPalette(0)); + _screen->setFont(Screen::FID_GOLDFONT_FNT); + + int talkieCreditsSize, talkieCreditsSpecialSize; + const uint8 *talkieCredits = _vm->staticres()->loadRawData(k2SeqplayCredits, talkieCreditsSize); + const char *const *talkieCreditsSpecial = _vm->staticres()->loadStrings(k2SeqplayCreditsSpecial, talkieCreditsSpecialSize); + + _vm->sound()->selectAudioResourceSet(kMusicIngame); + _vm->sound()->loadSoundFile(3); + _vm->sound()->playTrack(3); + + _screen->setTextColorMap(colormap); + _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0); + _screen->updateScreen(); + _screen->fadeFromBlack(); + + _screen->_charWidth = -2; + uint8 *dataPtr = new uint8[0xAFD]; + memcpy(dataPtr, talkieCredits, talkieCreditsSize); + _vm->staticres()->unloadId(k2SeqplayCredits); + + displayHoFTalkieScrollText(dataPtr, &d, 2, 6, 5, 1, Screen::FID_GOLDFONT_FNT, Screen::FID_GOLDFONT_FNT, 0, talkieCreditsSpecial); + delayTicks(8); + + delete[] dataPtr; + _vm->staticres()->unloadId(k2SeqplayCreditsSpecial); + _vm->sound()->selectAudioResourceSet(kMusicFinale); + _vm->sound()->loadSoundFile(0); +} + +void SeqPlayer_HOF::displayHoFTalkieScrollText(uint8 *data, const ScreenDim *d, int tempPage1, int tempPage2, int speed, + int step, Screen::FontId fid1, Screen::FontId fid2, const uint8 *shapeData, const char *const *specialData) { + if (!data) + return; + + static const char mark[] = { 5, 13, 0 }; + + _screen->clearPage(tempPage1); + _screen->clearPage(tempPage2); + _screen->copyRegion(d->sx << 3, d->sy, d->sx << 3, d->sy, d->w << 3, d->h, 0, tempPage1); + + struct ScrollTextData { + int16 x; + int16 y; + uint8 *text; + byte unk1; + byte height; + byte adjust; + + ScrollTextData() { + x = 0; // 0 11 + y = 0; // 2 13 + text = 0; // 4 15 + unk1 = 0; // 8 19 + height = 0; // 9 20 + adjust = 0; // 10 21 + } + }; + + ScrollTextData *textData = new ScrollTextData[36]; + uint8 *ptr = data; + + bool loop = true; + int cnt = 0; + + while (loop) { + uint32 loopEnd = _system->getMillis() + speed * _vm->tickLength(); + + while (cnt < 35 && *ptr) { + uint16 cH; + + if (cnt) + cH = textData[cnt].y + textData[cnt].height + (textData[cnt].height >> 3); + else + cH = d->h; + + char *str = (char *)ptr; + + ptr = (uint8 *)strpbrk(str, mark); + if (!ptr) + ptr = (uint8 *)strchr(str, 0); + + textData[cnt + 1].unk1 = *ptr; + *ptr = 0; + if (textData[cnt + 1].unk1) + ptr++; + + if (*str == 3 || *str == 4) + textData[cnt + 1].adjust = *str++; + else + textData[cnt + 1].adjust = 0; + + _screen->setFont(fid1); + + if (*str == 1) { + _screen->setFont(fid2); + str++; + } else if (*str == 2) { + str++; + } + + textData[cnt + 1].height = _screen->getFontHeight(); + + switch (textData[cnt + 1].adjust) { + case 3: + textData[cnt + 1].x = 157 - _screen->getTextWidth(str); + break; + case 4: + textData[cnt + 1].x = 161; + break; + default: + textData[cnt + 1].x = (((d->w << 3) - _screen->getTextWidth(str)) >> 1) + 1; } + + if (textData[cnt].unk1 == 5) + cH -= (textData[cnt].height + (textData[cnt].height >> 3)); + + textData[cnt + 1].y = cH; + textData[cnt + 1].text = (uint8 *)str; + cnt++; } + + _screen->copyRegion(d->sx << 3, d->sy, d->sx << 3, d->sy, d->w << 3, d->h, tempPage1, tempPage2); + + int cnt2 = 0; + bool palCycle = 0; + + while (cnt2 < cnt) { + const char *str = (const char *)textData[cnt2 + 1].text; + const char *str2 = str; + int16 cW = textData[cnt2 + 1].x - 10; + int16 cH = textData[cnt2 + 1].y; + int x = (d->sx << 3) + cW; + int y = d->sy + cH; + int col1 = 255; + + if (cH < d->h) { + _screen->setCurPage(tempPage2); + _screen->setFont(fid1); + if (textData[cnt2 + 1].height != _screen->getFontHeight()) + _screen->setFont(fid2); + + if (specialData) { + if (!strcmp(str, specialData[0])) { + col1 = 112; + char cChar[2] = " "; + while (*str2) { + cChar[0] = *str2; + _screen->printText(cChar, x, y, col1++, 0); + x += _screen->getCharWidth((uint8)*str2++); + } + palCycle = true; + } else if (!strcmp(str, specialData[1])) { + col1 = 133; + char cChar[2] = " "; + while (*str2) { + cChar[0] = *str2; + _screen->printText(cChar, x, y, col1--, 0); + x += _screen->getCharWidth((uint8)*str2++); + } + palCycle = true; + } else { + _screen->printText(str, x, y, col1, 0); + } + } else { + _screen->printText(str, x, y, col1, 0); + } + _screen->setCurPage(0); + } + + textData[cnt2 + 1].y -= step; + cnt2++; + } + + _screen->copyRegion(d->sx << 3, d->sy, d->sx << 3, d->sy, d->w << 3, d->h, tempPage2, 0); + _screen->updateScreen(); + + if (textData[1].y < -10) { + textData[1].text += strlen((char *)textData[1].text); + textData[1].text[0] = textData[1].unk1; + cnt--; + memcpy(&textData[1], &textData[2], cnt * sizeof(ScrollTextData)); + } + + if (palCycle) { + for (int col = 133; col > 112; col--) + _screen->getPalette(0).copy(_screen->getPalette(0), col - 1, 1, col); + _screen->getPalette(0).copy(_screen->getPalette(0), 133, 1, 112); + _screen->setScreenPalette(_screen->getPalette(0)); + } + + delayUntil(loopEnd); + + if ((cnt < 36) && ((d->sy + d->h) > (textData[cnt].y + textData[cnt].height)) && !_abortPlayback) { + delayTicks(500); + cnt = 0; + } + + if (checkAbortPlayback()) + if (checkPlaybackStatus()) + loop = false; + + if (!cnt || _abortPlayback) + loop = false; } - if (_flags.isDemo && !_flags.isTalkie) { - _eventList.clear(); - _screen->fadeToBlack(); + _vm->sound()->beginFadeOut(); + _screen->fadeToBlack(); + + _abortPlayback = _abortRequested = false; + + delete[] textData; +} + +void SeqPlayer_HOF::updateDemoAdText(int bottom, int top) { + int dstY, dstH, srcH; + + static const ScreenDim d = { 0x00, 0x00, 0x28, 0x320, 0xFF, 0xFE, 0x00, 0x00 }; + + if (_scrollProgressCounter - (top - 1) < 0) { + dstY = top - _scrollProgressCounter; + dstH = _scrollProgressCounter; + srcH = 0; + } else { + dstY = 0; + srcH = _scrollProgressCounter - top; + dstH = (400 - srcH <= top) ? 400 - srcH : top; } - if (!_menuChoice) - delay(1200); + if (dstH > 0) { + if (_hofDemoAnimData) { + for (int i = 0; i < 4; i++) { + const HoFSeqItemAnimData *def = &_hofDemoAnimData[i]; + ActiveItemAnim *a = &_hofDemoActiveItemAnim[i]; - _screen->setCurPage(oldPage); - _screen->showMouse(); + _screen->fillRect(12, def->y - 8, 28, def->y + 8, 0, 4); + _screen->drawShape(4, _hofDemoItemShapes[def->itemIndex + def->frames[a->currentFrame]], 12, def->y - 8, 0, 0); + if (_callbackCurrentFrame % 2 == 0) + a->currentFrame = (a->currentFrame + 1) % 20; + } + } + _screen->copyRegionEx(4, 0, srcH, 2, 2, dstY + bottom, 320, dstH, &d); + } +} - for (int i = 0; i < 8; i++) - seq_unloadWSA(i); +void SeqPlayer_HOF::delayTicks(uint32 ticks) { + uint32 len = ticks * _vm->tickLength(); + while (len && !_vm->shouldQuit() && !checkAbortPlayback()) { + uint32 step = (len >= 10) ? 10 : len; + _system->delayMillis(step); + len -= step; + } +} - _seqWsa->close(); +void SeqPlayer_HOF::delayUntil(uint32 dest) { + for (uint32 ct = _system->getMillis(); ct < dest && !_vm->shouldQuit() && !checkAbortPlayback(); ) { + uint32 step = (dest - ct >= 10) ? 10 : (dest - ct); + _system->delayMillis(step); + ct = _system->getMillis(); + } +} - _screen->_charWidth = 0; +void SeqPlayer_HOF::setCountDown(uint32 ticks) { + _countDownRemainder = ticks * _vm->tickLength(); + if (_vm->gameFlags().platform == Common::kPlatformFMTowns || _vm->gameFlags().platform == Common::kPlatformPC98) + _countDownRemainder = _countDownRemainder * 2 / 3; + _countDownLastUpdate = _system->getMillis() & ~(_vm->tickLength() - 1); +} - seq_uninit(); +bool SeqPlayer_HOF::countDownRunning() { + uint32 cur = _system->getMillis(); + uint32 step = cur - _countDownLastUpdate; + _countDownLastUpdate = cur; + _countDownRemainder = (step <= _countDownRemainder) ? _countDownRemainder - step : 0; + return _countDownRemainder; } -int KyraEngine_HoF::seq_introWestwood(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +#define CASE_ALT(dosCase, towns98Case)\ + case dosCase:\ + case towns98Case:\ + if (!((_callbackCurrentFrame == towns98Case && (_vm->gameFlags().platform == Common::kPlatformFMTowns || _vm->gameFlags().platform == Common::kPlatformPC98)) || (_callbackCurrentFrame == dosCase && _vm->gameFlags().platform == Common::kPlatformPC)))\ + break; + +int SeqPlayer_HOF::cbHOF_westwood(WSAMovie_v2 *wsaObj, int x, int y, int frm) { if (frm == -2) { - if (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98) - delay(300 * _tickLength); + if (_vm->gameFlags().platform == Common::kPlatformFMTowns || _vm->gameFlags().platform == Common::kPlatformPC98) + delayTicks(300); } else if (!frm) { - _sound->playTrack(2); + _vm->sound()->playTrack(2); } return 0; } -int KyraEngine_HoF::seq_introTitle(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +int SeqPlayer_HOF::cbHOF_title(WSAMovie_v2 *wsaObj, int x, int y, int frm) { if (frm == 1) { - _sound->playTrack(3); - } else if (frm == 25) { + _vm->sound()->playTrack(3); + } else if (frm == 25 && _startupSaveLoadable) { int cp = _screen->setCurPage(0); _screen->showMouse(); _system->updateScreen(); - _menuChoice = _menu->handle(11) + 1; - _seqEndTime = 0; - _seqSubframePlaying = false; - if (_menuChoice == 4) - quitGame(); + _result = _menu->handle(11) + 1; + _updateAnimations = false; + + if (_result == 1) { + _curScene = _lastScene; + _preventLooping = true; + } else { + setCountDown(200); + } + + if (_result == 4) + _vm->quitGame(); _screen->hideMouse(); _screen->setCurPage(cp); @@ -355,31 +1792,29 @@ int KyraEngine_HoF::seq_introTitle(WSAMovie_v2 *wsaObj, int x, int y, int frm) { return 0; } -int KyraEngine_HoF::seq_introOverview(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +int SeqPlayer_HOF::cbHOF_overview(WSAMovie_v2 *wsaObj, int x, int y, int frm) { uint8 *tmpPal = _screen->getPalette(3).getData() + 0x101; memset(tmpPal, 0, 256); - _seqSubFrameEndTimeInternal = 0; - uint32 now = 0; + uint32 frameEnd = 0; - switch (_seqFrameCounter) { + switch (_callbackCurrentFrame) { case 0: - _seqSubframePlaying = true; - _sound->playTrack(4); - _seqSubFrameEndTimeInternal = _system->getMillis() + 60 * _tickLength; + _updateAnimations = true; + fadeOutMusic(); + _vm->sound()->playTrack(4); + frameEnd = _system->getMillis() + 60 * _vm->tickLength(); - _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0), 1, 255) & 0xff; - memset(_seqTextColorMap, _seqTextColor[1], 16); - _seqTextColorMap[1] = _seqTextColor[0] = _screen->findLeastDifferentColor(_seqTextColorPresets + 3, _screen->getPalette(0), 1, 255) & 0xff; + _textColor[1] = _screen->findLeastDifferentColor(_textColorPresets, _screen->getPalette(0), 1, 255) & 0xFF; + memset(_textColorMap, _textColor[1], 16); + _textColorMap[1] = _textColor[0] = _screen->findLeastDifferentColor(_textColorPresets + 3, _screen->getPalette(0), 1, 255) & 0xFF; + _screen->setTextColorMap(_textColorMap); - _screen->setTextColorMap(_seqTextColorMap); - - now = _system->getMillis(); - if (_seqSubFrameEndTimeInternal > now) - delay(_seqSubFrameEndTimeInternal - now); + delayUntil(frameEnd); break; case 1: - _screen->generateGrayOverlay(_screen->getPalette(0), _screen->getPalette(3).getData(), 0x40, 0, 0, 0, 0x100, true); + assert(_screenHoF); + _screenHoF->generateGrayOverlay(_screen->getPalette(0), _screen->getPalette(3).getData(), 0x40, 0, 0, 0, 0x100, true); for (int i = 0; i < 256; i++) tmpPal[_screen->getPalette(3)[i]] = 1; @@ -393,19 +1828,19 @@ int KyraEngine_HoF::seq_introOverview(WSAMovie_v2 *wsaObj, int x, int y, int frm break; case 40: - seq_loadNestedSequence(0, kSequenceOver1); + startNestedAnimation(0, kNestedSequenceOver1); break; case 60: - seq_loadNestedSequence(1, kSequenceOver2); + startNestedAnimation(1, kNestedSequenceOver2); break; case 120: - seq_playTalkText(0); + playSoundAndDisplaySubTitle(0); break; case 200: - seq_waitForTextsTimeout(); + waitForSubTitlesTimeout(); _screen->fadePalette(_screen->getPalette(2), 64); break; @@ -417,64 +1852,57 @@ int KyraEngine_HoF::seq_introOverview(WSAMovie_v2 *wsaObj, int x, int y, int frm _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0); _screen->setScreenPalette(_screen->getPalette(0)); _screen->updateScreen(); - seq_resetActiveWSA(0); - seq_resetActiveWSA(1); + closeNestedAnimation(0); + closeNestedAnimation(1); break; case 282: - seq_loadNestedSequence(0, kSequenceForest); - seq_playTalkText(1); + startNestedAnimation(0, kNestedSequenceForest); + playSoundAndDisplaySubTitle(1); break; - case 354: - case 434: - if (!((_seqFrameCounter == 354 && (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)) || (_seqFrameCounter == 434 && _flags.platform == Common::kPlatformPC))) - break; - - seq_resetActiveWSA(0); - seq_loadNestedSequence(0, kSequenceDragon); + CASE_ALT(434, 354) + closeNestedAnimation(0); + startNestedAnimation(0, kNestedSequenceDragon); break; - case 400: - case 540: - if (!((_seqFrameCounter == 400 && (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)) || (_seqFrameCounter == 540 && _flags.platform == Common::kPlatformPC))) - break; - - seq_waitForTextsTimeout(); - seq_resetActiveWSA(0); - _seqEndTime = 0; - _seqSubframePlaying = false; + CASE_ALT(540, 400) + waitForSubTitlesTimeout(); + closeNestedAnimation(0); + setCountDown(0); + _updateAnimations = false; break; default: break; } - _seqFrameCounter++; + _callbackCurrentFrame++; return 0; } -int KyraEngine_HoF::seq_introLibrary(WSAMovie_v2 *wsaObj, int x, int y, int frm) { - switch (_seqFrameCounter) { +int SeqPlayer_HOF::cbHOF_library(WSAMovie_v2 *wsaObj, int x, int y, int frm) { + switch (_callbackCurrentFrame) { case 0: - _seqSubframePlaying = true; - _sound->playTrack(5); + _updateAnimations = true; + _vm->sound()->playTrack(5); - _screen->generateGrayOverlay(_screen->getPalette(0), _screen->getPalette(3).getData(), 0x24, 0, 0, 0, 0x100, false); - _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0), 1, 255) & 0xff; - memset(_seqTextColorMap, _seqTextColor[1], 16); - _seqTextColorMap[1] = _seqTextColor[0] = _screen->findLeastDifferentColor(_seqTextColorPresets + 3, _screen->getPalette(0), 1, 255) & 0xff; + assert(_screenHoF); + _screenHoF->generateGrayOverlay(_screen->getPalette(0), _screen->getPalette(3).getData(), 0x24, 0, 0, 0, 0x100, false); + _textColor[1] = _screen->findLeastDifferentColor(_textColorPresets, _screen->getPalette(0), 1, 255) & 0xFF; + memset(_textColorMap, _textColor[1], 16); + _textColorMap[1] = _textColor[0] = _screen->findLeastDifferentColor(_textColorPresets + 3, _screen->getPalette(0), 1, 255) & 0xFF; - _screen->setTextColorMap(_seqTextColorMap); + _screen->setTextColorMap(_textColorMap); break; case 1: - seq_loadNestedSequence(0, kSequenceLibrary3); - seq_playTalkText(4); + startNestedAnimation(0, kNestedSequenceLibrary3); + playSoundAndDisplaySubTitle(4); break; case 100: - seq_waitForTextsTimeout(); + waitForSubTitlesTimeout(); _screen->copyPage(12, 2); _screen->applyOverlay(0, 0, 320, 200, 2, _screen->getPalette(3).getData()); @@ -482,585 +1910,560 @@ int KyraEngine_HoF::seq_introLibrary(WSAMovie_v2 *wsaObj, int x, int y, int frm) _screen->updateScreen(); _screen->copyPage(2, 12); - seq_resetActiveWSA(0); - seq_loadNestedSequence(0, kSequenceDarm); + closeNestedAnimation(0); + startNestedAnimation(0, kNestedSequenceDarm); break; case 104: - seq_playTalkText(5); + playSoundAndDisplaySubTitle(5); break; case 240: - seq_waitForTextsTimeout(); - seq_resetActiveWSA(0); - seq_loadNestedSequence(0, kSequenceLibrary2); + waitForSubTitlesTimeout(); + closeNestedAnimation(0); + startNestedAnimation(0, kNestedSequenceLibrary2); break; case 340: - seq_resetActiveWSA(0); + closeNestedAnimation(0); _screen->applyOverlay(0, 0, 320, 200, 2, _screen->getPalette(3).getData()); _screen->copyPage(2, 12); _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0); _screen->updateScreen(); - seq_loadNestedSequence(0, kSequenceMarco); - seq_playTalkText(6); + startNestedAnimation(0, kNestedSequenceMarco); + playSoundAndDisplaySubTitle(6); break; - case 480: - case 660: - if (!((_seqFrameCounter == 480 && (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)) || (_seqFrameCounter == 660 && _flags.platform == Common::kPlatformPC))) - break; - + CASE_ALT(660, 480) _screen->copyPage(2, 12); - seq_waitForTextsTimeout(); - seq_resetActiveWSA(0); - _seqEndTime = 0; - _seqSubframePlaying = false; + waitForSubTitlesTimeout(); + closeNestedAnimation(0); + setCountDown(0); + _updateAnimations = false; break; default: break; } - _seqFrameCounter++; + _callbackCurrentFrame++; return 0; } - -int KyraEngine_HoF::seq_introHand(WSAMovie_v2 *wsaObj, int x, int y, int frm) { - switch (_seqFrameCounter) { +int SeqPlayer_HOF::cbHOF_hand(WSAMovie_v2 *wsaObj, int x, int y, int frm) { + switch (_callbackCurrentFrame) { case 0: - _seqSubframePlaying = true; - _sound->playTrack(6); + _updateAnimations = true; + _vm->sound()->playTrack(6); - _screen->generateGrayOverlay(_screen->getPalette(0), _screen->getPalette(3).getData(), 0x24, 0, 0, 0, 0x100, false); - _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0), 1, 255) & 0xff; - memset(_seqTextColorMap, _seqTextColor[1], 16); - _seqTextColorMap[1] = _seqTextColor[0] = _screen->findLeastDifferentColor(_seqTextColorPresets + 3, _screen->getPalette(0), 1, 255) & 0xff; + assert(_screenHoF); + _screenHoF->generateGrayOverlay(_screen->getPalette(0), _screen->getPalette(3).getData(), 0x24, 0, 0, 0, 0x100, false); + _textColor[1] = _screen->findLeastDifferentColor(_textColorPresets, _screen->getPalette(0), 1, 255) & 0xFF; + memset(_textColorMap, _textColor[1], 16); + _textColorMap[1] = _textColor[0] = _screen->findLeastDifferentColor(_textColorPresets + 3, _screen->getPalette(0), 1, 255) & 0xFF; - _screen->setTextColorMap(_seqTextColorMap); + _screen->setTextColorMap(_textColorMap); break; case 1: - seq_loadNestedSequence(0, kSequenceHand1a); - seq_loadNestedSequence(1, kSequenceHand1b); - seq_loadNestedSequence(2, kSequenceHand1c); - seq_playTalkText(7); + startNestedAnimation(0, kNestedSequenceHand1a); + startNestedAnimation(1, kNestedSequenceHand1b); + startNestedAnimation(2, kNestedSequenceHand1c); + playSoundAndDisplaySubTitle(7); break; case 201: - seq_waitForTextsTimeout(); + waitForSubTitlesTimeout(); _screen->applyOverlay(0, 0, 320, 200, 2, _screen->getPalette(3).getData()); _screen->copyPage(2, 12); _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0); _screen->updateScreen(); - seq_resetActiveWSA(0); - seq_resetActiveWSA(1); - seq_resetActiveWSA(2); - seq_loadNestedSequence(0, kSequenceHand2); - seq_playTalkText(8); + closeNestedAnimation(0); + closeNestedAnimation(1); + closeNestedAnimation(2); + startNestedAnimation(0, kNestedSequenceHand2); + playSoundAndDisplaySubTitle(8); break; - case 260: - case 395: - if (!((_seqFrameCounter == 260 && (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)) || (_seqFrameCounter == 395 && _flags.platform == Common::kPlatformPC))) - break; - - seq_waitForTextsTimeout(); - seq_resetActiveWSA(0); - seq_loadNestedSequence(1, kSequenceHand3); - seq_playTalkText(9); + CASE_ALT(395, 260) + waitForSubTitlesTimeout(); + closeNestedAnimation(0); + startNestedAnimation(1, kNestedSequenceHand3); + playSoundAndDisplaySubTitle(9); break; - case 365: - case 500: - if (!((_seqFrameCounter == 365 && (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)) || (_seqFrameCounter == 500 && _flags.platform == Common::kPlatformPC))) - break; - - seq_waitForTextsTimeout(); - seq_resetActiveWSA(1); - seq_loadNestedSequence(0, kSequenceHand4); + CASE_ALT(500, 365) + waitForSubTitlesTimeout(); + closeNestedAnimation(1); + startNestedAnimation(0, kNestedSequenceHand4); break; - case 405: - case 540: - if (!((_seqFrameCounter == 405 && (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)) || (_seqFrameCounter == 540 && _flags.platform == Common::kPlatformPC))) - break; - - seq_playTalkText(10); + CASE_ALT(540, 405) + playSoundAndDisplaySubTitle(10); break; - case 484: - case 630: - if (!((_seqFrameCounter == 484 && (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)) || (_seqFrameCounter == 630 && _flags.platform == Common::kPlatformPC))) - break; - - seq_waitForTextsTimeout(); - seq_resetActiveWSA(0); - _seqEndTime = 0; - _seqSubframePlaying = false; + CASE_ALT(630, 484) + waitForSubTitlesTimeout(); + closeNestedAnimation(0); + setCountDown(0); + _updateAnimations = false; break; default: break; } - _seqFrameCounter++; + _callbackCurrentFrame++; return 0; } -int KyraEngine_HoF::seq_introPoint(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +int SeqPlayer_HOF::cbHOF_point(WSAMovie_v2 *wsaObj, int x, int y, int frm) { if (frm == -2) { - seq_waitForTextsTimeout(); - _seqEndTime = 0; + waitForSubTitlesTimeout(); + setCountDown(0); } - switch (_seqFrameCounter) { + switch (_callbackCurrentFrame) { case -2: - seq_waitForTextsTimeout(); + waitForSubTitlesTimeout(); break; case 0: - _sound->playTrack(7); + _vm->sound()->playTrack(7); - _seqTextColor[1] = 0xf7; - memset(_seqTextColorMap, _seqTextColor[1], 16); - _seqTextColorMap[1] = _seqTextColor[0] = _screen->findLeastDifferentColor(_seqTextColorPresets + 3, _screen->getPalette(0), 1, 255) & 0xff; - _screen->setTextColorMap(_seqTextColorMap); - _screen->generateGrayOverlay(_screen->getPalette(0), _screen->getPalette(3).getData(), 0x24, 0, 0, 0, 0x100, false); + _textColor[1] = 0xF7; + memset(_textColorMap, _textColor[1], 16); + _textColorMap[1] = _textColor[0] = _screen->findLeastDifferentColor(_textColorPresets + 3, _screen->getPalette(0), 1, 255) & 0xFF; + _screen->setTextColorMap(_textColorMap); + assert(_screenHoF); + _screenHoF->generateGrayOverlay(_screen->getPalette(0), _screen->getPalette(3).getData(), 0x24, 0, 0, 0, 0x100, false); break; case 1: - seq_playTalkText(11); + playSoundAndDisplaySubTitle(11); break; default: break; } - _seqFrameCounter++; + _callbackCurrentFrame++; return 0; } -int KyraEngine_HoF::seq_introZanfaun(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +int SeqPlayer_HOF::cbHOF_zanfaun(WSAMovie_v2 *wsaObj, int x, int y, int frm) { if (frm == -2) { - seq_waitForTextsTimeout(); - _seqEndTime = 0; + waitForSubTitlesTimeout(); + setCountDown(0); return 0; } - switch (_seqFrameCounter) { + switch (_callbackCurrentFrame) { case 0: - _sound->playTrack(8); + _vm->sound()->playTrack(8); - _seqTextColor[1] = 0xfd; - memset(_seqTextColorMap, _seqTextColor[1], 16); - _seqTextColorMap[1] = _seqTextColor[0] = _screen->findLeastDifferentColor(_seqTextColorPresets + 3, _screen->getPalette(0), 1, 255) & 0xff; - _screen->setTextColorMap(_seqTextColorMap); + _textColor[1] = 0xFD; + memset(_textColorMap, _textColor[1], 16); + _textColorMap[1] = _textColor[0] = _screen->findLeastDifferentColor(_textColorPresets + 3, _screen->getPalette(0), 1, 255) & 0xFF; + _screen->setTextColorMap(_textColorMap); break; case 1: - if (_flags.isTalkie) { - seq_playWsaSyncDialogue(21, 13, -1, 140, 70, 160, wsaObj, 0, 8, x, y); + if (_vm->gameFlags().isTalkie) { + playDialogueAnimation(21, 13, -1, 140, 70, 160, wsaObj, 0, 8, x, y); } else { - seq_setTextEntry(21, 140, 70, 200, 160); - _seqFrameDelay = 200; + displaySubTitle(21, 140, 70, 200, 160); + _animDuration = 200; } break; case 2: case 11: case 21: - if (!_flags.isTalkie) - _seqFrameDelay = 12; + if (!_vm->gameFlags().isTalkie) + _animDuration = 12; break; case 9: - if (_flags.isTalkie) - seq_playWsaSyncDialogue(13, 14, -1, 140, (_flags.lang == Common::FR_FRA - || _flags.lang == Common::DE_DEU) ? 50 : 70, 160, wsaObj, 9, 15, x, y); + if (_vm->gameFlags().isTalkie) + playDialogueAnimation(13, 14, -1, 140, (_vm->gameFlags().lang == Common::FR_FRA + || _vm->gameFlags().lang == Common::DE_DEU) ? 50 : 70, 160, wsaObj, 9, 15, x, y); break; case 10: - if (!_flags.isTalkie) { - seq_waitForTextsTimeout(); - seq_setTextEntry(13, 140, 50, _sequenceStringsDuration[13], 160); - _seqFrameDelay = 300; + if (!_vm->gameFlags().isTalkie) { + waitForSubTitlesTimeout(); + displaySubTitle(13, 140, 50, _textDuration[13], 160); + _animDuration = 300; } break; case 16: - if (_flags.isTalkie) - seq_playWsaSyncDialogue(18, 15, -1, 140, (_flags.lang == Common::FR_FRA) ? 50 : - (_flags.lang == Common::DE_DEU ? 40 : 70), 160, wsaObj, 10, 16, x, y); + if (_vm->gameFlags().isTalkie) + playDialogueAnimation(18, 15, -1, 140, (_vm->gameFlags().lang == Common::FR_FRA) ? 50 : + (_vm->gameFlags().lang == Common::DE_DEU ? 40 : 70), 160, wsaObj, 10, 16, x, y); break; case 17: - if (_flags.isTalkie) - _seqFrameDelay = 12; + if (_vm->gameFlags().isTalkie) + _animDuration = 12; break; case 20: - if (!_flags.isTalkie) { - seq_waitForTextsTimeout(); - seq_setTextEntry(18, 160, 50, _sequenceStringsDuration[18], 160); - _seqFrameDelay = 200; + if (!_vm->gameFlags().isTalkie) { + waitForSubTitlesTimeout(); + displaySubTitle(18, 160, 50, _textDuration[18], 160); + _animDuration = 200; } break; case 26: - seq_waitForTextsTimeout(); + waitForSubTitlesTimeout(); break; case 46: - if (_flags.isTalkie) { - seq_playWsaSyncDialogue(16, 16, -1, 200, 50, 120, wsaObj, 46, 46, x, y); + if (_vm->gameFlags().isTalkie) { + playDialogueAnimation(16, 16, -1, 200, 50, 120, wsaObj, 46, 46, x, y); } else { - seq_waitForTextsTimeout(); - seq_setTextEntry(16, 200, 50, _sequenceStringsDuration[16], 120); + waitForSubTitlesTimeout(); + displaySubTitle(16, 200, 50, _textDuration[16], 120); } - _seqEndTime = _system->getMillis() + 120 * _tickLength; + setCountDown(120); break; default: break; } - _seqFrameCounter++; + _callbackCurrentFrame++; return 0; } -int KyraEngine_HoF::seq_introOver1(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +int SeqPlayer_HOF::cbHOF_over1(WSAMovie_v2 *wsaObj, int x, int y, int frm) { if (frm == 2) - seq_waitForTextsTimeout(); + waitForSubTitlesTimeout(); else if (frm == 3) - seq_playTalkText(12); + playSoundAndDisplaySubTitle(12); return frm; } - -int KyraEngine_HoF::seq_introOver2(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +int SeqPlayer_HOF::cbHOF_over2(WSAMovie_v2 *wsaObj, int x, int y, int frm) { if (frm == 1) - seq_playTalkText(12); + playSoundAndDisplaySubTitle(12); return frm; } -int KyraEngine_HoF::seq_introForest(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +int SeqPlayer_HOF::cbHOF_forest(WSAMovie_v2 *wsaObj, int x, int y, int frm) { if (frm == 11) - seq_waitForTextsTimeout(); + waitForSubTitlesTimeout(); else if (frm == 12) - seq_playTalkText(2); + playSoundAndDisplaySubTitle(2); return frm; } -int KyraEngine_HoF::seq_introDragon(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +int SeqPlayer_HOF::cbHOF_dragon(WSAMovie_v2 *wsaObj, int x, int y, int frm) { if (frm == 11) - seq_waitForTextsTimeout(); + waitForSubTitlesTimeout(); else if (frm == 3) - seq_playTalkText(3); + playSoundAndDisplaySubTitle(3); return frm; } -int KyraEngine_HoF::seq_introDarm(WSAMovie_v2 *wsaObj, int x, int y, int frm) { - //NULLSUB (at least in FM-TOWNS version) +int SeqPlayer_HOF::cbHOF_darm(WSAMovie_v2 *wsaObj, int x, int y, int frm) { return frm; } -int KyraEngine_HoF::seq_introLibrary2(WSAMovie_v2 *wsaObj, int x, int y, int frm) { - //NULLSUB (at least in FM-TOWNS version) +int SeqPlayer_HOF::cbHOF_library2(WSAMovie_v2 *wsaObj, int x, int y, int frm) { return frm; } -int KyraEngine_HoF::seq_introMarco(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +int SeqPlayer_HOF::cbHOF_marco(WSAMovie_v2 *wsaObj, int x, int y, int frm) { if (frm == 36) { - seq_waitForTextsTimeout(); - _seqEndTime = 0; + waitForSubTitlesTimeout(); + setCountDown(0); } return frm; } -int KyraEngine_HoF::seq_introHand1a(WSAMovie_v2 *wsaObj, int x, int y, int frm) { - //NULLSUB (at least in FM-TOWNS version) +int SeqPlayer_HOF::cbHOF_hand1a(WSAMovie_v2 *wsaObj, int x, int y, int frm) { return frm; } -int KyraEngine_HoF::seq_introHand1b(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +int SeqPlayer_HOF::cbHOF_hand1b(WSAMovie_v2 *wsaObj, int x, int y, int frm) { if (frm == 15) frm = 12; return frm; } -int KyraEngine_HoF::seq_introHand1c(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +int SeqPlayer_HOF::cbHOF_hand1c(WSAMovie_v2 *wsaObj, int x, int y, int frm) { if (frm == 8) frm = 4; return frm; } -int KyraEngine_HoF::seq_introHand2(WSAMovie_v2 *wsaObj, int x, int y, int frm) { - //NULLSUB (at least in FM-TOWNS version) +int SeqPlayer_HOF::cbHOF_hand2(WSAMovie_v2 *wsaObj, int x, int y, int frm) { return frm; } -int KyraEngine_HoF::seq_introHand3(WSAMovie_v2 *wsaObj, int x, int y, int frm) { - //NULLSUB (at least in FM-TOWNS version) +int SeqPlayer_HOF::cbHOF_hand3(WSAMovie_v2 *wsaObj, int x, int y, int frm) { return frm; } -int KyraEngine_HoF::seq_finaleFunters(WSAMovie_v2 *wsaObj, int x, int y, int frm) { - _seqSubFrameEndTimeInternal = 0; - int chatX = 0; - int chatY = 0; - int chatW = 0; - int chatFirstFrame = 0; - int chatLastFrame = 0; +int SeqPlayer_HOF::cbHOF_funters(WSAMovie_v2 *wsaObj, int x, int y, int frm) { + uint32 frameEnd = 0; + int subTitleX = 0; + int subTitleY = 0; + int subTitleW = 0; + int subTitleFirstFrame = 0; + int subTitleLastFrame = 0; uint16 voiceIndex = 0; switch (frm) { case -2: - seq_sequenceCommand(9); + doTransition(9); break; case 0: - _sound->playTrack(3); + _vm->sound()->playTrack(3); - _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0), 1, 255) & 0xff; - memset(_seqTextColorMap, _seqTextColor[1], 16); - _seqTextColor[0] = _seqTextColorMap[1] = 0xff; - _screen->setTextColorMap(_seqTextColorMap); + _textColor[1] = _screen->findLeastDifferentColor(_textColorPresets, _screen->getPalette(0), 1, 255) & 0xFF; + memset(_textColorMap, _textColor[1], 16); + _textColor[0] = _textColorMap[1] = 0xFF; + _screen->setTextColorMap(_textColorMap); - _seqSubFrameEndTimeInternal = _system->getMillis() + 480 * _tickLength; - seq_printCreditsString(81, 240, 70, _seqTextColorMap, 252); - seq_printCreditsString(82, 240, 90, _seqTextColorMap, _seqTextColor[0]); + frameEnd = _system->getMillis() + 480 * _vm->tickLength(); + printFadingText(81, 240, 70, _textColorMap, 252); + printFadingText(82, 240, 90, _textColorMap, _textColor[0]); _screen->copyPage(2, 12); - seq_playTalkText(_flags.isTalkie ? 28 : 24); - delay(_seqSubFrameEndTimeInternal - _system->getMillis()); - _seqTextColor[0] = 1; - - if (_flags.isTalkie) { - chatY = (_flags.lang == Common::FR_FRA) ? 70 : 78; - chatFirstFrame = 9; - chatLastFrame = 15; + playSoundAndDisplaySubTitle(_vm->gameFlags().isTalkie ? 28 : 24); + delayUntil(frameEnd); + _textColor[0] = 1; + + if (_vm->gameFlags().isTalkie) { + subTitleY = (_vm->gameFlags().lang == Common::FR_FRA) ? 70 : 78; + subTitleFirstFrame = 9; + subTitleLastFrame = 15; voiceIndex = 34; } else { - chatY = (_flags.lang == Common::FR_FRA) ? 78 : 70; - chatFirstFrame = 0; - chatLastFrame = 8; + subTitleY = (_vm->gameFlags().lang == Common::FR_FRA) ? 78 : 70; + subTitleFirstFrame = 0; + subTitleLastFrame = 8; } - chatX = (_flags.lang == Common::FR_FRA) ? 84 : 88; - chatW = 100; + subTitleX = (_vm->gameFlags().lang == Common::FR_FRA) ? 84 : 88; + subTitleW = 100; - seq_playWsaSyncDialogue(22, voiceIndex, 187, chatX, chatY, chatW, wsaObj, chatFirstFrame, chatLastFrame, x, y); + playDialogueAnimation(22, voiceIndex, 187, subTitleX, subTitleY, subTitleW, wsaObj, subTitleFirstFrame, subTitleLastFrame, x, y); break; case 9: case 16: - if (!((frm == 9 && !_flags.isTalkie) || (frm == 16 && _flags.isTalkie))) + if (!((frm == 9 && !_vm->gameFlags().isTalkie) || (frm == 16 && _vm->gameFlags().isTalkie))) break; - _seqFrameDelay = 12; + _animDuration = 12; - if (_flags.lang == Common::FR_FRA) { - chatX = 80; - chatW = 112; + if (_vm->gameFlags().lang == Common::FR_FRA) { + subTitleX = 80; + subTitleW = 112; } else { - chatX = (_flags.lang == Common::DE_DEU) ? 84 : 96; - chatW = 100; + subTitleX = (_vm->gameFlags().lang == Common::DE_DEU) ? 84 : 96; + subTitleW = 100; } - if (_flags.isTalkie) { - chatFirstFrame = 0; - chatLastFrame = 8; + if (_vm->gameFlags().isTalkie) { + subTitleFirstFrame = 0; + subTitleLastFrame = 8; voiceIndex = 35; } else { - chatFirstFrame = 9; - chatLastFrame = 15; + subTitleFirstFrame = 9; + subTitleLastFrame = 15; } - chatY = 70; + subTitleY = 70; - seq_playWsaSyncDialogue(23, voiceIndex, 137, chatX, chatY, chatW, wsaObj, chatFirstFrame, chatLastFrame, x, y); - if (_flags.isTalkie) - _seqWsaCurrentFrame = 17; + playDialogueAnimation(23, voiceIndex, 137, subTitleX, subTitleY, subTitleW, wsaObj, subTitleFirstFrame, subTitleLastFrame, x, y); + if (_vm->gameFlags().isTalkie) + _animCurrentFrame = 17; break; default: break; } - _seqFrameCounter++; + _callbackCurrentFrame++; return 0; } -int KyraEngine_HoF::seq_finaleFerb(WSAMovie_v2 *wsaObj, int x, int y, int frm) { - _seqSubFrameEndTimeInternal = 0; - int chatX = 0; - int chatY = 0; - int chatW = 0; - int chatFirstFrame = 0; - int chatLastFrame = 0; +int SeqPlayer_HOF::cbHOF_ferb(WSAMovie_v2 *wsaObj, int x, int y, int frm) { + uint32 frameEnd = 0; + int subTitleX = 0; + int subTitleY = 0; + int subTitleW = 0; + int subTitleFirstFrame = 0; + int subTitleLastFrame = 0; uint16 voiceIndex = 0; switch (frm) { case -2: - seq_sequenceCommand(9); - _seqSubFrameEndTimeInternal = _system->getMillis() + 480 * _tickLength; - seq_printCreditsString(34, 240, _flags.isTalkie ? 60 : 40, _seqTextColorMap, 252); - seq_printCreditsString(35, 240, _flags.isTalkie ? 70 : 50, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(36, 240, _flags.isTalkie ? 90 : 70, _seqTextColorMap, 252); - seq_printCreditsString(37, 240, _flags.isTalkie ? 100 : 90, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(38, 240, _flags.isTalkie ? 120 : 110, _seqTextColorMap, 252); - seq_printCreditsString(39, 240, _flags.isTalkie ? 130 : 120, _seqTextColorMap, _seqTextColor[0]); - if (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98) - seq_printCreditsString(103, 240, 130, _seqTextColorMap, _seqTextColor[0]); - delay(_seqSubFrameEndTimeInternal - _system->getMillis()); - _seqEndTime = 0; + doTransition(9); + frameEnd = _system->getMillis() + 480 * _vm->tickLength(); + printFadingText(34, 240, _vm->gameFlags().isTalkie ? 60 : 40, _textColorMap, 252); + printFadingText(35, 240, _vm->gameFlags().isTalkie ? 70 : 50, _textColorMap, _textColor[0]); + printFadingText(36, 240, _vm->gameFlags().isTalkie ? 90 : 70, _textColorMap, 252); + printFadingText(37, 240, _vm->gameFlags().isTalkie ? 100 : 90, _textColorMap, _textColor[0]); + printFadingText(38, 240, _vm->gameFlags().isTalkie ? 120 : 110, _textColorMap, 252); + printFadingText(39, 240, _vm->gameFlags().isTalkie ? 130 : 120, _textColorMap, _textColor[0]); + if (_vm->gameFlags().platform == Common::kPlatformFMTowns || _vm->gameFlags().platform == Common::kPlatformPC98) + printFadingText(103, 240, 130, _textColorMap, _textColor[0]); + delayUntil(frameEnd); + setCountDown(0); break; case 0: - _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0), 1, 255) & 0xff; - memset(_seqTextColorMap, _seqTextColor[1], 16); - _seqTextColor[0] = _seqTextColorMap[1] = 255; - _screen->setTextColorMap(_seqTextColorMap); + _textColor[1] = _screen->findLeastDifferentColor(_textColorPresets, _screen->getPalette(0), 1, 255) & 0xFF; + memset(_textColorMap, _textColor[1], 16); + _textColor[0] = _textColorMap[1] = 255; + _screen->setTextColorMap(_textColorMap); break; case 5: - if (!_flags.isTalkie) - seq_playTalkText(18); - _seqFrameDelay = 16; + if (!_vm->gameFlags().isTalkie) + playSoundAndDisplaySubTitle(18); + _animDuration = 16; - if (_flags.isTalkie) { - chatFirstFrame = 5; - chatLastFrame = 8; + if (_vm->gameFlags().isTalkie) { + subTitleFirstFrame = 5; + subTitleLastFrame = 8; voiceIndex = 22; } else { - chatLastFrame = 14; + subTitleLastFrame = 14; } - chatX = 116; - chatY = 90; - chatW = 60; + subTitleX = 116; + subTitleY = 90; + subTitleW = 60; - seq_playWsaSyncDialogue(24, voiceIndex, 149, chatX, chatY, chatW, wsaObj, chatFirstFrame, chatLastFrame, x, y); + playDialogueAnimation(24, voiceIndex, 149, subTitleX, subTitleY, subTitleW, wsaObj, subTitleFirstFrame, subTitleLastFrame, x, y); break; case 11: - if (_flags.isTalkie) - seq_playWsaSyncDialogue(24, 22, 149, 116, 90, 60, wsaObj, 11, 14, x, y); + if (_vm->gameFlags().isTalkie) + playDialogueAnimation(24, 22, 149, 116, 90, 60, wsaObj, 11, 14, x, y); break; case 16: - seq_playTalkText(_flags.isTalkie ? 23 : 19); - _seqFrameDelay = _flags.isTalkie ? 20 : 16; + playSoundAndDisplaySubTitle(_vm->gameFlags().isTalkie ? 23 : 19); + _animDuration = _vm->gameFlags().isTalkie ? 20 : 16; - if (_flags.lang == Common::FR_FRA) { - chatY = 48; - chatW = 88; + if (_vm->gameFlags().lang == Common::FR_FRA) { + subTitleY = 48; + subTitleW = 88; } else { - chatY = 60; - chatW = 100; + subTitleY = 60; + subTitleW = 100; } - chatX = 60; + subTitleX = 60; - if (_flags.isTalkie) + if (_vm->gameFlags().isTalkie) voiceIndex = 36; - seq_playWsaSyncDialogue(25, voiceIndex, 143, chatX, chatY, chatW, wsaObj, 16, 25, x, y); - _seqFrameDelay = 16; + playDialogueAnimation(25, voiceIndex, 143, subTitleX, subTitleY, subTitleW, wsaObj, 16, 25, x, y); + _animDuration = 16; break; default: break; } - _seqFrameCounter++; + _callbackCurrentFrame++; return 0; } -int KyraEngine_HoF::seq_finaleFish(WSAMovie_v2 *wsaObj, int x, int y, int frm) { - _seqSubFrameEndTimeInternal = 0; - int chatX = 0; - int chatY = 0; - int chatW = 0; +int SeqPlayer_HOF::cbHOF_fish(WSAMovie_v2 *wsaObj, int x, int y, int frm) { + uint32 frameEnd = 0; + int subTitleX = 0; + int subTitleY = 0; + int subTitleW = 0; uint16 voiceIndex = 0; switch (frm) { case -2: - seq_sequenceCommand(9); - _seqSubFrameEndTimeInternal = _system->getMillis() + 480 * _tickLength; + doTransition(9); + frameEnd = _system->getMillis() + 480 * _vm->tickLength(); - seq_printCreditsString(40, 240, _flags.isTalkie ? 55 : 40, _seqTextColorMap, 252); - seq_printCreditsString(41, 240, _flags.isTalkie ? 65 : 50, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(42, 240, _flags.isTalkie ? 75 : 60, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(43, 240, _flags.isTalkie ? 95 : 80, _seqTextColorMap, 252); - seq_printCreditsString(44, 240, _flags.isTalkie ? 105 : 90, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(93, 240, _flags.isTalkie ? 125 : 110, _seqTextColorMap, 252); - seq_printCreditsString(94, 240, _flags.isTalkie ? 135 : 120, _seqTextColorMap, _seqTextColor[0]); - delay(_seqSubFrameEndTimeInternal - _system->getMillis()); - _seqEndTime = 0; + printFadingText(40, 240, _vm->gameFlags().isTalkie ? 55 : 40, _textColorMap, 252); + printFadingText(41, 240, _vm->gameFlags().isTalkie ? 65 : 50, _textColorMap, _textColor[0]); + printFadingText(42, 240, _vm->gameFlags().isTalkie ? 75 : 60, _textColorMap, _textColor[0]); + printFadingText(43, 240, _vm->gameFlags().isTalkie ? 95 : 80, _textColorMap, 252); + printFadingText(44, 240, _vm->gameFlags().isTalkie ? 105 : 90, _textColorMap, _textColor[0]); + printFadingText(93, 240, _vm->gameFlags().isTalkie ? 125 : 110, _textColorMap, 252); + printFadingText(94, 240, _vm->gameFlags().isTalkie ? 135 : 120, _textColorMap, _textColor[0]); + delayUntil(frameEnd); + setCountDown(0); break; case 0: - _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0), 1, 255) & 0xff; - memset(_seqTextColorMap, _seqTextColor[1], 16); - _seqTextColor[0] = _seqTextColorMap[1] = 0xff; - _screen->setTextColorMap(_seqTextColorMap); + _textColor[1] = _screen->findLeastDifferentColor(_textColorPresets, _screen->getPalette(0), 1, 255) & 0xFF; + memset(_textColorMap, _textColor[1], 16); + _textColor[0] = _textColorMap[1] = 0xFF; + _screen->setTextColorMap(_textColorMap); break; case 4: - chatX = 94; - chatY = 42; - chatW = 100; - if (_flags.isTalkie) + subTitleX = 94; + subTitleY = 42; + subTitleW = 100; + if (_vm->gameFlags().isTalkie) voiceIndex = 37; - seq_playWsaSyncDialogue(26, voiceIndex, 149, chatX, chatY, chatW, wsaObj, 3, 12, x, y); + playDialogueAnimation(26, voiceIndex, 149, subTitleX, subTitleY, subTitleW, wsaObj, 3, 12, x, y); break; case 14: - seq_playTalkText(_flags.isTalkie ? 19 : 15); + playSoundAndDisplaySubTitle(_vm->gameFlags().isTalkie ? 19 : 15); break; case 23: - seq_playTalkText(_flags.isTalkie ? 20 : 16); + playSoundAndDisplaySubTitle(_vm->gameFlags().isTalkie ? 20 : 16); break; case 29: - chatX = (_flags.lang == Common::DE_DEU) ? 82 : ((_flags.lang == Common::FR_FRA) ? 92 : 88); - chatY = 40; - chatW = 100; + subTitleX = (_vm->gameFlags().lang == Common::DE_DEU) ? 82 : ((_vm->gameFlags().lang == Common::FR_FRA) ? 92 : 88); + subTitleY = 40; + subTitleW = 100; - if (_flags.isTalkie) { - if (_flags.lang == Common::DE_DEU) - chatY = 35; + if (_vm->gameFlags().isTalkie) { + if (_vm->gameFlags().lang == Common::DE_DEU) + subTitleY = 35; voiceIndex = 38; } - seq_playWsaSyncDialogue(27, voiceIndex, 187, chatX, chatY, chatW, wsaObj, 28, 34, x, y); + playDialogueAnimation(27, voiceIndex, 187, subTitleX, subTitleY, subTitleW, wsaObj, 28, 34, x, y); break; case 45: - seq_playTalkText(_flags.isTalkie ? 21 : 17); + playSoundAndDisplaySubTitle(_vm->gameFlags().isTalkie ? 21 : 17); break; case 50: - seq_playTalkText(_flags.isTalkie ? 29 : 25); + playSoundAndDisplaySubTitle(_vm->gameFlags().isTalkie ? 29 : 25); break; default: break; } - _seqFrameCounter++; + _callbackCurrentFrame++; return 0; } -int KyraEngine_HoF::seq_finaleFheep(WSAMovie_v2 *wsaObj, int x, int y, int frm) { - _seqSubFrameEndTimeInternal = 0; - int chatX = 0; - int chatY = 0; - int chatW = 0; - int chatFirstFrame = 0; - int chatLastFrame = 0; +int SeqPlayer_HOF::cbHOF_fheep(WSAMovie_v2 *wsaObj, int x, int y, int frm) { + uint32 frameEnd = 0; + int subTitleX = 0; + int subTitleY = 0; + int subTitleW = 0; + int subTitleFirstFrame = 0; + int subTitleLastFrame = 0; uint16 voiceIndex = 0; switch (frm) { @@ -1068,79 +2471,79 @@ int KyraEngine_HoF::seq_finaleFheep(WSAMovie_v2 *wsaObj, int x, int y, int frm) _screen->copyPage(12, 2); _screen->copyPage(2, 0); _screen->updateScreen(); - seq_sequenceCommand(9); - _seqSubFrameEndTimeInternal = _system->getMillis() + 480 * _tickLength; - seq_printCreditsString(49, 240, 20, _seqTextColorMap, 252); - seq_printCreditsString(50, 240, 30, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(51, 240, 40, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(52, 240, 50, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(53, 240, 60, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(54, 240, 70, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(55, 240, 80, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(56, 240, 90, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(57, 240, 100, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(58, 240, 110, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(60, 240, 120, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(61, 240, 130, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(62, 240, 140, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(63, 240, 150, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(64, 240, 160, _seqTextColorMap, _seqTextColor[0]); - - delay(_seqSubFrameEndTimeInternal - _system->getMillis()); - _seqEndTime = 0; + doTransition(9); + frameEnd = _system->getMillis() + 480 * _vm->tickLength(); + printFadingText(49, 240, 20, _textColorMap, 252); + printFadingText(50, 240, 30, _textColorMap, _textColor[0]); + printFadingText(51, 240, 40, _textColorMap, _textColor[0]); + printFadingText(52, 240, 50, _textColorMap, _textColor[0]); + printFadingText(53, 240, 60, _textColorMap, _textColor[0]); + printFadingText(54, 240, 70, _textColorMap, _textColor[0]); + printFadingText(55, 240, 80, _textColorMap, _textColor[0]); + printFadingText(56, 240, 90, _textColorMap, _textColor[0]); + printFadingText(57, 240, 100, _textColorMap, _textColor[0]); + printFadingText(58, 240, 110, _textColorMap, _textColor[0]); + printFadingText(60, 240, 120, _textColorMap, _textColor[0]); + printFadingText(61, 240, 130, _textColorMap, _textColor[0]); + printFadingText(62, 240, 140, _textColorMap, _textColor[0]); + printFadingText(63, 240, 150, _textColorMap, _textColor[0]); + printFadingText(64, 240, 160, _textColorMap, _textColor[0]); + + delayUntil(frameEnd); + setCountDown(0); break; case 0: - _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0), 1, 255) & 0xff; - memset(_seqTextColorMap, _seqTextColor[1], 16); - _seqTextColor[0] = _seqTextColorMap[1] = 0xff; - _screen->setTextColorMap(_seqTextColorMap); + _textColor[1] = _screen->findLeastDifferentColor(_textColorPresets, _screen->getPalette(0), 1, 255) & 0xFF; + memset(_textColorMap, _textColor[1], 16); + _textColor[0] = _textColorMap[1] = 0xFF; + _screen->setTextColorMap(_textColorMap); break; case 2: - seq_playTalkText(_flags.isTalkie ? 25 : 21); + playSoundAndDisplaySubTitle(_vm->gameFlags().isTalkie ? 25 : 21); - if (_flags.lang == Common::FR_FRA) { - chatX = 92; - chatY = 72; + if (_vm->gameFlags().lang == Common::FR_FRA) { + subTitleX = 92; + subTitleY = 72; } else { - chatX = (_flags.lang == Common::DE_DEU) ? 90 : 98; - chatY = 84; + subTitleX = (_vm->gameFlags().lang == Common::DE_DEU) ? 90 : 98; + subTitleY = 84; } - if (_flags.isTalkie) { - chatFirstFrame = 8; - chatLastFrame = 9; + if (_vm->gameFlags().isTalkie) { + subTitleFirstFrame = 8; + subTitleLastFrame = 9; voiceIndex = 39; } else { - chatFirstFrame = 2; - chatLastFrame = -8; + subTitleFirstFrame = 2; + subTitleLastFrame = -8; } - chatW = 100; + subTitleW = 100; - seq_playWsaSyncDialogue(28, voiceIndex, -1, chatX, chatY, chatW, wsaObj, chatFirstFrame, chatLastFrame, x, y); - if (_flags.isTalkie) - _seqWsaCurrentFrame = 4; + playDialogueAnimation(28, voiceIndex, -1, subTitleX, subTitleY, subTitleW, wsaObj, subTitleFirstFrame, subTitleLastFrame, x, y); + if (_vm->gameFlags().isTalkie) + _animCurrentFrame = 4; break; case 9: - seq_playTalkText(_flags.isTalkie ? 24 : 20); - _seqFrameDelay = 100; + playSoundAndDisplaySubTitle(_vm->gameFlags().isTalkie ? 24 : 20); + _animDuration = 100; break; default: break; } - _seqFrameCounter++; + _callbackCurrentFrame++; return 0; } -int KyraEngine_HoF::seq_finaleFarmer(WSAMovie_v2 *wsaObj, int x, int y, int frm) { - _seqSubFrameEndTimeInternal = 0; - int chatX = 0; - int chatY = 0; - int chatW = 0; +int SeqPlayer_HOF::cbHOF_farmer(WSAMovie_v2 *wsaObj, int x, int y, int frm) { + uint32 frameEnd = 0; + int subTitleX = 0; + int subTitleY = 0; + int subTitleW = 0; uint16 voiceIndex = 0; switch (frm) { @@ -1148,169 +2551,164 @@ int KyraEngine_HoF::seq_finaleFarmer(WSAMovie_v2 *wsaObj, int x, int y, int frm) _screen->copyPage(12, 2); _screen->copyPage(2, 0); _screen->updateScreen(); - seq_sequenceCommand(9); - _seqSubFrameEndTimeInternal = _system->getMillis() + 480 * _tickLength; - seq_printCreditsString(45, 240, 40, _seqTextColorMap, 252); - seq_printCreditsString(46, 240, 50, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(47, 240, 60, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(83, 240, 80, _seqTextColorMap, 252); - seq_printCreditsString(48, 240, 90, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(65, 240, 110, _seqTextColorMap, 252); - seq_printCreditsString(66, 240, 120, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(67, 240, 130, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(68, 240, 140, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(69, 240, 150, _seqTextColorMap, _seqTextColor[0]); - if (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98) - seq_printCreditsString(104, 240, 160, _seqTextColorMap, _seqTextColor[0]); - delay(_seqSubFrameEndTimeInternal - _system->getMillis()); - _seqEndTime = 0; + doTransition(9); + frameEnd = _system->getMillis() + 480 * _vm->tickLength(); + printFadingText(45, 240, 40, _textColorMap, 252); + printFadingText(46, 240, 50, _textColorMap, _textColor[0]); + printFadingText(47, 240, 60, _textColorMap, _textColor[0]); + printFadingText(83, 240, 80, _textColorMap, 252); + printFadingText(48, 240, 90, _textColorMap, _textColor[0]); + printFadingText(65, 240, 110, _textColorMap, 252); + printFadingText(66, 240, 120, _textColorMap, _textColor[0]); + printFadingText(67, 240, 130, _textColorMap, _textColor[0]); + printFadingText(68, 240, 140, _textColorMap, _textColor[0]); + printFadingText(69, 240, 150, _textColorMap, _textColor[0]); + if (_vm->gameFlags().platform == Common::kPlatformFMTowns || _vm->gameFlags().platform == Common::kPlatformPC98) + printFadingText(104, 240, 160, _textColorMap, _textColor[0]); + delayUntil(frameEnd); + setCountDown(0); break; case 0: - _seqTextColor[1] = 1 + (_screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0), 1, 254) & 0xff); - memset(_seqTextColorMap, _seqTextColor[1], 16); - _seqTextColorMap[1] = _seqTextColor[0] = 1 + (_screen->findLeastDifferentColor(_seqTextColorPresets + 3, _screen->getPalette(0), 1, 254) & 0xff); - _screen->setTextColorMap(_seqTextColorMap); - seq_playTalkText(_flags.isTalkie ? 30 : 26); + _textColor[1] = 1 + (_screen->findLeastDifferentColor(_textColorPresets, _screen->getPalette(0), 1, 254) & 0xFF); + memset(_textColorMap, _textColor[1], 16); + _textColorMap[1] = _textColor[0] = 1 + (_screen->findLeastDifferentColor(_textColorPresets + 3, _screen->getPalette(0), 1, 254) & 0xFF); + _screen->setTextColorMap(_textColorMap); + playSoundAndDisplaySubTitle(_vm->gameFlags().isTalkie ? 30 : 26); break; case 6: - if (_flags.isTalkie) - seq_playTalkText(18); + if (_vm->gameFlags().isTalkie) + playSoundAndDisplaySubTitle(18); break; case 12: - if (!_flags.isTalkie) - seq_playTalkText(14); + if (!_vm->gameFlags().isTalkie) + playSoundAndDisplaySubTitle(14); - chatX = 90; - chatY = 30; - chatW = 100; + subTitleX = 90; + subTitleY = 30; + subTitleW = 100; - if (_flags.isTalkie) { - if (_flags.lang == Common::FR_FRA || _flags.lang == Common::DE_DEU) { - chatX = 75; - chatY = 25; + if (_vm->gameFlags().isTalkie) { + if (_vm->gameFlags().lang == Common::FR_FRA || _vm->gameFlags().lang == Common::DE_DEU) { + subTitleX = 75; + subTitleY = 25; } voiceIndex = 40; } - seq_playWsaSyncDialogue(29, voiceIndex, 150, chatX, chatY, chatW, wsaObj, 12, -21, x, y); + playDialogueAnimation(29, voiceIndex, 150, subTitleX, subTitleY, subTitleW, wsaObj, 12, -21, x, y); break; default: break; } - _seqFrameCounter++; + _callbackCurrentFrame++; return 0; } -int KyraEngine_HoF::seq_finaleFuards(WSAMovie_v2 *wsaObj, int x, int y, int frm) { - _seqSubFrameEndTimeInternal = 0; - int chatX = 0; - int chatY = 0; - int chatW = 0; - int chatFirstFrame = 0; - int chatLastFrame = 0; - //int textCol = 0; +int SeqPlayer_HOF::cbHOF_fuards(WSAMovie_v2 *wsaObj, int x, int y, int frm) { + uint32 frameEnd = 0; + int subTitleX = 0; + int subTitleY = 0; + int subTitleW = 0; + int subTitleFirstFrame = 0; + int subTitleLastFrame = 0; uint16 voiceIndex = 0; switch (frm) { case -2: - seq_sequenceCommand(9); - _seqSubFrameEndTimeInternal = _system->getMillis() + 480 * _tickLength; - seq_printCreditsString(70, 240, 20, _seqTextColorMap, 252); - seq_printCreditsString(71, 240, 30, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(72, 240, 40, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(73, 240, 50, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(74, 240, 60, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(75, 240, 70, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(101, 240, 80, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(102, 240, 90, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(87, 240, 100, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(88, 240, 110, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(89, 240, 120, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(90, 240, 130, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(91, 240, 140, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(92, 240, 150, _seqTextColorMap, _seqTextColor[0]); - delay(_seqSubFrameEndTimeInternal - _system->getMillis()); - _seqEndTime = 0; + doTransition(9); + frameEnd = _system->getMillis() + 480 * _vm->tickLength(); + printFadingText(70, 240, 20, _textColorMap, 252); + printFadingText(71, 240, 30, _textColorMap, _textColor[0]); + printFadingText(72, 240, 40, _textColorMap, _textColor[0]); + printFadingText(73, 240, 50, _textColorMap, _textColor[0]); + printFadingText(74, 240, 60, _textColorMap, _textColor[0]); + printFadingText(75, 240, 70, _textColorMap, _textColor[0]); + printFadingText(101, 240, 80, _textColorMap, _textColor[0]); + printFadingText(102, 240, 90, _textColorMap, _textColor[0]); + printFadingText(87, 240, 100, _textColorMap, _textColor[0]); + printFadingText(88, 240, 110, _textColorMap, _textColor[0]); + printFadingText(89, 240, 120, _textColorMap, _textColor[0]); + printFadingText(90, 240, 130, _textColorMap, _textColor[0]); + printFadingText(91, 240, 140, _textColorMap, _textColor[0]); + printFadingText(92, 240, 150, _textColorMap, _textColor[0]); + delayUntil(frameEnd); + setCountDown(0); break; case 0: for (int i = 0; i < 0x300; i++) - _screen->getPalette(0)[i] &= 0x3f; - _seqTextColor[1] = 0xCf; - memset(_seqTextColorMap, _seqTextColor[1], 16); - _seqTextColor[0] = _seqTextColorMap[1] = 0xfe; + _screen->getPalette(0)[i] &= 0x3F; + _textColor[1] = 0xCf; + memset(_textColorMap, _textColor[1], 16); + _textColor[0] = _textColorMap[1] = 0xFE; - _screen->setTextColorMap(_seqTextColorMap); + _screen->setTextColorMap(_textColorMap); break; case 6: - _seqFrameDelay = 20; + _animDuration = 20; - if (_flags.isTalkie) { - chatX = 82; - //textCol = 143; - chatFirstFrame = 16; - chatLastFrame = 21; + if (_vm->gameFlags().isTalkie) { + subTitleX = 82; + subTitleFirstFrame = 16; + subTitleLastFrame = 21; voiceIndex = 41; } else { - chatX = 62; - //textCol = 137; - chatFirstFrame = 9; - chatLastFrame = 13; + subTitleX = 62; + subTitleFirstFrame = 9; + subTitleLastFrame = 13; } - chatY = (_flags.lang == Common::FR_FRA || _flags.lang == Common::DE_DEU) ? 88 :100; - chatW = 80; + subTitleY = (_vm->gameFlags().lang == Common::FR_FRA || _vm->gameFlags().lang == Common::DE_DEU) ? 88 :100; + subTitleW = 80; - seq_playWsaSyncDialogue(30, voiceIndex, 137, chatX, chatY, chatW, wsaObj, chatFirstFrame, chatLastFrame, x, y); - if (_flags.isTalkie) - _seqWsaCurrentFrame = 8; + playDialogueAnimation(30, voiceIndex, 137, subTitleX, subTitleY, subTitleW, wsaObj, subTitleFirstFrame, subTitleLastFrame, x, y); + if (_vm->gameFlags().isTalkie) + _animCurrentFrame = 8; break; case 9: case 16: - if (_flags.isTalkie) { + if (_vm->gameFlags().isTalkie) { if (frm == 16) break; - chatX = 64; - //textCol = 137; - chatFirstFrame = 9; - chatLastFrame = 13; + subTitleX = 64; + subTitleFirstFrame = 9; + subTitleLastFrame = 13; voiceIndex = 42; } else { if (frm == 9) break; - chatX = 80; - //textCol = 143; - chatFirstFrame = 16; - chatLastFrame = 21; + subTitleX = 80; + subTitleFirstFrame = 16; + subTitleLastFrame = 21; } - chatY = 100; - chatW = 100; + subTitleY = 100; + subTitleW = 100; - seq_playWsaSyncDialogue(31, voiceIndex, 143, chatX, chatY, chatW, wsaObj, chatFirstFrame, chatLastFrame, x, y); - if (_flags.isTalkie) - _seqWsaCurrentFrame = 21; + playDialogueAnimation(31, voiceIndex, 143, subTitleX, subTitleY, subTitleW, wsaObj, subTitleFirstFrame, subTitleLastFrame, x, y); + if (_vm->gameFlags().isTalkie) + _animCurrentFrame = 21; break; default: break; } - _seqFrameCounter++; + _callbackCurrentFrame++; return 0; } -int KyraEngine_HoF::seq_finaleFirates(WSAMovie_v2 *wsaObj, int x, int y, int frm) { - _seqSubFrameEndTimeInternal = 0; - int chatX = 0; - int chatY = 0; - int chatW = 0; +int SeqPlayer_HOF::cbHOF_firates(WSAMovie_v2 *wsaObj, int x, int y, int frm) { + uint32 frameEnd = 0; + int subTitleX = 0; + int subTitleY = 0; + int subTitleW = 0; uint16 voiceIndex = 0; switch (frm) { @@ -1318,87 +2716,87 @@ int KyraEngine_HoF::seq_finaleFirates(WSAMovie_v2 *wsaObj, int x, int y, int frm _screen->copyPage(12, 2); _screen->copyPage(2, 0); _screen->updateScreen(); - seq_sequenceCommand(9); - _seqSubFrameEndTimeInternal = _system->getMillis() + 480 * _tickLength; - seq_printCreditsString(76, 240, 40, _seqTextColorMap, 252); - seq_printCreditsString(77, 240, 50, _seqTextColorMap, 252); - seq_printCreditsString(78, 240, 60, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(79, 240, 70, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(80, 240, 80, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(84, 240, 100, _seqTextColorMap, 252); - seq_printCreditsString(85, 240, 110, _seqTextColorMap, _seqTextColor[0]); - seq_printCreditsString(99, 240, 130, _seqTextColorMap, 252); - seq_printCreditsString(100, 240, 140, _seqTextColorMap, _seqTextColor[0]); - delay(_seqSubFrameEndTimeInternal - _system->getMillis()); - _seqEndTime = 0; + doTransition(9); + frameEnd = _system->getMillis() + 480 * _vm->tickLength(); + printFadingText(76, 240, 40, _textColorMap, 252); + printFadingText(77, 240, 50, _textColorMap, 252); + printFadingText(78, 240, 60, _textColorMap, _textColor[0]); + printFadingText(79, 240, 70, _textColorMap, _textColor[0]); + printFadingText(80, 240, 80, _textColorMap, _textColor[0]); + printFadingText(84, 240, 100, _textColorMap, 252); + printFadingText(85, 240, 110, _textColorMap, _textColor[0]); + printFadingText(99, 240, 130, _textColorMap, 252); + printFadingText(100, 240, 140, _textColorMap, _textColor[0]); + delayUntil(frameEnd); + setCountDown(0); break; case 0: - _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0), 1, 255) & 0xff; - memset(_seqTextColorMap, _seqTextColor[1], 16); - _seqTextColor[0] = _seqTextColorMap[1] = 0xff; - _screen->setTextColorMap(_seqTextColorMap); + _textColor[1] = _screen->findLeastDifferentColor(_textColorPresets, _screen->getPalette(0), 1, 255) & 0xFF; + memset(_textColorMap, _textColor[1], 16); + _textColor[0] = _textColorMap[1] = 0xFF; + _screen->setTextColorMap(_textColorMap); break; case 6: - seq_playTalkText(_flags.isTalkie ? 31 : 27); + playSoundAndDisplaySubTitle(_vm->gameFlags().isTalkie ? 31 : 27); break; case 14: case 15: - if (!((frm == 15 && !_flags.isTalkie) || (frm == 14 && _flags.isTalkie))) + if (!((frm == 15 && !_vm->gameFlags().isTalkie) || (frm == 14 && _vm->gameFlags().isTalkie))) break; - seq_playTalkText(_flags.isTalkie ? 31 : 27); + playSoundAndDisplaySubTitle(_vm->gameFlags().isTalkie ? 31 : 27); - if (_flags.lang == Common::DE_DEU) { - chatX = 82; - chatY = 84; - chatW = 140; + if (_vm->gameFlags().lang == Common::DE_DEU) { + subTitleX = 82; + subTitleY = 84; + subTitleW = 140; } else { - chatX = 74; - chatY = (_flags.lang == Common::FR_FRA) ? 96: 108; - chatW = 80; + subTitleX = 74; + subTitleY = (_vm->gameFlags().lang == Common::FR_FRA) ? 96: 108; + subTitleW = 80; } - if (_flags.isTalkie) + if (_vm->gameFlags().isTalkie) voiceIndex = 43; - seq_playWsaSyncDialogue(32, voiceIndex, 137, chatX, chatY, chatW, wsaObj, 14, 16, x, y); + playDialogueAnimation(32, voiceIndex, 137, subTitleX, subTitleY, subTitleW, wsaObj, 14, 16, x, y); break; case 28: - seq_playTalkText(_flags.isTalkie ? 32 : 28); + playSoundAndDisplaySubTitle(_vm->gameFlags().isTalkie ? 32 : 28); break; case 29: - seq_playTalkText(_flags.isTalkie ? 33 : 29); + playSoundAndDisplaySubTitle(_vm->gameFlags().isTalkie ? 33 : 29); break; case 31: - if (_flags.isTalkie) + if (_vm->gameFlags().isTalkie) voiceIndex = 44; - chatX = 90; - chatY = (_flags.lang == Common::DE_DEU) ? 60 : 76; - chatW = 80; + subTitleX = 90; + subTitleY = (_vm->gameFlags().lang == Common::DE_DEU) ? 60 : 76; + subTitleW = 80; - seq_playWsaSyncDialogue(33, voiceIndex, 143, chatX, chatY, chatW, wsaObj, 31, 34, x, y); + playDialogueAnimation(33, voiceIndex, 143, subTitleX, subTitleY, subTitleW, wsaObj, 31, 34, x, y); break; case 35: - _seqFrameDelay = 300; + _animDuration = 300; break; default: break; } - _seqFrameCounter++; + _callbackCurrentFrame++; return 0; } -int KyraEngine_HoF::seq_finaleFrash(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +int SeqPlayer_HOF::cbHOF_frash(WSAMovie_v2 *wsaObj, int x, int y, int frm) { int tmp = 0; switch (frm) { @@ -1408,473 +2806,440 @@ int KyraEngine_HoF::seq_finaleFrash(WSAMovie_v2 *wsaObj, int x, int y, int frm) _screen->copyPage(2, 12); _screen->copyPage(2, 0); _screen->updateScreen(); - _seqFrameCounter = 0; - seq_loadNestedSequence(0, kSequenceFiggle); + _callbackCurrentFrame = 0; + startNestedAnimation(0, kNestedSequenceFiggle); break; case -1: - if (_flags.isTalkie) - seq_finaleActorScreen(); - _seqSpecialFlag = _flags.isTalkie; + if (_vm->gameFlags().isTalkie) + playHoFTalkieCredits(); + _talkieFinaleExtraFlag = _vm->gameFlags().isTalkie; break; case 0: - if (_seqFrameCounter == 1) { - _sound->playTrack(4); - _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0), 1, 255) & 0xff; - memset(_seqTextColorMap, _seqTextColor[1], 16); - _seqTextColor[0] = _seqTextColorMap[1] = 0xff; - _screen->setTextColorMap(_seqTextColorMap); + if (_callbackCurrentFrame == 1) { + _vm->sound()->playTrack(4); + _textColor[1] = _screen->findLeastDifferentColor(_textColorPresets, _screen->getPalette(0), 1, 255) & 0xFF; + memset(_textColorMap, _textColor[1], 16); + _textColor[0] = _textColorMap[1] = 0xFF; + _screen->setTextColorMap(_textColorMap); } - _seqFrameDelay = 10; + _animDuration = 10; break; case 1: - if (_seqFrameCounter < 20 && _seqSpecialFlag) { - _seqWsaCurrentFrame = 0; + if (_callbackCurrentFrame < 20 && _talkieFinaleExtraFlag) { + _animCurrentFrame = 0; } else { - _seqFrameDelay = _flags.isTalkie ? 500 : (300 + _rnd.getRandomNumberRng(1, 300)); - seq_playTalkText(_flags.isTalkie ? 26 : 22); - if (_seqSpecialFlag) { - _seqFrameCounter = 3; - _seqSpecialFlag = false; + _animDuration = _vm->gameFlags().isTalkie ? 500 : (300 + _vm->_rnd.getRandomNumberRng(1, 300)); + playSoundAndDisplaySubTitle(_vm->gameFlags().isTalkie ? 26 : 22); + if (_talkieFinaleExtraFlag) { + _callbackCurrentFrame = 3; + _talkieFinaleExtraFlag = false; } } break; case 2: - _seqFrameDelay = 20; + _animDuration = 20; break; case 3: - seq_playTalkText(_flags.isTalkie ? 27 : 23); - _seqFrameDelay = _flags.isTalkie ? 500 : (300 + _rnd.getRandomNumberRng(1, 300)); + playSoundAndDisplaySubTitle(_vm->gameFlags().isTalkie ? 27 : 23); + _animDuration = _vm->gameFlags().isTalkie ? 500 : (300 + _vm->_rnd.getRandomNumberRng(1, 300)); break; case 4: - _seqFrameDelay = 10; + _animDuration = 10; break; case 5: - seq_playTalkText(_flags.isTalkie ? 27 : 23); - tmp = _seqFrameCounter / 6; + playSoundAndDisplaySubTitle(_vm->gameFlags().isTalkie ? 27 : 23); + tmp = _callbackCurrentFrame / 6; if (tmp == 2) - _seqFrameDelay = _flags.isTalkie ? 7 : (1 + _rnd.getRandomNumberRng(1, 10)); + _animDuration = _vm->gameFlags().isTalkie ? 7 : (1 + _vm->_rnd.getRandomNumberRng(1, 10)); else if (tmp < 2) - _seqFrameDelay = _flags.isTalkie ? 500 : (300 + _rnd.getRandomNumberRng(1, 300)); + _animDuration = _vm->gameFlags().isTalkie ? 500 : (300 + _vm->_rnd.getRandomNumberRng(1, 300)); break; case 6: - _seqFrameDelay = 10; - tmp = _seqFrameCounter / 6; + _animDuration = 10; + tmp = _callbackCurrentFrame / 6; if (tmp == 2) - _seqWsaCurrentFrame = 4; + _animCurrentFrame = 4; else if (tmp < 2) - _seqWsaCurrentFrame = 0; + _animCurrentFrame = 0; break; case 7: - _seqFrameCounter = 0; - _seqFrameDelay = 5; - seq_playTalkText(_flags.isTalkie ? 26 : 22); + _callbackCurrentFrame = 0; + _animDuration = 5; + playSoundAndDisplaySubTitle(_vm->gameFlags().isTalkie ? 26 : 22); break; case 11: - if (_seqFrameCounter < 8) - _seqWsaCurrentFrame = 8; + if (_callbackCurrentFrame < 8) + _animCurrentFrame = 8; break; default: break; } - _seqFrameCounter++; + _callbackCurrentFrame++; return 0; } -void KyraEngine_HoF::seq_finaleActorScreen() { - static const uint8 colormap[] = {0, 0, 102, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - static const ScreenDim d = { 0x00, 0x0C, 0x28, 0xB4, 0xFF, 0x00, 0x00, 0x00 }; - - _screen->loadBitmap("finale.cps", 3, 3, &_screen->getPalette(0)); - _screen->setFont(Screen::FID_GOLDFONT_FNT); - - int talkieCreditsSize, talkieCreditsSpecialSize; - const uint8 *talkieCredits = _staticres->loadRawData(k2SeqplayCredits, talkieCreditsSize); - const char * const *talkieCreditsSpecial = _staticres->loadStrings(k2SeqplayCreditsSpecial, talkieCreditsSpecialSize); - - _sound->setSoundList(&_soundData[kMusicIngame]); - _sound->loadSoundFile(3); - _sound->playTrack(3); - - _screen->setTextColorMap(colormap); - _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0); - _screen->updateScreen(); - _screen->fadeFromBlack(); - - _screen->_charWidth = -2; - uint8 *dataPtr = new uint8[0xafd]; - memcpy(dataPtr, talkieCredits, talkieCreditsSize); - _staticres->unloadId(k2SeqplayCredits); - - seq_displayScrollText(dataPtr, &d, 2, 6, 5, 1, Screen::FID_GOLDFONT_FNT, Screen::FID_GOLDFONT_FNT, 0, talkieCreditsSpecial); - delay(120); - - delete[] dataPtr; - _staticres->unloadId(k2SeqplayCreditsSpecial); - _sound->setSoundList(&_soundData[kMusicFinale]); - _sound->loadSoundFile(0); -} - -int KyraEngine_HoF::seq_finaleFiggle(WSAMovie_v2 *wsaObj, int x, int y, int frm) { - if (_seqFrameCounter == 10) - _seqEndTime = 0; - if (_seqFrameCounter == 10 || _seqFrameCounter == 5 || _seqFrameCounter == 7) - seq_playTalkText(_flags.isTalkie ? 45 : 30); +int SeqPlayer_HOF::cbHOF_figgle(WSAMovie_v2 *wsaObj, int x, int y, int frm) { + if (_callbackCurrentFrame == 10) + setCountDown(0); + if (_callbackCurrentFrame == 10 || _callbackCurrentFrame == 5 || _callbackCurrentFrame == 7) + playSoundAndDisplaySubTitle(_vm->gameFlags().isTalkie ? 45 : 30); - _seqFrameCounter++; + _callbackCurrentFrame++; return frm; } -int KyraEngine_HoF::seq_demoVirgin(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +int SeqPlayer_HOF::cbHOFDEMO_virgin(WSAMovie_v2 *wsaObj, int x, int y, int frm) { if (!frm) - delay(50 * _tickLength); + delayTicks(50); return 0; } -int KyraEngine_HoF::seq_demoWestwood(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +int SeqPlayer_HOF::cbHOFDEMO_westwood(WSAMovie_v2 *wsaObj, int x, int y, int frm) { if (!frm) - _sound->playTrack(2); + _vm->sound()->playTrack(2); return 0; } -int KyraEngine_HoF::seq_demoTitle(WSAMovie_v2 *wsaObj, int x, int y, int frm) { + +int SeqPlayer_HOF::cbHOFDEMO_title(WSAMovie_v2 *wsaObj, int x, int y, int frm) { if (!frm) { - _sound->playTrack(3); + _vm->sound()->playTrack(3); } else if (frm == 25) { - delay(60 * _tickLength); - _seqEndTime = 0; - seq_sequenceCommand(0); + delayTicks(60); + setCountDown(0); + doTransition(0); } return 0; } -int KyraEngine_HoF::seq_demoHill(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +int SeqPlayer_HOF::cbHOFDEMO_hill(WSAMovie_v2 *wsaObj, int x, int y, int frm) { if (!frm) { - _sound->playTrack(4); + _vm->sound()->playTrack(4); } else if (frm == 25) { - seq_loadNestedSequence(0, kSequenceDemoWater); - _seqFrameDelay--; + startNestedAnimation(0, kNestedSequenceHoFDemoWater); + _animDuration--; } else if (frm > 25 && frm < 50) { - if (_seqFrameDelay > 3) - _seqFrameDelay--; + if (_animDuration > 3) + _animDuration--; } else if (frm == 95) { - _seqFrameDelay = 70; + _animDuration = 70; } else if (frm == 96) { - _seqFrameDelay = 7; + _animDuration = 7; } else if (frm == 129) { - seq_resetActiveWSA(0); + closeNestedAnimation(0); } return 0; } -int KyraEngine_HoF::seq_demoOuthome(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +int SeqPlayer_HOF::cbHOFDEMO_outhome(WSAMovie_v2 *wsaObj, int x, int y, int frm) { switch (frm) { case 12: - seq_playTalkText(4); + playSoundAndDisplaySubTitle(4); break; case 32: - seq_playTalkText(7); + playSoundAndDisplaySubTitle(7); break; case 36: - seq_playTalkText(10); + playSoundAndDisplaySubTitle(10); break; case 57: - seq_playTalkText(9); + playSoundAndDisplaySubTitle(9); break; case 80: case 96: case 149: - _seqFrameDelay = 70; + _animDuration = 70; break; case 81: case 97: - _seqFrameDelay = 5; + _animDuration = 5; break; case 110: - seq_playTalkText(5); + playSoundAndDisplaySubTitle(5); break; case 137: - seq_playTalkText(6); + playSoundAndDisplaySubTitle(6); break; } return 0; } -int KyraEngine_HoF::seq_demoWharf(WSAMovie_v2 *wsaObj, int x, int y, int frm) { - if (!_seqFrameCounter) - seq_loadNestedSequence(0, kSequenceDemoWharf2); +int SeqPlayer_HOF::cbHOFDEMO_wharf(WSAMovie_v2 *wsaObj, int x, int y, int frm) { + if (!_callbackCurrentFrame) + startNestedAnimation(0, kNestedSequenceHoFDemoWharf2); switch (frm) { case 0: - seq_playTalkText(11); + playSoundAndDisplaySubTitle(11); break; case 5: - if ((_seqFrameCounter / 8) <= 2 || _activeWSA[0].flags != -1) - _seqWsaCurrentFrame = 0; + if ((_callbackCurrentFrame / 8) <= 2 || _animSlots[0].flags != -1) + _animCurrentFrame = 0; else - seq_resetActiveWSA(0); + closeNestedAnimation(0); break; case 6: - seq_resetActiveWSA(0); + closeNestedAnimation(0); break; case 8: case 10: - seq_playTalkText(2); + playSoundAndDisplaySubTitle(2); break; case 13: - seq_playTalkText(7); + playSoundAndDisplaySubTitle(7); break; case 16: - seq_playTalkText(12); + playSoundAndDisplaySubTitle(12); break; default: break; } - _seqFrameCounter++; + _callbackCurrentFrame++; return 0; } -int KyraEngine_HoF::seq_demoDinob(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +int SeqPlayer_HOF::cbHOFDEMO_dinob(WSAMovie_v2 *wsaObj, int x, int y, int frm) { if (frm == 0) { - if (!(_seqFrameCounter/8)) { - seq_loadNestedSequence(0, kSequenceDemoDinob2); - _seqWsaCurrentFrame = 0; + if (!(_callbackCurrentFrame/8)) { + startNestedAnimation(0, kNestedSequenceHoFDemoDinob2); + _animCurrentFrame = 0; } } else if (frm == 3) { - if (_activeWSA[0].flags != -1) { - _seqWsaCurrentFrame = 0; + if (_animSlots[0].flags != -1) { + _animCurrentFrame = 0; } else { - seq_resetActiveWSA(0); + closeNestedAnimation(0); _screen->copyPage(2, 12); } } else if (frm == 4) { - seq_resetActiveWSA(0); + closeNestedAnimation(0); } - _seqFrameCounter++; + _callbackCurrentFrame++; return 0; } -int KyraEngine_HoF::seq_demoFisher(WSAMovie_v2 *wsaObj, int x, int y, int frm) { - if (((_system->getMillis() - _seqStartTime) / (5 * _tickLength)) > 0) { - _seqStartTime = _system->getMillis(); - if (!_seqFrameCounter) { - seq_loadNestedSequence(0, kSequenceDemoBail); - seq_loadNestedSequence(1, kSequenceDemoDig); +int SeqPlayer_HOF::cbHOFDEMO_fisher(WSAMovie_v2 *wsaObj, int x, int y, int frm) { + if (((_system->getMillis() - _fisherAnimCurTime) / (5 * _vm->tickLength())) > 0) { + _fisherAnimCurTime = _system->getMillis(); + if (!_callbackCurrentFrame) { + startNestedAnimation(0, kNestedSequenceHoFDemoBail); + startNestedAnimation(1, kNestedSequenceHoFDemoDig); } - if (_seqScrollTextCounter >= 0x18f && !_seqFrameCounter) + if (_scrollProgressCounter >= 0x18F && !_callbackCurrentFrame) return 0; - if (!_seqFrameCounter) { + if (!_callbackCurrentFrame) { _screen->loadBitmap("adtext.cps", 4, 4, 0); _screen->loadBitmap("adtext2.cps", 6, 6, 0); _screen->copyPageMemory(6, 0, 4, 64000, 1024); _screen->copyPageMemory(6, 1023, 6, 0, 64000); - _seqScrollTextCounter = 0; + _scrollProgressCounter = 0; } - seq_scrollPage(24, 144); - _seqFrameCounter++; - if (_seqFrameCounter < 0x256 || _seqFrameCounter > 0x31c) { - if (_seqFrameCounter < 0x174 || _seqFrameCounter > 0x1d7) { - if (_seqFrameCounter < 0x84 || _seqFrameCounter > 0xe7) { - _seqScrollTextCounter++; + updateDemoAdText(24, 144); + _callbackCurrentFrame++; + if (_callbackCurrentFrame < 0x256 || _callbackCurrentFrame > 0x31C) { + if (_callbackCurrentFrame < 0x174 || _callbackCurrentFrame > 0x1D7) { + if (_callbackCurrentFrame < 0x84 || _callbackCurrentFrame > 0xE7) { + _scrollProgressCounter++; } } } - if (_seqFrameCounter > 0x31e) { - seq_resetActiveWSA(0); - seq_resetActiveWSA(1); - _seqEndTime = 0; + if (_callbackCurrentFrame > 0x31E) { + closeNestedAnimation(0); + closeNestedAnimation(1); + setCountDown(0); _screen->copyPage(2, 12); } } else { - seq_scrollPage(24, 144); + updateDemoAdText(24, 144); } return 0; } -int KyraEngine_HoF::seq_demoWharf2(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +int SeqPlayer_HOF::cbHOFDEMO_wharf2(WSAMovie_v2 *wsaObj, int x, int y, int frm) { if (frm == 69) - _seqWsaCurrentFrame = 8; + _animCurrentFrame = 8; return frm; } -int KyraEngine_HoF::seq_demoDinob2(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +int SeqPlayer_HOF::cbHOFDEMO_dinob2(WSAMovie_v2 *wsaObj, int x, int y, int frm) { switch (frm) { case 19: - seq_playTalkText(13); + playSoundAndDisplaySubTitle(13); break; case 54: - seq_playTalkText(15); + playSoundAndDisplaySubTitle(15); break; case 61: - seq_playTalkText(16); + playSoundAndDisplaySubTitle(16); break; case 69: - seq_playTalkText(14); + playSoundAndDisplaySubTitle(14); break; case 77: - seq_playTalkText(13); + playSoundAndDisplaySubTitle(13); break; case 79: - _seqWsaCurrentFrame = 4; + _animCurrentFrame = 4; break; } return frm; } -int KyraEngine_HoF::seq_demoWater(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +int SeqPlayer_HOF::cbHOFDEMO_water(WSAMovie_v2 *wsaObj, int x, int y, int frm) { if (frm == 1) - seq_playTalkText(11); + playSoundAndDisplaySubTitle(11); return frm; } -int KyraEngine_HoF::seq_demoBail(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +int SeqPlayer_HOF::cbHOFDEMO_bail(WSAMovie_v2 *wsaObj, int x, int y, int frm) { return frm; } -int KyraEngine_HoF::seq_demoDig(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +int SeqPlayer_HOF::cbHOFDEMO_dig(WSAMovie_v2 *wsaObj, int x, int y, int frm) { return frm; } #ifdef ENABLE_LOL -int KyraEngine_HoF::seq_lolDemoScene1(WSAMovie_v2 *wsaObj, int x, int y, int frm) { +int SeqPlayer_HOF::cbLOLDEMO_scene1(WSAMovie_v2 *wsaObj, int x, int y, int frm) { Palette &tmpPal = _screen->getPalette(2); - if (!(_seqFrameCounter % 100)) { - if (_seqFrameCounter == 0) { - _sound->haltTrack(); - _sound->playTrack(6); + if (!(_callbackCurrentFrame % 100)) { + if (_callbackCurrentFrame == 0) { + _vm->sound()->haltTrack(); + _vm->sound()->playTrack(6); } tmpPal.copy(_screen->getPalette(0)); - for (int i = 3; i < 0x300; i++) { + for (int i = 3; i < 768; i++) { tmpPal[i] = ((int)tmpPal[i] * 120) / 64; - if (tmpPal[i] > 0x3f) - tmpPal[i] = 0x3f; + if (tmpPal[i] > 0x3F) + tmpPal[i] = 0x3F; } - seq_playTalkText(_rnd.getRandomBit()); + playSoundAndDisplaySubTitle(_vm->_rnd.getRandomBit()); _screen->setScreenPalette(tmpPal); _screen->updateScreen(); - delay(8); + _vm->delay(8); } else { _screen->setScreenPalette(_screen->getPalette(0)); _screen->updateScreen(); - if (_seqFrameCounter == 40) - seq_playTalkText(3); + if (_callbackCurrentFrame == 40) + playSoundAndDisplaySubTitle(3); } - _seqFrameCounter++; + _callbackCurrentFrame++; return frm; } -int KyraEngine_HoF::seq_lolDemoScene2(WSAMovie_v2 *wsaObj, int x, int y, int frm) { - switch (_seqFrameCounter - 17) { +int SeqPlayer_HOF::cbLOLDEMO_scene2(WSAMovie_v2 *wsaObj, int x, int y, int frm) { + switch (frm - 17) { case 0: - _seqFrameDelay = 8; + _animDuration = 8; break; case 3: case 6: case 9: - seq_playTalkText(8); + playSoundEffect(8, 255 - ((26 - frm) << 3)); break; case 15: - seq_playTalkText(9); + playSoundAndDisplaySubTitle(9); break; case 18: - seq_playTalkText(2); + playSoundAndDisplaySubTitle(2); break; default: break; } - _seqFrameCounter++; + _callbackCurrentFrame++; return frm; } -int KyraEngine_HoF::seq_lolDemoScene3(WSAMovie_v2 *wsaObj, int x, int y, int frm) { - if (_seqFrameCounter == 1) - seq_playTalkText(6); - else if (frm == 26) - seq_playTalkText(7); +int SeqPlayer_HOF::cbLOLDEMO_scene3(WSAMovie_v2 *wsaObj, int x, int y, int frm) { + if (frm == 1) + playSoundAndDisplaySubTitle(6); + else if (frm == 24) + playSoundAndDisplaySubTitle(7); - _seqFrameCounter++; + _callbackCurrentFrame++; return frm; } -int KyraEngine_HoF::seq_lolDemoScene4(WSAMovie_v2 *wsaObj, int x, int y, int frm) { - switch (_seqFrameCounter) { +int SeqPlayer_HOF::cbLOLDEMO_scene4(WSAMovie_v2 *wsaObj, int x, int y, int frm) { + switch (frm) { case 11: case 14: case 17: case 20: - seq_playTalkText(8); + playSoundEffect(8, 255 - ((22 - frm) << 3)); break; case 22: - seq_playTalkText(11); + playSoundAndDisplaySubTitle(11); break; case 24: - seq_playTalkText(8); + playSoundAndDisplaySubTitle(8); break; case 30: - seq_playTalkText(15); + playSoundAndDisplaySubTitle(15); break; case 34: - seq_playTalkText(14); + playSoundAndDisplaySubTitle(14); break; case 38: - seq_playTalkText(13); + playSoundAndDisplaySubTitle(13); break; case 42: - seq_playTalkText(12); + playSoundAndDisplaySubTitle(12); break; default: break; } - _seqFrameCounter++; + _callbackCurrentFrame++; return frm; } -int KyraEngine_HoF::seq_lolDemoScene5(WSAMovie_v2 *wsaObj, int x, int y, int frm) { - switch (_seqFrameCounter++) { +int SeqPlayer_HOF::cbLOLDEMO_scene5(WSAMovie_v2 *wsaObj, int x, int y, int frm) { + switch (_callbackCurrentFrame++) { case 0: case 4: case 6: @@ -1889,13 +3254,13 @@ int KyraEngine_HoF::seq_lolDemoScene5(WSAMovie_v2 *wsaObj, int x, int y, int frm case 26: case 28: case 30: - seq_playTalkText(15); + playSoundEffect(15, 255 - ((31 - frm) << 3)); break; case 32: - seq_playTalkText(16); + playSoundAndDisplaySubTitle(16); break; case 42: - seq_playTalkText(6); + playSoundAndDisplaySubTitle(6); break; default: break; @@ -1903,24 +3268,24 @@ int KyraEngine_HoF::seq_lolDemoScene5(WSAMovie_v2 *wsaObj, int x, int y, int frm return frm; } -int KyraEngine_HoF::seq_lolDemoText5(WSAMovie_v2 *wsaObj, int x, int y, int frm) { - if (_seqFrameCounter++ == 100) - seq_playTalkText(5); +int SeqPlayer_HOF::cbLOLDEMO_text5(WSAMovie_v2 *wsaObj, int x, int y, int frm) { + if (_callbackCurrentFrame++ == 100) + playSoundAndDisplaySubTitle(5); return frm; } -int KyraEngine_HoF::seq_lolDemoScene6(WSAMovie_v2 *wsaObj, int x, int y, int frm) { - while (_seqScrollTextCounter < 0x122) { - _seqEndTime = _system->getMillis() + 6 * _tickLength; - if (!_seqFrameCounter) { +int SeqPlayer_HOF::cbLOLDEMO_scene6(WSAMovie_v2 *wsaObj, int x, int y, int frm) { + while (_scrollProgressCounter < 290) { + setCountDown(6); + if (!_callbackCurrentFrame) { _screen->loadBitmap("adtext.cps", 4, 4, 0); _screen->loadBitmap("adtext2.cps", 6, 6, 0); _screen->copyPageMemory(6, 0, 4, 64000, 1024); _screen->copyPageMemory(6, 1023, 6, 0, 64000); - _seqScrollTextCounter = 0; + _scrollProgressCounter = 0; } - if (_seqFrameCounter % 175) { + if (_callbackCurrentFrame % 175) { _screen->setScreenPalette(_screen->getPalette(0)); } else { Palette &tmpPal = _screen->getPalette(2); @@ -1928,27 +3293,29 @@ int KyraEngine_HoF::seq_lolDemoScene6(WSAMovie_v2 *wsaObj, int x, int y, int frm for (int i = 3; i < 0x300; i++) { tmpPal[i] = ((int)tmpPal[i] * 120) / 64; - if (tmpPal[i] > 0x3f) - tmpPal[i] = 0x3f; + if (tmpPal[i] > 0x3F) + tmpPal[i] = 0x3F; } - seq_playTalkText(_rnd.getRandomBit()); + playSoundAndDisplaySubTitle(_vm->_rnd.getRandomBit()); _screen->setScreenPalette(tmpPal); _screen->updateScreen(); - delay(8); + _vm->delay(8); } - if (_seqFrameCounter == 40 || _seqFrameCounter == 80 || _seqFrameCounter == 150 || _seqFrameCounter == 300) - seq_playTalkText(3); + if (_callbackCurrentFrame == 40 || _callbackCurrentFrame == 80 || _callbackCurrentFrame == 150 || _callbackCurrentFrame == 300) + playSoundAndDisplaySubTitle(3); _screen->copyPage(12, 2); - seq_scrollPage(70, 130); + updateDemoAdText(70, 130); _screen->copyPage(2, 0); _screen->updateScreen(); - _seqFrameCounter++; - if (_seqFrameCounter < 128 || _seqFrameCounter > 207) - _seqScrollTextCounter++; - delayUntil(_seqEndTime); + _callbackCurrentFrame++; + if (_callbackCurrentFrame < 128 || _callbackCurrentFrame > 207) + _scrollProgressCounter++; + + while (countDownRunning()) + delayTicks(1); } _screen->copyPage(2, 12); @@ -1956,776 +3323,16 @@ int KyraEngine_HoF::seq_lolDemoScene6(WSAMovie_v2 *wsaObj, int x, int y, int frm } #endif // ENABLE_LOL -uint32 KyraEngine_HoF::seq_activeTextsTimeLeft() { - uint32 res = 0; - - for (int i = 0; i < 10; i++) { - uint32 chatend = (_activeText[i].duration + _activeText[i].startTime); - uint32 curtime = _system->getMillis(); - if (_activeText[i].duration != -1 && chatend > curtime) { - chatend -= curtime; - if (res < chatend) - res = chatend; - } - } - - return res; -} - -void KyraEngine_HoF::seq_processWSAs() { - for (int i = 0; i < 8; i++) { - if (_activeWSA[i].flags != -1) { - if (seq_processNextSubFrame(i)) - seq_resetActiveWSA(i); - } - } -} - -void KyraEngine_HoF::seq_processText() { - int curPage = _screen->setCurPage(2); - char outputStr[70]; - - for (int i = 0; i < 10; i++) { - if (_activeText[i].startTime + _activeText[i].duration > _system->getMillis() && _activeText[i].duration != -1) { - - char *srcStr = seq_preprocessString(_sequenceStrings[_activeText[i].strIndex], _activeText[i].width); - int yPos = _activeText[i].y; - - while (*srcStr) { - uint32 linePos = 0; - for (; *srcStr; linePos++) { - if (*srcStr == 0x0d) // Carriage return - break; - outputStr[linePos] = *srcStr; - srcStr++; - } - outputStr[linePos] = 0; - if (*srcStr == 0x0d) - srcStr++; - - uint8 textColor = (_activeText[i].textcolor >= 0) ? _activeText[i].textcolor : _seqTextColor[0]; - _screen->printText(outputStr, _activeText[i].x - (_screen->getTextWidth(outputStr) / 2), yPos, textColor, 0); - yPos += 10; - } - } else { - _activeText[i].duration = -1; - } - } - - _screen->setCurPage(curPage); -} - -char *KyraEngine_HoF::seq_preprocessString(const char *srcStr, int width) { - char *dstStr = _seqProcessedString; - int lineStart = 0; - int linePos = 0; - - while (*srcStr) { - while (*srcStr && *srcStr != 0x20) // Space - dstStr[lineStart + linePos++] = *srcStr++; - dstStr[lineStart + linePos] = 0; - - int len = _screen->getTextWidth(&dstStr[lineStart]); - if (width >= len && *srcStr) { - dstStr[lineStart + linePos++] = *srcStr++; - } else { - dstStr[lineStart + linePos] = 0x0d; // Carriage return - lineStart += linePos + 1; - linePos = 0; - if (*srcStr) - srcStr++; - } - } - dstStr[lineStart + linePos] = 0; - - return strlen(_seqProcessedString) ? dstStr : 0; -} - -void KyraEngine_HoF::seq_sequenceCommand(int command) { - for (int i = 0; i < 8; i++) - seq_resetActiveWSA(i); - - switch (command) { - case 0: - _screen->fadeToBlack(36); - _screen->getPalette(0).clear(); - _screen->getPalette(1).clear(); - break; - - case 1: - seq_playTalkText(_rnd.getRandomBit()); - - _screen->getPalette(0).fill(0, 256, 0x3F); - _screen->fadePalette(_screen->getPalette(0), 16); - - _screen->copyPalette(1, 0); - break; - - case 3: - _screen->copyPage(2, 0); - _screen->fadePalette(_screen->getPalette(0), 16); - _screen->copyPalette(1, 0); - break; - - case 4: - _screen->copyPage(2, 0); - _screen->fadePalette(_screen->getPalette(0), 36); - _screen->copyPalette(1, 0); - break; - - case 5: - _screen->copyPage(2, 0); - break; - - case 6: - // UNUSED - // seq_loadBLD("library.bld"); - break; - - case 7: - // UNUSED - // seq_loadBLD("marco.bld"); - break; - - case 8: - _screen->fadeToBlack(16); - _screen->getPalette(0).clear(); - _screen->getPalette(1).clear(); - - delay(120 * _tickLength); - break; - - case 9: { - Palette &pal = _screen->getPalette(0); - for (int i = 0; i < 256; i++) { - int pv = (pal[3 * i] + pal[3 * i + 1] + pal[3 * i + 2]) / 3; - pal[3 * i] = pal[3 * i + 1] = pal[3 * i + 2] = pv & 0xff; - } - - //int a = 0x100; - //int d = (0x800 << 5) - 0x100; - //pal[3 * i] = pal[3 * i + 1] = pal[3 * i + 2] = 0x3f; - - _screen->fadePalette(pal, 64); - _screen->copyPalette(1, 0); - } break; - - default: - break; - } -} - -void KyraEngine_HoF::seq_cmpFadeFrame(const char *cmpFile) { - _screen->copyPage(10, 2); - _screen->copyPage(4, 10); - _screen->clearPage(6); - _screen->loadBitmap(cmpFile, 6, 6, 0); - _screen->copyPage(12, 4); - - for (int i = 0; i < 3; i++) { - uint32 endtime = _system->getMillis() + 4 * _tickLength; - _screen->cmpFadeFrameStep(4, 320, 200, 0, 0, 2, 320, 200, 0, 0, 320, 200, 6); - _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0); - _screen->updateScreen(); - delayUntil(endtime); - } - - _screen->copyPage(4, 0); - _screen->updateScreen(); - _screen->copyPage(4, 2); - _screen->copyPage(4, 6); - _screen->copyPage(10, 4); -} - -void KyraEngine_HoF::seq_playTalkText(uint8 chatNum) { - assert(chatNum < _sequenceSoundListSize); - - if (chatNum < 12 && !_flags.isDemo && textEnabled()) - seq_setTextEntry(chatNum, 160, 168, _sequenceStringsDuration[chatNum], 160); - - _sound->voicePlay(_sequenceSoundList[chatNum], &_speechHandle); -} - -void KyraEngine_HoF::seq_waitForTextsTimeout() { - uint32 longest = seq_activeTextsTimeLeft() + _system->getMillis(); - uint32 now = _system->getMillis(); - - if (textEnabled()) { - if (longest > now) - delay(longest - now); - } else if (speechEnabled()) { - while (snd_voiceIsPlaying()) - delay(_tickLength); - } - - seq_resetAllTextEntries(); -} - -void KyraEngine_HoF::seq_resetAllTextEntries() { - for (int i = 0; i < 10; i++) - _activeText[i].duration = -1; -} - -int KyraEngine_HoF::seq_setTextEntry(uint16 strIndex, uint16 posX, uint16 posY, int duration, uint16 width) { - for (int i = 0; i < 10; i++) { - if (_activeText[i].duration != -1) { - if (i < 9) - continue; - else - return -1; - } - - _activeText[i].strIndex = strIndex; - _activeText[i].x = posX; - _activeText[i].y = posY; - _activeText[i].duration = duration * _tickLength; - _activeText[i].width = width; - _activeText[i].startTime = _system->getMillis(); - _activeText[i].textcolor = -1; - - return i; - } - return -1; -} - -void KyraEngine_HoF::seq_loadNestedSequence(int wsaNum, int seqNum) { - if (_activeWSA[wsaNum].flags != -1) - return; - - NestedSequence s = _sequences->seqn[seqNum]; - - if (!_activeWSA[wsaNum].movie) { - _activeWSA[wsaNum].movie = new WSAMovie_v2(this); - assert(_activeWSA[wsaNum].movie); - } - - _activeWSA[wsaNum].movie->close(); - - _activeWSA[wsaNum].movie->open(s.wsaFile, 0, 0); - - if (!_activeWSA[wsaNum].movie->opened()) { - delete _activeWSA[wsaNum].movie; - _activeWSA[wsaNum].movie = 0; - return; - } - - _activeWSA[wsaNum].endFrame = s.endFrame; - _activeWSA[wsaNum].startFrame = _activeWSA[wsaNum].currentFrame = s.startframe; - _activeWSA[wsaNum].frameDelay = s.frameDelay; - _activeWSA[wsaNum].callback = _callbackN[seqNum]; - _activeWSA[wsaNum].control = s.wsaControl; - - _activeWSA[wsaNum].flags = s.flags | 1; - _activeWSA[wsaNum].x = s.x; - _activeWSA[wsaNum].y = s.y; - _activeWSA[wsaNum].startupCommand = s.startupCommand; - _activeWSA[wsaNum].finalCommand = s.finalCommand; - _activeWSA[wsaNum].lastFrame = 0xffff; - - seq_nestedSequenceFrame(s.startupCommand, wsaNum); - - if (!s.startupCommand) - seq_processNextSubFrame(wsaNum); - - _activeWSA[wsaNum].nextFrame = _system->getMillis(); -} - -void KyraEngine_HoF::seq_nestedSequenceFrame(int command, int wsaNum) { - int xa = 0, ya = 0; - command--; - if (!_activeWSA[wsaNum].movie || skipFlag() || shouldQuit() || _abortIntroFlag) - return; - - switch (command) { - case 0: - xa = -_activeWSA[wsaNum].movie->xAdd(); - ya = -_activeWSA[wsaNum].movie->yAdd(); - _activeWSA[wsaNum].movie->displayFrame(0, 8, xa, ya, 0, 0, 0); - seq_animatedSubFrame(8, 2, 7, 8, _activeWSA[wsaNum].movie->xAdd(), _activeWSA[wsaNum].movie->yAdd(), - _activeWSA[wsaNum].movie->width(), _activeWSA[wsaNum].movie->height(), 1, 2); - break; - - case 1: - xa = -_activeWSA[wsaNum].movie->xAdd(); - ya = -_activeWSA[wsaNum].movie->yAdd(); - _activeWSA[wsaNum].movie->displayFrame(0, 8, xa, ya, 0, 0, 0); - seq_animatedSubFrame(8, 2, 7, 8, _activeWSA[wsaNum].movie->xAdd(), _activeWSA[wsaNum].movie->yAdd(), - _activeWSA[wsaNum].movie->width(), _activeWSA[wsaNum].movie->height(), 1, 1); - break; - - case 2: - seq_waitForTextsTimeout(); - xa = -_activeWSA[wsaNum].movie->xAdd(); - ya = -_activeWSA[wsaNum].movie->yAdd(); - _activeWSA[wsaNum].movie->displayFrame(0x15, 8, xa, ya, 0, 0, 0); - seq_animatedSubFrame(8, 2, 7, 8, _activeWSA[wsaNum].movie->xAdd(), _activeWSA[wsaNum].movie->yAdd(), - _activeWSA[wsaNum].movie->width(), _activeWSA[wsaNum].movie->height(), 0, 2); - break; - - case 3: - _screen->copyPage(2, 10); - _activeWSA[wsaNum].movie->displayFrame(0, 2, 0, 0, 0, 0, 0); - _screen->copyPage(2, 12); - seq_cmpFadeFrame("scene2.cmp"); - break; - - case 4: - _screen->copyPage(2, 10); - _activeWSA[wsaNum].movie->displayFrame(0, 2, 0, 0, 0, 0, 0); - _screen->copyPage(2, 12); - seq_cmpFadeFrame("scene3.cmp"); - break; - - default: - break; - } -} - -void KyraEngine_HoF::seq_animatedSubFrame(int srcPage, int dstPage, int delaytime, int steps, - int x, int y, int w, int h, int openClose, int directionFlags) { - if (openClose) { - for (int i = 1; i < steps; i++) { - uint32 endtime = _system->getMillis() + delaytime * _tickLength; - - int w2 = (((w * 256) / steps) * i) / 256; - int h2 = (((h * 256) / steps) * i) / 256; - - int ym = (directionFlags & 2) ? (h - h2) : 0; - int xm = (directionFlags & 1) ? (w - w2) : 0; - - _screen->wsaFrameAnimationStep(0, 0, x + xm, y + ym, w, h, w2, h2, srcPage, dstPage, 0); - - _screen->copyPage(dstPage, 6); - _screen->copyPage(dstPage, 0); - _screen->updateScreen(); - - _screen->copyPage(12, dstPage); - delayUntil(endtime); - } - - _screen->wsaFrameAnimationStep(0, 0, x, y, w, h, w, h, srcPage, dstPage, 0); - _screen->copyPage(dstPage, 6); - _screen->copyPage(dstPage, 0); - _screen->updateScreen(); - } else { - _screen->copyPage(12, dstPage); - for (int i = steps; i; i--) { - uint32 endtime = _system->getMillis() + delaytime * _tickLength; - - int w2 = (((w * 256) / steps) * i) / 256; - int h2 = (((h * 256) / steps) * i) / 256; +#undef CASE_ALT - int ym = (directionFlags & 2) ? (h - h2) : 0; - int xm = (directionFlags & 1) ? (w - w2) : 0; - - _screen->wsaFrameAnimationStep(0, 0, x + xm, y + ym, w, h, w2, h2, srcPage, dstPage, 0); - - _screen->copyPage(dstPage, 6); - _screen->copyPage(dstPage, 0); - _screen->updateScreen(); - - _screen->copyPage(12, dstPage); - delayUntil(endtime); - } - } -} - -void KyraEngine_HoF::seq_resetActiveWSA(int wsaNum) { - if (_activeWSA[wsaNum].flags == -1) - return; - - _activeWSA[wsaNum].flags = -1; - seq_nestedSequenceFrame(_activeWSA[wsaNum].finalCommand, wsaNum); - _activeWSA[wsaNum].movie->close(); -} - -void KyraEngine_HoF::seq_unloadWSA(int wsaNum) { - if (_activeWSA[wsaNum].movie) { - _activeWSA[wsaNum].movie->close(); - delete _activeWSA[wsaNum].movie; - _activeWSA[wsaNum].movie = 0; - } -} - -bool KyraEngine_HoF::seq_processNextSubFrame(int wsaNum) { - uint32 currentFrame = _activeWSA[wsaNum].currentFrame; - uint32 currentTime = _system->getMillis(); - - if (_activeWSA[wsaNum].callback && currentFrame != _activeWSA[wsaNum].lastFrame) { - _activeWSA[wsaNum].lastFrame = currentFrame; - currentFrame = (this->*_activeWSA[wsaNum].callback)(_activeWSA[wsaNum].movie, _activeWSA[wsaNum].x, _activeWSA[wsaNum].y, currentFrame); - } - - if (_activeWSA[wsaNum].movie) { - if (_activeWSA[wsaNum].flags & 0x20) { - _activeWSA[wsaNum].movie->displayFrame(_activeWSA[wsaNum].control[currentFrame].index, 2, _activeWSA[wsaNum].x, _activeWSA[wsaNum].y, 0x4000, 0, 0); - _activeWSA[wsaNum].frameDelay = _activeWSA[wsaNum].control[currentFrame].delay; - } else { - _activeWSA[wsaNum].movie->displayFrame(currentFrame % _activeWSA[wsaNum].movie->frames(), 2, _activeWSA[wsaNum].x, _activeWSA[wsaNum].y, 0x4000, 0, 0); - } - } - - if (_activeWSA[wsaNum].flags & 0x10) { - currentFrame = (currentTime - _activeWSA[wsaNum].nextFrame) / (_activeWSA[wsaNum].frameDelay * _tickLength); - } else { - if (((int32)(currentTime - _activeWSA[wsaNum].nextFrame) / (int32)(_activeWSA[wsaNum].frameDelay * _tickLength)) > 0) { - currentFrame++; - _activeWSA[wsaNum].nextFrame = currentTime; - } - } - - bool res = false; - - if (currentFrame >= _activeWSA[wsaNum].endFrame) { - int sw = ((_activeWSA[wsaNum].flags & 0x1e) - 2); - switch (sw) { - case 0: - res = true; - currentFrame = _activeWSA[wsaNum].endFrame; - _screen->copyPage(2, 12); - break; - - case 6: - case 8: - currentFrame = _activeWSA[wsaNum].endFrame - 1; - break; - - case 2: - case 10: - currentFrame = _activeWSA[wsaNum].startFrame; - break; - - default: - currentFrame = _activeWSA[wsaNum].endFrame - 1; - res = true; - } - } - - _activeWSA[wsaNum].currentFrame = currentFrame & 0xffff; - return res; -} - -void KyraEngine_HoF::seq_printCreditsString(uint16 strIndex, int x, int y, const uint8 *colorMap, uint8 textcolor) { - uint8 colormap[16]; - if (skipFlag() || shouldQuit() || _abortIntroFlag || _menuChoice) - return; - - Screen::FontId of = _screen->setFont(Screen::FID_8_FNT); - - memset(&_screen->getPalette(0)[0x2fa], 0x3f, 6); - _screen->getPalette(0)[0x2f6] = 0x3f; - _screen->getPalette(0)[0x2f5] = 0x20; - _screen->getPalette(0)[0x2f4] = 0x30; - colormap[0] = colorMap[0]; - colormap[1] = 0xfd; - memcpy(&colormap[2], &colorMap[2], 14); - uint8 seqTextColor0 = _seqTextColor[0]; - - _seqTextColor[0] = 0xfd; - _screen->setTextColorMap(colormap); - seq_resetAllTextEntries(); - seq_setTextEntry(strIndex, x, y, 0x80, 0x78); - seq_processText(); - _screen->copyPage(2, 0); - _screen->updateScreen(); - _screen->getPalette(0)[0x2f7] = _screen->getPalette(0)[textcolor * 3]; - _screen->getPalette(0)[0x2f8] = _screen->getPalette(0)[textcolor * 3 + 1]; - _screen->getPalette(0)[0x2f9] = _screen->getPalette(0)[textcolor * 3 + 2]; - _screen->fadePalette(_screen->getPalette(0), 0x18); - - _seqTextColor[0] = textcolor; - _screen->setTextColorMap(colorMap); - seq_resetAllTextEntries(); - seq_setTextEntry(strIndex, x, y, 0x80, 0x78); - seq_processText(); - _screen->copyPage(2, 0); - _screen->updateScreen(); - _screen->getPalette(0)[0x2f7] = _screen->getPalette(0)[0x2f8] = _screen->getPalette(0)[0x2f9] = 0; - _screen->fadePalette(_screen->getPalette(0), 1); - _screen->copyPage(2, 12); - seq_resetAllTextEntries(); - - _seqTextColor[0] = seqTextColor0; - - _screen->setFont(of); -} - -void KyraEngine_HoF::seq_playWsaSyncDialogue(uint16 strIndex, uint16 vocIndex, int textColor, int x, int y, int width, WSAMovie_v2 *wsa, int firstframe, int lastframe, int wsaXpos, int wsaYpos) { - int dur = int(strlen(_sequenceStrings[strIndex])) * (_flags.isTalkie ? 7 : 15); - if (textEnabled()) { - int entry = seq_setTextEntry(strIndex, x, y, dur, width); - _activeText[entry].textcolor = textColor; - } - _seqWsaChatTimeout = _system->getMillis() + dur * _tickLength; - int curframe = firstframe; - - if (vocIndex && speechEnabled()) { - while (_sound->voiceIsPlaying() && !skipFlag()) - delay(4); - seq_playTalkText(vocIndex); - } - - while (_system->getMillis() < _seqWsaChatTimeout && !(_abortIntroFlag || skipFlag())) { - if (lastframe < 0) { - int t = ABS(lastframe); - if (t < curframe) - curframe = t; - } - - if (ABS(lastframe) < curframe) - curframe = firstframe; - - _seqWsaChatFrameTimeout = _seqEndTime = _system->getMillis() + _seqFrameDelay * _tickLength; - if (wsa) - wsa->displayFrame(curframe % wsa->frames(), 2, wsaXpos, wsaYpos, 0, 0, 0); - - _screen->copyPage(2, 12); - - seq_processText(); - - uint32 tm = _system->getMillis(); - if (_seqWsaChatFrameTimeout > tm && _seqWsaChatTimeout > tm) - delay(MIN(_seqWsaChatFrameTimeout - tm, _seqWsaChatTimeout - tm)); - - if (speechEnabled() && !textEnabled() && !snd_voiceIsPlaying()) - break; - - _screen->copyPage(2, 0); - _screen->updateScreen(); - curframe++; - } - - if (_abortIntroFlag || skipFlag()) - _sound->voiceStop(); - - if (ABS(lastframe) < curframe) - curframe = ABS(lastframe); - - if (curframe == firstframe) - curframe++; - - _seqWsaCurrentFrame = curframe; -} - -void KyraEngine_HoF::seq_displayScrollText(uint8 *data, const ScreenDim *d, int tempPage1, int tempPage2, int speed, - int step, Screen::FontId fid1, Screen::FontId fid2, const uint8 *shapeData, const char *const *specialData) { - if (!data) - return; - - static const char mark[] = { 5, 13, 0 }; - - _screen->clearPage(tempPage1); - _screen->clearPage(tempPage2); - _screen->copyRegion(d->sx << 3, d->sy, d->sx << 3, d->sy, d->w << 3, d->h, 0, tempPage1); - - struct ScrollTextData { - int16 x; - int16 y; - uint8 *text; - byte unk1; - byte height; - byte adjust; - - ScrollTextData() { - x = 0; // 0 11 - y = 0; // 2 13 - text = 0; // 4 15 - unk1 = 0; // 8 19 - height = 0; // 9 20 - adjust = 0; // 10 21 - } - }; - - ScrollTextData *textData = new ScrollTextData[36]; - uint8 *ptr = data; - - bool loop = true; - int cnt = 0; - - while (loop) { - _seqSubFrameEndTimeInternal = _system->getMillis() + speed * _tickLength; - - while (cnt < 35 && *ptr) { - uint16 cH; - - if (cnt) - cH = textData[cnt].y + textData[cnt].height + (textData[cnt].height >> 3); - else - cH = d->h; - - char *str = (char *)ptr; - - ptr = (uint8 *)strpbrk(str, mark); - if (!ptr) - ptr = (uint8 *)strchr(str, 0); - - textData[cnt + 1].unk1 = *ptr; - *ptr = 0; - if (textData[cnt + 1].unk1) - ptr++; - - if (*str == 3 || *str == 4) - textData[cnt + 1].adjust = *str++; - else - textData[cnt + 1].adjust = 0; - - _screen->setFont(fid1); - - if (*str == 1) { - _screen->setFont(fid2); - str++; - } else if (*str == 2) { - str++; - } - - textData[cnt + 1].height = _screen->getFontHeight(); - - switch (textData[cnt + 1].adjust) { - case 3: - textData[cnt + 1].x = 157 - _screen->getTextWidth(str); - break; - case 4: - textData[cnt + 1].x = 161; - break; - default: - textData[cnt + 1].x = (((d->w << 3) - _screen->getTextWidth(str)) >> 1) + 1; - } - - if (textData[cnt].unk1 == 5) - cH -= (textData[cnt].height + (textData[cnt].height >> 3)); - - textData[cnt + 1].y = cH; - textData[cnt + 1].text = (uint8 *)str; - cnt++; - } - - _screen->copyRegion(d->sx << 3, d->sy, d->sx << 3, d->sy, d->w << 3, d->h, tempPage1, tempPage2); - - int cnt2 = 0; - bool palCycle = 0; - - while (cnt2 < cnt) { - const char *str = (const char *)textData[cnt2 + 1].text; - const char *str2 = str; - int16 cW = textData[cnt2 + 1].x - 10; - int16 cH = textData[cnt2 + 1].y; - int x = (d->sx << 3) + cW; - int y = d->sy + cH; - int col1 = 255; - - if (cH < d->h) { - _screen->setCurPage(tempPage2); - _screen->setFont(fid1); - if (textData[cnt2 + 1].height != _screen->getFontHeight()) - _screen->setFont(fid2); - - if (specialData) { - if (!strcmp(str, specialData[0])) { - col1 = 112; - char cChar[2] = " "; - while (*str2) { - cChar[0] = *str2; - _screen->printText(cChar, x, y, col1++, 0); - x += _screen->getCharWidth((uint8)*str2++); - } - palCycle = true; - } else if (!strcmp(str, specialData[1])) { - col1 = 133; - char cChar[2] = " "; - while (*str2) { - cChar[0] = *str2; - _screen->printText(cChar, x, y, col1--, 0); - x += _screen->getCharWidth((uint8)*str2++); - } - palCycle = true; - } else { - _screen->printText(str, x, y, col1, 0); - } - } else { - _screen->printText(str, x, y, col1, 0); - } - _screen->setCurPage(0); - } - - textData[cnt2 + 1].y -= step; - cnt2++; - } - - _screen->copyRegion(d->sx << 3, d->sy, d->sx << 3, d->sy, d->w << 3, d->h, tempPage2, 0); - _screen->updateScreen(); - - if (textData[1].y < -10) { - textData[1].text += strlen((char *)textData[1].text); - textData[1].text[0] = textData[1].unk1; - cnt--; - memcpy(&textData[1], &textData[2], cnt * sizeof(ScrollTextData)); - } - - if (palCycle) { - for (int col = 133; col > 112; col--) - _screen->getPalette(0).copy(_screen->getPalette(0), col - 1, 1, col); - _screen->getPalette(0).copy(_screen->getPalette(0), 133, 1, 112); - _screen->setScreenPalette(_screen->getPalette(0)); - } - - delayUntil(_seqSubFrameEndTimeInternal); - - if ((cnt < 36) && ((d->sy + d->h) > (textData[cnt].y + textData[cnt].height)) && !skipFlag()) { - resetSkipFlag(); - delay(_tickLength * 500); - cnt = 0; - } - - if (!cnt || skipFlag()) - loop = false; - } - - _sound->beginFadeOut(); - _screen->fadeToBlack(); - - _abortIntroFlag= false; - resetSkipFlag(); - - delete[] textData; -} - -void KyraEngine_HoF::seq_scrollPage(int bottom, int top) { - int dstY, dstH, srcH; - - static const ScreenDim d = { 0x00, 0x00, 0x28, 0x320, 0xFF, 0xFE, 0x00, 0x00 }; - - if (_seqScrollTextCounter - (top - 1) < 0) { - dstY = top - _seqScrollTextCounter; - dstH = _seqScrollTextCounter; - srcH = 0; - } else { - dstY = 0; - srcH = _seqScrollTextCounter - top; - dstH = (400 - srcH <= top) ? 400 - srcH : top; - } - - if (dstH > 0) { - if (_demoAnimData) { - for (int i = 0; i < 4; i++) { - const ItemAnimData_v1 *def = &_demoAnimData[i]; - ActiveItemAnim *a = &_activeItemAnim[i]; - - _screen->fillRect(12, def->y - 8, 28, def->y + 8, 0, 4); - _screen->drawShape(4, getShapePtr(def->itemIndex + def->frames[a->currentFrame]), 12, def->y - 8, 0, 0); - if (_seqFrameCounter % 2 == 0) - a->currentFrame = (a->currentFrame + 1) % 20; - } - } - _screen->copyRegionEx(4, 0, srcH, 2, 2, dstY + bottom, 320, dstH, &d); - } -} +const uint8 SeqPlayer_HOF::_textColorPresets[] = { 0x01, 0x01, 0x00, 0x3F, 0x3F, 0x3F }; void KyraEngine_HoF::seq_showStarcraftLogo() { WSAMovie_v2 *ci = new WSAMovie_v2(this); assert(ci); _screen->clearPage(2); _res->loadPakFile("INTROGEN.PAK"); - int endframe = ci->open("ci.wsa", 0, &_screen->getPalette(0)); + int endframe = ci->open("CI.WSA", 0, &_screen->getPalette(0)); _res->unloadPakFile("INTROGEN.PAK"); if (!ci->opened()) { delete ci; @@ -2736,20 +3343,28 @@ void KyraEngine_HoF::seq_showStarcraftLogo() { _screen->copyPage(2, 0); _screen->fadeFromBlack(); for (int i = 1; i < endframe; i++) { - _seqEndTime = _system->getMillis() + 50; + uint32 end = _system->getMillis() + 50; if (skipFlag()) break; ci->displayFrame(i, 2, 0, 0, 0, 0, 0); _screen->copyPage(2, 0); _screen->updateScreen(); - delay(_seqEndTime - _system->getMillis()); + uint32 cur = _system->getMillis(); + if (end > cur) + delay(end - cur); + else + updateInput(); } if (!skipFlag()) { - _seqEndTime = _system->getMillis() + 50; + uint32 end = _system->getMillis() + 50; ci->displayFrame(0, 2, 0, 0, 0, 0, 0); _screen->copyPage(2, 0); _screen->updateScreen(); - delay(_seqEndTime - _system->getMillis()); + uint32 cur = _system->getMillis(); + if (end > cur) + delay(end - cur); + else + updateInput(); } _screen->fadeToBlack(); _screen->showMouse(); @@ -2758,67 +3373,38 @@ void KyraEngine_HoF::seq_showStarcraftLogo() { delete ci; } -void KyraEngine_HoF::seq_init() { - _seqProcessedString = new char[200]; - _seqWsa = new WSAMovie_v2(this); - _activeWSA = new ActiveWSA[8]; - _activeText = new ActiveText[10]; - - _res->unloadAllPakFiles(); - _res->loadPakFile(StaticResource::staticDataFilename()); - _res->loadFileList(_sequencePakList, _sequencePakListSize); - - if (_flags.platform == Common::kPlatformPC98) - _sound->loadSoundFile("SOUND.DAT"); - - _screen->setFont(_flags.lang == Common::JA_JPN ? Screen::FID_SJIS_FNT : Screen::FID_GOLDFONT_FNT); - - if (_flags.gameID == GI_LOL) - return; - - if (_flags.isDemo && !_flags.isTalkie) { - _demoAnimData = _staticres->loadShapeAnimData_v1(k2SeqplayShapeAnimData, _itemAnimDefinitionSize); - uint8 *shp = _res->fileData("icons.shp", 0); - uint32 outsize = READ_LE_UINT16(shp + 4); - _animShapeFiledata = new uint8[outsize]; - Screen::decodeFrame4(shp + 10, _animShapeFiledata, outsize); - delete[] shp; - - for (int i = 0; i < 20; i++) - addShapeToPool(_screen->getPtrToShape(_animShapeFiledata, i), i); - } else { - const MainMenu::StaticData data = { - { _sequenceStrings[97], _sequenceStrings[96], _sequenceStrings[95], _sequenceStrings[98], 0 }, - { 0x01, 0x04, 0x0C, 0x04, 0x00, 0xd7, 0xd6 }, - { 0xd8, 0xda, 0xd9, 0xd8 }, - (_flags.lang == Common::JA_JPN) ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT, 240 - }; - - _menu = new MainMenu(this); - _menu->init(data, MainMenu::Animation()); - } +int KyraEngine_HoF::seq_playIntro() { + bool startupSaveLoadable = saveFileLoadable(0); + return SeqPlayer_HOF(this, _screen, _system, startupSaveLoadable).play(kSequenceVirgin, startupSaveLoadable? kSequenceTitle : kSequenceNoLooping); } -void KyraEngine_HoF::seq_uninit() { - delete[] _seqProcessedString; - _seqProcessedString = NULL; - - delete[] _activeWSA; - _activeWSA = NULL; +int KyraEngine_HoF::seq_playOutro() { + return SeqPlayer_HOF(this, _screen, _system).play(kSequenceFunters, kSequenceFrash); +} - delete[] _activeText; - _activeText = NULL; +int KyraEngine_HoF::seq_playDemo() { + SeqPlayer_HOF(this, _screen, _system).play(kSequenceHoFDemoVirgin, kSequenceHoFDemoVirgin); + return 4; +} - delete _seqWsa; - _seqWsa = NULL; +void KyraEngine_HoF::seq_pausePlayer(bool toggle) { + SeqPlayer_HOF *activePlayer = SeqPlayer_HOF::instance(); + if (activePlayer) + activePlayer->pause(toggle); +} - delete[] _animShapeFiledata; - _animShapeFiledata = 0; +#ifdef ENABLE_LOL +int LoLEngine::playDemo() { + SeqPlayer_HOF(this, _screen, _system).play(kSequenceLoLDemoScene1, kSequenceLoLDemoScene1); + return -1; +} - delete _menu; - _menu = 0; - _screen->setFont(_flags.lang == Common::JA_JPN ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT); +void LoLEngine::pauseDemoPlayer(bool toggle) { + SeqPlayer_HOF *activePlayer = SeqPlayer_HOF::instance(); + if (activePlayer) + activePlayer->pause(toggle); } +#endif // ENABLE_LOL #pragma mark - #pragma mark - Ingame sequences diff --git a/engines/kyra/sequences_hof.h b/engines/kyra/sequences_hof.h new file mode 100644 index 0000000000..2558a68a6a --- /dev/null +++ b/engines/kyra/sequences_hof.h @@ -0,0 +1,74 @@ +/* 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. + * + */ + +#ifndef KYRA_SEQUENCES_HOF_H +#define KYRA_SEQUENCES_HOF_H + +#include "kyra/kyra_v2.h" + +namespace Kyra { + +struct HoFSequence { + const char *wsaFile; + const char *cpsFile; + uint16 flags; + uint8 fadeInTransitionType; + uint8 fadeOutTransitionType; + int16 stringIndex1; + int16 stringIndex2; + uint16 startFrame; + uint16 numFrames; + uint16 duration; + uint16 xPos; + uint16 yPos; + uint16 timeout; +}; + +struct HoFNestedSequence { + const char *wsaFile; + const FrameControl *wsaControl; + uint16 flags; + uint16 startframe; + uint16 endFrame; + uint16 frameDelay; + uint16 x; + uint16 y; + uint16 fadeInTransitionType; + uint16 fadeOutTransitionType; +}; + +struct HoFSeqData { + const HoFSequence *seq; + int numSeq; + const HoFNestedSequence *nestedSeq; + int numNestedSeq; +}; + +struct HoFSeqItemAnimData { + int16 itemIndex; + uint16 y; + const uint16 *frames; +}; + +} // End of namespace Kyra + +#endif diff --git a/engines/kyra/sequences_lok.cpp b/engines/kyra/sequences_lok.cpp index e63d0a7d8f..994bd2ba9b 100644 --- a/engines/kyra/sequences_lok.cpp +++ b/engines/kyra/sequences_lok.cpp @@ -1207,7 +1207,7 @@ struct CreditsLine { void KyraEngine_LoK::seq_playCredits() { static const uint8 colorMap[] = { 0, 0, 0xC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - static const char stringTerms[] = { 0x5, 0xd, 0x0}; + static const char stringTerms[] = { 0x5, 0xD, 0x0}; typedef Common::List<CreditsLine> CreditsLineList; CreditsLineList lines; diff --git a/engines/kyra/sequences_lol.cpp b/engines/kyra/sequences_lol.cpp index a06f2077ba..c8f97eb770 100644 --- a/engines/kyra/sequences_lol.cpp +++ b/engines/kyra/sequences_lol.cpp @@ -36,10 +36,16 @@ namespace Kyra { #pragma mark - Intro int LoLEngine::processPrologue() { - setupPrologueData(true); - - if (!saveFileLoadable(0) || _flags.isDemo) - showIntro(); + // There are two non-interactive demos (one which plays the intro and another one) which plays a number of specific scenes. + // We try to identify the latter one by looking for a specific file. + _res->loadPakFile("GENERAL.PAK"); + if (_flags.isDemo && _res->exists("scene1.cps")) { + return playDemo(); + } else { + setupPrologueData(true); + if (!saveFileLoadable(0) || _flags.isDemo) + showIntro(); + } if (_flags.isDemo) { _screen->fadePalette(_screen->getPalette(1), 30, 0); @@ -66,7 +72,7 @@ int LoLEngine::processPrologue() { // Original version: (260|193) "V CD1.02 D" const int width = _screen->getTextWidth(versionString.c_str()); _screen->fprintString("%s", 320 - width, 193, 0x67, 0x00, 0x04, versionString.c_str()); - _screen->setFont(_flags.lang == Common::JA_JPN ? Screen::FID_SJIS_FNT : Screen::FID_9_FNT); + _screen->setFont((_flags.lang == Common::JA_JPN && _flags.use16ColorMode) ? Screen::FID_SJIS_FNT : Screen::FID_9_FNT); _screen->fadePalette(_screen->getPalette(0), 0x1E); _screen->updateScreen(); @@ -139,7 +145,12 @@ void LoLEngine::setupPrologueData(bool load) { static const char *const fileListFloppy[] = { "INTRO.PAK", "INTROVOC.PAK", 0 }; - const char *const *fileList = _flags.isTalkie ? fileListCD : fileListFloppy; + + static const char *const fileListTowns[] = { + "INTRO.PAK", "TINTROVO.PAK", 0 + }; + + const char *const *fileList = _flags.isTalkie ? fileListCD : (_flags.platform == Common::kPlatformFMTowns ? fileListTowns : fileListFloppy); char filename[32]; for (uint i = 0; fileList[i]; ++i) { @@ -176,7 +187,7 @@ void LoLEngine::setupPrologueData(bool load) { memset(_selectionAnimTimers, 0, sizeof(_selectionAnimTimers)); _screen->getPalette(1).clear(); - _sound->setSoundList(&_soundData[kMusicIntro]); + _sound->selectAudioResourceSet(kMusicIntro); // We have three sound.dat files, one for the intro, one for the // end sequence and one for ingame, each contained in a different @@ -197,7 +208,7 @@ void LoLEngine::setupPrologueData(bool load) { return; _eventList.clear(); - _sound->setSoundList(0); + _sound->selectAudioResourceSet(kMusicIntro); } } @@ -219,7 +230,7 @@ void LoLEngine::showIntro() { _screen->loadFont(Screen::FID_8_FNT, "NEW8P.FNT"); _screen->loadFont(Screen::FID_INTRO_FNT, "INTRO.FNT"); - _screen->setFont(_flags.lang == Common::JA_JPN ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT); + _screen->setFont((_flags.lang == Common::JA_JPN && _flags.use16ColorMode) ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT); _tim->resetFinishedFlag(); _tim->setLangData("LOLINTRO.DIP"); @@ -289,10 +300,10 @@ int LoLEngine::chooseCharacter() { _chargenWSA->displayFrame(0, 2, 113, 0, 0, 0, 0); - _screen->setFont(_flags.lang == Common::JA_JPN ? Screen::FID_SJIS_FNT : Screen::FID_9_FNT); + _screen->setFont((_flags.lang == Common::JA_JPN && _flags.use16ColorMode) ? Screen::FID_SJIS_FNT : Screen::FID_9_FNT); _screen->_curPage = 2; - if (_flags.platform == Common::kPlatformPC98) { + if (_flags.platform == Common::kPlatformPC98 && _flags.use16ColorMode) { _screen->fillRect(17, 29, 94, 97, 17); _screen->fillRect(68, 167, 310, 199, 17); _screen->drawClippedLine(68, 166, 311, 166, 238); @@ -304,7 +315,7 @@ int LoLEngine::chooseCharacter() { _screen->_curPage = 2; for (int i = 0; i < 4; ++i) { - _screen->printText((const char *)_charNamesPC98[i], _charPosXPC98[i], 168, 0xC1, 0x00); + _screen->printText(_charNamesJapanese[i], _charPosXPC98[i], 168, 0xC1, 0x00); Screen::FontId old = _screen->setFont(Screen::FID_SJIS_FNT); for (int j = 0; j < 3; ++j) { @@ -318,7 +329,7 @@ int LoLEngine::chooseCharacter() { _screen->printText(_tim->getCTableEntry(53), 72, 184, 0x81, 0x00); _screen->printText(_tim->getCTableEntry(55), 72, 192, 0x81, 0x00); } else { - const char *const *previewNames = (_flags.lang == Common::RU_RUS && !_flags.isTalkie) ? _charPreviewNamesRussianFloppy : _charPreviewNamesDefault; + const char *const *previewNames = (_flags.lang == Common::RU_RUS && !_flags.isTalkie) ? _charPreviewNamesRussianFloppy : (_flags.lang == Common::JA_JPN ? _charNamesJapanese : _charPreviewNamesDefault); for (int i = 0; i < 4; ++i) { _screen->fprintStringIntro("%s", _charPreviews[i].x + 16, _charPreviews[i].y + 36, 0xC0, 0x00, 0x9C, 0x120, previewNames[i]); _screen->fprintStringIntro("%d", _charPreviews[i].x + 21, _charPreviews[i].y + 48, 0x98, 0x00, 0x9C, 0x220, _charPreviews[i].attrib[0]); @@ -710,7 +721,7 @@ void LoLEngine::showStarcraftLogo() { _screen->fadeFromBlack(); int inputFlag = 0; for (int i = 0; i < endframe; i++) { - inputFlag = checkInput(0) & 0xff; + inputFlag = checkInput(0) & 0xFF; if (shouldQuit() || inputFlag) break; ci->displayFrame(i, 2, 32, 80, 0, 0, 0); @@ -722,7 +733,7 @@ void LoLEngine::showStarcraftLogo() { if (!(shouldQuit() || inputFlag)) { _sound->voicePlay("star2", &_speechHandle); while (_sound->voiceIsPlaying(&_speechHandle) && !(shouldQuit() || inputFlag)) { - inputFlag = checkInput(0) & 0xff; + inputFlag = checkInput(0) & 0xFF; delay(_tickLength); } } @@ -1009,7 +1020,11 @@ void LoLEngine::setupEpilogueData(bool load) { "GENERAL.PAK", "INTRO.PAK", "FINALE1.PAK", "FINALE2.PAK", 0 }; - const char *const *fileList = _flags.isTalkie ? fileListCD : fileListFloppy; + static const char *const fileListTowns[] = { + "GENERAL.PAK", "INTRO.PAK", "FINALE1.PAK", "TFINALE2.PAK", 0 + }; + + const char *const *fileList = _flags.isTalkie ? fileListCD : (_flags.platform == Common::kPlatformFMTowns ? fileListTowns : fileListFloppy); assert(fileList); char filename[32]; @@ -1035,7 +1050,7 @@ void LoLEngine::setupEpilogueData(bool load) { _screen->clearPage(3); if (load) { - _sound->setSoundList(&_soundData[kMusicFinale]); + _sound->selectAudioResourceSet(kMusicFinale); // We have three sound.dat files, one for the intro, one for the // end sequence and one for ingame, each contained in a different @@ -1051,7 +1066,7 @@ void LoLEngine::setupEpilogueData(bool load) { return; _eventList.clear(); - _sound->setSoundList(0); + _sound->selectAudioResourceSet(kMusicIntro); } } diff --git a/engines/kyra/sound.cpp b/engines/kyra/sound.cpp index 73c20ee6df..32d175bdb0 100644 --- a/engines/kyra/sound.cpp +++ b/engines/kyra/sound.cpp @@ -37,7 +37,7 @@ namespace Kyra { Sound::Sound(KyraEngine_v1 *vm, Audio::Mixer *mixer) : _vm(vm), _mixer(mixer), _soundChannels(), _musicEnabled(1), - _sfxEnabled(true), _soundDataList(0) { + _sfxEnabled(true) { } Sound::~Sound() { @@ -47,14 +47,6 @@ Sound::kType Sound::getSfxType() const { return getMusicType(); } -void Sound::setSoundList(const AudioDataStruct *list) { - _soundDataList = list; -} - -bool Sound::hasSoundFile(uint file) const { - return (fileListEntry(file) != 0); -} - bool Sound::isPlaying() const { return false; } @@ -73,7 +65,7 @@ bool Sound::isVoicePresent(const char *file) const { return false; } -int32 Sound::voicePlay(const char *file, Audio::SoundHandle *handle, uint8 volume, bool isSfx) { +int32 Sound::voicePlay(const char *file, Audio::SoundHandle *handle, uint8 volume, uint8 priority, bool isSfx) { Audio::SeekableAudioStream *audioStream = getVoiceStream(file); if (!audioStream) { @@ -81,7 +73,7 @@ int32 Sound::voicePlay(const char *file, Audio::SoundHandle *handle, uint8 volum } int playTime = audioStream->getLength().msecs(); - playVoiceStream(audioStream, handle, volume, isSfx); + playVoiceStream(audioStream, handle, volume, priority, isSfx); return playTime; } @@ -109,12 +101,20 @@ Audio::SeekableAudioStream *Sound::getVoiceStream(const char *file) const { } } -bool Sound::playVoiceStream(Audio::AudioStream *stream, Audio::SoundHandle *handle, uint8 volume, bool isSfx) { +bool Sound::playVoiceStream(Audio::AudioStream *stream, Audio::SoundHandle *handle, uint8 volume, uint8 priority, bool isSfx) { int h = 0; - while (h < kNumChannelHandles && _mixer->isSoundHandleActive(_soundChannels[h])) + while (h < kNumChannelHandles && _mixer->isSoundHandleActive(_soundChannels[h].handle)) ++h; if (h >= kNumChannelHandles) { + h = 0; + while (h < kNumChannelHandles && _soundChannels[h].priority > priority) + ++h; + if (h < kNumChannelHandles) + voiceStop(&_soundChannels[h].handle); + } + + if (h >= kNumChannelHandles) { // When we run out of handles we need to destroy the stream object, // this is to avoid memory leaks in some scenes where too many sfx // are started. @@ -123,9 +123,10 @@ bool Sound::playVoiceStream(Audio::AudioStream *stream, Audio::SoundHandle *hand return false; } - _mixer->playStream(isSfx ? Audio::Mixer::kSFXSoundType : Audio::Mixer::kSpeechSoundType, &_soundChannels[h], stream, -1, volume); + _mixer->playStream(isSfx ? Audio::Mixer::kSFXSoundType : Audio::Mixer::kSpeechSoundType, &_soundChannels[h].handle, stream, -1, volume); + _soundChannels[h].priority = priority; if (handle) - *handle = _soundChannels[h]; + *handle = _soundChannels[h].handle; return true; } @@ -133,8 +134,8 @@ bool Sound::playVoiceStream(Audio::AudioStream *stream, Audio::SoundHandle *hand void Sound::voiceStop(const Audio::SoundHandle *handle) { if (!handle) { for (int h = 0; h < kNumChannelHandles; ++h) { - if (_mixer->isSoundHandleActive(_soundChannels[h])) - _mixer->stopHandle(_soundChannels[h]); + if (_mixer->isSoundHandleActive(_soundChannels[h].handle)) + _mixer->stopHandle(_soundChannels[h].handle); } } else { _mixer->stopHandle(*handle); @@ -144,7 +145,7 @@ void Sound::voiceStop(const Audio::SoundHandle *handle) { bool Sound::voiceIsPlaying(const Audio::SoundHandle *handle) const { if (!handle) { for (int h = 0; h < kNumChannelHandles; ++h) { - if (_mixer->isSoundHandleActive(_soundChannels[h])) + if (_mixer->isSoundHandleActive(_soundChannels[h].handle)) return true; } } else { @@ -156,7 +157,7 @@ bool Sound::voiceIsPlaying(const Audio::SoundHandle *handle) const { bool Sound::allVoiceChannelsPlaying() const { for (int i = 0; i < kNumChannelHandles; ++i) - if (!_mixer->isSoundHandleActive(_soundChannels[i])) + if (!_mixer->isSoundHandleActive(_soundChannels[i].handle)) return false; return true; } @@ -194,9 +195,14 @@ void MixedSoundDriver::updateVolumeSettings() { _sfx->updateVolumeSettings(); } -void MixedSoundDriver::setSoundList(const AudioDataStruct *list) { - _music->setSoundList(list); - _sfx->setSoundList(list); +void MixedSoundDriver::initAudioResourceInfo(int set, void *info) { + _music->initAudioResourceInfo(set, info); + _sfx->initAudioResourceInfo(set, info); +} + +void MixedSoundDriver::selectAudioResourceSet(int set) { + _music->selectAudioResourceSet(set); + _sfx->selectAudioResourceSet(set); } bool MixedSoundDriver::hasSoundFile(uint file) const { diff --git a/engines/kyra/sound.h b/engines/kyra/sound.h index 63cec48d00..2f5a0b6121 100644 --- a/engines/kyra/sound.h +++ b/engines/kyra/sound.h @@ -37,6 +37,35 @@ class SeekableAudioStream; namespace Kyra { +// Helper structs to format the data passed to the various initAudioResourceInfo() implementations +struct SoundResourceInfo_PC { + SoundResourceInfo_PC(const char *const *files, int numFiles) : fileList(files), fileListSize(numFiles) {} + const char *const *fileList; + uint fileListSize; +}; + +struct SoundResourceInfo_Towns { + SoundResourceInfo_Towns(const char *const *files, int numFiles, const int32 *cdaTbl, int cdaTblSize) : fileList(files), fileListSize(numFiles), cdaTable(cdaTbl), cdaTableSize(cdaTblSize) {} + const char *const *fileList; + uint fileListSize; + const int32 *cdaTable; + uint cdaTableSize; +}; + +struct SoundResourceInfo_PC98 { + SoundResourceInfo_PC98(const char *fileNamePattern) : pattern(fileNamePattern) {} + const char *pattern; +}; + +struct SoundResourceInfo_TownsPC98V2 { + SoundResourceInfo_TownsPC98V2(const char *const *files, int numFiles, const char *fileNamePattern, const uint16 *cdaTbl, int cdaTblSize) : fileList(files), fileListSize(numFiles), pattern(fileNamePattern), cdaTable(cdaTbl), cdaTableSize(cdaTblSize) {} + const char *const *fileList; + uint fileListSize; + const char *pattern; + const uint16 *cdaTable; + uint cdaTableSize; +}; + /** * Analog audio output device API for Kyrandia games. * It contains functionality to play music tracks, @@ -78,12 +107,20 @@ public: virtual void updateVolumeSettings() {} /** - * Sets the soundfiles the output device will use - * when playing a track and/or sound effect. + * Assigns static resource data with information on how to load + * audio resources to * - * @param list soundfile list + * @param set value defined in AudioResourceSet enum + * info various types of resource info data (file list, file name pattern, struct, etc. - depending on the inheriting driver type) */ - virtual void setSoundList(const AudioDataStruct *list); + virtual void initAudioResourceInfo(int set, void *info) = 0; + + /** + * Select audio resource set. + * + * @param set value defined in AudioResourceSet enum + */ + virtual void selectAudioResourceSet(int set) = 0; /** * Checks if a given sound file is present. @@ -91,7 +128,7 @@ public: * @param track track number * @return true if available, false otherwise */ - virtual bool hasSoundFile(uint file) const; + virtual bool hasSoundFile(uint file) const = 0; /** * Load a specifc sound file for use of @@ -128,7 +165,7 @@ public: * * @param track sound effect id */ - virtual void playSoundEffect(uint8 track, uint8 volume = 0xff) = 0; + virtual void playSoundEffect(uint8 track, uint8 volume = 0xFF) = 0; /** * Stop playback of all sfx tracks. @@ -184,11 +221,11 @@ public: * @param handle store a copy of the sound handle * @return playtime of the voice file (-1 marks unknown playtime) */ - virtual int32 voicePlay(const char *file, Audio::SoundHandle *handle = 0, uint8 volume = 255, bool isSfx = false); + virtual int32 voicePlay(const char *file, Audio::SoundHandle *handle = 0, uint8 volume = 255, uint8 priority = 255, bool isSfx = false); Audio::SeekableAudioStream *getVoiceStream(const char *file) const; - bool playVoiceStream(Audio::AudioStream *stream, Audio::SoundHandle *handle = 0, uint8 volume = 255, bool isSfx = false); + bool playVoiceStream(Audio::AudioStream *stream, Audio::SoundHandle *handle = 0, uint8 volume = 255, uint8 priority = 255, bool isSfx = false); /** * Checks if a voice is being played. @@ -228,17 +265,17 @@ public: */ virtual void resetTrigger() {} protected: - const char *fileListEntry(int file) const { return (_soundDataList != 0 && file >= 0 && file < _soundDataList->fileListLen) ? _soundDataList->fileList[file] : ""; } - int fileListLen() const { return _soundDataList->fileListLen; } - const void *cdaData() const { return _soundDataList != 0 ? _soundDataList->cdaTracks : 0; } - int cdaTrackNum() const { return _soundDataList != 0 ? _soundDataList->cdaNumTracks : 0; } - int extraOffset() const { return _soundDataList != 0 ? _soundDataList->extraOffset : 0; } - enum { kNumChannelHandles = 4 }; - Audio::SoundHandle _soundChannels[kNumChannelHandles]; + struct SoundChannel { + SoundChannel() : handle(), priority(0) {} + Audio::SoundHandle handle; + int priority; + }; + + SoundChannel _soundChannels[kNumChannelHandles]; int _musicEnabled; bool _sfxEnabled; @@ -247,8 +284,6 @@ protected: Audio::Mixer *_mixer; private: - const AudioDataStruct *_soundDataList; - struct SpeechCodecs { const char *fileext; Audio::SeekableAudioStream *(*streamFunc)( @@ -272,7 +307,8 @@ public: virtual void updateVolumeSettings(); - virtual void setSoundList(const AudioDataStruct *list); + virtual void initAudioResourceInfo(int set, void *info); + virtual void selectAudioResourceSet(int set); virtual bool hasSoundFile(uint file) const; virtual void loadSoundFile(uint file); virtual void loadSoundFile(Common::String file); @@ -283,7 +319,7 @@ public: virtual void haltTrack(); virtual bool isPlaying() const; - virtual void playSoundEffect(uint8 track, uint8 volume = 0xff); + virtual void playSoundEffect(uint8 track, uint8 volume = 0xFF); virtual void stopAllSoundEffects(); @@ -293,88 +329,6 @@ private: Sound *_music, *_sfx; }; -// Digital Audio -class AUDStream; -class KyraAudioStream; -class KyraEngine_MR; - -/** - * Digital audio output device. - * - * This is just used for Kyrandia 3. - */ -class SoundDigital { -public: - SoundDigital(KyraEngine_MR *vm, Audio::Mixer *mixer); - ~SoundDigital(); - - bool init() { return true; } - - /** - * Plays a sound. - * - * @param filename file to be played - * @param priority priority of the sound - * @param type type - * @param volume channel volume - * @param loop true if the sound should loop (endlessly) - * @param channel tell the sound player to use a specific channel for playback - * - * @return channel playing the sound - */ - int playSound(const char *filename, uint8 priority, Audio::Mixer::SoundType type, int volume = 255, bool loop = false, int channel = -1); - - /** - * Checks if a given channel is playing a sound. - * - * @param channel channel number to check - * @return true if playing, else false - */ - bool isPlaying(int channel); - - /** - * Stop the playback of a sound in the given - * channel. - * - * @param channel channel number - */ - void stopSound(int channel); - - /** - * Stops playback of all sounds. - */ - void stopAllSounds(); - - /** - * Makes the sound in a given channel - * fading out. - * - * @param channel channel number - * @param ticks fadeout time - */ - void beginFadeOut(int channel, int ticks); -private: - KyraEngine_MR *_vm; - Audio::Mixer *_mixer; - - struct Sound { - Audio::SoundHandle handle; - - char filename[16]; - uint8 priority; - KyraAudioStream *stream; - } _sounds[4]; - - struct AudioCodecs { - const char *fileext; - Audio::SeekableAudioStream *(*streamFunc)( - Common::SeekableReadStream *stream, - DisposeAfterUse::Flag disposeAfterUse); - }; - - static const AudioCodecs _supportedCodecs[]; -}; - } // End of namespace Kyra #endif diff --git a/engines/kyra/sound_adlib.cpp b/engines/kyra/sound_adlib.cpp index 668e662413..1d665709e5 100644 --- a/engines/kyra/sound_adlib.cpp +++ b/engines/kyra/sound_adlib.cpp @@ -683,14 +683,14 @@ void AdLibDriver::adjustSfxData(uint8 *ptr, int volume) { _sfxVelocity = ptr[3]; // Adjust the values. - if (volume != 0xff) { + if (volume != 0xFF) { if (_version >= 3) { int newVal = ((((ptr[3]) + 63) * volume) >> 8) & 0xFF; ptr[3] = -newVal + 63; ptr[1] = ((ptr[1] * volume) >> 8) & 0xFF; } else { - int newVal = ((_sfxVelocity << 2) ^ 0xff) * volume; - ptr[3] = (newVal >> 10) ^ 0x3f; + int newVal = ((_sfxVelocity << 2) ^ 0xFF) * volume; + ptr[3] = (newVal >> 10) ^ 0x3F; ptr[1] = newVal >> 11; } } @@ -2292,6 +2292,8 @@ SoundAdLibPC::SoundAdLibPC(KyraEngine_v1 *vm, Audio::Mixer *mixer) _numSoundTriggers = 0; _sfxPlayingSound = -1; _soundFileLoaded.clear(); + _currentResourceSet = 0; + memset(&_resInfo, 0, sizeof(_resInfo)); switch (vm->game()) { case GI_LOL: @@ -2322,6 +2324,8 @@ SoundAdLibPC::SoundAdLibPC(KyraEngine_v1 *vm, Audio::Mixer *mixer) SoundAdLibPC::~SoundAdLibPC() { delete _driver; delete[] _soundDataPtr; + for (int i = 0; i < 3; i++) + initAudioResourceInfo(i, 0); } bool SoundAdLibPC::init() { @@ -2371,7 +2375,7 @@ void SoundAdLibPC::playTrack(uint8 track) { _driver->setSyncJumpMask(0x000F); else _driver->setSyncJumpMask(0); - play(track, 0xff); + play(track, 0xFF); } } @@ -2405,7 +2409,7 @@ void SoundAdLibPC::play(uint8 track, uint8 volume) { } void SoundAdLibPC::beginFadeOut() { - play(_version > 2 ? 1 : 15, 0xff); + play(_version > 2 ? 1 : 15, 0xFF); } int SoundAdLibPC::checkTrigger() { @@ -2416,8 +2420,29 @@ void SoundAdLibPC::resetTrigger() { _driver->resetSoundTrigger(); } +void SoundAdLibPC::initAudioResourceInfo(int set, void *info) { + if (set >= kMusicIntro && set <= kMusicFinale) { + delete _resInfo[set]; + _resInfo[set] = info ? new SoundResourceInfo_PC(*(SoundResourceInfo_PC*)info) : 0; + } +} + +void SoundAdLibPC::selectAudioResourceSet(int set) { + if (set >= kMusicIntro && set <= kMusicFinale) { + if (_resInfo[set]) + _currentResourceSet = set; + } +} + +bool SoundAdLibPC::hasSoundFile(uint file) const { + if (file < res()->fileListSize) + return (res()->fileList[file] != 0); + return false; +} + void SoundAdLibPC::loadSoundFile(uint file) { - internalLoadFile(fileListEntry(file)); + if (file < res()->fileListSize) + internalLoadFile(res()->fileList[file]); } void SoundAdLibPC::loadSoundFile(Common::String file) { diff --git a/engines/kyra/sound_adlib.h b/engines/kyra/sound_adlib.h index 8492f3b99a..f8486499ab 100644 --- a/engines/kyra/sound_adlib.h +++ b/engines/kyra/sound_adlib.h @@ -69,6 +69,9 @@ public: virtual void updateVolumeSettings(); + virtual void initAudioResourceInfo(int set, void *info); + virtual void selectAudioResourceSet(int set); + virtual bool hasSoundFile(uint file) const; virtual void loadSoundFile(uint file); virtual void loadSoundFile(Common::String file); @@ -76,7 +79,7 @@ public: virtual void haltTrack(); virtual bool isPlaying() const; - virtual void playSoundEffect(uint8 track, uint8 volume = 0xff); + virtual void playSoundEffect(uint8 track, uint8 volume = 0xFF); virtual void beginFadeOut(); @@ -87,6 +90,10 @@ private: void play(uint8 track, uint8 volume); + const SoundResourceInfo_PC *res() const {return _resInfo[_currentResourceSet]; } + SoundResourceInfo_PC *_resInfo[3]; + int _currentResourceSet; + AdLibDriver *_driver; int _version; diff --git a/engines/kyra/sound_amiga.cpp b/engines/kyra/sound_amiga.cpp index ec2748dd38..7292541594 100644 --- a/engines/kyra/sound_amiga.cpp +++ b/engines/kyra/sound_amiga.cpp @@ -53,10 +53,26 @@ bool SoundAmiga::init() { return _driver != 0 && _tableSfxIntro && _tableSfxGame; } +void SoundAmiga::initAudioResourceInfo(int set, void *info) { + // See comment below +} + +void SoundAmiga::selectAudioResourceSet(int set) { + // It seems that loadSoundFile() is doing what would normally be done in here. + // As long as this driver is only required for one single target (Kyra 1 Amiga) + // this doesn't matter much. +} + +bool SoundAmiga::hasSoundFile(uint file) const { + if (file < 3) + return true; + return false; +} + void SoundAmiga::loadSoundFile(uint file) { debugC(5, kDebugLevelSound, "SoundAmiga::loadSoundFile(%d)", file); - static const char * const tableFilenames[3][2] = { + static const char *const tableFilenames[3][2] = { { "introscr.mx", "introinst.mx" }, { "kyramusic.mx", 0 }, { "finalescr.mx", "introinst.mx" } diff --git a/engines/kyra/sound_digital.cpp b/engines/kyra/sound_digital.cpp index fe0f1fb9bc..518805c43e 100644 --- a/engines/kyra/sound_digital.cpp +++ b/engines/kyra/sound_digital.cpp @@ -20,7 +20,7 @@ * */ -#include "kyra/sound.h" +#include "kyra/sound_digital.h" #include "kyra/resource.h" #include "kyra/kyra_mr.h" @@ -271,8 +271,8 @@ int AUDStream::readChunk(int16 *buffer, const int maxSamples) { while (outSize > 0) { input = _inBuffer[i++] << 2; - code = (input >> 8) & 0xff; - count = (input & 0xff) >> 2; + code = (input >> 8) & 0xFF; + count = (input & 0xFF) >> 2; switch (code) { case 2: @@ -294,7 +294,7 @@ int AUDStream::readChunk(int16 *buffer, const int maxSamples) { for (; count >= 0; count--) { code = _inBuffer[i++]; - curSample += WSTable4Bit[code & 0x0f]; + curSample += WSTable4Bit[code & 0x0F]; curSample = clip8BitSample(curSample); _outBuffer[j++] = curSample; diff --git a/engines/kyra/sound_digital.h b/engines/kyra/sound_digital.h new file mode 100644 index 0000000000..271dde6a21 --- /dev/null +++ b/engines/kyra/sound_digital.h @@ -0,0 +1,119 @@ +/* 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. + * + */ + +#ifndef KYRA_SOUND_DIGITAL_H +#define KYRA_SOUND_DIGITAL_H + +#include "audio/mixer.h" + +namespace Common { +class SeekableReadStream; +} // End of namespace Common + +namespace Audio { +class SeekableAudioStream; +} // End of namespace Audio + +namespace Kyra { + +// Digital Audio +class KyraAudioStream; +class KyraEngine_MR; + +/** + * Digital audio output device. + * + * This is just used for Kyrandia 3. + */ +class SoundDigital { +public: + SoundDigital(KyraEngine_MR *vm, Audio::Mixer *mixer); + ~SoundDigital(); + + /** + * Plays a sound. + * + * @param filename file to be played + * @param priority priority of the sound + * @param type type + * @param volume channel volume + * @param loop true if the sound should loop (endlessly) + * @param channel tell the sound player to use a specific channel for playback + * + * @return channel playing the sound + */ + int playSound(const char *filename, uint8 priority, Audio::Mixer::SoundType type, int volume = 255, bool loop = false, int channel = -1); + + /** + * Checks if a given channel is playing a sound. + * + * @param channel channel number to check + * @return true if playing, else false + */ + bool isPlaying(int channel); + + /** + * Stop the playback of a sound in the given + * channel. + * + * @param channel channel number + */ + void stopSound(int channel); + + /** + * Stops playback of all sounds. + */ + void stopAllSounds(); + + /** + * Makes the sound in a given channel + * fading out. + * + * @param channel channel number + * @param ticks fadeout time + */ + void beginFadeOut(int channel, int ticks); +private: + KyraEngine_MR *_vm; + Audio::Mixer *_mixer; + + struct Sound { + Audio::SoundHandle handle; + + char filename[16]; + uint8 priority; + KyraAudioStream *stream; + } _sounds[4]; + + struct AudioCodecs { + const char *fileext; + Audio::SeekableAudioStream *(*streamFunc)( + Common::SeekableReadStream *stream, + DisposeAfterUse::Flag disposeAfterUse); + }; + + static const AudioCodecs _supportedCodecs[]; +}; + +} // End of namespace Kyra + +#endif diff --git a/engines/kyra/sound_intern.h b/engines/kyra/sound_intern.h index 827a487685..007ca3d3f5 100644 --- a/engines/kyra/sound_intern.h +++ b/engines/kyra/sound_intern.h @@ -23,6 +23,8 @@ #ifndef KYRA_SOUND_INTERN_H #define KYRA_SOUND_INTERN_H + + #include "kyra/sound.h" #include "kyra/sound_adlib.h" @@ -40,6 +42,7 @@ class MaxTrax; } // End of namespace Audio namespace Kyra { + class MidiOutput; /** @@ -51,28 +54,31 @@ class MidiOutput; class SoundMidiPC : public Sound { public: SoundMidiPC(KyraEngine_v1 *vm, Audio::Mixer *mixer, MidiDriver *driver, kType type); - ~SoundMidiPC(); + virtual ~SoundMidiPC(); - kType getMusicType() const { return _type; } + virtual kType getMusicType() const { return _type; } - bool init(); + virtual bool init(); - void updateVolumeSettings(); + virtual void updateVolumeSettings(); - void loadSoundFile(uint file); - void loadSoundFile(Common::String file); - void loadSfxFile(Common::String file); + virtual void initAudioResourceInfo(int set, void *info); + virtual void selectAudioResourceSet(int set); + virtual bool hasSoundFile(uint file) const; + virtual void loadSoundFile(uint file); + virtual void loadSoundFile(Common::String file); + virtual void loadSfxFile(Common::String file); - void playTrack(uint8 track); - void haltTrack(); - bool isPlaying() const; + virtual void playTrack(uint8 track); + virtual void haltTrack(); + virtual bool isPlaying() const; - void playSoundEffect(uint8 track, uint8 volume = 0xff); - void stopAllSoundEffects(); + virtual void playSoundEffect(uint8 track, uint8 volume = 0xFF); + virtual void stopAllSoundEffects(); - void beginFadeOut(); + virtual void beginFadeOut(); - void pause(bool paused); + virtual void pause(bool paused); private: static void onTimer(void *data); @@ -89,6 +95,10 @@ private: MidiParser *_music; MidiParser *_sfx[3]; + const SoundResourceInfo_PC *res() const {return _resInfo[_currentResourceSet]; } + SoundResourceInfo_PC *_resInfo[3]; + int _currentResourceSet; + // misc kType _type; Common::String getFileName(const Common::String &str); @@ -103,25 +113,28 @@ private: class SoundTowns : public Sound { public: SoundTowns(KyraEngine_v1 *vm, Audio::Mixer *mixer); - ~SoundTowns(); + virtual ~SoundTowns(); - kType getMusicType() const { return kTowns; } + virtual kType getMusicType() const { return kTowns; } - bool init(); - void process(); + virtual bool init(); + virtual void process(); - void loadSoundFile(uint file); - void loadSoundFile(Common::String) {} + virtual void initAudioResourceInfo(int set, void *info); + virtual void selectAudioResourceSet(int set); + virtual bool hasSoundFile(uint file) const; + virtual void loadSoundFile(uint file); + virtual void loadSoundFile(Common::String) {} - void playTrack(uint8 track); - void haltTrack(); + virtual void playTrack(uint8 track); + virtual void haltTrack(); - void playSoundEffect(uint8 track, uint8 volume = 0xff); - void stopAllSoundEffects(); + virtual void playSoundEffect(uint8 track, uint8 volume = 0xFF); + virtual void stopAllSoundEffects(); - void beginFadeOut(); + virtual void beginFadeOut(); - void updateVolumeSettings(); + virtual void updateVolumeSettings(); private: bool loadInstruments(); @@ -142,6 +155,10 @@ private: bool _cdaPlaying; + const SoundResourceInfo_Towns *res() const {return _resInfo[_currentResourceSet]; } + SoundResourceInfo_Towns *_resInfo[3]; + int _currentResourceSet; + const uint8 *_musicFadeTable; const uint8 *_sfxBTTable; const uint8 *_sfxWDTable; @@ -150,55 +167,64 @@ private: class SoundPC98 : public Sound { public: SoundPC98(KyraEngine_v1 *vm, Audio::Mixer *mixer); - ~SoundPC98(); + virtual ~SoundPC98(); virtual kType getMusicType() const { return kPC98; } - bool init(); + virtual bool init(); - void process() {} - void loadSoundFile(uint file); - void loadSoundFile(Common::String file); + virtual void initAudioResourceInfo(int set, void *info); + virtual void selectAudioResourceSet(int set); + virtual bool hasSoundFile(uint file) const; + virtual void loadSoundFile(uint file); + virtual void loadSoundFile(Common::String file); - void playTrack(uint8 track); - void haltTrack(); - void beginFadeOut(); + virtual void playTrack(uint8 track); + virtual void haltTrack(); + virtual void beginFadeOut(); - int32 voicePlay(const char *file, Audio::SoundHandle *handle, uint8 volume, bool isSfx) { return -1; } - void playSoundEffect(uint8 track, uint8 volume = 0xff); + virtual int32 voicePlay(const char *file, Audio::SoundHandle *handle, uint8 volume, uint8 priority, bool isSfx) override { return -1; } + virtual void playSoundEffect(uint8 track, uint8 volume = 0xFF); - void updateVolumeSettings(); + virtual void updateVolumeSettings(); -protected: +private: int _lastTrack; uint8 *_musicTrackData; uint8 *_sfxTrackData; TownsPC98_AudioDriver *_driver; + + const char *resPattern() {return _resInfo[_currentResourceSet]->c_str(); } + Common::String *_resInfo[3]; + int _currentResourceSet; }; class SoundTownsPC98_v2 : public Sound { public: SoundTownsPC98_v2(KyraEngine_v1 *vm, Audio::Mixer *mixer); - ~SoundTownsPC98_v2(); + virtual ~SoundTownsPC98_v2(); - kType getMusicType() const { return _vm->gameFlags().platform == Common::kPlatformFMTowns ? kTowns : kPC98; } + virtual kType getMusicType() const { return _vm->gameFlags().platform == Common::kPlatformFMTowns ? kTowns : kPC98; } - bool init(); - void process(); + virtual bool init(); + virtual void process(); - void loadSoundFile(uint file) {} - void loadSoundFile(Common::String file); + virtual void initAudioResourceInfo(int set, void *info); + virtual void selectAudioResourceSet(int set); + virtual bool hasSoundFile(uint file) const; + virtual void loadSoundFile(uint file) {} + virtual void loadSoundFile(Common::String file); - void playTrack(uint8 track); - void haltTrack(); - void beginFadeOut(); + virtual void playTrack(uint8 track); + virtual void haltTrack(); + virtual void beginFadeOut(); - int32 voicePlay(const char *file, Audio::SoundHandle *handle, uint8 volume, bool isSfx); - void playSoundEffect(uint8 track, uint8 volume = 0xff); + virtual int32 voicePlay(const char *file, Audio::SoundHandle *handle, uint8 volume = 255, uint8 priority = 255, bool isSfx = true) override; + virtual void playSoundEffect(uint8 track, uint8 volume = 0xFF); - void updateVolumeSettings(); + virtual void updateVolumeSettings(); -protected: +private: Audio::AudioStream *_currentSFX; int _lastTrack; bool _useFmSfx; @@ -206,6 +232,10 @@ protected: uint8 *_musicTrackData; uint8 *_sfxTrackData; TownsPC98_AudioDriver *_driver; + + const SoundResourceInfo_TownsPC98V2 *res() const {return _resInfo[_currentResourceSet]; } + SoundResourceInfo_TownsPC98V2 *_resInfo[3]; + int _currentResourceSet; }; // PC Speaker MIDI driver @@ -288,22 +318,24 @@ struct AmigaSfxTable { class SoundAmiga : public Sound { public: SoundAmiga(KyraEngine_v1 *vm, Audio::Mixer *mixer); - ~SoundAmiga(); + virtual ~SoundAmiga(); virtual kType getMusicType() const { return kAmiga; } //FIXME - bool init(); + virtual bool init(); - void process() {} - void loadSoundFile(uint file); - void loadSoundFile(Common::String) {} + virtual void initAudioResourceInfo(int set, void *info); + virtual void selectAudioResourceSet(int set); + virtual bool hasSoundFile(uint file) const; + virtual void loadSoundFile(uint file); + virtual void loadSoundFile(Common::String) {} - void playTrack(uint8 track); - void haltTrack(); - void beginFadeOut(); + virtual void playTrack(uint8 track); + virtual void haltTrack(); + virtual void beginFadeOut(); - int32 voicePlay(const char *file, Audio::SoundHandle *handle, uint8 volume, bool isSfx) { return -1; } - void playSoundEffect(uint8 track, uint8 volume = 0xff); + virtual int32 voicePlay(const char *file, Audio::SoundHandle *handle, uint8 volume, uint8 priority, bool isSfx) override { return -1; } + virtual void playSoundEffect(uint8 track, uint8 volume = 0xFF); protected: Audio::MaxTrax *_driver; diff --git a/engines/kyra/sound_lol.cpp b/engines/kyra/sound_lol.cpp index cb9be43b07..48230d025c 100644 --- a/engines/kyra/sound_lol.cpp +++ b/engines/kyra/sound_lol.cpp @@ -60,7 +60,7 @@ bool LoLEngine::snd_playCharacterSpeech(int id, int8 speaker, int) { Common::String pattern2 = Common::String::format("%02d", id & 0x4000 ? 0 : _curTlkFile); if (id & 0x4000) { - pattern1 = Common::String::format("%03X", id & 0x3fff); + pattern1 = Common::String::format("%03X", id & 0x3FFF); } else if (id < 1000) { pattern1 = Common::String::format("%03d", id); } else { @@ -164,11 +164,19 @@ void LoLEngine::snd_playSoundEffect(int track, int volume) { if (track == -1 || track >= _ingameSoundListSize) return; - volume &= 0xff; - int16 volIndex = (int16)READ_LE_UINT16(&_ingameSoundIndex[track * 2 + 1]); + volume &= 0xFF; + int16 prIndex = (int16)READ_LE_UINT16(&_ingameSoundIndex[track * 2 + 1]); + uint16 priority = (prIndex > 0) ? (prIndex * volume) >> 8 : -prIndex; - uint16 vocLevel = (volIndex > 0) ? (volIndex * volume) >> 8 : -volIndex; - vocLevel = CLIP(volume >> 4, 2, 13) * 7 + 164; + static const uint8 volTable1[] = { 223, 159, 95, 47, 15, 0 }; + static const uint8 volTable2[] = { 255, 191, 127, 63, 30, 0 }; + + for (int i = 0; i < 6; i++) { + if (volTable1[i] < volume) { + volume = volTable2[i]; + break; + } + } int16 vocIndex = (int16)READ_LE_UINT16(&_ingameSoundIndex[track * 2]); @@ -180,7 +188,7 @@ void LoLEngine::snd_playSoundEffect(int track, int volume) { if (hasVocFile) { if (_sound->isVoicePresent(_ingameSoundList[vocIndex])) - _sound->voicePlay(_ingameSoundList[vocIndex], 0, vocLevel & 0xff, true); + _sound->voicePlay(_ingameSoundList[vocIndex], 0, volume, priority, true); } else if (_flags.platform == Common::kPlatformPC) { if (_sound->getSfxType() == Sound::kMidiMT32) track = (track < _ingameMT32SoundIndexSize) ? (_ingameMT32SoundIndex[track] - 1) : -1; @@ -206,8 +214,8 @@ bool LoLEngine::snd_processEnvironmentalSoundEffect(int soundId, int block) { uint16 cbl = _currentBlock; for (int i = 3; i > 0; i--) { - int dir = calcMonsterDirection(cbl & 0x1f, cbl >> 5, block & 0x1f, block >> 5); - cbl = (cbl + blockShiftTable[dir]) & 0x3ff; + int dir = calcMonsterDirection(cbl & 0x1F, cbl >> 5, block & 0x1F, block >> 5); + cbl = (cbl + blockShiftTable[dir]) & 0x3FF; if (cbl != block) { if (testWallFlag(cbl, 0, 1)) _environmentSfxVol >>= 1; @@ -239,7 +247,7 @@ void LoLEngine::snd_playQueuedEffects() { void LoLEngine::snd_loadSoundFile(int track) { if (_sound->musicEnabled()) { - if (_flags.platform != Common::kPlatformPC98) { + if (_flags.platform == Common::kPlatformPC) { int t = (track - 250) * 3; if (_curMusicFileIndex != _musicTrackMap[t] || _curMusicFileExt != (char)_musicTrackMap[t + 1]) { snd_stopMusic(); @@ -261,12 +269,12 @@ int LoLEngine::snd_playTrack(int track) { _lastMusicTrack = track; if (_sound->musicEnabled()) { - if (_flags.platform == Common::kPlatformPC98) { - _sound->playTrack(track - 249); - } else { + if (_flags.platform == Common::kPlatformPC) { snd_loadSoundFile(track); int t = (track - 250) * 3; _sound->playTrack(_musicTrackMap[t + 2]); + } else { + _sound->playTrack(track - 249); } } diff --git a/engines/kyra/sound_midi.cpp b/engines/kyra/sound_midi.cpp index 70cc304192..a54c52612b 100644 --- a/engines/kyra/sound_midi.cpp +++ b/engines/kyra/sound_midi.cpp @@ -442,6 +442,8 @@ SoundMidiPC::SoundMidiPC(KyraEngine_v1 *vm, Audio::Mixer *mixer, MidiDriver *dri _output = 0; _musicFile = _sfxFile = 0; + _currentResourceSet = 0; + memset(&_resInfo, 0, sizeof(_resInfo)); _music = MidiParser::createParser_XMIDI(); assert(_music); @@ -495,6 +497,9 @@ SoundMidiPC::~SoundMidiPC() { delete[] _sfxFile; delete[] _musicFile; + + for (int i = 0; i < 3; i++) + initAudioResourceInfo(i, 0); } bool SoundMidiPC::init() { @@ -586,8 +591,29 @@ void SoundMidiPC::updateVolumeSettings() { _output->setSourceVolume(i, _sfxVolume, false); } +void SoundMidiPC::initAudioResourceInfo(int set, void *info) { + if (set >= kMusicIntro && set <= kMusicFinale) { + delete _resInfo[set]; + _resInfo[set] = info ? new SoundResourceInfo_PC(*(SoundResourceInfo_PC*)info) : 0; + } +} + +void SoundMidiPC::selectAudioResourceSet(int set) { + if (set >= kMusicIntro && set <= kMusicFinale) { + if (_resInfo[set]) + _currentResourceSet = set; + } +} + +bool SoundMidiPC::hasSoundFile(uint file) const { + if (file < res()->fileListSize) + return (res()->fileList[file] != 0); + return false; +} + void SoundMidiPC::loadSoundFile(uint file) { - loadSoundFile(fileListEntry(file)); + if (file < res()->fileListSize) + loadSoundFile(res()->fileList[file]); } void SoundMidiPC::loadSoundFile(Common::String file) { diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp index 4b25db33f2..af741a1ebe 100644 --- a/engines/kyra/sound_towns.cpp +++ b/engines/kyra/sound_towns.cpp @@ -35,8 +35,8 @@ namespace Kyra { SoundTowns::SoundTowns(KyraEngine_v1 *vm, Audio::Mixer *mixer) : Sound(vm, mixer), _lastTrack(-1), _musicTrackData(0), _sfxFileData(0), _cdaPlaying(0), - _sfxFileIndex((uint)-1), _musicFadeTable(0), _sfxWDTable(0), _sfxBTTable(0), _sfxChannel(0x46) { - + _sfxFileIndex((uint)-1), _musicFadeTable(0), _sfxWDTable(0), _sfxBTTable(0), _sfxChannel(0x46), _currentResourceSet(0) { + memset(&_resInfo, 0, sizeof(_resInfo)); _driver = new TownsEuphonyDriver(_mixer); } @@ -46,6 +46,8 @@ SoundTowns::~SoundTowns() { delete _driver; delete[] _musicTrackData; delete[] _sfxFileData; + for (int i = 0; i < 3; i++) + initAudioResourceInfo(i, 0); } bool SoundTowns::init() { @@ -78,11 +80,12 @@ void SoundTowns::playTrack(uint8 track) { return; track -= 2; - const int32 *const tTable = (const int32 *)cdaData(); - int tTableIndex = 3 * track; + uint tTableIndex = 3 * track; + + assert(tTableIndex + 2 < res()->cdaTableSize); - int trackNum = (int)READ_LE_UINT32(&tTable[tTableIndex + 2]); - int32 loop = (int32)READ_LE_UINT32(&tTable[tTableIndex + 1]); + int trackNum = (int)READ_LE_UINT32(&res()->cdaTable[tTableIndex + 2]); + int32 loop = (int32)READ_LE_UINT32(&res()->cdaTable[tTableIndex + 1]); if (track == _lastTrack && _musicEnabled) return; @@ -95,7 +98,7 @@ void SoundTowns::playTrack(uint8 track) { g_system->getAudioCDManager()->updateCD(); _cdaPlaying = true; } else if (_musicEnabled) { - playEuphonyTrack(READ_LE_UINT32(&tTable[tTableIndex]), loop); + playEuphonyTrack(READ_LE_UINT32(&res()->cdaTable[tTableIndex]), loop); _cdaPlaying = false; } @@ -117,12 +120,32 @@ void SoundTowns::haltTrack() { _driver->stopParser(); } +void SoundTowns::initAudioResourceInfo(int set, void *info) { + if (set >= kMusicIntro && set <= kMusicFinale) { + delete _resInfo[set]; + _resInfo[set] = info ? new SoundResourceInfo_Towns(*(SoundResourceInfo_Towns*)info) : 0; + } +} + +void SoundTowns::selectAudioResourceSet(int set) { + if (set >= kMusicIntro && set <= kMusicFinale) { + if (_resInfo[set]) + _currentResourceSet = set; + } +} + +bool SoundTowns::hasSoundFile(uint file) const { + if (file < res()->fileListSize) + return (res()->fileList[file] != 0); + return false; +} + void SoundTowns::loadSoundFile(uint file) { - if (_sfxFileIndex == file) + if (_sfxFileIndex == file || file >= res()->fileListSize) return; _sfxFileIndex = file; delete[] _sfxFileData; - _sfxFileData = _vm->resource()->fileData(fileListEntry(file), 0); + _sfxFileData = _vm->resource()->fileData(res()->fileList[file], 0); } void SoundTowns::playSoundEffect(uint8 track, uint8) { @@ -151,8 +174,8 @@ void SoundTowns::playSoundEffect(uint8 track, uint8) { } } - uint8 *fileBody = _sfxFileData + 0x01b8; - int32 offset = (int32)READ_LE_UINT32(_sfxFileData + (track - 0x0b) * 4); + uint8 *fileBody = _sfxFileData + 0x01B8; + int32 offset = (int32)READ_LE_UINT32(_sfxFileData + (track - 0x0B) * 4); if (offset == -1) return; @@ -191,10 +214,10 @@ void SoundTowns::playSoundEffect(uint8 track, uint8) { sfx_WdTable_Number = READ_LE_UINT16(_sfxWDTable + sfx_WdTable_Offset); sfx_BtTable_Offset += (int16)READ_LE_UINT16(_sfxWDTable + sfx_WdTable_Offset + 2); - *tgt++ = _sfxBTTable[((sfx_BtTable_Offset >> 2) & 0xff)]; + *tgt++ = _sfxBTTable[((sfx_BtTable_Offset >> 2) & 0xFF)]; sfx_BtTable_Offset += (int16)READ_LE_UINT16(_sfxWDTable + sfx_WdTable_Offset + 4); - *tgt++ = _sfxBTTable[((sfx_BtTable_Offset >> 2) & 0xff)]; + *tgt++ = _sfxBTTable[((sfx_BtTable_Offset >> 2) & 0xFF)]; } } @@ -270,7 +293,7 @@ void SoundTowns::beginFadeOut() { 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]); + _driver->chanVolume(ii, fadeVolCur[ii - 0x3A]); for (int ii = 0; ii < 6; ii++) { fadeVolCur[ii] -= fadeVolStep[ii]; @@ -367,13 +390,16 @@ void SoundTowns::fadeOutSoundEffects() { } SoundPC98::SoundPC98(KyraEngine_v1 *vm, Audio::Mixer *mixer) : - Sound(vm, mixer), _musicTrackData(0), _sfxTrackData(0), _lastTrack(-1), _driver(0) { + Sound(vm, mixer), _musicTrackData(0), _sfxTrackData(0), _lastTrack(-1), _driver(0), _currentResourceSet(0) { + memset(&_resInfo, 0, sizeof(_resInfo)); } SoundPC98::~SoundPC98() { delete[] _musicTrackData; delete[] _sfxTrackData; delete _driver; + for (int i = 0; i < 3; i++) + initAudioResourceInfo(i, 0); } bool SoundPC98::init() { @@ -383,8 +409,26 @@ bool SoundPC98::init() { return reslt; } -void SoundPC98::loadSoundFile(uint file) { - if (!scumm_strnicmp(fileListEntry(0), "INTRO", 5)) { +void SoundPC98::initAudioResourceInfo(int set, void *info) { + if (set >= kMusicIntro && set <= kMusicFinale) { + delete _resInfo[set]; + _resInfo[set] = info ? new Common::String(((SoundResourceInfo_PC98*)info)->pattern) : 0; + } +} + +void SoundPC98::selectAudioResourceSet(int set) { + if (set >= kMusicIntro && set <= kMusicFinale) { + if (_resInfo[set]) + _currentResourceSet = set; + } +} + +bool SoundPC98::hasSoundFile(uint file) const { + return true; +} + +void SoundPC98::loadSoundFile(uint) { + if (_currentResourceSet == kMusicIntro) { delete[] _sfxTrackData; _sfxTrackData = 0; @@ -407,14 +451,14 @@ void SoundPC98::loadSoundFile(Common::String file) { } void SoundPC98::playTrack(uint8 track) { - track += extraOffset(); + track -= 1; if (track == _lastTrack && _musicEnabled) return; beginFadeOut(); - Common::String musicFile = fileListLen() == 1 ? Common::String::format(fileListEntry(0), track) : fileListEntry(track); + Common::String musicFile = Common::String::format(resPattern(), track); delete[] _musicTrackData; _musicTrackData = _vm->resource()->fileData(musicFile.c_str(), 0); if (_musicEnabled) @@ -464,13 +508,16 @@ void SoundPC98::updateVolumeSettings() { // KYRA 2 SoundTownsPC98_v2::SoundTownsPC98_v2(KyraEngine_v1 *vm, Audio::Mixer *mixer) : - Sound(vm, mixer), _currentSFX(0), _musicTrackData(0), _sfxTrackData(0), _lastTrack(-1), _driver(0), _useFmSfx(false) { + Sound(vm, mixer), _currentSFX(0), _musicTrackData(0), _sfxTrackData(0), _lastTrack(-1), _driver(0), _useFmSfx(false), _currentResourceSet(0) { + memset(&_resInfo, 0, sizeof(_resInfo)); } SoundTownsPC98_v2::~SoundTownsPC98_v2() { delete[] _musicTrackData; delete[] _sfxTrackData; delete _driver; + for (int i = 0; i < 3; i++) + initAudioResourceInfo(i, 0); } bool SoundTownsPC98_v2::init() { @@ -478,7 +525,9 @@ bool SoundTownsPC98_v2::init() { TownsPC98_AudioDriver::kType86 : TownsPC98_AudioDriver::kTypeTowns); if (_vm->gameFlags().platform == Common::kPlatformFMTowns) { - _vm->checkCD(); + if (_resInfo[_currentResourceSet]) + if (_resInfo[_currentResourceSet]->cdaTableSize) + _vm->checkCD(); // FIXME: While checking for 'track1.XXX(X)' looks like // a good idea, we should definitely not be doing this // here. Basically our filenaming scheme could change @@ -486,9 +535,9 @@ bool SoundTownsPC98_v2::init() { // this misses the possibility that we play the tracks // right off CD. So we should find another way to // check if we have access to CD audio. - Resource *res = _vm->resource(); + Resource *r = _vm->resource(); if (_musicEnabled && - (res->exists("track1.mp3") || res->exists("track1.ogg") || res->exists("track1.flac") || res->exists("track1.fla"))) + (r->exists("track1.mp3") || r->exists("track1.ogg") || r->exists("track1.flac") || r->exists("track1.fla"))) _musicEnabled = 2; else _musicEnabled = 1; @@ -503,6 +552,26 @@ bool SoundTownsPC98_v2::init() { return reslt; } +void SoundTownsPC98_v2::initAudioResourceInfo(int set, void *info) { + if (set >= kMusicIntro && set <= kMusicFinale) { + delete _resInfo[set]; + _resInfo[set] = info ? new SoundResourceInfo_TownsPC98V2(*(SoundResourceInfo_TownsPC98V2*)info) : 0; + } +} + +void SoundTownsPC98_v2::selectAudioResourceSet(int set) { + if (set >= kMusicIntro && set <= kMusicFinale) { + if (_resInfo[set]) + _currentResourceSet = set; + } +} + +bool SoundTownsPC98_v2::hasSoundFile(uint file) const { + if (file < res()->fileListSize) + return (res()->fileList[file] != 0); + return false; +} + void SoundTownsPC98_v2::loadSoundFile(Common::String file) { delete[] _sfxTrackData; _sfxTrackData = _vm->resource()->fileData(file.c_str(), 0); @@ -513,18 +582,14 @@ void SoundTownsPC98_v2::process() { } void SoundTownsPC98_v2::playTrack(uint8 track) { - track += extraOffset(); - if (track == _lastTrack && _musicEnabled) return; - const uint16 *const cdaTracks = (const uint16 *)cdaData(); - int trackNum = -1; if (_vm->gameFlags().platform == Common::kPlatformFMTowns) { - for (int i = 0; i < cdaTrackNum(); i++) { - if (track == (uint8) READ_LE_UINT16(&cdaTracks[i * 2])) { - trackNum = (int) READ_LE_UINT16(&cdaTracks[i * 2 + 1]) - 1; + for (uint i = 0; i < res()->cdaTableSize; i++) { + if (track == (uint8) READ_LE_UINT16(&res()->cdaTable[i * 2])) { + trackNum = (int) READ_LE_UINT16(&res()->cdaTable[i * 2 + 1]) - 1; break; } } @@ -532,9 +597,10 @@ void SoundTownsPC98_v2::playTrack(uint8 track) { beginFadeOut(); - Common::String musicFile = fileListLen() == 1 ? Common::String::format(fileListEntry(0), track) : fileListEntry(track); + Common::String musicFile = res()->pattern ? Common::String::format(res()->pattern, track) : (res()->fileList ? res()->fileList[track] : 0); if (musicFile.empty()) return; + delete[] _musicTrackData; _musicTrackData = _vm->resource()->fileData(musicFile.c_str(), 0); @@ -569,15 +635,24 @@ void SoundTownsPC98_v2::beginFadeOut() { haltTrack(); } -int32 SoundTownsPC98_v2::voicePlay(const char *file, Audio::SoundHandle *handle, uint8, bool) { +int32 SoundTownsPC98_v2::voicePlay(const char *file, Audio::SoundHandle *handle, uint8 volume, uint8 priority, bool) { static const uint16 rates[] = { 0x10E1, 0x0CA9, 0x0870, 0x0654, 0x0438, 0x032A, 0x021C, 0x0194 }; static const char patternHOF[] = "%s.PCM"; static const char patternLOL[] = "%s.VOC"; int h = 0; if (_currentSFX) { - while (h < kNumChannelHandles && _mixer->isSoundHandleActive(_soundChannels[h])) + while (h < kNumChannelHandles && _mixer->isSoundHandleActive(_soundChannels[h].handle)) h++; + + if (h >= kNumChannelHandles) { + h = 0; + while (h < kNumChannelHandles && _soundChannels[h].priority > priority) + ++h; + if (h < kNumChannelHandles) + voiceStop(&_soundChannels[h].handle); + } + if (h >= kNumChannelHandles) return 0; } @@ -621,7 +696,7 @@ int32 SoundTownsPC98_v2::voicePlay(const char *file, Audio::SoundHandle *handle, cmd = ~cmd; } else { cmd |= 0x80; - if (cmd == 0xff) + if (cmd == 0xFF) cmd--; } if (cmd < 0x80) @@ -630,9 +705,10 @@ int32 SoundTownsPC98_v2::voicePlay(const char *file, Audio::SoundHandle *handle, } _currentSFX = Audio::makeRawStream(sfx, outsize, sfxRate * 10, Audio::FLAG_UNSIGNED | Audio::FLAG_LITTLE_ENDIAN); - _mixer->playStream(Audio::Mixer::kSFXSoundType, &_soundChannels[h], _currentSFX); + _mixer->playStream(Audio::Mixer::kSFXSoundType, &_soundChannels[h].handle, _currentSFX, -1, volume); + _soundChannels[h].priority = priority; if (handle) - *handle = _soundChannels[h]; + *handle = _soundChannels[h].handle; delete[] data; return 1; diff --git a/engines/kyra/sprites_eob.cpp b/engines/kyra/sprites_eob.cpp index 5c679f5cb4..962efe6a4e 100644 --- a/engines/kyra/sprites_eob.cpp +++ b/engines/kyra/sprites_eob.cpp @@ -58,7 +58,7 @@ void EoBCoreEngine::releaseMonsterShapes(int first, int num) { const uint8 *EoBCoreEngine::loadMonsterProperties(const uint8 *data) { uint8 cmd = *data++; - while (cmd != 0xff) { + while (cmd != 0xFF) { EoBMonsterProperty *d = &_monsterProps[cmd]; d->armorClass = (int8)*data++; d->hitChance = (int8)*data++; @@ -90,7 +90,7 @@ const uint8 *EoBCoreEngine::loadMonsterProperties(const uint8 *data) { d->sound2 = (int8)*data++; d->numRemoteAttacks = *data++; - if (*data++ != 0xff) { + if (*data++ != 0xFF) { d->remoteWeaponChangeMode = *data++; d->numRemoteWeapons = *data++; @@ -113,7 +113,7 @@ const uint8 *EoBCoreEngine::loadMonsterProperties(const uint8 *data) { } const uint8 *EoBCoreEngine::loadActiveMonsterData(const uint8 *data, int level) { - for (uint8 p = *data++; p != 0xff; p = *data++) { + for (uint8 p = *data++; p != 0xFF; p = *data++) { uint8 v = *data++; _timer->setCountdown(0x20 + (p << 1), v); _timer->setCountdown(0x21 + (p << 1), v); @@ -132,7 +132,7 @@ const uint8 *EoBCoreEngine::loadActiveMonsterData(const uint8 *data, int level) memset(_monsters, 0, 30 * sizeof(EoBMonsterInPlay)); for (int i = 0; i < 30; i++, data += 14) { - if (*data == 0xff) + if (*data == 0xFF) continue; initMonster(data[0], data[1], READ_LE_UINT16(&data[2]), data[4], (int8)data[5], data[6], data[7], data[8], data[9], READ_LE_UINT16(&data[10]), READ_LE_UINT16(&data[12])); @@ -174,7 +174,7 @@ void EoBCoreEngine::initMonster(int index, int unit, uint16 block, int pos, int } void EoBCoreEngine::placeMonster(EoBMonsterInPlay *m, uint16 block, int dir) { - if (block != 0xffff) { + if (block != 0xFFFF) { checkSceneUpdateNeed(m->block); if (_levelBlockProperties[m->block].flags & 7) { _levelBlockProperties[m->block].flags--; @@ -201,11 +201,11 @@ void EoBCoreEngine::killMonster(EoBMonsterInPlay *m, bool giveExperience) { if (m->randItem) { if (rollDice(1, 10, 0) == 1) - setItemPosition((Item *)&_levelBlockProperties[m->block & 0x3ff].drawObjects, m->block, duplicateItem(m->randItem), pos); + setItemPosition((Item *)&_levelBlockProperties[m->block & 0x3FF].drawObjects, m->block, duplicateItem(m->randItem), pos); } if (m->fixedItem) - setItemPosition((Item *)&_levelBlockProperties[m->block & 0x3ff].drawObjects, m->block, duplicateItem(m->fixedItem), pos); + setItemPosition((Item *)&_levelBlockProperties[m->block & 0x3FF].drawObjects, m->block, duplicateItem(m->fixedItem), pos); if (giveExperience) increasePartyExperience(_monsterProps[m->type].experience); @@ -357,7 +357,7 @@ void EoBCoreEngine::flashMonsterShape(EoBMonsterInPlay *m) { disableSysTimer(2); _flashShapeTimer = 0; drawScene(1); - m->flags &= 0xfd; + m->flags &= 0xFD; _flashShapeTimer = _system->getMillis() + _tickLength; enableSysTimer(2); @@ -536,7 +536,7 @@ void EoBCoreEngine::drawMonsters(int index) { int h = shp[1]; x = x - (w >> 1) + (d->idleAnimState >> 4); - y = y - h + (d->idleAnimState & 0x0f); + y = y - h + (d->idleAnimState & 0x0F); drawMonsterShape(shp, x, y, f >= 0 ? 0 : 1, d->flags, palIndex); diff --git a/engines/kyra/sprites_lol.cpp b/engines/kyra/sprites_lol.cpp index f4bae113c5..88b24e1367 100644 --- a/engines/kyra/sprites_lol.cpp +++ b/engines/kyra/sprites_lol.cpp @@ -66,7 +66,7 @@ void LoLEngine::loadMonsterShapes(const char *file, int monsterIndex, int animTy of[2] = _screen->makeShapeCopy(p, s + 2); } } - _monsterAnimType[monsterIndex] = animType & 0xff; + _monsterAnimType[monsterIndex] = animType & 0xFF; uint8 *palShape = _screen->makeShapeCopy(p, 16); @@ -90,7 +90,7 @@ void LoLEngine::loadMonsterShapes(const char *file, int monsterIndex, int animTy uint16 sz = MIN(_screen->getShapeSize(_monsterShapes[pos]) - 10, 256); memset(tmpPal2, 0, 256); memcpy(tmpPal2, _monsterShapes[pos] + 10, sz); - memset(tmpPal3, 0xff, 256 * sizeof(uint16)); + memset(tmpPal3, 0xFF, 256 * sizeof(uint16)); uint8 numCol = *tmpPal2; for (int ii = 0; ii < numCol; ii++) { @@ -104,7 +104,7 @@ void LoLEngine::loadMonsterShapes(const char *file, int monsterIndex, int animTy memset(tmpPal2, 0, 256); memcpy(tmpPal2, _monsterShapes[pos] + 10, sz); for (int iii = 0; iii < numCol; iii++) { - if (tmpPal3[iii] == 0xffff) + if (tmpPal3[iii] == 0xFFFF) continue; if (p[tmpPal3[iii] * 320 + ii + 1]) tmpPal2[1 + iii] = p[tmpPal3[iii] * 320 + ii + 1]; @@ -159,7 +159,7 @@ int LoLEngine::deleteMonstersFromBlock(int block) { continue; } - LoLMonster *m = &_monsters[i & 0x7fff]; + LoLMonster *m = &_monsters[i & 0x7FFF]; cnt++; setMonsterMode(m, 14); @@ -215,8 +215,8 @@ bool LoLEngine::updateMonsterAdjustBlocks(LoLMonster *monster) { if (monster->properties->flags & 8) return true; - uint16 x1 = (monster->x & 0xff00) | 0x80; - uint16 y1 = (monster->y & 0xff00) | 0x80; + uint16 x1 = (monster->x & 0xFF00) | 0x80; + uint16 y1 = (monster->y & 0xFF00) | 0x80; int x2 = _partyPosX; int y2 = _partyPosY; @@ -242,7 +242,7 @@ bool LoLEngine::updateMonsterAdjustBlocks(LoLMonster *monster) { return false; for (int i = 0; i < 18; i++) - _visibleBlocks[i] = &_levelBlockProperties[(monster->block + _dscBlockIndex[dir + i]) & 0x3ff]; + _visibleBlocks[i] = &_levelBlockProperties[(monster->block + _dscBlockIndex[dir + i]) & 0x3FF]; int16 fx1 = 0; int16 fx2 = 0; @@ -277,8 +277,8 @@ void LoLEngine::placeMonster(LoLMonster *monster, uint16 x, uint16 y) { _levelBlockProperties[monster->block].direction = 5; checkSceneUpdateNeed(monster->block); - // WORKAROUND: Some monsters in the white tower have sound id's of 0xff. This is definitely a bug, since the - // last valid track number is 249 and there is no specific handling for 0xff. Nonetheless this wouldn't + // WORKAROUND: Some monsters in the white tower have sound id's of 0xFF. This is definitely a bug, since the + // last valid track number is 249 and there is no specific handling for 0xFF. Nonetheless this wouldn't // cause problems in the original code, because it just so happens that the invalid memory address points // to an entry in _ingameGMSoundIndex which just so happens to have a value of -1 if (monster->properties->sounds[0] == 0 || monster->properties->sounds[0] == 255 || cont == false) @@ -364,7 +364,7 @@ int LoLEngine::checkBlockBeforeObjectPlacement(uint16 x, uint16 y, uint16 object return 4; if (x & 0x80) { - if (((x & 0xff) + objectWidth) & 0xff00) { + if (((x & 0xFF) + objectWidth) & 0xFF00) { xOffs = 1; _objectLastDirection = 2; x2 = x + objectWidth; @@ -380,7 +380,7 @@ int LoLEngine::checkBlockBeforeObjectPlacement(uint16 x, uint16 y, uint16 object flag = 1; } } else { - if (((x & 0xff) - objectWidth) & 0xff00) { + if (((x & 0xFF) - objectWidth) & 0xFF00) { xOffs = -1; _objectLastDirection = 6; x2 = x - objectWidth; @@ -398,7 +398,7 @@ int LoLEngine::checkBlockBeforeObjectPlacement(uint16 x, uint16 y, uint16 object } if (y & 0x80) { - if (((y & 0xff) + objectWidth) & 0xff00) { + if (((y & 0xFF) + objectWidth) & 0xFF00) { yOffs = 1; _objectLastDirection = 4; y2 = y + objectWidth; @@ -415,7 +415,7 @@ int LoLEngine::checkBlockBeforeObjectPlacement(uint16 x, uint16 y, uint16 object flag = 0; } } else { - if (((y & 0xff) - objectWidth) & 0xff00) { + if (((y & 0xFF) - objectWidth) & 0xFF00) { yOffs = -1; _objectLastDirection = 0; y2 = y - objectWidth; @@ -449,7 +449,7 @@ int LoLEngine::checkBlockBeforeObjectPlacement(uint16 x, uint16 y, uint16 object int LoLEngine::testBlockPassability(int block, int x, int y, int objectWidth, int testFlag, int wallFlag) { if (block == _currentBlock) - testFlag &= 0xfffe; + testFlag &= 0xFFFE; if (testFlag & 1) { _monsterCurBlock = block; @@ -463,7 +463,7 @@ int LoLEngine::testBlockPassability(int block, int x, int y, int objectWidth, in uint16 obj = _levelBlockProperties[block].assignedObjects; while (obj & 0x8000) { - LoLMonster *monster = &_monsters[obj & 0x7fff]; + LoLMonster *monster = &_monsters[obj & 0x7FFF]; if (monster->mode < 13) { int r = checkDrawObjectSpace(x, y, monster->x, monster->y); @@ -481,19 +481,8 @@ int LoLEngine::calcMonsterSkillLevel(int id, int a) { const uint16 *c = getCharacterOrMonsterStats(id); int r = (a << 8) / c[4]; - /* - if (!(id & 0x8000)) - r = (r * _monsterModifiers[3 + _monsterDifficulty]) >> 8; - - id &= 0x7fff; - - if (_characters[id].skillLevels[1] <= 3) - return r; - else if (_characters[id].skillLevels[1] <= 7) - return (r- (r >> 2));*/ - if (id & 0x8000) { - r = (r * _monsterModifiers[3 + _monsterDifficulty]) >> 8; + r = (r * _monsterModifiers2[3 + _monsterDifficulty]) >> 8; } else { if (_characters[id].skillLevels[1] > 7) r = (r - (r >> 1)); @@ -530,7 +519,7 @@ void LoLEngine::drawBlockObjects(int blockArrayIndex) { s = l->drawObjects; while (s) { if (s & 0x8000) { - s &= 0x7fff; + s &= 0x7FFF; if (blockArrayIndex < 15) drawMonster(s); s = _monsters[s].nextDrawObject; @@ -607,7 +596,7 @@ void LoLEngine::drawBlockObjects(int blockArrayIndex) { void LoLEngine::drawMonster(uint16 id) { LoLMonster *m = &_monsters[id]; int16 flg = _monsterDirFlags[(_currentDirection << 2) + m->facing]; - int curFrm = getMonsterCurFrame(m, flg & 0xffef); + int curFrm = getMonsterCurFrame(m, flg & 0xFFEF); uint8 *shp = 0; if (curFrm == -1) { @@ -622,7 +611,7 @@ void LoLEngine::drawMonster(uint16 id) { if (m->properties->flags & 0x800) flg |= 0x20; - uint8 *monsterPalette = d ? _monsterPalettes[(m->properties->shapeIndex << 4) + (curFrm & 0x0f)] + (shp[10] * (d - 1)) : 0; + uint8 *monsterPalette = d ? _monsterPalettes[(m->properties->shapeIndex << 4) + (curFrm & 0x0F)] + (shp[10] * (d - 1)) : 0; uint8 *brightnessOverlay = drawItemOrMonster(shp, monsterPalette, m->x + _monsterShiftOffs[m->shiftStep << 1], m->y + _monsterShiftOffs[(m->shiftStep << 1) + 1], 0, 0, flg | 1, -1, flip); for (int i = 0; i < 4; i++) { @@ -644,16 +633,16 @@ void LoLEngine::drawMonster(uint16 id) { int dW = _screen->getShapeScaledWidth(shp, _dmScaleW) >> 1; int dH = _screen->getShapeScaledHeight(shp, _dmScaleH) >> 1; - int bloodAmount = (m->mode == 13) ? (m->fightCurTick << 1) : (m->properties->hitPoints / (m->damageReceived & 0x7fff)); + int bloodAmount = (m->mode == 13) ? (m->fightCurTick << 1) : (m->properties->hitPoints / (m->damageReceived & 0x7FFF)); shp = _gameShapes[6]; - int bloodType = m->properties->flags & 0xc000; + int bloodType = m->properties->flags & 0xC000; if (bloodType == 0x4000) - bloodType = _flags.use16ColorMode ? 0xbb : 63; + bloodType = _flags.use16ColorMode ? 0xBB : 63; else if (bloodType == 0x8000) bloodType = _flags.use16ColorMode ? 0x55 : 15; - else if (bloodType == 0xc000) + else if (bloodType == 0xC000) bloodType = _flags.use16ColorMode ? 0x33 : 74; else bloodType = 0; @@ -708,7 +697,9 @@ int LoLEngine::getMonsterCurFrame(LoLMonster *m, uint16 dirFlags) { break; case 1: // monsters whose outward appearance reflects the damage they have taken - tmp = (m->properties->hitPoints * _monsterModifiers[_monsterDifficulty]) >> 8; + tmp = m->properties->hitPoints; + if (_flags.isTalkie) + tmp = (tmp * _monsterModifiers1[_monsterDifficulty]) >> 8; if (m->hitPoints > (tmp >> 1)) tmp = 0; else if (m->hitPoints > (tmp >> 2)) @@ -796,7 +787,7 @@ void LoLEngine::redrawSceneItem() { int t = (i << 7) + 1; while (s) { if (s & 0x8000) { - s = _monsters[s & 0x7fff].nextDrawObject; + s = _monsters[s & 0x7FFF].nextDrawObject; } else { LoLItem *item = &_itemsInPlay[s]; @@ -934,7 +925,7 @@ uint8 *LoLEngine::drawItemOrMonster(uint8 *shape, uint8 *monsterPalette, int x, uint8 tmpOvl[16]; if (flags & 0x80) { - flags &= 0xff7f; + flags &= 0xFF7F; ovl2 = monsterPalette; monsterPalette = 0; } else { @@ -969,7 +960,7 @@ uint8 *LoLEngine::drawItemOrMonster(uint8 *shape, uint8 *monsterPalette, int x, if (_flags.use16ColorMode) { if (_currentLevel != 22) - flg &= 0xdfff; + flg &= 0xDFFF; } else { if (_currentLevel == 22) { @@ -1059,7 +1050,7 @@ void LoLEngine::updateMonster(LoLMonster *monster) { if ((monster->mode != 11) && (monster->mode != 14)) { if (!(_rnd.getRandomNumber(255) & 3)) { - monster->shiftStep = (monster->shiftStep + 1) & 0x0f; + monster->shiftStep = (monster->shiftStep + 1) & 0x0F; checkSceneUpdateNeed(monster->block); } } @@ -1127,7 +1118,7 @@ void LoLEngine::updateMonster(LoLMonster *monster) { // first recovery phase after delivering an attack if (++monster->fightCurTick > 2) { setMonsterMode(monster, 5); - monster->fightCurTick = (int8)((((8 << 8) / monster->properties->fightingStats[4]) * _monsterModifiers[6 + _monsterDifficulty]) >> 8); + monster->fightCurTick = (int8)((((8 << 8) / monster->properties->fightingStats[4]) * _monsterModifiers3[_monsterDifficulty]) >> 8); } checkSceneUpdateNeed(monster->block); break; @@ -1137,7 +1128,7 @@ void LoLEngine::updateMonster(LoLMonster *monster) { chasePartyWithCloseAttacks(monster); } else { setMonsterMode(monster, 7); - monster->flags &= 0xfff7; + monster->flags &= 0xFFF7; } break; @@ -1164,13 +1155,13 @@ void LoLEngine::updateMonster(LoLMonster *monster) { if (monster->damageReceived) { if (monster->damageReceived & 0x8000) - monster->damageReceived &= 0x7fff; + monster->damageReceived &= 0x7FFF; else monster->damageReceived = 0; checkSceneUpdateNeed(monster->block); } - monster->flags &= 0xffef; + monster->flags &= 0xFFEF; } void LoLEngine::moveMonster(LoLMonster *monster) { @@ -1239,13 +1230,13 @@ bool LoLEngine::chasePartyWithDistanceAttacks(LoLMonster *monster) { int flyingObject = monster->properties->distWeapons[s]; - if (flyingObject & 0xc000) { + if (flyingObject & 0xC000) { if (getBlockDistance(monster->block, _currentBlock) > 1) { int type = flyingObject & 0x4000 ? 0 : 1; - flyingObject = makeItem(flyingObject & 0x3fff, 0, 0); + flyingObject = makeItem(flyingObject & 0x3FFF, 0, 0); if (flyingObject) { - if (!launchObject(type, flyingObject, monster->x, monster->y, 12, dir << 1, -1, monster->id | 0x8000, 0x3f)) + if (!launchObject(type, flyingObject, monster->x, monster->y, 12, dir << 1, -1, monster->id | 0x8000, 0x3F)) deleteItem(flyingObject); } } @@ -1274,7 +1265,7 @@ bool LoLEngine::chasePartyWithDistanceAttacks(LoLMonster *monster) { if (getBlockDistance(monster->block, _monsters[i].block) < 7) setMonsterMode(monster, 7); } - _txt->printMessage(2, "%s", getLangString(0x401a)); + _txt->printMessage(2, "%s", getLangString(0x401A)); } else if (flyingObject == 4) { launchMagicViper(); @@ -1294,7 +1285,7 @@ bool LoLEngine::chasePartyWithDistanceAttacks(LoLMonster *monster) { void LoLEngine::chasePartyWithCloseAttacks(LoLMonster *monster) { if (!(monster->flags & 8)) { - int dir = calcMonsterDirection(monster->x & 0xff00, monster->y & 0xff00, _partyPosX & 0xff00, _partyPosY & 0xff00); + int dir = calcMonsterDirection(monster->x & 0xFF00, monster->y & 0xFF00, _partyPosX & 0xFF00, _partyPosY & 0xFF00); int x1 = _partyPosX; int y1 = _partyPosY; @@ -1396,11 +1387,11 @@ int LoLEngine::checkForPossibleDistanceAttack(uint16 monsterBlock, int direction if (mdist > distance) return 5; - int dir = calcMonsterDirection(monsterBlock & 0x1f, monsterBlock >> 5, curBlock & 0x1f, curBlock >> 5); + int dir = calcMonsterDirection(monsterBlock & 0x1F, monsterBlock >> 5, curBlock & 0x1F, curBlock >> 5); if ((dir & 1) || (dir != (direction << 1))) return 5; - if (((monsterBlock & 0x1f) != (curBlock & 0x1f)) && ((monsterBlock & 0xffe0) != (curBlock & 0xffe0))) + if (((monsterBlock & 0x1F) != (curBlock & 0x1F)) && ((monsterBlock & 0xFFE0) != (curBlock & 0xFFE0))) return 5; if (distance < 0) @@ -1438,8 +1429,8 @@ void LoLEngine::getNextStepCoords(int16 srcX, int16 srcY, int &newX, int &newY, static const int8 stepAdjustX[] = { 0, 32, 32, 32, 0, -32, -32, -32 }; static const int8 stepAdjustY[] = { -32, -32, 0, 32, 32, 32, 0, -32 }; - newX = (srcX + stepAdjustX[direction]) & 0x1fff; - newY = (srcY + stepAdjustY[direction]) & 0x1fff; + newX = (srcX + stepAdjustX[direction]) & 0x1FFF; + newY = (srcY + stepAdjustY[direction]) & 0x1FFF; } void LoLEngine::alignMonsterToParty(LoLMonster *monster) { @@ -1447,7 +1438,7 @@ void LoLEngine::alignMonsterToParty(LoLMonster *monster) { uint16 mx = monster->x; uint16 my = monster->y; uint16 *pos = (mdir & 1) ? &my : &mx; - bool centered = (*pos & 0x7f) == 0; + bool centered = (*pos & 0x7F) == 0; bool posFlag = true; if (monster->properties->maxWidth <= 63) { @@ -1458,7 +1449,7 @@ void LoLEngine::alignMonsterToParty(LoLMonster *monster) { r = true; } else { uint16 id = _levelBlockProperties[monster->block].assignedObjects; - id = (id & 0x8000) ? (id & 0x7fff) : 0xffff; + id = (id & 0x8000) ? (id & 0x7FFF) : 0xFFFF; if (id != monster->id) { r = true; @@ -1466,8 +1457,8 @@ void LoLEngine::alignMonsterToParty(LoLMonster *monster) { for (int i = 0; i < 3; i++) { mdir = (mdir + 1) & 3; id = _levelBlockProperties[calcNewBlockPosition(monster->block, mdir)].assignedObjects; - id = (id & 0x8000) ? (id & 0x7fff) : 0xffff; - if (id != 0xffff) { + id = (id & 0x8000) ? (id & 0x7FFF) : 0xFFFF; + if (id != 0xFFFF) { r = true; break; } diff --git a/engines/kyra/sprites_rpg.cpp b/engines/kyra/sprites_rpg.cpp index 0c4fcb09ab..9c08bc8dd6 100644 --- a/engines/kyra/sprites_rpg.cpp +++ b/engines/kyra/sprites_rpg.cpp @@ -27,9 +27,9 @@ namespace Kyra { int KyraRpgEngine::getBlockDistance(uint16 block1, uint16 block2) { - int b1x = block1 & 0x1f; + int b1x = block1 & 0x1F; int b1y = block1 >> 5; - int b2x = block2 & 0x1f; + int b2x = block2 & 0x1F; int b2y = block2 >> 5; uint8 dy = ABS(b2y - b1y); diff --git a/engines/kyra/staticres.cpp b/engines/kyra/staticres.cpp index 00dc4f9e13..bac31f0a3e 100644 --- a/engines/kyra/staticres.cpp +++ b/engines/kyra/staticres.cpp @@ -31,6 +31,7 @@ #include "kyra/gui_lok.h" #include "kyra/gui_hof.h" #include "kyra/gui_mr.h" +#include "kyra/sequences_hof.h" #include "kyra/sound_intern.h" #include "common/endian.h" @@ -38,7 +39,7 @@ namespace Kyra { -#define RESFILE_VERSION 83 +#define RESFILE_VERSION 84 namespace { bool checkKyraDat(Common::SeekableReadStream *file) { @@ -245,8 +246,8 @@ bool StaticResource::init() { { kAmigaSfxTable, proc(loadAmigaSfxTable), proc(freeAmigaSfxTable) }, { kRawData, proc(loadRawData), proc(freeRawData) }, - { k2SeqData, proc(loadHofSequenceData), proc(freeHofSequenceData) }, - { k2ShpAnimDataV1, proc(loadShapeAnimData_v1), proc(freeHofShapeAnimDataV1) }, + { k2SeqData, proc(loadHoFSequenceData), proc(freeHoFSequenceData) }, + { k2SeqItemAnimData, proc(loadHoFSeqItemAnimData), proc(freeHoFSeqItemAnimData) }, { k2ItemAnimDefinition, proc(loadItemAnimDefinition), proc(freeItemAnimDefinition) }, #ifdef ENABLE_LOL @@ -289,7 +290,7 @@ void StaticResource::deinit() { } const char *const *StaticResource::loadStrings(int id, int &strings) { - return (const char * const *)getData(id, kStringList, strings); + return (const char *const *)getData(id, kStringList, strings); } const uint8 *StaticResource::loadRawData(int id, int &size) { @@ -308,12 +309,12 @@ const Room *StaticResource::loadRoomTable(int id, int &entries) { return (const Room *)getData(id, StaticResource::kRoomList, entries); } -const HofSeqData *StaticResource::loadHofSequenceData(int id, int &entries) { - return (const HofSeqData *)getData(id, k2SeqData, entries); +const HoFSeqData *StaticResource::loadHoFSequenceData(int id, int &entries) { + return (const HoFSeqData *)getData(id, k2SeqData, entries); } -const ItemAnimData_v1 *StaticResource::loadShapeAnimData_v1(int id, int &entries) { - return (const ItemAnimData_v1 *)getData(id, k2ShpAnimDataV1, entries); +const HoFSeqItemAnimData *StaticResource::loadHoFSeqItemAnimData(int id, int &entries) { + return (const HoFSeqItemAnimData *)getData(id, k2SeqItemAnimData, entries); } const ItemAnimDefinition *StaticResource::loadItemAnimDefinition(int id, int &entries) { @@ -513,12 +514,12 @@ bool StaticResource::loadRoomTable(Common::SeekableReadStream &stream, void *&pt return true; } -bool StaticResource::loadHofSequenceData(Common::SeekableReadStream &stream, void *&ptr, int &size) { +bool StaticResource::loadHoFSequenceData(Common::SeekableReadStream &stream, void *&ptr, int &size) { int numSeq = stream.readUint16BE(); uint32 offset = 2; - Sequence *tmp_s = new Sequence[numSeq]; + HoFSequence *tmp_s = new HoFSequence[numSeq]; - size = sizeof(HofSeqData) + numSeq * (sizeof(Sequence) + 28); + size = sizeof(HoFSeqData) + numSeq * (sizeof(HoFSequence) + 28); for (int i = 0; i < numSeq; i++) { stream.seek(offset, SEEK_SET); offset += 2; @@ -529,22 +530,22 @@ bool StaticResource::loadHofSequenceData(Common::SeekableReadStream &stream, voi stream.read(const_cast<char *>(tmp_s[i].wsaFile), 14); tmp_s[i].cpsFile = new char[14]; stream.read(const_cast<char *>(tmp_s[i].cpsFile), 14); - tmp_s[i].startupCommand = stream.readByte(); - tmp_s[i].finalCommand = stream.readByte(); + tmp_s[i].fadeInTransitionType = stream.readByte(); + tmp_s[i].fadeOutTransitionType = stream.readByte(); tmp_s[i].stringIndex1 = stream.readUint16BE(); tmp_s[i].stringIndex2 = stream.readUint16BE(); tmp_s[i].startFrame = stream.readUint16BE(); tmp_s[i].numFrames = stream.readUint16BE(); - tmp_s[i].frameDelay = stream.readUint16BE(); + tmp_s[i].duration = stream.readUint16BE(); tmp_s[i].xPos = stream.readUint16BE(); tmp_s[i].yPos = stream.readUint16BE(); - tmp_s[i].duration = stream.readUint16BE(); + tmp_s[i].timeout = stream.readUint16BE(); } stream.seek(offset, SEEK_SET); offset += 2; int numSeqN = stream.readUint16BE(); - NestedSequence *tmp_n = new NestedSequence[numSeqN]; - size += (numSeqN * (sizeof(NestedSequence) + 14)); + HoFNestedSequence *tmp_n = new HoFNestedSequence[numSeqN]; + size += (numSeqN * (sizeof(HoFNestedSequence) + 14)); for (int i = 0; i < numSeqN; i++) { stream.seek(offset, SEEK_SET); offset += 2; @@ -559,8 +560,8 @@ bool StaticResource::loadHofSequenceData(Common::SeekableReadStream &stream, voi tmp_n[i].x = stream.readUint16BE(); tmp_n[i].y = stream.readUint16BE(); uint16 ctrlOffs = stream.readUint16BE(); - tmp_n[i].startupCommand = stream.readUint16BE(); - tmp_n[i].finalCommand = stream.readUint16BE(); + tmp_n[i].fadeInTransitionType = stream.readUint16BE(); + tmp_n[i].fadeOutTransitionType = stream.readUint16BE(); if (ctrlOffs) { stream.seek(ctrlOffs, SEEK_SET); @@ -580,21 +581,21 @@ bool StaticResource::loadHofSequenceData(Common::SeekableReadStream &stream, voi } } - HofSeqData *loadTo = new HofSeqData; + HoFSeqData *loadTo = new HoFSeqData; assert(loadTo); loadTo->seq = tmp_s; - loadTo->seqn = tmp_n; + loadTo->nestedSeq = tmp_n; loadTo->numSeq = numSeq; - loadTo->numSeqn = numSeqN; + loadTo->numNestedSeq = numSeqN; ptr = loadTo; return true; } -bool StaticResource::loadShapeAnimData_v1(Common::SeekableReadStream &stream, void *&ptr, int &size) { +bool StaticResource::loadHoFSeqItemAnimData(Common::SeekableReadStream &stream, void *&ptr, int &size) { size = stream.readByte(); - ItemAnimData_v1 *loadTo = new ItemAnimData_v1[size]; + HoFSeqItemAnimData *loadTo = new HoFSeqItemAnimData[size]; assert(loadTo); for (int i = 0; i < size; i++) { @@ -670,8 +671,8 @@ void StaticResource::freeRoomTable(void *&ptr, int &size) { size = 0; } -void StaticResource::freeHofSequenceData(void *&ptr, int &size) { - HofSeqData *h = (HofSeqData *)ptr; +void StaticResource::freeHoFSequenceData(void *&ptr, int &size) { + HoFSeqData *h = (HoFSeqData *)ptr; for (int i = 0; i < h->numSeq; i++) { delete[] h->seq[i].wsaFile; @@ -679,19 +680,19 @@ void StaticResource::freeHofSequenceData(void *&ptr, int &size) { } delete[] h->seq; - for (int i = 0; i < h->numSeqn; i++) { - delete[] h->seqn[i].wsaFile; - delete[] h->seqn[i].wsaControl; + for (int i = 0; i < h->numNestedSeq; i++) { + delete[] h->nestedSeq[i].wsaFile; + delete[] h->nestedSeq[i].wsaControl; } - delete[] h->seqn; + delete[] h->nestedSeq; delete h; ptr = 0; size = 0; } -void StaticResource::freeHofShapeAnimDataV1(void *&ptr, int &size) { - ItemAnimData_v1 *d = (ItemAnimData_v1 *)ptr; +void StaticResource::freeHoFSeqItemAnimData(void *&ptr, int &size) { + HoFSeqItemAnimData *d = (HoFSeqItemAnimData *)ptr; for (int i = 0; i < size; i++) delete[] d[i].frames; delete[] d; @@ -777,22 +778,6 @@ void KyraEngine_LoK::initStaticResource() { _storyStrings = _staticres->loadStrings(k1PC98StoryStrings, _storyStringsSize); - int size1, size2; - const char *const *soundfiles1 = _staticres->loadStrings(k1AudioTracks, size1); - const char *const *soundfiles2 = _staticres->loadStrings(k1AudioTracks2, size2); - _soundFilesSize = size1 + size2; - if (_soundFilesSize) { - delete[] _soundFiles; - const char **soundfiles = new const char*[_soundFilesSize]; - for (int i = 0; i < _soundFilesSize; i++) - soundfiles[i] = (i < size1) ? soundfiles1[i] : soundfiles2[i - size1]; - _soundFiles = soundfiles; - } - _soundFilesIntro = _staticres->loadStrings(k1AudioTracksIntro, _soundFilesIntroSize); - _cdaTrackTable = (const int32 *)_staticres->loadRawData(k1TownsCDATable, _cdaTrackTableSize); - - // copied static res - // room list const Room *tempRoomList = _staticres->loadRoomTable(k1RoomList, _roomTableSize); @@ -819,34 +804,40 @@ void KyraEngine_LoK::initStaticResource() { _staticres->unloadId(k1DefaultShapes); } - // audio data tables - static const char *const tIntro98[] = { "INTRO%d.DAT" }; - static const char *const tIngame98[] = { "KYRAM%d.DAT" }; + // audio resource assignment + int size1, size2; + const char *const *soundfiles1 = _staticres->loadStrings(k1AudioTracks, size1); + const char *const *soundfiles2 = _staticres->loadStrings(k1AudioTracks2, size2); + int soundFilesSize = size1 + size2; + int soundFilesIntroSize = 0; + int cdaTableSize = 0; + const char **soundFiles = 0; + + if (soundFilesSize) { + soundFiles = new const char*[soundFilesSize]; + for (int i = 0; i < soundFilesSize; i++) + soundFiles[i] = (i < size1) ? soundfiles1[i] : soundfiles2[i - size1]; + } + const char *const *soundFilesIntro = _staticres->loadStrings(k1AudioTracksIntro, temp); + const int32 *cdaTable = (const int32 *)_staticres->loadRawData(k1TownsCDATable, cdaTableSize); // FIXME: It seems Kyra1 MAC CD includes AdLib and MIDI music and sfx, thus we enable // support for those for now. (Based on patch #2767489 "Support for Mac Kyrandia 1 CD" by satz). - memset(_soundData, 0, sizeof(_soundData)); if (_flags.platform == Common::kPlatformPC || _flags.platform == Common::kPlatformMacintosh) { - _soundData[0].fileList = _soundFilesIntro; - _soundData[0].fileListLen = _soundFilesIntroSize; - _soundData[1].fileList = _soundFiles; - _soundData[1].fileListLen = _soundFilesSize; + SoundResourceInfo_PC resInfoIntro(soundFilesIntro, soundFilesIntroSize); + SoundResourceInfo_PC resInfoIngame(soundFiles, soundFilesSize); + _sound->initAudioResourceInfo(kMusicIntro, &resInfoIntro); + _sound->initAudioResourceInfo(kMusicIngame, &resInfoIngame); } else if (_flags.platform == Common::kPlatformFMTowns) { - _soundData[0].fileList = _soundFiles; - _soundData[0].fileListLen = _soundFilesSize; - _soundData[0].cdaTracks = _cdaTrackTable; - _soundData[0].cdaNumTracks = _cdaTrackTableSize; - _soundData[1].fileList = _soundFiles; - _soundData[1].fileListLen = _soundFilesSize; - _soundData[1].cdaTracks = _cdaTrackTable; - _soundData[1].cdaNumTracks = _cdaTrackTableSize; + SoundResourceInfo_Towns resInfoIntro(soundFiles, soundFilesSize, cdaTable, cdaTableSize); + SoundResourceInfo_Towns resInfoIngame(soundFiles, soundFilesSize, cdaTable, cdaTableSize); + _sound->initAudioResourceInfo(kMusicIntro, &resInfoIntro); + _sound->initAudioResourceInfo(kMusicIngame, &resInfoIngame); } else if (_flags.platform == Common::kPlatformPC98) { - _soundData[0].fileList = tIntro98; - _soundData[0].fileListLen = 1; - _soundData[0].extraOffset = -1; - _soundData[1].fileList = tIngame98; - _soundData[1].fileListLen = 1; - _soundData[1].extraOffset = -1; + SoundResourceInfo_PC98 resInfoIntro("INTRO%d.DAT"); + SoundResourceInfo_PC98 resInfoIngame("KYRAM%d.DAT"); + _sound->initAudioResourceInfo(kMusicIntro, &resInfoIntro); + _sound->initAudioResourceInfo(kMusicIngame, &resInfoIngame); } } @@ -992,11 +983,7 @@ void KyraEngine_LoK::loadMainScreen(int page) { } void KyraEngine_HoF::initStaticResource() { - int tmpSize = 0; - - _sequencePakList = _staticres->loadStrings(k2SeqplayPakFiles, _sequencePakListSize); _ingamePakList = _staticres->loadStrings(k2IngamePakFiles, _ingamePakListSize); - _sequenceStrings = _staticres->loadStrings(k2SeqplayStrings, _sequenceStringsSize); _ingameSoundList = _staticres->loadStrings(k2IngameSfxFiles, _ingameSoundListSize); _ingameSoundIndex = (const uint16 *)_staticres->loadRawData(k2IngameSfxIndex, _ingameSoundIndexSize); _musicFileListIntro = _staticres->loadStrings(k2SeqplayIntroTracks, _musicFileListIntroSize); @@ -1009,131 +996,29 @@ void KyraEngine_HoF::initStaticResource() { _ingameTimJpStr = _staticres->loadStrings(k2IngameTimJpStrings, _ingameTimJpStrSize); _itemAnimDefinition = _staticres->loadItemAnimDefinition(k2IngameShapeAnimData, _itemAnimDefinitionSize); - // replace sequence talkie files with localized versions - const char *const *seqSoundList = _staticres->loadStrings(k2SeqplaySfxFiles, _sequenceSoundListSize); - const char *const *tlkfiles = _staticres->loadStrings(k2SeqplayTlkFiles, tmpSize); - char **tmpSndLst = new char *[_sequenceSoundListSize]; - - for (int i = 0; i < _sequenceSoundListSize; i++) { - const int len = strlen(seqSoundList[i]); - - tmpSndLst[i] = new char[len + 1]; - tmpSndLst[i][0] = 0; - - if (tlkfiles && len > 1) { - for (int ii = 0; ii < tmpSize; ii++) { - if (strlen(tlkfiles[ii]) > 1 && !scumm_stricmp(&seqSoundList[i][1], &tlkfiles[ii][1])) - strcpy(tmpSndLst[i], tlkfiles[ii]); - } - } - - if (tmpSndLst[i][0] == 0) - strcpy(tmpSndLst[i], seqSoundList[i]); - } - - tlkfiles = seqSoundList = 0; - _staticres->unloadId(k2SeqplayTlkFiles); - _staticres->unloadId(k2SeqplaySfxFiles); - _sequenceSoundList = tmpSndLst; - // assign music data - static const char *const fmtMusicFileListIntro[] = { "intro%d.twn" }; - static const char *const fmtMusicFileListFinale[] = { "finale%d.twn" }; - static const char *const fmtMusicFileListIngame[] = { "km%02d.twn" }; - - static const char *const pc98MusicFileListIntro[] = { "intro%d.86" }; - static const char *const pc98MusicFileListFinale[] = { "finale%d.86" }; - static const char *const pc98MusicFileListIngame[] = { "km%02d.86" }; - - memset(_soundData, 0, sizeof(_soundData)); if (_flags.platform == Common::kPlatformPC) { - _soundData[0].fileList = _musicFileListIntro; - _soundData[0].fileListLen = _musicFileListIntroSize; - _soundData[1].fileList = _musicFileListIngame; - _soundData[1].fileListLen = _musicFileListIngameSize; - _soundData[2].fileList = _musicFileListFinale; - _soundData[2].fileListLen = _musicFileListIntroSize; + SoundResourceInfo_PC resInfoIntro(_musicFileListIntro, _musicFileListIntroSize); + SoundResourceInfo_PC resInfoIngame(_musicFileListIngame, _musicFileListIngameSize); + SoundResourceInfo_PC resInfoFinale(_musicFileListFinale, _musicFileListFinaleSize); + _sound->initAudioResourceInfo(kMusicIntro, &resInfoIntro); + _sound->initAudioResourceInfo(kMusicIngame, &resInfoIngame); + _sound->initAudioResourceInfo(kMusicFinale, &resInfoFinale); } else if (_flags.platform == Common::kPlatformFMTowns) { - _soundData[0].fileList = fmtMusicFileListIntro; - _soundData[0].fileListLen = 1; - _soundData[0].cdaTracks = _cdaTrackTableIntro; - _soundData[0].cdaNumTracks = _cdaTrackTableIntroSize >> 1; - _soundData[1].fileList = fmtMusicFileListIngame; - _soundData[1].fileListLen = 1; - _soundData[1].cdaTracks = _cdaTrackTableIngame; - _soundData[1].cdaNumTracks = _cdaTrackTableIngameSize >> 1; - _soundData[2].fileList = fmtMusicFileListFinale; - _soundData[2].fileListLen = 1; - _soundData[2].cdaTracks = _cdaTrackTableFinale; - _soundData[2].cdaNumTracks = _cdaTrackTableFinaleSize >> 1; + SoundResourceInfo_TownsPC98V2 resInfoIntro(0, 0, "intro%d.twn", (const uint16*)_cdaTrackTableIntro, _cdaTrackTableIntroSize >> 1); + SoundResourceInfo_TownsPC98V2 resInfoIngame(0, 0, "km%02d.twn", (const uint16*)_cdaTrackTableIngame, _cdaTrackTableIngameSize >> 1); + SoundResourceInfo_TownsPC98V2 resInfoFinale(0, 0, "finale%d.twn", (const uint16*)_cdaTrackTableFinale, _cdaTrackTableFinaleSize >> 1); + _sound->initAudioResourceInfo(kMusicIntro, &resInfoIntro); + _sound->initAudioResourceInfo(kMusicIngame, &resInfoIngame); + _sound->initAudioResourceInfo(kMusicFinale, &resInfoFinale); } else if (_flags.platform == Common::kPlatformPC98) { - _soundData[0].fileList = pc98MusicFileListIntro; - _soundData[0].fileListLen = 1; - _soundData[1].fileList = pc98MusicFileListIngame; - _soundData[1].fileListLen = 1; - _soundData[2].fileList = pc98MusicFileListFinale; - _soundData[2].fileListLen = 1; + SoundResourceInfo_TownsPC98V2 resInfoIntro(0, 0, "intro%d.86", 0, 0); + SoundResourceInfo_TownsPC98V2 resInfoIngame(0, 0, "km%02d.86", 0, 0); + SoundResourceInfo_TownsPC98V2 resInfoFinale(0, 0, "finale%d.86", 0, 0); + _sound->initAudioResourceInfo(kMusicIntro, &resInfoIntro); + _sound->initAudioResourceInfo(kMusicIngame, &resInfoIngame); + _sound->initAudioResourceInfo(kMusicFinale, &resInfoFinale); } - - // setup sequence data - _sequences = _staticres->loadHofSequenceData(k2SeqplaySeqData, tmpSize); - - static const SeqProc hofSequenceCallbacks[] = { - 0, &KyraEngine_HoF::seq_introWestwood, - &KyraEngine_HoF::seq_introTitle, &KyraEngine_HoF::seq_introOverview, - &KyraEngine_HoF::seq_introLibrary, &KyraEngine_HoF::seq_introHand, - &KyraEngine_HoF::seq_introPoint, &KyraEngine_HoF::seq_introZanfaun, - &KyraEngine_HoF::seq_finaleFunters, &KyraEngine_HoF::seq_finaleFerb, - &KyraEngine_HoF::seq_finaleFish, &KyraEngine_HoF::seq_finaleFheep, - &KyraEngine_HoF::seq_finaleFarmer, &KyraEngine_HoF::seq_finaleFuards, - &KyraEngine_HoF::seq_finaleFirates, &KyraEngine_HoF::seq_finaleFrash - }; - - static const SeqProc hofNestedSequenceCallbacks[] = { - &KyraEngine_HoF::seq_finaleFiggle, &KyraEngine_HoF::seq_introOver1, - &KyraEngine_HoF::seq_introOver2, &KyraEngine_HoF::seq_introForest, - &KyraEngine_HoF::seq_introDragon, &KyraEngine_HoF::seq_introDarm, - &KyraEngine_HoF::seq_introLibrary2, &KyraEngine_HoF::seq_introLibrary2, - &KyraEngine_HoF::seq_introMarco, &KyraEngine_HoF::seq_introHand1a, - &KyraEngine_HoF::seq_introHand1b, &KyraEngine_HoF::seq_introHand1c, - &KyraEngine_HoF::seq_introHand2, &KyraEngine_HoF::seq_introHand3, 0 - }; - - static const SeqProc hofDemoSequenceCallbacks[] = { - &KyraEngine_HoF::seq_demoVirgin, &KyraEngine_HoF::seq_demoWestwood, - &KyraEngine_HoF::seq_demoTitle, &KyraEngine_HoF::seq_demoHill, - &KyraEngine_HoF::seq_demoOuthome, &KyraEngine_HoF::seq_demoWharf, - &KyraEngine_HoF::seq_demoDinob, &KyraEngine_HoF::seq_demoFisher, 0 - }; - - static const SeqProc hofDemoNestedSequenceCallbacks[] = { - &KyraEngine_HoF::seq_demoWharf2, &KyraEngine_HoF::seq_demoDinob2, - &KyraEngine_HoF::seq_demoWater, &KyraEngine_HoF::seq_demoBail, - &KyraEngine_HoF::seq_demoDig, 0 - }; - -#ifdef ENABLE_LOL - static const SeqProc kLoLDemoSequenceCallbacks[] = { - &KyraEngine_HoF::seq_lolDemoScene1, 0, &KyraEngine_HoF::seq_lolDemoScene2, 0, - &KyraEngine_HoF::seq_lolDemoScene3, 0, &KyraEngine_HoF::seq_lolDemoScene4, 0, - &KyraEngine_HoF::seq_lolDemoScene5, &KyraEngine_HoF::seq_lolDemoText5, - &KyraEngine_HoF::seq_lolDemoScene6, 0 - }; - - static const SeqProc kLoLDemoNestedSequenceCallbacks[] = { 0 }; -#endif // ENABLE_LOL - - _callbackS = -#ifdef ENABLE_LOL - _flags.gameID == GI_LOL ? kLoLDemoSequenceCallbacks : -#endif // ENABLE_LOL - ((_flags.isDemo && !_flags.isTalkie) ? hofDemoSequenceCallbacks : hofSequenceCallbacks); - - _callbackN = -#ifdef ENABLE_LOL - _flags.gameID == GI_LOL ? kLoLDemoNestedSequenceCallbacks : -#endif // ENABLE_LOL - ((_flags.isDemo && !_flags.isTalkie) ? hofDemoNestedSequenceCallbacks : hofNestedSequenceCallbacks); } void KyraEngine_MR::initStaticResource() { @@ -1224,13 +1109,13 @@ const uint8 KyraEngine_LoK::_itemPosY[] = { }; void GUI_LoK::initStaticResource() { - GUI_V1_BUTTON(_scrollUpButton, 0x12, 1, 1, 1, 0x483, 0, 0, 0, 0x18, 0x0f, 0); - GUI_V1_BUTTON(_scrollDownButton, 0x13, 1, 1, 1, 0x483, 0, 0, 0, 0x18, 0x0f, 0); + GUI_V1_BUTTON(_scrollUpButton, 0x12, 1, 1, 1, 0x483, 0, 0, 0, 0x18, 0x0F, 0); + GUI_V1_BUTTON(_scrollDownButton, 0x13, 1, 1, 1, 0x483, 0, 0, 0, 0x18, 0x0F, 0); - GUI_V1_BUTTON(_menuButtonData[0], 0x0c, 1, 1, 1, 0x487, 0, 0, 0, 0, 0, 0); - GUI_V1_BUTTON(_menuButtonData[1], 0x0d, 1, 1, 1, 0x487, 0, 0, 0, 0, 0, 0); - GUI_V1_BUTTON(_menuButtonData[2], 0x0e, 1, 1, 1, 0x487, 0, 0, 0, 0, 0, 0); - GUI_V1_BUTTON(_menuButtonData[3], 0x0f, 1, 1, 1, 0x487, 0, 0, 0, 0, 0, 0); + GUI_V1_BUTTON(_menuButtonData[0], 0x0C, 1, 1, 1, 0x487, 0, 0, 0, 0, 0, 0); + GUI_V1_BUTTON(_menuButtonData[1], 0x0D, 1, 1, 1, 0x487, 0, 0, 0, 0, 0, 0); + GUI_V1_BUTTON(_menuButtonData[2], 0x0E, 1, 1, 1, 0x487, 0, 0, 0, 0, 0, 0); + GUI_V1_BUTTON(_menuButtonData[3], 0x0F, 1, 1, 1, 0x487, 0, 0, 0, 0, 0, 0); GUI_V1_BUTTON(_menuButtonData[4], 0x10, 1, 1, 1, 0x487, 0, 0, 0, 0, 0, 0); GUI_V1_BUTTON(_menuButtonData[5], 0x11, 1, 1, 1, 0x487, 0, 0, 0, 0, 0, 0); @@ -1412,8 +1297,6 @@ const int GUI_v2::_sliderBarsPosition[] = { // kyra 2 static res -const uint8 KyraEngine_HoF::_seqTextColorPresets[] = { 0x01, 0x01, 0x00, 0x3f, 0x3f, 0x3f }; - const char *const KyraEngine_HoF::_languageExtension[] = { "ENG", "FRE", @@ -1631,7 +1514,7 @@ void KyraEngine_HoF::initInventoryButtonList() { _inventoryButtons[i].buttonCallback = inventoryCallback; _buttonList = &_inventoryButtons[0]; - for (size_t i = 1; i < 15; ++i) + for (int i = 1; i < 15; ++i) _buttonList = _gui->addButtonToList(_buttonList, &_inventoryButtons[i]); } diff --git a/engines/kyra/staticres_eob.cpp b/engines/kyra/staticres_eob.cpp index 7a5012f117..e0a2862dea 100644 --- a/engines/kyra/staticres_eob.cpp +++ b/engines/kyra/staticres_eob.cpp @@ -220,44 +220,44 @@ const uint8 EoBCoreEngine::_wallOfForceShapeDefs[] = { 0x0C, 0x00, 0x05, 0x10 }; -const int16 EoBCoreEngine::_buttonList1[] = { +const uint8 EoBCoreEngine::_buttonList1[] = { 58, 0, 1, 2, 3, 90, 91, 4, 5, 6, 7, 8, 9, 10, 11, 12, 78, 79, 13, 14, 15, 16, - 80, 81, 17, 18, 19, 20, 82, 83, 49, 50, 51, 52, 53, 54, 56, 57, -1 + 80, 81, 17, 18, 19, 20, 82, 83, 49, 50, 51, 52, 53, 54, 56, 57, 255 }; -const int16 EoBCoreEngine::_buttonList2[] = { +const uint8 EoBCoreEngine::_buttonList2[] = { 58, 61, 62, 63, 64, 65, 93, 94, 66, 67, 68, 69, 70, 71, 76, 77, 88, 0, 1, 2, 3, 90, 91, 4, 5, 6, 7, 8, 9, 10, 11, 12, 78, 79, 13, 14, 15, 16, 80, 81, 17, 18, - 19, 20, 82, 83, 49, 50, 51, 52, 53, 54, 56, 57, -1 + 19, 20, 82, 83, 49, 50, 51, 52, 53, 54, 56, 57, 255 }; -const int16 EoBCoreEngine::_buttonList3[] = { +const uint8 EoBCoreEngine::_buttonList3[] = { 58, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 84, 85, 46, 47, 48, 60, 59, 92, 4, 5, 6, 7, 8, 49, 50, - 51, 52, 53, 54, 56, 57, -1 + 51, 52, 53, 54, 56, 57, 255 }; -const int16 EoBCoreEngine::_buttonList4[] = { - 58, 47, 48, 60, 59, 92, 4, 5, 6, 7, 8, 49, 50, 51, 52, 53, 54, 56, 57, -1 +const uint8 EoBCoreEngine::_buttonList4[] = { + 58, 47, 48, 60, 59, 92, 4, 5, 6, 7, 8, 49, 50, 51, 52, 53, 54, 56, 57, 255 }; -const int16 EoBCoreEngine::_buttonList5[] = { +const uint8 EoBCoreEngine::_buttonList5[] = { 58, 61, 62, 63, 64, 65, 93, 66, 67, 68, 69, 70, 71, 88, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 84, - 85, 46, 47, 48, 60, 59, 92, 4, 5, 6, 7, 8, 49, 50, 51, 52, 53, 54, 56, 57, -1 + 85, 46, 47, 48, 60, 59, 92, 4, 5, 6, 7, 8, 49, 50, 51, 52, 53, 54, 56, 57, 255 }; -const int16 EoBCoreEngine::_buttonList6[] = { +const uint8 EoBCoreEngine::_buttonList6[] = { 58, 61, 62, 63, 64, 65, 93, 66, 67, 68, 69, 70, 71, 88, 46, 47, 48, 60, 59, 92, - 4, 5, 6, 7, 8, 49, 50, 51, 52, 53, 54, 56, 57, -1 + 4, 5, 6, 7, 8, 49, 50, 51, 52, 53, 54, 56, 57, 255 }; -const int16 EoBCoreEngine::_buttonList7[] = { - 17, 18, 19, 20, 82, 83, 55, -1 +const uint8 EoBCoreEngine::_buttonList7[] = { + 17, 18, 19, 20, 82, 83, 55, 255 }; -const int16 EoBCoreEngine::_buttonList8[] = { - 72, 73, 74, 75, 86, 87, 89, -1 +const uint8 EoBCoreEngine::_buttonList8[] = { + 72, 73, 74, 75, 86, 87, 89, 255 }; const uint8 EoBCoreEngine::_clock2Timers[] = { @@ -465,13 +465,13 @@ void EoBCoreEngine::initStaticResource() { // EOB I doesn't have load and save menus, because there is only one single // save slot. Instead of emulating this we provide a menu similiar to EOB II. - static const char *saveLoadStrings[3][4] = { + static const char *const saveLoadStrings[3][4] = { { "Cancel", "Empty Slot", "Save Game", "Load Game" }, { "Abbr.", "Leerer Slot", "Speichern", " Laden" }, { 0, 0, 0, 0 } }; - static const char *errorSlotEmptyString[3] = { + static const char *const errorSlotEmptyString[3] = { "There is no game\rsaved in that slot!", "Hier ist noch kein\rSpiel gespeichert!", 0 @@ -1096,7 +1096,7 @@ void EoBEngine::initStaticResource() { p->dmgModifierEvade = *ps++; } - static const char *errorSlotNoNameString[3] = { + static const char *const errorSlotNoNameString[3] = { " You must specify\r a name for your\r save game!", " Spielstaende mues-\r sen einen Namen\r haben!", 0 @@ -1118,10 +1118,10 @@ void EoBEngine::initSpells() { { 0x0000, 0x000000, 0x00 }, // dummy { 0x0033, 0x000001, 0x00 }, // armor { 0x0100, 0x000000, 0x21 }, // burning hands - { 0x004c, 0x000002, 0x00 }, // detect magic + { 0x004C, 0x000002, 0x00 }, // detect magic { 0x0100, 0x000000, 0x01 }, // magic missile { 0x0000, 0x000000, 0x00 }, // dummy - { 0x008b, 0x000008, 0x00 }, // shield + { 0x008B, 0x000008, 0x00 }, // shield { 0x0488, 0x000000, 0x03 }, // shocking grasp { 0x0021, 0x000040, 0x00 }, // invisibility { 0x0000, 0x000000, 0x00 }, // dummy @@ -1141,10 +1141,10 @@ void EoBEngine::initSpells() { { 0x0000, 0x000000, 0x00 }, // CLOUD KILL { 0x0100, 0x000000, 0x41 }, // cone of cold { 0x0100, 0x000000, 0x00 }, // hold monster - { 0x005c, 0x000400, 0x00 }, // bless + { 0x005C, 0x000400, 0x00 }, // bless { 0x0020, 0x000000, 0x00 }, // cure light wounds { 0x0100, 0x000000, 0x01 }, // cause light wounds - { 0x004c, 0x000002, 0x00 }, // detect magic + { 0x004C, 0x000002, 0x00 }, // detect magic { 0x0029, 0x000800, 0x00 }, // prot from evil { 0x0039, 0x000000, 0x00 }, // aid { 0x2408, 0x000000, 0x21 }, // flame blade @@ -1153,7 +1153,7 @@ void EoBEngine::initSpells() { { 0x0040, 0x000000, 0x00 }, // create food { 0x1000, 0x000000, 0x00 }, // dispel magic { 0x0099, 0x004000, 0x00 }, // magical vestment - { 0x004c, 0x008000, 0x00 }, // prayer + { 0x004C, 0x008000, 0x00 }, // prayer { 0x0040, 0x000000, 0x00 }, // remove paralysis { 0x0020, 0x000000, 0x00 }, // cure serious { 0x0100, 0x000000, 0x01 }, // cause serious @@ -1187,7 +1187,7 @@ void EoBEngine::initSpells() { const KyraRpgGUISettings EoBEngine::_guiSettingsVGA = { { 9, 15, 95, 9, 7, { 285, 139 }, { 189, 162 }, { 31, 31 } }, - { 135, 130, 132, 133, 133, 17, 23, 20, 184, 177, 180, 184, 177, 180 } + { 135, 130, 132, 133, 133, 17, 23, 20, 184, 177, 180, 184, 177, 180 } }; const KyraRpgGUISettings EoBEngine::_guiSettingsEGA = { @@ -1210,7 +1210,7 @@ void DarkMoonEngine::initStaticResource() { _animIntro[i] = _staticres->loadEoB2SeqData(kEob2IntroAnimData00 + i, temp); _shapesIntro = new const DarkMoonShapeDef*[13]; - memset(_shapesIntro, 0, sizeof(DarkMoonShapeDef*) * 13); + memset(_shapesIntro, 0, sizeof(DarkMoonShapeDef *) * 13); _shapesIntro[0] = _staticres->loadEoB2ShapeData(kEoB2IntroShapes00, temp); _shapesIntro[1] = _staticres->loadEoB2ShapeData(kEoB2IntroShapes01, temp); _shapesIntro[4] = _staticres->loadEoB2ShapeData(kEoB2IntroShapes04, temp); @@ -1225,7 +1225,7 @@ void DarkMoonEngine::initStaticResource() { _animFinale[i] = _staticres->loadEoB2SeqData(kEob2FinaleAnimData00 + i, temp); _shapesFinale = new const DarkMoonShapeDef*[13]; - memset(_shapesFinale, 0, sizeof(DarkMoonShapeDef*) * 13); + memset(_shapesFinale, 0, sizeof(DarkMoonShapeDef *) * 13); _shapesFinale[0] = _staticres->loadEoB2ShapeData(kEoB2FinaleShapes00, temp); _shapesFinale[3] = _staticres->loadEoB2ShapeData(kEoB2FinaleShapes03, temp); _shapesFinale[7] = _staticres->loadEoB2ShapeData(kEoB2FinaleShapes07, temp); @@ -1249,7 +1249,7 @@ void DarkMoonEngine::initStaticResource() { _wallOfForceDsNumH = _staticres->loadRawData(kEoB2WallOfForceNumH, temp); _wallOfForceShpId = _staticres->loadRawData(kEoB2WallOfForceShpId, temp); - static const char *errorSlotNoNameString[3] = { + static const char *const errorSlotNoNameString[3] = { " You must specify\r a name for your\r save game!", " Spielst[nde m]ssen\r einen Namen haben!", 0 @@ -1258,7 +1258,7 @@ void DarkMoonEngine::initStaticResource() { _errorSlotNoNameString = errorSlotNoNameString[(_flags.lang == Common::EN_ANY) ? 0 : ((_flags.lang == Common::DE_DEU) ? 1 : 2)]; // ScummVM specific - static const char *transferStringsScummVM[3][5] = { + static const char *const transferStringsScummVM[3][5] = { { "\r We cannot find any EOB save game\r file. Please make sure that the\r save game file with the party\r you wish to transfer is located\r in your ScummVM save game\r directory. If you have set up\r multiple save directories you\r have to copy the EOB save file\r into your EOB II save directory.\r Do you wish to try again?", "Game ID", @@ -1300,7 +1300,7 @@ void DarkMoonEngine::initSpells() { } } -const char *DarkMoonEngine::_palFilesIntroVGA[] = { +const char *const DarkMoonEngine::_palFilesIntroVGA[] = { "PALETTE1.PAL", "PALETTE3.PAL", "PALETTE2.PAL", @@ -1308,7 +1308,7 @@ const char *DarkMoonEngine::_palFilesIntroVGA[] = { 0 }; -const char *DarkMoonEngine::_palFilesIntroEGA[] = { +const char *const DarkMoonEngine::_palFilesIntroEGA[] = { "PALETTE0.PAL", "PALETTE3.PAL", "PALETTE2.PAL", @@ -1316,7 +1316,7 @@ const char *DarkMoonEngine::_palFilesIntroEGA[] = { 0 }; -const char *DarkMoonEngine::_palFilesFinaleVGA[] = { +const char *const DarkMoonEngine::_palFilesFinaleVGA[] = { "FINALE_0.PAL", "FINALE_0.PAL", "FINALE_1.PAL", @@ -1329,7 +1329,7 @@ const char *DarkMoonEngine::_palFilesFinaleVGA[] = { 0 }; -const char *DarkMoonEngine::_palFilesFinaleEGA[] = { +const char *const DarkMoonEngine::_palFilesFinaleEGA[] = { "FINALE_0.PAL", "FINALE_0.PAL", "FINALE_1.PAL", diff --git a/engines/kyra/staticres_lol.cpp b/engines/kyra/staticres_lol.cpp index 63bc7fa99b..a1c5ff340c 100644 --- a/engines/kyra/staticres_lol.cpp +++ b/engines/kyra/staticres_lol.cpp @@ -24,6 +24,7 @@ #include "kyra/lol.h" #include "kyra/screen_lol.h" #include "kyra/gui_lol.h" +#include "kyra/sound_intern.h" #ifdef ENABLE_LOL @@ -213,30 +214,39 @@ void StaticResource::freeButtonDefs(void *&ptr, int &size) { } void LoLEngine::initStaticResource() { - // assign music data - static const char *const pcMusicFileListIntro[] = { "LOREINTR" }; - static const char *const pcMusicFileListFinale[] = { "LOREFINL" }; - static const char *const pcMusicFileListIngame[] = { "LORE%02d%c" }; - - static const char *const pc98MusicFileListIntro[] = { 0, "lore84.86", "lore82.86", 0, 0, 0, "lore83.86", "lore81.86" }; - static const char *const pc98MusicFileListFinale[] = { 0, 0, "lore85.86", "lore86.86", "lore87.86" }; - static const char *const pc98MusicFileListIngame[] = { "lore%02d.86" }; - - memset(_soundData, 0, sizeof(_soundData)); + // assign music resource data. 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); + if (_flags.isDemo) { + static const char *const file[] = { "LOREDEMO" }; + SoundResourceInfo_PC resInfoDemo(file, ARRAYSIZE(file)); + _sound->initAudioResourceInfo(kMusicIntro, &resInfoDemo); + } else { + static const char *const intro[] = { "LOREINTR" }; + static const char *const finale[] = { "LOREFINL" }; + SoundResourceInfo_PC resInfoIntro(intro, ARRAYSIZE(intro)); + SoundResourceInfo_PC resInfoFinale(finale, ARRAYSIZE(finale)); + _sound->initAudioResourceInfo(kMusicIntro, &resInfoIntro); + // In game music file handling is different, thus does not need a file list. + _sound->initAudioResourceInfo(kMusicFinale, &resInfoFinale); + } } 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); + static const char *const fileListIntro[] = { 0, "lore84.86", "lore82.86", 0, 0, 0, "lore83.86", "lore81.86" }; + static const char *const fileListFinale[] = { 0, 0, "lore85.86", "lore86.86", "lore87.86" }; + SoundResourceInfo_TownsPC98V2 resInfoIntro(fileListIntro, ARRAYSIZE(fileListIntro), 0, 0, 0); + SoundResourceInfo_TownsPC98V2 resInfoIngame(0, 0, "lore%02d.86", 0, 0); + SoundResourceInfo_TownsPC98V2 resInfoFinale(fileListFinale, ARRAYSIZE(fileListFinale), 0, 0, 0); + _sound->initAudioResourceInfo(kMusicIntro, &resInfoIntro); + _sound->initAudioResourceInfo(kMusicIngame, &resInfoIngame); + _sound->initAudioResourceInfo(kMusicFinale, &resInfoFinale); + } else if (_flags.platform == Common::kPlatformFMTowns) { + static const char *const fileListIntro[] = { 0, "lore84.twn", "lore82.twn", 0, 0, 0, "lore83.twn", "lore81.twn" }; + static const char *const fileListFinale[] = { 0, 0, "lore85.twn", "lore86.twn", "lore87.twn" }; + SoundResourceInfo_TownsPC98V2 resInfoIntro(fileListIntro, ARRAYSIZE(fileListIntro), 0, 0, 0); + SoundResourceInfo_TownsPC98V2 resInfoIngame(0, 0, "lore%02d.twn", 0, 0); + SoundResourceInfo_TownsPC98V2 resInfoFinale(fileListFinale, ARRAYSIZE(fileListFinale), 0, 0, 0); + _sound->initAudioResourceInfo(kMusicIntro, &resInfoIntro); + _sound->initAudioResourceInfo(kMusicIngame, &resInfoIngame); + _sound->initAudioResourceInfo(kMusicFinale, &resInfoFinale); } if (_flags.isDemo) @@ -260,7 +270,10 @@ void LoLEngine::initStaticResource() { _charDefsKieran = _staticres->loadRawDataBe16(kLoLCharDefsKieran, tempSize); _charDefsAkshel = _staticres->loadRawDataBe16(kLoLCharDefsAkshel, tempSize); _expRequirements = (const int32 *)_staticres->loadRawDataBe32(kLoLExpRequirements, tempSize); - _monsterModifiers = _staticres->loadRawDataBe16(kLoLMonsterModifiers, tempSize); + _monsterModifiers1 = _staticres->loadRawDataBe16(kLoLMonsterModifiers1, tempSize); + _monsterModifiers2 = _staticres->loadRawDataBe16(kLoLMonsterModifiers2, tempSize); + _monsterModifiers3 = _staticres->loadRawDataBe16(kLoLMonsterModifiers3, tempSize); + _monsterModifiers4 = _staticres->loadRawDataBe16(kLoLMonsterModifiers4, tempSize); _monsterShiftOffs = (const int8 *)_staticres->loadRawData(kLoLMonsterShiftOffsets, tempSize); _monsterDirFlags = _staticres->loadRawData(kLoLMonsterDirFlags, tempSize); _monsterScaleX = _staticres->loadRawData(kLoLMonsterScaleX, tempSize); @@ -303,14 +316,14 @@ void LoLEngine::initStaticResource() { } _buttonData = _staticres->loadButtonDefs(kLoLButtonDefs, tempSize); - _buttonList1 = (const int16 *)_staticres->loadRawDataBe16(kLoLButtonList1, tempSize); - _buttonList2 = (const int16 *)_staticres->loadRawDataBe16(kLoLButtonList2, tempSize); - _buttonList3 = (const int16 *)_staticres->loadRawDataBe16(kLoLButtonList3, tempSize); - _buttonList4 = (const int16 *)_staticres->loadRawDataBe16(kLoLButtonList4, tempSize); - _buttonList5 = (const int16 *)_staticres->loadRawDataBe16(kLoLButtonList5, tempSize); - _buttonList6 = (const int16 *)_staticres->loadRawDataBe16(kLoLButtonList6, tempSize); - _buttonList7 = (const int16 *)_staticres->loadRawDataBe16(kLoLButtonList7, tempSize); - _buttonList8 = (const int16 *)_staticres->loadRawDataBe16(kLoLButtonList8, tempSize); + _buttonList1 = _staticres->loadRawData(kLoLButtonList1, tempSize); + _buttonList2 = _staticres->loadRawData(kLoLButtonList2, tempSize); + _buttonList3 = _staticres->loadRawData(kLoLButtonList3, tempSize); + _buttonList4 = _staticres->loadRawData(kLoLButtonList4, tempSize); + _buttonList5 = _staticres->loadRawData(kLoLButtonList5, tempSize); + _buttonList6 = _staticres->loadRawData(kLoLButtonList6, tempSize); + _buttonList7 = _staticres->loadRawData(kLoLButtonList7, tempSize); + _buttonList8 = _staticres->loadRawData(kLoLButtonList8, tempSize); _autoMapStrings = _staticres->loadRawDataBe16(kLoLMapStringId, tempSize); @@ -457,11 +470,11 @@ void LoLEngine::initStaticResource() { } 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); + 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); + 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); @@ -486,61 +499,61 @@ void GUI_LoL::initStaticData() { 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(_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(_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(_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); + 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[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[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(_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); + 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; @@ -658,11 +671,11 @@ 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 char *const LoLEngine::_charNamesJapanese[] = { + "\x83\x41\x83\x4E\x83\x56\x83\x46\x83\x8B\0", + "\x83\x7D\x83\x43\x83\x50\x83\x8B\x00\x00\0", + "\x83\x4C\x81\x5B\x83\x89\x83\x93\x00\x00\0", + "\x83\x52\x83\x93\x83\x89\x83\x62\x83\x68\0" }; const uint8 LoLEngine::_chargenFrameTableTalkie[] = { diff --git a/engines/kyra/text_hof.cpp b/engines/kyra/text_hof.cpp index 06067d6693..7fa823da0f 100644 --- a/engines/kyra/text_hof.cpp +++ b/engines/kyra/text_hof.cpp @@ -464,9 +464,9 @@ void KyraEngine_HoF::processDialogue(int dlgOffset, int vocH, int csEntry) { nextTimSequence = READ_LE_UINT16(&_ingameTalkObjIndex[cmd]); if (nextTimSequence == 10) { - if (queryGameFlag(0x3e)) + if (queryGameFlag(0x3E)) nextTimSequence = 14; - if (queryGameFlag(0x3f)) + if (queryGameFlag(0x3F)) nextTimSequence = 15; if (queryGameFlag(0x40)) nextTimSequence = 16; diff --git a/engines/kyra/text_lol.cpp b/engines/kyra/text_lol.cpp index ee42d6db92..6e77db1f8a 100644 --- a/engines/kyra/text_lol.cpp +++ b/engines/kyra/text_lol.cpp @@ -85,7 +85,7 @@ void TextDisplayer_LoL::setupField(bool mode) { _screen->copyBlockToPage(3, 0, 0, 320, 200, _vm->_pageBuffer1); _screen->setCurPage(cp); - _vm->_updateFlags &= 0xfffd; + _vm->_updateFlags &= 0xFFFD; } } else { if (!mode) @@ -136,18 +136,16 @@ void TextDisplayer_LoL::expandField() { void TextDisplayer_LoL::printDialogueText(int dim, char *str, EMCState *script, const uint16 *paramList, int16 paramIndex) { int oldDim = 0; - const bool isPc98 = (_vm->gameFlags().platform == Common::kPlatformPC98); - if (dim == 3) { if (_vm->_updateFlags & 2) { oldDim = clearDim(4); - _textDimData[4].color1 = isPc98 ? 0x33 : 254; + _textDimData[4].color1 = _vm->gameFlags().use16ColorMode ? 0x33 : 254; _textDimData[4].color2 = _screen->_curDim->unkA; } else { oldDim = clearDim(3); - _textDimData[3].color1 = isPc98 ? 0x33 : 192; + _textDimData[3].color1 = _vm->gameFlags().use16ColorMode ? 0x33 : 192; _textDimData[3].color2 = _screen->_curDim->unkA; - if (!isPc98) + if (!_vm->gameFlags().use16ColorMode) _screen->copyColor(192, 254); _vm->enableTimer(11); _vm->_textColorFlag = 0; @@ -157,12 +155,12 @@ void TextDisplayer_LoL::printDialogueText(int dim, char *str, EMCState *script, oldDim = _screen->curDimIndex(); _screen->setScreenDim(dim); _lineCount = 0; - _textDimData[dim].color1 = isPc98 ? 0x33 : 254; + _textDimData[dim].color1 = _vm->gameFlags().use16ColorMode ? 0x33 : 254; _textDimData[dim].color2 = _screen->_curDim->unkA; } int cp = _screen->setCurPage(0); - Screen::FontId of = _screen->setFont(_vm->gameFlags().use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_9_FNT); + Screen::FontId of = _screen->setFont((_vm->gameFlags().lang == Common::JA_JPN && _vm->gameFlags().use16ColorMode) ? Screen::FID_SJIS_FNT : Screen::FID_9_FNT); preprocessString(str, script, paramList, paramIndex); _numCharsTotal = strlen(_dialogueBuffer); @@ -176,8 +174,8 @@ void TextDisplayer_LoL::printDialogueText(int dim, char *str, EMCState *script, } void TextDisplayer_LoL::printMessage(uint16 type, const char *str, ...) { - static const uint8 textColors256[] = { 0xfe, 0xa2, 0x84, 0x97, 0x9F }; - static const uint8 textColors16[] = { 0x33, 0xaa, 0x88, 0x55, 0x99 }; + static const uint8 textColors256[] = { 0xFE, 0xA2, 0x84, 0x97, 0x9F }; + static const uint8 textColors16[] = { 0x33, 0xAA, 0x88, 0x55, 0x99 }; static const uint8 soundEffect[] = { 0x0B, 0x00, 0x2B, 0x1B, 0x00 }; const uint8 *textColors = _vm->gameFlags().use16ColorMode ? textColors16 : textColors256; @@ -187,7 +185,7 @@ void TextDisplayer_LoL::printMessage(uint16 type, const char *str, ...) { else _vm->stopPortraitSpeechAnim(); - uint16 col = textColors[type & 0x7fff]; + uint16 col = textColors[type & 0x7FFF]; int od = _screen->curDimIndex(); @@ -222,16 +220,15 @@ void TextDisplayer_LoL::printMessage(uint16 type, const char *str, ...) { _vm->sound()->playSoundEffect(soundEffect[type]); } - _vm->_textColorFlag = type & 0x7fff; + _vm->_textColorFlag = type & 0x7FFF; _vm->_fadeText = false; } void TextDisplayer_LoL::preprocessString(char *str, EMCState *script, const uint16 *paramList, int16 paramIndex) { char *dst = _dialogueBuffer; - const bool isPc98 = (_vm->gameFlags().platform == Common::kPlatformPC98); for (char *s = str; *s;) { - if (isPc98) { + if (_vm->gameFlags().lang == Common::JA_JPN) { uint8 c = *s; if (c >= 0xE0 || (c > 0x80 && c < 0xA0)) { *dst++ = *s++; diff --git a/engines/kyra/text_rpg.cpp b/engines/kyra/text_rpg.cpp index 52c14c7223..a19d678e35 100644 --- a/engines/kyra/text_rpg.cpp +++ b/engines/kyra/text_rpg.cpp @@ -36,7 +36,7 @@ enum { TextDisplayer_rpg::TextDisplayer_rpg(KyraRpgEngine *engine, Screen *scr) : _vm(engine), _screen(scr), _lineCount(0), _printFlag(false), _lineWidth(0), _numCharsTotal(0), _allowPageBreak(true), - _numCharsLeft(0), _numCharsPrinted(0), _sjisLineBreakFlag(false), _waitButtonMode(1) { + _numCharsLeft(0), _numCharsPrinted(0), _sjisTextModeLineBreak(false), _waitButtonMode(1) { _dialogueBuffer = new char[kEoBTextBufferSize]; memset(_dialogueBuffer, 0, kEoBTextBufferSize); @@ -88,8 +88,8 @@ void TextDisplayer_rpg::resetDimTextPositions(int dim) { } void TextDisplayer_rpg::resetPageBreakString() { - if (vm()->_moreStrings) - strcpy(_pageBreakString, vm()->_moreStrings[0]); + if (_vm->_moreStrings) + strcpy(_pageBreakString, _vm->_moreStrings[0]); } void TextDisplayer_rpg::setPageBreakFlag() { @@ -102,8 +102,6 @@ void TextDisplayer_rpg::removePageBreakFlag() { } void TextDisplayer_rpg::displayText(char *str, ...) { - const bool isPc98 = (_vm->gameFlags().platform == Common::kPlatformPC98); - _printFlag = false; _lineWidth = 0; @@ -125,7 +123,9 @@ void TextDisplayer_rpg::displayText(char *str, ...) { const ScreenDim *sd = _screen->_curDim; int sdx = _screen->curDimIndex(); - bool pc98PrintFlag = (isPc98 && (sdx == 3 || sdx == 4 || sdx == 5 || sdx == 15)) ? true : false; + bool sjisTextMode = (_vm->gameFlags().lang == Common::JA_JPN && _vm->gameFlags().use16ColorMode && (sdx == 3 || sdx == 4 || sdx == 5 || sdx == 15)) ? true : false; + int sjisOffs = sjisTextMode ? 8 : 9; + uint16 charsPerLine = (sd->w << 3) / (_screen->getFontWidth() + _screen->_charWidth); while (c) { @@ -146,15 +146,25 @@ void TextDisplayer_rpg::displayText(char *str, ...) { c = parseCommand(); } - if (isPc98) { + if (_vm->gameFlags().lang == Common::JA_JPN) { uint8 cu = (uint8) c; if (cu >= 0xE0 || (cu > 0x80 && cu < 0xA0)) { - _currentLine[_numCharsLeft++] = c; - _currentLine[_numCharsLeft++] = parseCommand(); - _currentLine[_numCharsLeft] = '\0'; - _lineWidth += 8; - if ((_textDimData[sdx].column + _lineWidth) > (sd->w << 3)) + if (sjisTextMode) { + _currentLine[_numCharsLeft++] = c; + _currentLine[_numCharsLeft++] = parseCommand(); + _currentLine[_numCharsLeft] = '\0'; + } + + if ((_textDimData[sdx].column + _lineWidth + sjisOffs) > (sd->w << 3)) printLine(_currentLine); + + if (!sjisTextMode) { + _currentLine[_numCharsLeft++] = c; + _currentLine[_numCharsLeft++] = parseCommand(); + _currentLine[_numCharsLeft] = '\0'; + } + + _lineWidth += sjisOffs; c = parseCommand(); continue; } @@ -182,17 +192,17 @@ void TextDisplayer_rpg::displayText(char *str, ...) { case 8: printLine(_currentLine); dv = _textDimData[sdx].column / (_screen->getFontWidth() + _screen->_charWidth); - dv = ((dv + 8) & 0xfff8) - 1; + dv = ((dv + 8) & 0xFFF8) - 1; if (dv >= charsPerLine) dv = 0; _textDimData[sdx].column = (_screen->getFontWidth() + _screen->_charWidth) * dv; break; case 12: - if (isPc98) - _sjisLineBreakFlag = true; + if (sjisTextMode) + _sjisTextModeLineBreak = true; printLine(_currentLine); - _sjisLineBreakFlag = false; + _sjisTextModeLineBreak = false; _lineCount++; _textDimData[sdx].column = 0; _textDimData[sdx].line++; @@ -208,7 +218,7 @@ void TextDisplayer_rpg::displayText(char *str, ...) { default: if (_vm->game() == GI_LOL || (unsigned char)c > 30) { - _lineWidth += (pc98PrintFlag ? 4 : _screen->getCharWidth((uint8)c)); + _lineWidth += (sjisTextMode ? 4 : (_screen->_currentFont == Screen::FID_SJIS_FNT ? 9 : _screen->getCharWidth((uint8)c))); _currentLine[_numCharsLeft++] = c; _currentLine[_numCharsLeft] = 0; @@ -266,7 +276,7 @@ void TextDisplayer_rpg::readNextPara() { // versions depend on this code we'll have to look at this again. #if 0 if ((_vm->game() != GI_LOL) && (d & 0x80)) { - d &= 0x7f; + d &= 0x7F; c = d & 7; d = (d & 0x78) >> 3; uint8 l = d; @@ -280,10 +290,9 @@ void TextDisplayer_rpg::readNextPara() { } void TextDisplayer_rpg::printLine(char *str) { - const bool isPc98 = (_vm->gameFlags().platform == Common::kPlatformPC98); const ScreenDim *sd = _screen->_curDim; int sdx = _screen->curDimIndex(); - bool pc98PrintFlag = (isPc98 && (sdx == 3 || sdx == 4 || sdx == 5 || sdx == 15)) ? true : false; + bool sjisTextMode = (_vm->gameFlags().lang == Common::JA_JPN && _vm->gameFlags().use16ColorMode && (sdx == 3 || sdx == 4 || sdx == 5 || sdx == 15)) ? true : false; int fh = (_screen->_currentFont == Screen::FID_SJIS_FNT) ? 9 : (_screen->getFontHeight() + _screen->_charOffset); int lines = (sd->h - _screen->_charOffset) / fh; @@ -307,25 +316,27 @@ void TextDisplayer_rpg::printLine(char *str) { } int x1 = (sd->sx << 3) + _textDimData[sdx].column; - int y = sd->sy + (pc98PrintFlag ? (_textDimData[sdx].line << 3) : (fh * _textDimData[sdx].line)); + int y = sd->sy + (sjisTextMode ? (_textDimData[sdx].line << 3) : (fh * _textDimData[sdx].line)); int w = sd->w << 3; int lw = _lineWidth; int s = _numCharsLeft; char c = 0; + uint8 twoByteCharOffs = 0; - if (pc98PrintFlag) { + + if (sjisTextMode) { bool ct = true; if ((lw + _textDimData[sdx].column) > w) { if ((lines - 1 - (_waitButtonSpace << 1)) <= _lineCount) // cut off line to leave space for "MORE" button - w -= vm()->guiSettings()->buttons.waitReserve; + w -= _vm->guiSettings()->buttons.waitReserve; } else { - if (!_sjisLineBreakFlag || (_lineCount + 1 < lines - 1)) + if (!_sjisTextModeLineBreak || (_lineCount + 1 < lines - 1)) ct = false; else // cut off line to leave space for "MORE" button - w -= vm()->guiSettings()->buttons.waitReserve; + w -= _vm->guiSettings()->buttons.waitReserve; } if (ct) { @@ -344,41 +355,88 @@ void TextDisplayer_rpg::printLine(char *str) { s = n2; } } else { - if ((lw + _textDimData[sdx].column) > w) { + if (_vm->gameFlags().lang == Common::JA_JPN) { + for (int i = 0; i < s; ++i) { + uint8 cu = (uint8) str[i]; + if (cu >= 0xE0 || (cu > 0x80 && cu < 0xA0)) + twoByteCharOffs = 8; + } + } + + if ((lw + _textDimData[sdx].column) >= w) { if ((lines - 1) <= _lineCount && _allowPageBreak) // cut off line to leave space for "MORE" button - w -= vm()->guiSettings()->buttons.waitReserve; + w -= _vm->guiSettings()->buttons.waitReserve; w -= _textDimData[sdx].column; - int n2 = 0; - int n1 = s - 1; + int lineLastCharPos = 0; + int strPos = s - 1; + + if (twoByteCharOffs) { + lw = 0; + int prevStrPos = 0; + c = str[0]; + + for (strPos = 0; strPos < s; ++strPos) { + uint8 cu = (uint8) str[strPos]; + if (cu >= 0xE0 || (cu > 0x80 && cu < 0xA0)) { + lw += 9; + strPos++; + } else { + lw += _screen->getCharWidth((uint8)c); + } + + if (!lineLastCharPos && w < lw + twoByteCharOffs) + lineLastCharPos = prevStrPos; + + if (lineLastCharPos && c == ' ') { + s = strPos; + _printFlag = false; + break; + } + prevStrPos = strPos; + c = (char) cu; + } + + if (!lineLastCharPos) { + lineLastCharPos = s - 1; + if (lineLastCharPos && str[lineLastCharPos] == ' ') { + s = strPos; + _printFlag = false; + } + } - while (n1 > 0) { - //cut off line after last space - c = str[n1]; + lw = _lineWidth; - lw -= _screen->getCharWidth((uint8)c); + } else { + while (strPos > 0) { + //cut off line after last space + c = str[strPos]; - if (!n2 && lw <= w) - n2 = n1; + lw -= _screen->getCharWidth((uint8)c); - if (n2 && c == ' ') { - s = n1; - _printFlag = false; - break; + if (!lineLastCharPos && lw <= w) + lineLastCharPos = strPos; + + if (lineLastCharPos && c == ' ') { + s = strPos; + _printFlag = false; + break; + } + strPos--; } - n1--; } - if (!n1) { + if (!strPos) { if (_textDimData[sdx].column && !_printFlag) { s = lw = 0; _printFlag = true; } else { - s = n2; + s = lineLastCharPos; } } + } } @@ -386,7 +444,7 @@ void TextDisplayer_rpg::printLine(char *str) { str[s] = 0; uint8 col = _textDimData[sdx].color1; - if (isPc98 && (sdx == 2 || sdx == 3 || sdx == 4 || sdx == 5 || sdx == 15)) { + if (sjisTextMode && (sdx == 2 || sdx == 3 || sdx == 4 || sdx == 5 || sdx == 15)) { switch (_textDimData[sdx].color1) { case 0x88: col = 0x41; @@ -394,14 +452,14 @@ void TextDisplayer_rpg::printLine(char *str) { case 0x55: col = 0x81; break; - case 0xaa: + case 0xAA: col = 0x21; break; case 0x99: - col = 0xa1; + col = 0xA1; break; case 0x33: - col = 0xe1; + col = 0xE1; break; case 0x18: col = 0x61; @@ -413,6 +471,7 @@ void TextDisplayer_rpg::printLine(char *str) { _screen->printText(str, x1 & ~3, (y + 8) & ~7, col, 0); } else { _screen->printText(str, x1, y, col, _textDimData[sdx].color2); + _screen->updateScreen(); } _textDimData[sdx].column += lw; @@ -432,9 +491,9 @@ void TextDisplayer_rpg::printLine(char *str) { str[len] = 0; _numCharsLeft = strlen(str); - _lineWidth = pc98PrintFlag ? (_numCharsLeft << 2) : _screen->getTextWidth(str); + _lineWidth = sjisTextMode ? (_numCharsLeft << 2) : (_screen->_currentFont == Screen::FID_SJIS_FNT ? _numCharsLeft * 9: _screen->getTextWidth(str)); - if (!_numCharsLeft && _textDimData[sdx].column < (sd->w << 3)) + if (!_numCharsLeft && (_textDimData[sdx].column + twoByteCharOffs) <= (sd->w << 3)) return; _textDimData[sdx].column = 0; @@ -483,7 +542,7 @@ void TextDisplayer_rpg::printMessage(const char *str, int textColor, ...) { displayText(_dialogueBuffer); - if (vm()->game() != GI_EOB1) + if (_vm->game() != GI_EOB1) _textDimData[_screen->curDimIndex()].color1 = tc; if (!_screen->_curPage) @@ -494,7 +553,7 @@ int TextDisplayer_rpg::clearDim(int dim) { int res = _screen->curDimIndex(); _screen->setScreenDim(dim); _textDimData[dim].color1 = _screen->_curDim->unk8; - _textDimData[dim].color2 = vm()->game() == GI_LOL ? _screen->_curDim->unkA : vm()->guiSettings()->colors.fill; + _textDimData[dim].color2 = _vm->game() == GI_LOL ? _screen->_curDim->unkA : _vm->guiSettings()->colors.fill; clearCurDim(); return res; } @@ -502,7 +561,7 @@ int TextDisplayer_rpg::clearDim(int dim) { void TextDisplayer_rpg::clearCurDim() { int d = _screen->curDimIndex(); const ScreenDim *tmp = _screen->getScreenDim(d); - if (vm()->gameFlags().use16ColorMode) { + if (_vm->gameFlags().use16ColorMode) { _screen->fillRect(tmp->sx << 3, tmp->sy, ((tmp->sx + tmp->w) << 3) - 2, (tmp->sy + tmp->h) - 2, _textDimData[d].color2); } else _screen->fillRect(tmp->sx << 3, tmp->sy, ((tmp->sx + tmp->w) << 3) - 1, (tmp->sy + tmp->h) - 1, _textDimData[d].color2); @@ -512,40 +571,40 @@ void TextDisplayer_rpg::clearCurDim() { } void TextDisplayer_rpg::textPageBreak() { - if (vm()->game() != GI_LOL) - SWAP(vm()->_dialogueButtonLabelColor1, vm()->_dialogueButtonLabelColor2); + if (_vm->game() != GI_LOL) + SWAP(_vm->_dialogueButtonLabelColor1, _vm->_dialogueButtonLabelColor2); int cp = _screen->setCurPage(0); - Screen::FontId cf = _screen->setFont(vm()->gameFlags().use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_6_FNT); + Screen::FontId cf = _screen->setFont((_vm->gameFlags().lang == Common::JA_JPN && _vm->gameFlags().use16ColorMode) ? Screen::FID_SJIS_FNT : Screen::FID_6_FNT); - if (vm()->game() == GI_LOL) - vm()->_timer->pauseSingleTimer(11, true); + if (_vm->game() == GI_LOL) + _vm->_timer->pauseSingleTimer(11, true); - vm()->_fadeText = false; + _vm->_fadeText = false; int resetPortraitAfterSpeechAnim = 0; int updatePortraitSpeechAnimDuration = 0; - if (vm()->_updateCharNum != -1) { - resetPortraitAfterSpeechAnim = vm()->_resetPortraitAfterSpeechAnim; - vm()->_resetPortraitAfterSpeechAnim = 0; - updatePortraitSpeechAnimDuration = vm()->_updatePortraitSpeechAnimDuration; - if (vm()->_updatePortraitSpeechAnimDuration > 36) - vm()->_updatePortraitSpeechAnimDuration = 36; + if (_vm->_updateCharNum != -1) { + resetPortraitAfterSpeechAnim = _vm->_resetPortraitAfterSpeechAnim; + _vm->_resetPortraitAfterSpeechAnim = 0; + updatePortraitSpeechAnimDuration = _vm->_updatePortraitSpeechAnimDuration; + if (_vm->_updatePortraitSpeechAnimDuration > 36) + _vm->_updatePortraitSpeechAnimDuration = 36; } uint32 speechPartTime = 0; - if (vm()->speechEnabled() && vm()->_activeVoiceFileTotalTime && _numCharsTotal) - speechPartTime = vm()->_system->getMillis() + ((_numCharsPrinted * vm()->_activeVoiceFileTotalTime) / _numCharsTotal); + if (_vm->speechEnabled() && _vm->_activeVoiceFileTotalTime && _numCharsTotal) + speechPartTime = _vm->_system->getMillis() + ((_numCharsPrinted * _vm->_activeVoiceFileTotalTime) / _numCharsTotal); const ScreenDim *dim = _screen->getScreenDim(_screen->curDimIndex()); int x = ((dim->sx + dim->w) << 3) - (_vm->_dialogueButtonWidth + 3); int y = 0; - int w = vm()->_dialogueButtonWidth; + int w = _vm->_dialogueButtonWidth; - if (vm()->game() == GI_LOL) { - if (vm()->_needSceneRestore && (vm()->_updateFlags & 2)) { - if (vm()->_currentControlMode || !(vm()->_updateFlags & 2)) { + if (_vm->game() == GI_LOL) { + if (_vm->_needSceneRestore && (_vm->_updateFlags & 2)) { + if (_vm->_currentControlMode || !(_vm->_updateFlags & 2)) { y = dim->sy + dim->h - 5; } else { x += 6; @@ -555,49 +614,49 @@ void TextDisplayer_rpg::textPageBreak() { y = dim->sy + dim->h - 10; } } else { - y = vm()->guiSettings()->buttons.waitY[_waitButtonMode]; - x = vm()->guiSettings()->buttons.waitX[_waitButtonMode]; - w = vm()->guiSettings()->buttons.waitWidth[_waitButtonMode]; + y = _vm->guiSettings()->buttons.waitY[_waitButtonMode]; + x = _vm->guiSettings()->buttons.waitX[_waitButtonMode]; + w = _vm->guiSettings()->buttons.waitWidth[_waitButtonMode]; } - if (vm()->gameFlags().use16ColorMode) { - vm()->gui_drawBox(x + 8, (y & ~7) - 1, 66, 10, 0xee, 0xcc, -1); - _screen->printText(_pageBreakString, (x + 37 - (strlen(_pageBreakString) << 1) + 4) & ~3, (y + 2) & ~7, 0xc1, 0); + if (_vm->gameFlags().use16ColorMode) { + _vm->gui_drawBox(x + 8, (y & ~7) - 1, 66, 10, 0xEE, 0xCC, -1); + _screen->printText(_pageBreakString, (x + 37 - (strlen(_pageBreakString) << 1) + 4) & ~3, (y + 2) & ~7, 0xC1, 0); } else { - vm()->gui_drawBox(x, y, w, vm()->guiSettings()->buttons.height, vm()->guiSettings()->colors.frame1, vm()->guiSettings()->colors.frame2, vm()->guiSettings()->colors.fill); - _screen->printText(_pageBreakString, x + (w >> 1) - (vm()->screen()->getTextWidth(_pageBreakString) >> 1), y + 2, vm()->_dialogueButtonLabelColor1, 0); + _vm->gui_drawBox(x, y, w, _vm->guiSettings()->buttons.height, _vm->guiSettings()->colors.frame1, _vm->guiSettings()->colors.frame2, _vm->guiSettings()->colors.fill); + _screen->printText(_pageBreakString, x + (w >> 1) - (_vm->screen()->getTextWidth(_pageBreakString) >> 1), y + 2, _vm->_dialogueButtonLabelColor1, 0); } - vm()->removeInputTop(); + _vm->removeInputTop(); bool loop = true; bool target = false; do { - int inputFlag = vm()->checkInput(0, false) & 0xFF; - vm()->removeInputTop(); + int inputFlag = _vm->checkInput(0, false) & 0xFF; + _vm->removeInputTop(); while (!inputFlag && !_vm->shouldQuit()) { - vm()->update(); + _vm->update(); - if (vm()->speechEnabled()) { - if (((vm()->_system->getMillis() > speechPartTime) || (vm()->snd_updateCharacterSpeech() != 2)) && speechPartTime) { + if (_vm->speechEnabled()) { + if (((_vm->_system->getMillis() > speechPartTime) || (_vm->snd_updateCharacterSpeech() != 2)) && speechPartTime) { loop = false; - inputFlag = vm()->_keyMap[Common::KEYCODE_RETURN]; + inputFlag = _vm->_keyMap[Common::KEYCODE_RETURN]; break; } } - inputFlag = vm()->checkInput(0, false) & 0xFF; - vm()->removeInputTop(); + inputFlag = _vm->checkInput(0, false) & 0xFF; + _vm->removeInputTop(); } - vm()->gui_notifyButtonListChanged(); + _vm->gui_notifyButtonListChanged(); - if (inputFlag == vm()->_keyMap[Common::KEYCODE_SPACE] || inputFlag == vm()->_keyMap[Common::KEYCODE_RETURN]) { + if (inputFlag == _vm->_keyMap[Common::KEYCODE_SPACE] || inputFlag == _vm->_keyMap[Common::KEYCODE_RETURN]) { loop = false; } else if (inputFlag == 199 || inputFlag == 201) { - if (vm()->posWithinRect(vm()->_mouseX, vm()->_mouseY, x, y, x + w, y + 9)) { + if (_vm->posWithinRect(_vm->_mouseX, _vm->_mouseY, x, y, x + w, y + 9)) { if (_vm->game() == GI_LOL) target = true; else @@ -609,7 +668,7 @@ void TextDisplayer_rpg::textPageBreak() { } } while (loop && !_vm->shouldQuit()); - if (vm()->gameFlags().use16ColorMode) + if (_vm->gameFlags().use16ColorMode) _screen->fillRect(x + 8, y, x + 57, y + 9, _textDimData[_screen->curDimIndex()].color2); else _screen->fillRect(x, y, x + w - 1, y + 8, _textDimData[_screen->curDimIndex()].color2); @@ -617,52 +676,52 @@ void TextDisplayer_rpg::textPageBreak() { clearCurDim(); _screen->updateScreen(); - if (vm()->game() == GI_LOL) - vm()->_timer->pauseSingleTimer(11, false); + if (_vm->game() == GI_LOL) + _vm->_timer->pauseSingleTimer(11, false); - if (vm()->_updateCharNum != -1) { - vm()->_resetPortraitAfterSpeechAnim = resetPortraitAfterSpeechAnim; + if (_vm->_updateCharNum != -1) { + _vm->_resetPortraitAfterSpeechAnim = resetPortraitAfterSpeechAnim; if (updatePortraitSpeechAnimDuration > 36) updatePortraitSpeechAnimDuration -= 36; else updatePortraitSpeechAnimDuration >>= 1; - vm()->_updatePortraitSpeechAnimDuration = updatePortraitSpeechAnimDuration; + _vm->_updatePortraitSpeechAnimDuration = updatePortraitSpeechAnimDuration; } _screen->setFont(cf); _screen->setCurPage(cp); - if (vm()->game() != GI_LOL) - SWAP(vm()->_dialogueButtonLabelColor1, vm()->_dialogueButtonLabelColor2); + if (_vm->game() != GI_LOL) + SWAP(_vm->_dialogueButtonLabelColor1, _vm->_dialogueButtonLabelColor2); - vm()->removeInputTop(); + _vm->removeInputTop(); } void TextDisplayer_rpg::displayWaitButton() { - vm()->_dialogueNumButtons = 1; - vm()->_dialogueButtonString[0] = _pageBreakString; - vm()->_dialogueButtonString[1] = 0; - vm()->_dialogueButtonString[2] = 0; - vm()->_dialogueHighlightedButton = 0; + _vm->_dialogueNumButtons = 1; + _vm->_dialogueButtonString[0] = _pageBreakString; + _vm->_dialogueButtonString[1] = 0; + _vm->_dialogueButtonString[2] = 0; + _vm->_dialogueHighlightedButton = 0; - vm()->_dialogueButtonPosX = &vm()->guiSettings()->buttons.waitX[_waitButtonMode]; - vm()->_dialogueButtonPosY = &vm()->guiSettings()->buttons.waitY[_waitButtonMode]; - vm()->_dialogueButtonWidth = vm()->guiSettings()->buttons.waitWidth[_waitButtonMode]; - vm()->_dialogueButtonYoffs = 0; + _vm->_dialogueButtonPosX = &_vm->guiSettings()->buttons.waitX[_waitButtonMode]; + _vm->_dialogueButtonPosY = &_vm->guiSettings()->buttons.waitY[_waitButtonMode]; + _vm->_dialogueButtonWidth = _vm->guiSettings()->buttons.waitWidth[_waitButtonMode]; + _vm->_dialogueButtonYoffs = 0; - SWAP(vm()->_dialogueButtonLabelColor1, vm()->_dialogueButtonLabelColor2); - vm()->drawDialogueButtons(); + SWAP(_vm->_dialogueButtonLabelColor1, _vm->_dialogueButtonLabelColor2); + _vm->drawDialogueButtons(); - if (!vm()->shouldQuit()) - vm()->removeInputTop(); + if (!_vm->shouldQuit()) + _vm->removeInputTop(); - while (!vm()->processDialogue() && !vm()->shouldQuit()) {} + while (!_vm->processDialogue() && !_vm->shouldQuit()) {} - _screen->fillRect(vm()->_dialogueButtonPosX[0], vm()->_dialogueButtonPosY[0], vm()->_dialogueButtonPosX[0] + vm()->_dialogueButtonWidth - 1, vm()->_dialogueButtonPosY[0] + vm()->guiSettings()->buttons.height - 1, vm()->guiSettings()->colors.fill); + _screen->fillRect(_vm->_dialogueButtonPosX[0], _vm->_dialogueButtonPosY[0], _vm->_dialogueButtonPosX[0] + _vm->_dialogueButtonWidth - 1, _vm->_dialogueButtonPosY[0] + _vm->guiSettings()->buttons.height - 1, _vm->guiSettings()->colors.fill); _screen->updateScreen(); - vm()->_dialogueButtonWidth = 95; - SWAP(vm()->_dialogueButtonLabelColor1, vm()->_dialogueButtonLabelColor2); + _vm->_dialogueButtonWidth = 95; + SWAP(_vm->_dialogueButtonLabelColor1, _vm->_dialogueButtonLabelColor2); clearCurDim(); } diff --git a/engines/kyra/text_rpg.h b/engines/kyra/text_rpg.h index 5ad8899484..eb8617a371 100644 --- a/engines/kyra/text_rpg.h +++ b/engines/kyra/text_rpg.h @@ -79,7 +79,7 @@ protected: uint32 _numCharsPrinted; bool _printFlag; - bool _sjisLineBreakFlag; + bool _sjisTextModeLineBreak; char _pageBreakString[20]; char _scriptParaString[11]; diff --git a/engines/kyra/timer_eob.cpp b/engines/kyra/timer_eob.cpp index 766fe453ab..effda22ac9 100644 --- a/engines/kyra/timer_eob.cpp +++ b/engines/kyra/timer_eob.cpp @@ -57,7 +57,7 @@ void EoBCoreEngine::setupTimers() { void EoBCoreEngine::setCharEventTimer(int charIndex, uint32 countdown, int evnt, int updateExistingTimer) { uint32 ntime = _system->getMillis() + countdown * _tickLength; - uint8 timerId = 0x30 | (charIndex & 0x0f); + uint8 timerId = 0x30 | (charIndex & 0x0F); EoBCharacter *c = &_characters[charIndex]; if (!_timer->isEnabled(timerId)) { @@ -118,7 +118,7 @@ void EoBCoreEngine::setupCharacterTimers() { if (!testCharacter(i, 1)) continue; - uint32 nextTimer = 0xffffffff; + uint32 nextTimer = 0xFFFFFFFF; for (int ii = 0; ii < 10; ii++) { if (c->timers[ii] && c->timers[ii] < nextTimer) @@ -126,7 +126,7 @@ void EoBCoreEngine::setupCharacterTimers() { } uint32 ctime = _system->getMillis(); - if (nextTimer == 0xffffffff) + if (nextTimer == 0xFFFFFFFF) _timer->disable(0x30 | i); else { enableTimer(0x30 | i); @@ -219,11 +219,11 @@ void EoBCoreEngine::timerProcessFlyingObjects(int timerNum) { } void EoBCoreEngine::timerProcessMonsters(int timerNum) { - updateMonsters(timerNum & 0x0f); + updateMonsters(timerNum & 0x0F); } void EoBCoreEngine::timerSpecialCharacterUpdate(int timerNum) { - int charIndex = timerNum & 0x0f; + int charIndex = timerNum & 0x0F; EoBCharacter *c = &_characters[charIndex]; uint32 ctime = _system->getMillis(); @@ -309,13 +309,13 @@ void EoBCoreEngine::timerSpecialCharacterUpdate(int timerNum) { _screen->setFont(of); } - uint32 nextTimer = 0xffffffff; + uint32 nextTimer = 0xFFFFFFFF; for (int i = 0; i < 10; i++) { if (c->timers[i] && c->timers[i] < nextTimer) nextTimer = c->timers[i]; } - if (nextTimer == 0xffffffff) + if (nextTimer == 0xFFFFFFFF) _timer->disable(timerNum); else _timer->setCountdown(timerNum, (nextTimer - ctime) / _tickLength); diff --git a/engines/kyra/timer_lol.cpp b/engines/kyra/timer_lol.cpp index a3df8dbe00..9d0cc0dd72 100644 --- a/engines/kyra/timer_lol.cpp +++ b/engines/kyra/timer_lol.cpp @@ -49,7 +49,7 @@ void LoLEngine::setupTimers() { } void LoLEngine::timerProcessMonsters(int timerNum) { - for (int i = timerNum & 0x0f; i < 30; i += 2) + for (int i = timerNum & 0x0F; i < 30; i += 2) updateMonster(&_monsters[i]); } @@ -77,7 +77,7 @@ void LoLEngine::timerSpecialCharacterUpdate(int timerNum) { if (_characters[i].characterUpdateDelay[ii] > eventsLeft) eventsLeft = _characters[i].characterUpdateDelay[ii]; } else { - _characters[i].flags &= 0xfffb; + _characters[i].flags &= 0xFFFB; } gui_drawCharPortraitWithStats(i); @@ -89,7 +89,7 @@ void LoLEngine::timerSpecialCharacterUpdate(int timerNum) { break; case 2: - _characters[i].flags &= 0xffbf; + _characters[i].flags &= 0xFFBF; gui_drawCharPortraitWithStats(i); break; @@ -104,7 +104,7 @@ void LoLEngine::timerSpecialCharacterUpdate(int timerNum) { break; case 4: - _characters[i].flags &= 0xfeff; + _characters[i].flags &= 0xFEFF; _txt->printMessage(0, getLangString(0x4027), _characters[i].name); gui_drawCharPortraitWithStats(i); break; @@ -114,7 +114,7 @@ void LoLEngine::timerSpecialCharacterUpdate(int timerNum) { break; case 6: - _characters[i].flags &= 0xefff; + _characters[i].flags &= 0xEFFF; gui_drawCharPortraitWithStats(i); break; @@ -146,7 +146,7 @@ void LoLEngine::timerProcessFlyingObjects(int timerNum) { } void LoLEngine::timerRunSceneAnimScript(int timerNum) { - runLevelScript(0x401 + (timerNum & 0x0f), -1); + runLevelScript(0x401 + (timerNum & 0x0F), -1); } void LoLEngine::timerRegeneratePoints(int timerNum) { diff --git a/engines/kyra/vqa.cpp b/engines/kyra/vqa.cpp index 471e83c9ed..081d94a050 100644 --- a/engines/kyra/vqa.cpp +++ b/engines/kyra/vqa.cpp @@ -126,8 +126,8 @@ void VQAMovie::decodeSND1(byte *inbuf, uint32 insize, byte *outbuf, uint32 outsi while (outsize > 0) { input = *inbuf++ << 2; - code = (input >> 8) & 0xff; - count = (input & 0xff) >> 2; + code = (input >> 8) & 0xFF; + count = (input & 0xFF) >> 2; switch (code) { case 2: @@ -149,7 +149,7 @@ void VQAMovie::decodeSND1(byte *inbuf, uint32 insize, byte *outbuf, uint32 outsi for (; count >= 0; count--) { code = *inbuf++; - curSample += WSTable4Bit[code & 0x0f]; + curSample += WSTable4Bit[code & 0x0F]; curSample = CLIP<int16>(curSample, 0, 255); *outbuf++ = curSample; @@ -264,7 +264,7 @@ bool VQAMovie::open(const char *filename) { _frameInfo = new uint32[_header.numFrames]; _frame = new byte[_header.width * _header.height]; - _codeBookSize = 0xf00 * _header.blockW * _header.blockH; + _codeBookSize = 0xF00 * _header.blockW * _header.blockH; _codeBook = new byte[_codeBookSize]; _partialCodeBook = new byte[_codeBookSize]; memset(_codeBook, 0, _codeBookSize); diff --git a/engines/mohawk/console.cpp b/engines/mohawk/console.cpp index a7a650d8ed..fc957e895e 100644 --- a/engines/mohawk/console.cpp +++ b/engines/mohawk/console.cpp @@ -75,7 +75,7 @@ bool MystConsole::Cmd_ChangeCard(int argc, const char **argv) { } _vm->_sound->stopSound(); - _vm->changeToCard((uint16)atoi(argv[1]), true); + _vm->changeToCard((uint16)atoi(argv[1]), kTransitionCopy); return false; } diff --git a/engines/mohawk/cursors.cpp b/engines/mohawk/cursors.cpp index e73d4ed6a3..cdb4e1482f 100644 --- a/engines/mohawk/cursors.cpp +++ b/engines/mohawk/cursors.cpp @@ -106,8 +106,8 @@ void MystCursorManager::hideCursor() { void MystCursorManager::setCursor(uint16 id) { // Zero means empty cursor if (id == 0) { - static const byte emptyCursor = 0; - CursorMan.replaceCursor(&emptyCursor, 1, 1, 0, 0, 0); + static const byte emptyCursor[4] = { 0, 0, 0, 0 }; + CursorMan.replaceCursor(&emptyCursor, 2, 2, 0, 0, 0); return; } diff --git a/engines/mohawk/detection.cpp b/engines/mohawk/detection.cpp index 5664929948..ef07de0180 100644 --- a/engines/mohawk/detection.cpp +++ b/engines/mohawk/detection.cpp @@ -143,6 +143,7 @@ static const PlainGameDescriptor mohawkGames[] = { {"harryhh","Harry and the Haunted House"}, {"stellaluna", "Stellaluna"}, {"sheila", "Sheila Rae, the Brave"}, + {"rugratsps", "Rugrats Print Shop" }, {0, 0} }; diff --git a/engines/mohawk/detection_tables.h b/engines/mohawk/detection_tables.h index 55814af1c3..fc7dfce9bb 100644 --- a/engines/mohawk/detection_tables.h +++ b/engines/mohawk/detection_tables.h @@ -2096,6 +2096,24 @@ static const MohawkGameDescription gameDescriptions[] = { 0 }, + // Rugrats Adventure Game + // English Windows Demo + // From GeorgeQGreg (Rugrats Movie Soundtrack) + { + { + "rugrats", + "Demo", + AD_ENTRY1("outline", "adbd7ff6c5e1bdb7062c89879a4e39e6"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_DEMO | ADGF_UNSTABLE, + GUIO1(GUIO_NOASPECT) + }, + GType_LIVINGBOOKSV4, + 0, + 0 + }, + { { "lbsampler", @@ -2507,6 +2525,24 @@ static const MohawkGameDescription gameDescriptions[] = { 0 }, + // Rugrats Print Shop + // English Windows Demo + // From GeorgeQGreg (Rugrats Movie Soundtrack) + { + { + "rugratsps", + "Demo", + AD_ENTRY1("outline", "808d5ee8427180ddebdd5dd4199b47cb"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_DEMO | ADGF_UNSTABLE, + GUIO1(GUIO_NOASPECT) + }, + GType_LIVINGBOOKSV4, + 0, + 0 + }, + { AD_TABLE_END_MARKER, 0, 0, 0 } }; diff --git a/engines/mohawk/dialogs.cpp b/engines/mohawk/dialogs.cpp index 4461a30ad4..5f5a3b3800 100644 --- a/engines/mohawk/dialogs.cpp +++ b/engines/mohawk/dialogs.cpp @@ -137,12 +137,6 @@ void MystOptionsDialog::open() { void MystOptionsDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) { switch (cmd) { - case kZipCmd: - _vm->_gameState->_globals.zipMode = _zipModeCheckbox->getState(); - break; - case kTransCmd: - _vm->_gameState->_globals.transitions = _transitionsCheckbox->getState(); - break; case kDropCmd: _vm->_needsPageDrop = true; close(); @@ -155,8 +149,10 @@ void MystOptionsDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, ui _vm->_needsShowDemoMenu = true; close(); break; - case GUI::kCloseCmd: - close(); + case GUI::kOKCmd: + _vm->_gameState->_globals.zipMode = _zipModeCheckbox->getState(); + _vm->_gameState->_globals.transitions = _transitionsCheckbox->getState(); + GUI::OptionsDialog::handleCommand(sender, cmd, data); break; default: GUI::OptionsDialog::handleCommand(sender, cmd, data); diff --git a/engines/mohawk/installer_archive.cpp b/engines/mohawk/installer_archive.cpp index 636b7ae476..5af95f27e3 100644 --- a/engines/mohawk/installer_archive.cpp +++ b/engines/mohawk/installer_archive.cpp @@ -133,4 +133,4 @@ Common::SeekableReadStream *InstallerArchive::createReadStreamForMember(const Co return Common::decompressDCL(_stream, entry.compressedSize, entry.uncompressedSize); } -} // End of namespace Mohawk +} // End of namespace Mohawk diff --git a/engines/mohawk/myst.cpp b/engines/mohawk/myst.cpp index 9c0e642203..8140817eb3 100644 --- a/engines/mohawk/myst.cpp +++ b/engines/mohawk/myst.cpp @@ -523,7 +523,7 @@ void MohawkEngine_Myst::changeToStack(uint16 stack, uint16 card, uint16 linkSrcS _video->playMovieBlockingCentered(wrapMovieFilename(flyby, kMasterpieceOnly)); } - changeToCard(card, true); + changeToCard(card, kTransitionCopy); if (linkDstSound) _sound->playSoundBlocking(linkDstSound); @@ -549,7 +549,7 @@ void MohawkEngine_Myst::drawCardBackground() { _gfx->copyImageToBackBuffer(getCardBackgroundId(), Common::Rect(0, 0, 544, 332)); } -void MohawkEngine_Myst::changeToCard(uint16 card, bool updateScreen) { +void MohawkEngine_Myst::changeToCard(uint16 card, TransitionType transition) { debug(2, "changeToCard(%d)", card); _scriptParser->disablePersistentScripts(); @@ -629,9 +629,11 @@ void MohawkEngine_Myst::changeToCard(uint16 card, bool updateScreen) { } // Make sure the screen is updated - if (updateScreen) { - _gfx->copyBackBufferToScreen(Common::Rect(544, 333)); - _system->updateScreen(); + if (transition != kNoTransition) { + if (!_gameState->_globals.transitions) + transition = kTransitionCopy; + + _gfx->runTransition(transition, Common::Rect(544, 333), 10, 0); } // Make sure we have the right cursor showing @@ -1179,41 +1181,41 @@ bool MohawkEngine_Myst::canSaveGameStateCurrently() { } void MohawkEngine_Myst::dropPage() { - uint16 page = _gameState->_globals.heldPage; + uint16 page = _gameState->_globals.heldPage; bool whitePage = page == 13; bool bluePage = page - 1 < 6; - bool redPage = page - 7 < 6; - - // Play drop page sound - _sound->replaceSoundMyst(800); - - // Drop page - _gameState->_globals.heldPage = 0; - - // Redraw page area - if (whitePage && _gameState->_globals.currentAge == 2) { - redrawArea(41); - } else if (bluePage) { - if (page == 6) { - if (_gameState->_globals.currentAge == 2) - redrawArea(24); - } else { - redrawArea(103); - } - } else if (redPage) { - if (page == 12) { - if (_gameState->_globals.currentAge == 2) - redrawArea(25); - } else if (page == 10) { - if (_gameState->_globals.currentAge == 1) - redrawArea(35); - } else { - redrawArea(102); - } - } - - setMainCursor(kDefaultMystCursor); - checkCursorHints(); + bool redPage = page - 7 < 6; + + // Play drop page sound + _sound->replaceSoundMyst(800); + + // Drop page + _gameState->_globals.heldPage = 0; + + // Redraw page area + if (whitePage && _gameState->_globals.currentAge == 2) { + redrawArea(41); + } else if (bluePage) { + if (page == 6) { + if (_gameState->_globals.currentAge == 2) + redrawArea(24); + } else { + redrawArea(103); + } + } else if (redPage) { + if (page == 12) { + if (_gameState->_globals.currentAge == 2) + redrawArea(25); + } else if (page == 10) { + if (_gameState->_globals.currentAge == 1) + redrawArea(35); + } else { + redrawArea(102); + } + } + + setMainCursor(kDefaultMystCursor); + checkCursorHints(); } } // End of namespace Mohawk diff --git a/engines/mohawk/myst.h b/engines/mohawk/myst.h index 30770f7ec9..a268c19737 100644 --- a/engines/mohawk/myst.h +++ b/engines/mohawk/myst.h @@ -75,6 +75,23 @@ enum { kStoneshipStack // Stoneship Age }; +// Transitions +enum TransitionType { + kTransitionLeftToRight = 0, + kTransitionRightToLeft = 1, + kTransitionSlideToLeft = 2, + kTransitionSlideToRight = 3, + kTransitionDissolve = 4, + kTransitionTopToBottom = 5, + kTransitionBottomToTop = 6, + kTransitionSlideToTop = 7, + kTransitionSlideToBottom= 8, + kTransitionPartToRight = 9, + kTransitionPartToLeft = 10, + kTransitionCopy = 11, + kNoTransition = 999 +}; + const uint16 kMasterpieceOnly = 0xFFFF; struct MystCondition { @@ -154,7 +171,7 @@ public: void reloadSaveList(); void changeToStack(uint16 stack, uint16 card, uint16 linkSrcSound, uint16 linkDstSound); - void changeToCard(uint16 card, bool updateScreen); + void changeToCard(uint16 card, TransitionType transition); uint16 getCurCard() { return _curCard; } uint16 getCurStack() { return _curStack; } void setMainCursor(uint16 cursor); diff --git a/engines/mohawk/myst_areas.cpp b/engines/mohawk/myst_areas.cpp index a54b67bef4..12a2c7f44c 100644 --- a/engines/mohawk/myst_areas.cpp +++ b/engines/mohawk/myst_areas.cpp @@ -70,10 +70,30 @@ MystResource::~MystResource() { } void MystResource::handleMouseUp() { - if (_dest != 0) - _vm->changeToCard(_dest, true); - else + if (_dest == 0) { warning("Movement type resource with null destination at position (%d, %d), (%d, %d)", _rect.left, _rect.top, _rect.right, _rect.bottom); + return; + } + + uint16 opcode; + + switch (type) { + case kMystForwardArea: + opcode = 6; + break; + case kMystLeftArea: + opcode = 8; + break; + case kMystRightArea: + opcode = 7; + break; + default: + opcode = 48; + break; + } + + _vm->_scriptParser->setInvokingResource(this); + _vm->_scriptParser->runOpcode(opcode, 0); } bool MystResource::canBecomeActive() { @@ -202,22 +222,23 @@ VideoHandle MystResourceType6::playMovie() { // Check if the video is already running VideoHandle handle = _vm->_video->findVideoHandle(_videoFile); - if (_direction != 1) - warning("Playing QT movies backwards is not implemented"); - // If the video is not running, play it if (handle == NULL_VID_HANDLE || _vm->_video->endOfVideo(handle)) { - if (_playBlocking) { - _vm->_video->playMovieBlocking(_videoFile, _left, _top); - handle = NULL_VID_HANDLE; - } else { - handle = _vm->_video->playMovie(_videoFile, _left, _top, _loop); + handle = _vm->_video->playMovie(_videoFile, _left, _top, _loop); + if (_direction == -1) { + _vm->_video->seekToTime(handle, _vm->_video->getDuration(handle)); + _vm->_video->setVideoRate(handle, -1); } } else { // Resume the video _vm->_video->pauseMovie(handle, false); } + if (_playBlocking) { + _vm->_video->waitUntilMovieEnds(handle); + handle = NULL_VID_HANDLE; + } + return handle; } diff --git a/engines/mohawk/myst_graphics.cpp b/engines/mohawk/myst_graphics.cpp index 2df0f7e6ba..6a292c66e2 100644 --- a/engines/mohawk/myst_graphics.cpp +++ b/engines/mohawk/myst_graphics.cpp @@ -209,15 +209,15 @@ void MystGraphics::copyBackBufferToScreen(Common::Rect r) { _vm->_system->copyRectToScreen(_backBuffer->getBasePtr(r.left, r.top), _backBuffer->pitch, r.left, r.top, r.width(), r.height()); } -void MystGraphics::runTransition(uint16 type, Common::Rect rect, uint16 steps, uint16 delay) { +void MystGraphics::runTransition(TransitionType type, Common::Rect rect, uint16 steps, uint16 delay) { // Do not artificially delay during transitions int oldEnableDrawingTimeSimulation = _enableDrawingTimeSimulation; _enableDrawingTimeSimulation = 0; switch (type) { - case 0: { - debugC(kDebugScript, "Left to Right"); + case kTransitionLeftToRight: { + debugC(kDebugView, "Left to Right"); uint16 step = (rect.right - rect.left) / steps; Common::Rect area = rect; @@ -239,8 +239,8 @@ void MystGraphics::runTransition(uint16 type, Common::Rect rect, uint16 steps, u } } break; - case 1: { - debugC(kDebugScript, "Right to Left"); + case kTransitionRightToLeft: { + debugC(kDebugView, "Right to Left"); uint16 step = (rect.right - rect.left) / steps; Common::Rect area = rect; @@ -262,8 +262,25 @@ void MystGraphics::runTransition(uint16 type, Common::Rect rect, uint16 steps, u } } break; - case 5: { - debugC(kDebugScript, "Top to Bottom"); + case kTransitionSlideToLeft: + debugC(kDebugView, "Slide to left"); + transitionSlideToLeft(rect, steps, delay); + break; + case kTransitionSlideToRight: + debugC(kDebugView, "Slide to right"); + transitionSlideToRight(rect, steps, delay); + break; + case kTransitionDissolve: { + debugC(kDebugView, "Dissolve"); + + for (int16 step = 0; step < 8; step++) { + simulatePreviousDrawDelay(rect); + transitionDissolve(rect, step); + } + } + break; + case kTransitionTopToBottom: { + debugC(kDebugView, "Top to Bottom"); uint16 step = (rect.bottom - rect.top) / steps; Common::Rect area = rect; @@ -285,8 +302,8 @@ void MystGraphics::runTransition(uint16 type, Common::Rect rect, uint16 steps, u } } break; - case 6: { - debugC(kDebugScript, "Bottom to Top"); + case kTransitionBottomToTop: { + debugC(kDebugView, "Bottom to Top"); uint16 step = (rect.bottom - rect.top) / steps; Common::Rect area = rect; @@ -308,18 +325,260 @@ void MystGraphics::runTransition(uint16 type, Common::Rect rect, uint16 steps, u } } break; - default: - warning("Unknown Update Direction"); + case kTransitionSlideToTop: + debugC(kDebugView, "Slide to top"); + transitionSlideToTop(rect, steps, delay); + break; + case kTransitionSlideToBottom: + debugC(kDebugView, "Slide to bottom"); + transitionSlideToBottom(rect, steps, delay); + break; + case kTransitionPartToRight: { + debugC(kDebugView, "Partial left to right"); + + transitionPartialToRight(rect, 75, 3); + } + break; + case kTransitionPartToLeft: { + debugC(kDebugView, "Partial right to left"); - //TODO: Replace minimal implementation + transitionPartialToLeft(rect, 75, 3); + } + break; + case kTransitionCopy: copyBackBufferToScreen(rect); _vm->_system->updateScreen(); break; + default: + error("Unknown transition %d", type); } _enableDrawingTimeSimulation = oldEnableDrawingTimeSimulation; } +void MystGraphics::transitionDissolve(Common::Rect rect, uint step) { + static const bool pattern[][4][4] = { + { + { true, false, false, false }, + { false, false, false, false }, + { false, false, true, false }, + { false, false, false, false } + }, + { + { false, false, true, false }, + { false, false, false, false }, + { true, false, false, false }, + { false, false, false, false } + }, + { + { false, false, false, false }, + { false, true, false, false }, + { false, false, false, false }, + { false, false, false, true } + }, + { + { false, false, false, false }, + { false, false, false, true }, + { false, false, false, false }, + { false, true, false, false } + }, + { + { false, false, false, false }, + { false, false, true, false }, + { false, true, false, false }, + { false, false, false, false } + }, + { + { false, true, false, false }, + { false, false, false, false }, + { false, false, false, false }, + { false, false, true, false } + }, + { + { false, false, false, false }, + { true, false, false, false }, + { false, false, false, true }, + { false, false, false, false } + }, + { + { false, false, false, true }, + { false, false, false, false }, + { false, false, false, false }, + { true, false, false, false } + } + }; + + rect.clip(_viewport); + + Graphics::Surface *screen = _vm->_system->lockScreen(); + + for (uint16 y = rect.top; y < rect.bottom; y++) { + const bool *linePattern = pattern[step][y % 4]; + + if (!linePattern[0] && !linePattern[1] && !linePattern[2] && !linePattern[3]) + continue; + + for (uint16 x = rect.left; x < rect.right; x++) { + if (linePattern[x % 4]) { + if (_pixelFormat.bytesPerPixel == 2) { + uint16 *dst = (uint16 *)screen->getBasePtr(x, y); + *dst = *(const uint16 *)_backBuffer->getBasePtr(x, y); + } else { + uint32 *dst = (uint32 *)screen->getBasePtr(x, y); + *dst = *(const uint32 *)_backBuffer->getBasePtr(x, y); + } + } + } + } + + _vm->_system->unlockScreen(); + _vm->_system->updateScreen(); +} + +void MystGraphics::transitionSlideToLeft(Common::Rect rect, uint16 steps, uint16 delay) { + rect.clip(_viewport); + + uint32 stepWidth = (rect.right - rect.left) / steps; + Common::Rect srcRect = Common::Rect(rect.right, rect.top, rect.right, rect.bottom); + Common::Rect dstRect = Common::Rect(rect.left, rect.top, rect.left, rect.bottom); + + for (uint step = 1; step <= steps; step++) { + dstRect.right = dstRect.left + step * stepWidth; + srcRect.left = srcRect.right - step * stepWidth; + + _vm->_system->delayMillis(delay); + + simulatePreviousDrawDelay(dstRect); + _vm->_system->copyRectToScreen(_backBuffer->getBasePtr(dstRect.left, dstRect.top), + _backBuffer->pitch, srcRect.left, srcRect.top, srcRect.width(), srcRect.height()); + _vm->_system->updateScreen(); + } + + if (dstRect.right != rect.right) { + copyBackBufferToScreen(rect); + _vm->_system->updateScreen(); + } +} + +void MystGraphics::transitionSlideToRight(Common::Rect rect, uint16 steps, uint16 delay) { + rect.clip(_viewport); + + uint32 stepWidth = (rect.right - rect.left) / steps; + Common::Rect srcRect = Common::Rect(rect.left, rect.top, rect.left, rect.bottom); + Common::Rect dstRect = Common::Rect(rect.right, rect.top, rect.right, rect.bottom); + + for (uint step = 1; step <= steps; step++) { + dstRect.left = dstRect.right - step * stepWidth; + srcRect.right = srcRect.left + step * stepWidth; + + _vm->_system->delayMillis(delay); + + simulatePreviousDrawDelay(dstRect); + _vm->_system->copyRectToScreen(_backBuffer->getBasePtr(dstRect.left, dstRect.top), + _backBuffer->pitch, srcRect.left, srcRect.top, srcRect.width(), srcRect.height()); + _vm->_system->updateScreen(); + } + + if (dstRect.left != rect.left) { + copyBackBufferToScreen(rect); + _vm->_system->updateScreen(); + } +} + +void MystGraphics::transitionSlideToTop(Common::Rect rect, uint16 steps, uint16 delay) { + rect.clip(_viewport); + + uint32 stepWidth = (rect.bottom - rect.top) / steps; + Common::Rect srcRect = Common::Rect(rect.left, rect.bottom, rect.right, rect.bottom); + Common::Rect dstRect = Common::Rect(rect.left, rect.top, rect.right, rect.top); + + for (uint step = 1; step <= steps; step++) { + dstRect.bottom = dstRect.top + step * stepWidth; + srcRect.top = srcRect.bottom - step * stepWidth; + + _vm->_system->delayMillis(delay); + + simulatePreviousDrawDelay(dstRect); + _vm->_system->copyRectToScreen(_backBuffer->getBasePtr(dstRect.left, dstRect.top), + _backBuffer->pitch, srcRect.left, srcRect.top, srcRect.width(), srcRect.height()); + _vm->_system->updateScreen(); + } + + + if (dstRect.bottom < rect.bottom) { + copyBackBufferToScreen(rect); + _vm->_system->updateScreen(); + } +} + +void MystGraphics::transitionSlideToBottom(Common::Rect rect, uint16 steps, uint16 delay) { + rect.clip(_viewport); + + uint32 stepWidth = (rect.bottom - rect.top) / steps; + Common::Rect srcRect = Common::Rect(rect.left, rect.top, rect.right, rect.top); + Common::Rect dstRect = Common::Rect(rect.left, rect.bottom, rect.right, rect.bottom); + + for (uint step = 1; step <= steps; step++) { + dstRect.top = dstRect.bottom - step * stepWidth; + srcRect.bottom = srcRect.top + step * stepWidth; + + _vm->_system->delayMillis(delay); + + simulatePreviousDrawDelay(dstRect); + _vm->_system->copyRectToScreen(_backBuffer->getBasePtr(dstRect.left, dstRect.top), + _backBuffer->pitch, srcRect.left, srcRect.top, srcRect.width(), srcRect.height()); + _vm->_system->updateScreen(); + } + + + if (dstRect.top > rect.top) { + copyBackBufferToScreen(rect); + _vm->_system->updateScreen(); + } +} + +void MystGraphics::transitionPartialToRight(Common::Rect rect, uint32 width, uint32 steps) { + rect.clip(_viewport); + + uint32 stepWidth = width / steps; + Common::Rect srcRect = Common::Rect(rect.right, rect.top, rect.right, rect.bottom); + Common::Rect dstRect = Common::Rect(rect.left, rect.top, rect.left, rect.bottom); + + for (uint step = 1; step <= steps; step++) { + dstRect.right = dstRect.left + step * stepWidth; + srcRect.left = srcRect.right - step * stepWidth; + + simulatePreviousDrawDelay(dstRect); + _vm->_system->copyRectToScreen(_backBuffer->getBasePtr(dstRect.left, dstRect.top), + _backBuffer->pitch, srcRect.left, srcRect.top, srcRect.width(), srcRect.height()); + _vm->_system->updateScreen(); + } + + copyBackBufferToScreen(rect); + _vm->_system->updateScreen(); +} + +void MystGraphics::transitionPartialToLeft(Common::Rect rect, uint32 width, uint32 steps) { + rect.clip(_viewport); + + uint32 stepWidth = width / steps; + Common::Rect srcRect = Common::Rect(rect.left, rect.top, rect.left, rect.bottom); + Common::Rect dstRect = Common::Rect(rect.right, rect.top, rect.right, rect.bottom); + + for (uint step = 1; step <= steps; step++) { + dstRect.left = dstRect.right - step * stepWidth; + srcRect.right = srcRect.left + step * stepWidth; + + simulatePreviousDrawDelay(dstRect); + _vm->_system->copyRectToScreen(_backBuffer->getBasePtr(dstRect.left, dstRect.top), + _backBuffer->pitch, srcRect.left, srcRect.top, srcRect.width(), srcRect.height()); + _vm->_system->updateScreen(); + } + + copyBackBufferToScreen(rect); + _vm->_system->updateScreen(); +} + void MystGraphics::drawRect(Common::Rect rect, RectState state) { rect.clip(_viewport); diff --git a/engines/mohawk/myst_graphics.h b/engines/mohawk/myst_graphics.h index de8fe521e6..4bbc8d5b8c 100644 --- a/engines/mohawk/myst_graphics.h +++ b/engines/mohawk/myst_graphics.h @@ -48,7 +48,7 @@ public: void copyImageToScreen(uint16 image, Common::Rect dest); void copyImageToBackBuffer(uint16 image, Common::Rect dest); void copyBackBufferToScreen(Common::Rect r); - void runTransition(uint16 type, Common::Rect rect, uint16 steps, uint16 delay); + void runTransition(TransitionType type, Common::Rect rect, uint16 steps, uint16 delay); void drawRect(Common::Rect rect, RectState state); void drawLine(const Common::Point &p1, const Common::Point &p2, uint32 color); void enableDrawingTimeSimulation(bool enable); @@ -60,7 +60,13 @@ protected: MohawkEngine *getVM() { return (MohawkEngine *)_vm; } void simulatePreviousDrawDelay(const Common::Rect &dest); void copyBackBufferToScreenWithSaturation(int16 saturation); - + void transitionDissolve(Common::Rect rect, uint step); + void transitionSlideToLeft(Common::Rect rect, uint16 steps, uint16 delay); + void transitionSlideToRight(Common::Rect rect, uint16 steps, uint16 delay); + void transitionSlideToTop(Common::Rect rect, uint16 steps, uint16 delay); + void transitionSlideToBottom(Common::Rect rect, uint16 steps, uint16 delay); + void transitionPartialToRight(Common::Rect rect, uint32 width, uint32 steps); + void transitionPartialToLeft(Common::Rect rect, uint32 width, uint32 steps); private: MohawkEngine_Myst *_vm; MystBitmap *_bmpDecoder; diff --git a/engines/mohawk/myst_scripts.cpp b/engines/mohawk/myst_scripts.cpp index 107a8b03e9..c1b75df4cf 100644 --- a/engines/mohawk/myst_scripts.cpp +++ b/engines/mohawk/myst_scripts.cpp @@ -100,18 +100,18 @@ void MystScriptParser::setupCommonOpcodes() { // "Standard" Opcodes OPCODE(0, o_toggleVar); OPCODE(1, o_setVar); - OPCODE(2, o_changeCardSwitch); + OPCODE(2, o_changeCardSwitch4); OPCODE(3, o_takePage); OPCODE(4, o_redrawCard); // Opcode 5 Not Present - OPCODE(6, o_goToDest); - OPCODE(7, o_goToDest); - OPCODE(8, o_goToDest); + OPCODE(6, o_goToDestForward); + OPCODE(7, o_goToDestLeft); + OPCODE(8, o_goToDestRight); OPCODE(9, o_triggerMovie); OPCODE(10, o_toggleVarNoRedraw); // Opcode 11 Not Present - OPCODE(12, o_changeCardSwitch); - OPCODE(13, o_changeCardSwitch); + OPCODE(12, o_changeCardSwitchLtR); + OPCODE(13, o_changeCardSwitchRtL); OPCODE(14, o_drawAreaState); OPCODE(15, o_redrawAreaForVar); OPCODE(16, o_changeCardDirectional); @@ -120,7 +120,7 @@ void MystScriptParser::setupCommonOpcodes() { OPCODE(19, o_enableAreas); OPCODE(20, o_disableAreas); OPCODE(21, o_directionalUpdate); - OPCODE(22, o_goToDest); + OPCODE(22, o_goToDestUp); OPCODE(23, o_toggleAreasActivation); OPCODE(24, o_playSound); // Opcode 25 is unused; original calls replaceSoundMyst @@ -145,6 +145,7 @@ void MystScriptParser::setupCommonOpcodes() { OPCODE(44, o_restoreMainCursor); // Opcode 45 Not Present OPCODE(46, o_soundWaitStop); + OPCODE(48, o_goToDest); OPCODE(51, o_exitMap); // Opcodes 47 to 99 Not Present @@ -273,7 +274,7 @@ void MystScriptParser::animatedUpdate(uint16 argc, uint16 *argv, uint16 delay) { while (argsRead < argc) { Common::Rect rect = Common::Rect(argv[argsRead], argv[argsRead + 1], argv[argsRead + 2], argv[argsRead + 3]); - uint16 kind = argv[argsRead + 4]; + TransitionType kind = static_cast<TransitionType>(argv[argsRead + 4]); uint16 steps = argv[argsRead + 5]; debugC(kDebugScript, "\trect.left: %d", rect.left); @@ -323,16 +324,41 @@ void MystScriptParser::o_setVar(uint16 op, uint16 var, uint16 argc, uint16 *argv _vm->redrawArea(var); } -void MystScriptParser::o_changeCardSwitch(uint16 op, uint16 var, uint16 argc, uint16 *argv) { - // Opcodes 2, 12, and 13 are the same +void MystScriptParser::o_changeCardSwitch4(uint16 op, uint16 var, uint16 argc, uint16 *argv) { uint16 value = getVar(var); debugC(kDebugScript, "Opcode %d: changeCardSwitch var %d: %d", op, var, value); if (value) - _vm->changeToCard(argv[value -1 ], true); + _vm->changeToCard(argv[value -1 ], kTransitionDissolve); else if (_invokingResource != NULL) - _vm->changeToCard(_invokingResource->getDest(), true); + _vm->changeToCard(_invokingResource->getDest(), kTransitionDissolve); + else + warning("Missing invokingResource in altDest call"); +} + +void MystScriptParser::o_changeCardSwitchLtR(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + uint16 value = getVar(var); + + debugC(kDebugScript, "Opcode %d: changeCardSwitch var %d: %d", op, var, value); + + if (value) + _vm->changeToCard(argv[value -1 ], kTransitionLeftToRight); + else if (_invokingResource != NULL) + _vm->changeToCard(_invokingResource->getDest(), kTransitionLeftToRight); + else + warning("Missing invokingResource in altDest call"); +} + +void MystScriptParser::o_changeCardSwitchRtL(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + uint16 value = getVar(var); + + debugC(kDebugScript, "Opcode %d: changeCardSwitch var %d: %d", op, var, value); + + if (value) + _vm->changeToCard(argv[value -1 ], kTransitionRightToLeft); + else if (_invokingResource != NULL) + _vm->changeToCard(_invokingResource->getDest(), kTransitionRightToLeft); else warning("Missing invokingResource in altDest call"); } @@ -373,10 +399,47 @@ void MystScriptParser::o_goToDest(uint16 op, uint16 var, uint16 argc, uint16 *ar debugC(kDebugScript, "Opcode %d: Change To Dest of Invoking Resource", op); if (_invokingResource != NULL) - _vm->changeToCard(_invokingResource->getDest(), true); + _vm->changeToCard(_invokingResource->getDest(), kTransitionCopy); + else + warning("Opcode %d: Missing invokingResource", op); +} + +void MystScriptParser::o_goToDestForward(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + debugC(kDebugScript, "Opcode %d: Change To Dest of Invoking Resource", op); + + if (_invokingResource != NULL) + _vm->changeToCard(_invokingResource->getDest(), kTransitionDissolve); + else + warning("Opcode %d: Missing invokingResource", op); +} + +void MystScriptParser::o_goToDestLeft(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + debugC(kDebugScript, "Opcode %d: Change To Dest of Invoking Resource", op); + + if (_invokingResource != NULL) + _vm->changeToCard(_invokingResource->getDest(), kTransitionPartToRight); + else + warning("Opcode %d: Missing invokingResource", op); +} + +void MystScriptParser::o_goToDestRight(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + debugC(kDebugScript, "Opcode %d: Change To Dest of Invoking Resource", op); + + if (_invokingResource != NULL) + _vm->changeToCard(_invokingResource->getDest(), kTransitionPartToLeft); else warning("Opcode %d: Missing invokingResource", op); } + +void MystScriptParser::o_goToDestUp(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + debugC(kDebugScript, "Opcode %d: Change To Dest of Invoking Resource", op); + + if (_invokingResource != NULL) + _vm->changeToCard(_invokingResource->getDest(), kTransitionTopToBottom); + else + warning("Opcode %d: Missing invokingResource", op); +} + void MystScriptParser::o_triggerMovie(uint16 op, uint16 var, uint16 argc, uint16 *argv) { debugC(kDebugScript, "Opcode %d: Trigger Type 6 Resource Movie..", op); // TODO: If movie has sound, pause background music @@ -427,7 +490,7 @@ void MystScriptParser::o_changeCardDirectional(uint16 op, uint16 var, uint16 arg debugC(kDebugScript, "\tcardId: %d", cardId); debugC(kDebugScript, "\tdirectonal update data size: %d", directionalUpdateDataSize); - _vm->changeToCard(cardId, false); + _vm->changeToCard(cardId, kNoTransition); animatedUpdate(directionalUpdateDataSize, &argv[2], 0); } @@ -440,23 +503,23 @@ void MystScriptParser::o_changeCardPush(uint16 op, uint16 var, uint16 argc, uint debugC(kDebugScript, "Opcode %d: Jump to Card Id, Storing Current Card Id", op); _savedCardId = _vm->getCurCard(); - uint16 cardId = argv[0]; - // argv[1] is not used in the original engine + uint16 cardId = argv[0]; + TransitionType transition = static_cast<TransitionType>(argv[1]); debugC(kDebugScript, "\tCurrent CardId: %d", _savedCardId); debugC(kDebugScript, "\tJump to CardId: %d", cardId); - _vm->changeToCard(cardId, true); + _vm->changeToCard(cardId, transition); } void MystScriptParser::o_changeCardPop(uint16 op, uint16 var, uint16 argc, uint16 *argv) { debugC(kDebugScript, "Opcode %d: Return To Stored Card Id", op); debugC(kDebugScript, "\tCardId: %d", _savedCardId); - // argv[0] is not used in the original engine + TransitionType transition = static_cast<TransitionType>(argv[0]); - _vm->changeToCard(_savedCardId, true); + _vm->changeToCard(_savedCardId, transition); } void MystScriptParser::o_enableAreas(uint16 op, uint16 var, uint16 argc, uint16 *argv) { @@ -752,14 +815,11 @@ void MystScriptParser::o_changeCard(uint16 op, uint16 var, uint16 argc, uint16 * debugC(kDebugScript, "Opcode %d: Change Card", op); uint16 cardId = argv[0]; - - // Argument 1 if present is not used - // uint16 u0 = argv[1]; + TransitionType transition = static_cast<TransitionType>(argv[1]); debugC(kDebugScript, "\tTarget Card: %d", cardId); - //debugC(kDebugScript, "\tu0: %d", u0); // Unused data - _vm->changeToCard(cardId, true); + _vm->changeToCard(cardId, transition); } void MystScriptParser::o_drawImageChangeCard(uint16 op, uint16 var, uint16 argc, uint16 *argv) { @@ -767,7 +827,7 @@ void MystScriptParser::o_drawImageChangeCard(uint16 op, uint16 var, uint16 argc, uint16 imageId = argv[0]; uint16 cardId = argv[1]; - // argv[2] is not used in the original engine + TransitionType transition = static_cast<TransitionType>(argv[2]); debugC(kDebugScript, "\timageId: %d", imageId); debugC(kDebugScript, "\tcardId: %d", cardId); @@ -775,7 +835,7 @@ void MystScriptParser::o_drawImageChangeCard(uint16 op, uint16 var, uint16 argc, _vm->_gfx->copyImageToScreen(imageId, Common::Rect(0, 0, 544, 333)); _vm->_system->updateScreen(); - _vm->changeToCard(cardId, true); + _vm->changeToCard(cardId, transition); } void MystScriptParser::o_changeMainCursor(uint16 op, uint16 var, uint16 argc, uint16 *argv) { @@ -850,7 +910,7 @@ void MystScriptParser::o_changeCardPlaySoundDirectional(uint16 op, uint16 var, u if (soundId) _vm->_sound->replaceSoundMyst(soundId); - _vm->changeToCard(cardId, false); + _vm->changeToCard(cardId, kNoTransition); animatedUpdate(dataSize, &argv[4], delayBetweenSteps); } @@ -901,12 +961,12 @@ void MystScriptParser::o_quit(uint16 op, uint16 var, uint16 argc, uint16 *argv) void MystScriptParser::showMap() { if (_vm->getCurCard() != getMap()) { _savedMapCardId = _vm->getCurCard(); - _vm->changeToCard(getMap(), true); + _vm->changeToCard(getMap(), kTransitionCopy); } } void MystScriptParser::o_exitMap(uint16 op, uint16 var, uint16 argc, uint16 *argv) { - _vm->changeToCard(_savedMapCardId, true); + _vm->changeToCard(_savedMapCardId, kTransitionCopy); } } // End of namespace Mohawk diff --git a/engines/mohawk/myst_scripts.h b/engines/mohawk/myst_scripts.h index ccb76e0dc8..b75da0801a 100644 --- a/engines/mohawk/myst_scripts.h +++ b/engines/mohawk/myst_scripts.h @@ -86,10 +86,16 @@ public: // Common opcodes DECLARE_OPCODE(o_toggleVar); DECLARE_OPCODE(o_setVar); - DECLARE_OPCODE(o_changeCardSwitch); + DECLARE_OPCODE(o_changeCardSwitch4); + DECLARE_OPCODE(o_changeCardSwitchLtR); + DECLARE_OPCODE(o_changeCardSwitchRtL); DECLARE_OPCODE(o_takePage); DECLARE_OPCODE(o_redrawCard); DECLARE_OPCODE(o_goToDest); + DECLARE_OPCODE(o_goToDestForward); + DECLARE_OPCODE(o_goToDestLeft); + DECLARE_OPCODE(o_goToDestRight); + DECLARE_OPCODE(o_goToDestUp); DECLARE_OPCODE(o_triggerMovie); DECLARE_OPCODE(o_toggleVarNoRedraw); DECLARE_OPCODE(o_drawAreaState); diff --git a/engines/mohawk/myst_stacks/channelwood.cpp b/engines/mohawk/myst_stacks/channelwood.cpp index 069281f5dc..63ba5f7c85 100644 --- a/engines/mohawk/myst_stacks/channelwood.cpp +++ b/engines/mohawk/myst_stacks/channelwood.cpp @@ -341,7 +341,7 @@ void Channelwood::o_drawImageChangeCardAndVolume(uint16 op, uint16 var, uint16 a _vm->_gfx->copyImageToScreen(imageId, Common::Rect(0, 0, 544, 333)); _vm->_system->updateScreen(); - _vm->changeToCard(cardId, true); + _vm->changeToCard(cardId, kTransitionPartToLeft); if (argc == 3) { uint16 volume = argv[2]; @@ -476,9 +476,12 @@ void Channelwood::o_stairsDoorToggle(uint16 op, uint16 var, uint16 argc, uint16 MystResourceType6 *movie = static_cast<MystResourceType6 *>(_invokingResource); if (_state.stairsUpperDoorState) { - // TODO: Play backwards + // Close door, play the open movie backwards + movie->setDirection(-1); movie->playMovie(); } else { + // Open door + movie->setDirection(1); movie->playMovie(); } } diff --git a/engines/mohawk/myst_stacks/demo.cpp b/engines/mohawk/myst_stacks/demo.cpp index 29a12571fd..9f393ea401 100644 --- a/engines/mohawk/myst_stacks/demo.cpp +++ b/engines/mohawk/myst_stacks/demo.cpp @@ -104,14 +104,14 @@ void Demo::returnToMenu_run() { switch (_returnToMenuStep){ case 0: _vm->_gfx->fadeToBlack(); - _vm->changeToCard(2003, false); + _vm->changeToCard(2003, kNoTransition); _vm->_gfx->fadeFromBlack(); _returnToMenuStep++; break; case 1: _vm->_gfx->fadeToBlack(); - _vm->changeToCard(2001, false); + _vm->changeToCard(2001, kNoTransition); _vm->_gfx->fadeFromBlack(); _vm->_cursor->showCursor(); diff --git a/engines/mohawk/myst_stacks/intro.cpp b/engines/mohawk/myst_stacks/intro.cpp index 545b97d956..71733227ac 100644 --- a/engines/mohawk/myst_stacks/intro.cpp +++ b/engines/mohawk/myst_stacks/intro.cpp @@ -127,9 +127,9 @@ void Intro::introMovies_run() { break; default: if (_vm->getFeatures() & GF_DEMO) - _vm->changeToCard(2001, true); + _vm->changeToCard(2001, kTransitionRightToLeft); else - _vm->changeToCard(2, true); + _vm->changeToCard(2, kTransitionRightToLeft); } } @@ -148,7 +148,7 @@ void Intro::mystLinkBook_run() { _vm->_gfx->copyBackBufferToScreen(Common::Rect(544, 333)); } } else if (!_linkBookMovie->isPlaying()) { - _vm->changeToCard(5, true); + _vm->changeToCard(5, kTransitionRightToLeft); } } diff --git a/engines/mohawk/myst_stacks/mechanical.cpp b/engines/mohawk/myst_stacks/mechanical.cpp index 79de03308c..43e9bcfed5 100644 --- a/engines/mohawk/myst_stacks/mechanical.cpp +++ b/engines/mohawk/myst_stacks/mechanical.cpp @@ -39,8 +39,17 @@ Mechanical::Mechanical(MohawkEngine_Myst *vm) : MystScriptParser(vm), _state(vm->_gameState->_mechanical) { setupOpcodes(); + _elevatorGoingMiddle = false; + _mystStaircaseState = false; _fortressPosition = 0; + _fortressRotationSpeed = 0; + _fortressSimulationSpeed = 0; + _gearsWereRunning = false; + + _fortressRotationShortMovieWorkaround = false; + _fortressRotationShortMovieCount = 0; + _fortressRotationShortMovieLast = 0; } Mechanical::~Mechanical() { @@ -74,9 +83,9 @@ void Mechanical::setupOpcodes() { OPCODE(121, o_elevatorWindowMovie); OPCODE(122, o_elevatorGoMiddle); OPCODE(123, o_elevatorTopMovie); - OPCODE(124, opcode_124); + OPCODE(124, o_fortressRotationSetPosition); OPCODE(125, o_mystStaircaseMovie); - OPCODE(126, opcode_126); + OPCODE(126, o_elevatorWaitTimeout); OPCODE(127, o_crystalEnterYellow); OPCODE(128, o_crystalLeaveYellow); OPCODE(129, o_crystalEnterGreen); @@ -103,7 +112,6 @@ void Mechanical::setupOpcodes() { void Mechanical::disablePersistentScripts() { _fortressSimulationRunning = false; _elevatorRotationLeverMoving = false; - _elevatorGoingMiddle = false; _birdSinging = false; _fortressRotationRunning = false; } @@ -599,30 +607,33 @@ void Mechanical::elevatorGoMiddle_run() { _vm->_gfx->copyBackBufferToScreen(Common::Rect(10, 137, 61, 165)); _vm->_system->updateScreen(); } - } else if (_elevatorInCabin) { + } else { _elevatorTooLate = true; - - // Elevator going to middle animation - _vm->_cursor->hideCursor(); - _vm->_sound->playSoundBlocking(11120); - _vm->_gfx->copyImageToBackBuffer(6118, Common::Rect(544, 333)); - _vm->_sound->replaceSoundMyst(12120); - _vm->_gfx->runTransition(2, Common::Rect(177, 0, 370, 333), 25, 0); - _vm->_sound->playSoundBlocking(13120); - _vm->_sound->replaceSoundMyst(8120); - _vm->_gfx->copyImageToBackBuffer(6327, Common::Rect(544, 333)); - _vm->_system->delayMillis(500); - _vm->_sound->replaceSoundMyst(9120); - static uint16 moviePos[2] = { 3540, 5380 }; - o_elevatorWindowMovie(121, 0, 2, moviePos); - _vm->_gfx->copyBackBufferToScreen(Common::Rect(544, 333)); - _vm->_sound->replaceSoundMyst(10120); - _vm->_cursor->showCursor(); - _elevatorGoingMiddle = false; - _elevatorPosition = 1; - _vm->changeToCard(6327, true); + if (_elevatorInCabin) { + + // Elevator going to middle animation + _vm->_cursor->hideCursor(); + _vm->_sound->playSoundBlocking(11120); + _vm->_gfx->copyImageToBackBuffer(6118, Common::Rect(544, 333)); + _vm->_sound->replaceSoundMyst(12120); + _vm->_gfx->runTransition(kTransitionSlideToLeft, Common::Rect(177, 0, 370, 333), 25, 0); + _vm->_sound->playSoundBlocking(13120); + _vm->_sound->replaceSoundMyst(8120); + _vm->_gfx->copyImageToBackBuffer(6327, Common::Rect(544, 333)); + _vm->_system->delayMillis(500); + _vm->_sound->replaceSoundMyst(9120); + static uint16 moviePos[2] = { 3540, 5380 }; + o_elevatorWindowMovie(121, 0, 2, moviePos); + _vm->_gfx->copyBackBufferToScreen(Common::Rect(544, 333)); + _vm->_sound->replaceSoundMyst(10120); + _vm->_cursor->showCursor(); + + _elevatorPosition = 1; + + _vm->changeToCard(6327, kTransitionRightToLeft); + } } } } @@ -638,16 +649,18 @@ void Mechanical::o_elevatorTopMovie(uint16 op, uint16 var, uint16 argc, uint16 * _vm->_video->waitUntilMovieEnds(window); } -void Mechanical::opcode_124(uint16 op, uint16 var, uint16 argc, uint16 *argv) { - varUnusedCheck(op, var); +void Mechanical::o_fortressRotationSetPosition(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + debugC(kDebugScript, "Opcode %d: Set fortress position", op); - if (argc == 0) { - // Used by Card 6156 (Fortress Rotation Controls) - // Called when Red Exit Button Pressed to raise Elevator + VideoHandle gears = _fortressRotationGears->playMovie(); + uint32 moviePosition = Audio::Timestamp(_vm->_video->getTime(gears), 600).totalNumberOfFrames(); + + // Myst ME short movie workaround, explained in o_fortressRotation_init + if (_fortressRotationShortMovieWorkaround) { + moviePosition += 3600 * _fortressRotationShortMovieCount; + } - // TODO: Fill in Code... - } else - unknown(op, var, argc, argv); + _fortressPosition = (moviePosition + 900) / 1800 % 4; } void Mechanical::o_mystStaircaseMovie(uint16 op, uint16 var, uint16 argc, uint16 *argv) { @@ -656,17 +669,14 @@ void Mechanical::o_mystStaircaseMovie(uint16 op, uint16 var, uint16 argc, uint16 _vm->_video->playMovieBlocking(_vm->wrapMovieFilename("sstairs", kMechanicalStack), 199, 108); } -void Mechanical::opcode_126(uint16 op, uint16 var, uint16 argc, uint16 *argv) { - varUnusedCheck(op, var); +void Mechanical::o_elevatorWaitTimeout(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + debugC(kDebugScript, "Opcode %d: Wait for the elevator to go middle", op); - if (argc == 0) { - // Used by Card 6120 (Fortress Elevator) - // Called when Red Exit Button Pressed to raise Elevator and - // exit is clicked... - - // TODO: Fill in Code... - } else - unknown(op, var, argc, argv); + // Wait while the elevator times out + while (_elevatorGoingMiddle) { + runPersistentScripts(); + _vm->skippableWait(10); + } } void Mechanical::o_crystalEnterYellow(uint16 op, uint16 var, uint16 argc, uint16 *argv) { @@ -776,8 +786,76 @@ void Mechanical::o_elevatorRotation_init(uint16 op, uint16 var, uint16 argc, uin } void Mechanical::fortressRotation_run() { - // Used for Card 6156 (Fortress Rotation Controls) - // TODO: Fill in function... + VideoHandle gears = _fortressRotationGears->playMovie(); + + double oldRate = _vm->_video->getVideoRate(gears).toDouble(); + + uint32 moviePosition = Audio::Timestamp(_vm->_video->getTime(gears), 600).totalNumberOfFrames(); + + // Myst ME short movie workaround, explained in o_fortressRotation_init + if (_fortressRotationShortMovieWorkaround) { + // Detect if we just looped + if (ABS<int32>(_fortressRotationShortMovieLast - 3680) < 50 + && ABS<int32>(moviePosition) < 50) { + _fortressRotationShortMovieCount++; + } + + _fortressRotationShortMovieLast = moviePosition; + + // Simulate longer movie + moviePosition += 3600 * _fortressRotationShortMovieCount; + } + + int32 positionInQuarter = 900 - (moviePosition + 900) % 1800; + + // Are the gears moving? + if (oldRate >= 0.1 || ABS<int32>(positionInQuarter) >= 30 || _fortressRotationBrake) { + + double newRate = oldRate; + if (_fortressRotationBrake && (double)_fortressRotationBrake * 0.2 > oldRate) { + newRate += 0.1; + } + + // Don't let the gears get stuck between two fortress positions + if (ABS<double>(oldRate) <= 0.05) { + if (oldRate <= 0.0) { + newRate += oldRate; + } else { + newRate -= oldRate; + } + } else { + if (oldRate <= 0.0) { + newRate += 0.05; + } else { + newRate -= 0.05; + } + } + + // Adjust speed accordingly to acceleration lever + newRate += (double) (positionInQuarter / 1500.0) + * (double) (9 - _fortressRotationSpeed) / 9.0; + + newRate = CLIP<double>(newRate, -2.5, 2.5); + + _vm->_video->setVideoRate(gears, Common::Rational((int)(newRate * 1000.0), 1000)); + + _gearsWereRunning = true; + } else if (_gearsWereRunning) { + // The fortress has stopped. Set its new position + _fortressPosition = (moviePosition + 900) / 1800 % 4; + + _vm->_video->setVideoRate(gears, 0); + + if (!_fortressRotationShortMovieWorkaround) { + _vm->_video->seekToTime(gears, Audio::Timestamp(0, 1800 * _fortressPosition, 600)); + } else { + _vm->_video->seekToTime(gears, Audio::Timestamp(0, 1800 * (_fortressPosition % 2), 600)); + } + + _vm->_sound->playSoundBlocking(_fortressRotationSounds[_fortressPosition]); + + _gearsWereRunning = false; + } } void Mechanical::o_fortressRotation_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) { @@ -785,6 +863,11 @@ void Mechanical::o_fortressRotation_init(uint16 op, uint16 var, uint16 argc, uin _fortressRotationGears = static_cast<MystResourceType6 *>(_invokingResource); + VideoHandle gears = _fortressRotationGears->playMovie(); + _vm->_video->setVideoLooping(gears, true); + _vm->_video->seekToTime(gears, Audio::Timestamp(0, 1800 * _fortressPosition, 600)); + _vm->_video->setVideoRate(gears, 0); + _fortressRotationSounds[0] = argv[0]; _fortressRotationSounds[1] = argv[1]; _fortressRotationSounds[2] = argv[2]; @@ -792,12 +875,113 @@ void Mechanical::o_fortressRotation_init(uint16 op, uint16 var, uint16 argc, uin _fortressRotationBrake = 0; + // WORKAROUND for the tower rotation bug in Myst ME. + // The original engine only allowed to visit two out of the three small islands, + // preventing the game from being fully completable. + // The fortress rotation is computed from the current position in the movie + // hcgears.mov. The version of this movie that shipped with the ME edition is + // too short to allow to visit all the islands. + // ScummVM simulates a longer movie by counting the number of times the movie + // looped and adding that time to the current movie position. + // Hence allowing the fortress position to be properly computed. + uint32 movieDuration = _vm->_video->getDuration(gears).convertToFramerate(600).totalNumberOfFrames(); + if (movieDuration == 3680) { + _fortressRotationShortMovieWorkaround = true; + _fortressRotationShortMovieCount = 0; + _fortressRotationShortMovieLast = 0; + } + _fortressRotationRunning = true; + _gearsWereRunning = false; } void Mechanical::fortressSimulation_run() { - // Used for Card 6044 (Fortress Rotation Simulator) - // TODO: Fill in function... + if (_fortressSimulationInit) { + // Init sequence + _vm->_sound->replaceBackgroundMyst(_fortressSimulationStartSound1, 65535); + _vm->skippableWait(5000); + _vm->_sound->replaceSoundMyst(_fortressSimulationStartSound2); + + // Update movie while the sound is playing + VideoHandle startup = _fortressSimulationStartup->playMovie(); + while (_vm->_sound->isPlaying(_fortressSimulationStartSound2)) { + if (_vm->_video->updateMovies()) + _vm->_system->updateScreen(); + + _vm->_system->delayMillis(10); + } + _vm->_sound->replaceBackgroundMyst(_fortressSimulationStartSound1, 65535); + _vm->_video->waitUntilMovieEnds(startup); + _vm->_sound->stopBackgroundMyst(); + _vm->_sound->replaceSoundMyst(_fortressSimulationStartSound2); + + + Common::Rect src = Common::Rect(0, 0, 176, 176); + Common::Rect dst = Common::Rect(187, 3, 363, 179); + _vm->_gfx->copyImageSectionToBackBuffer(6046, src, dst); + _vm->_gfx->copyBackBufferToScreen(dst); + _vm->_system->updateScreen(); + + _fortressSimulationStartup->pauseMovie(true); + VideoHandle holo = _fortressSimulationHolo->playMovie(); + _vm->_video->setVideoLooping(holo, true); + _vm->_video->setVideoRate(holo, 0); + + _vm->_cursor->showCursor(); + + _fortressSimulationInit = false; + } else { + VideoHandle holo = _fortressSimulationHolo->playMovie(); + + double oldRate = _vm->_video->getVideoRate(holo).toDouble(); + + uint32 moviePosition = Audio::Timestamp(_vm->_video->getTime(holo), 600).totalNumberOfFrames(); + + int32 positionInQuarter = 900 - (moviePosition + 900) % 1800; + + // Are the gears moving? + if (oldRate >= 0.1 || ABS<int32>(positionInQuarter) >= 30 || _fortressSimulationBrake) { + + double newRate = oldRate; + if (_fortressSimulationBrake && (double)_fortressSimulationBrake * 0.2 > oldRate) { + newRate += 0.1; + } + + // Don't let the gears get stuck between two fortress positions + if (ABS<double>(oldRate) <= 0.05) { + if (oldRate <= 0.0) { + newRate += oldRate; + } else { + newRate -= oldRate; + } + } else { + if (oldRate <= 0.0) { + newRate += 0.05; + } else { + newRate -= 0.05; + } + } + + // Adjust speed accordingly to acceleration lever + newRate += (double) (positionInQuarter / 1500.0) + * (double) (9 - _fortressSimulationSpeed) / 9.0; + + newRate = CLIP<double>(newRate, -2.5, 2.5); + + _vm->_video->setVideoRate(holo, Common::Rational((int)(newRate * 1000.0), 1000)); + + _gearsWereRunning = true; + } else if (_gearsWereRunning) { + // The fortress has stopped. Set its new position + uint16 simulationPosition = (moviePosition + 900) / 1800 % 4; + + _vm->_video->setVideoRate(holo, 0); + _vm->_video->seekToTime(holo, Audio::Timestamp(0, 1800 * simulationPosition, 600)); + _vm->_sound->playSoundBlocking( _fortressRotationSounds[simulationPosition]); + + _gearsWereRunning = false; + } + } } void Mechanical::o_fortressSimulation_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) { @@ -816,6 +1000,10 @@ void Mechanical::o_fortressSimulation_init(uint16 op, uint16 var, uint16 argc, u _fortressSimulationBrake = 0; _fortressSimulationRunning = true; + _gearsWereRunning = false; + _fortressSimulationInit = true; + + _vm->_cursor->hideCursor(); } void Mechanical::o_fortressSimulationStartup_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) { diff --git a/engines/mohawk/myst_stacks/mechanical.h b/engines/mohawk/myst_stacks/mechanical.h index 3bd7f2d71b..7f3d5143e4 100644 --- a/engines/mohawk/myst_stacks/mechanical.h +++ b/engines/mohawk/myst_stacks/mechanical.h @@ -80,9 +80,9 @@ private: DECLARE_OPCODE(o_elevatorWindowMovie); DECLARE_OPCODE(o_elevatorGoMiddle); DECLARE_OPCODE(o_elevatorTopMovie); - DECLARE_OPCODE(opcode_124); + DECLARE_OPCODE(o_fortressRotationSetPosition); DECLARE_OPCODE(o_mystStaircaseMovie); - DECLARE_OPCODE(opcode_126); + DECLARE_OPCODE(o_elevatorWaitTimeout); DECLARE_OPCODE(o_crystalEnterYellow); DECLARE_OPCODE(o_crystalEnterGreen); DECLARE_OPCODE(o_crystalEnterRed); @@ -104,13 +104,19 @@ private: bool _mystStaircaseState; // 76 bool _fortressRotationRunning; + bool _gearsWereRunning; uint16 _fortressRotationSpeed; // 78 uint16 _fortressRotationBrake; // 80 uint16 _fortressPosition; // 82 uint16 _fortressRotationSounds[4]; // 86 to 92 MystResourceType6 *_fortressRotationGears; // 172 + bool _fortressRotationShortMovieWorkaround; + uint32 _fortressRotationShortMovieCount; + uint32 _fortressRotationShortMovieLast; + bool _fortressSimulationRunning; + bool _fortressSimulationInit; // 94 uint16 _fortressSimulationSpeed; // 96 uint16 _fortressSimulationBrake; // 98 uint16 _fortressSimulationStartSound1; // 102 diff --git a/engines/mohawk/myst_stacks/myst.cpp b/engines/mohawk/myst_stacks/myst.cpp index c1ddc74c82..f17d765c99 100644 --- a/engines/mohawk/myst_stacks/myst.cpp +++ b/engines/mohawk/myst_stacks/myst.cpp @@ -51,6 +51,8 @@ Myst::Myst(MohawkEngine_Myst *vm) : _dockVaultState = 0; _cabinDoorOpened = 0; _cabinMatchState = 2; + _cabinGaugeMovie = NULL_VID_HANDLE; + _cabinFireMovie = NULL_VID_HANDLE; _matchBurning = false; _tree = 0; _treeAlcove = 0; @@ -189,7 +191,7 @@ void Myst::setupOpcodes() { OPCODE(215, o_gulls2_init); OPCODE(216, o_treeCard_init); OPCODE(217, o_treeEntry_init); - OPCODE(218, opcode_218); + OPCODE(218, o_boilerMovies_init); OPCODE(219, o_rocketSliders_init); OPCODE(220, o_rocketLinkVideo_init); OPCODE(221, o_greenBook_init); @@ -202,7 +204,7 @@ void Myst::setupOpcodes() { OPCODE(303, NOP); OPCODE(304, o_treeCard_exit); OPCODE(305, o_treeEntry_exit); - OPCODE(306, NOP); + OPCODE(306, o_boiler_exit); OPCODE(307, o_generatorControlRoom_exit); OPCODE(308, NOP); OPCODE(309, NOP); @@ -608,6 +610,8 @@ uint16 Myst::getVar(uint16 var) { return 1; case 302: // Green Book Opened Before Flag return _state.greenBookOpenedBefore; + case 303: // Library Bookcase status changed + return _libraryBookcaseChanged; case 304: // Tower Rotation Map Initialized return _towerRotationMapInitialized; case 305: // Cabin Boiler Lit @@ -1041,7 +1045,7 @@ void Myst::o_bookGivePage(uint16 op, uint16 var, uint16 argc, uint16 *argv) { // No page or white page if (!_globals.heldPage || _globals.heldPage == 13) { - _vm->changeToCard(cardIdBookCover, true); + _vm->changeToCard(cardIdBookCover, kTransitionDissolve); return; } @@ -1083,7 +1087,7 @@ void Myst::o_bookGivePage(uint16 op, uint16 var, uint16 argc, uint16 *argv) { // Wrong book if (bookVar != var) { - _vm->changeToCard(cardIdBookCover, true); + _vm->changeToCard(cardIdBookCover, kTransitionDissolve); return; } @@ -1109,9 +1113,9 @@ void Myst::o_bookGivePage(uint16 op, uint16 var, uint16 argc, uint16 *argv) { else _globals.currentAge = 10; - _vm->changeToCard(cardIdLose, true); + _vm->changeToCard(cardIdLose, kTransitionDissolve); } else { - _vm->changeToCard(cardIdBookCover, true); + _vm->changeToCard(cardIdBookCover, kTransitionDissolve); } } @@ -1298,7 +1302,7 @@ void Myst::imagerValidation_run() { if (_imagerValidationStep == 11) { _imagerValidationStep = 0; - _vm->changeToCard(_imagerValidationCard, true); + _vm->changeToCard(_imagerValidationCard, kTransitionBottomToTop); } else { _startTime = time + 100; } @@ -1473,10 +1477,10 @@ void Myst::o_cabinSafeHandleMove(uint16 op, uint16 var, uint16 argc, uint16 *arg if (soundId) _vm->_sound->replaceSoundMyst(soundId); - _vm->changeToCard(4103, false); + _vm->changeToCard(4103, kNoTransition); Common::Rect screenRect = Common::Rect(544, 333); - _vm->_gfx->runTransition(0, screenRect, 2, 5); + _vm->_gfx->runTransition(kTransitionLeftToRight, screenRect, 2, 5); } _tempVar = 1; } else { @@ -1869,17 +1873,50 @@ void Myst::o_boilerLightPilot(uint16 op, uint16 var, uint16 argc, uint16 *argv) _state.cabinPilotLightLit = 1; _vm->redrawArea(98); + boilerFireUpdate(false); + // Put out match _matchGoOutTime = _vm->_system->getMillis(); if (_state.cabinValvePosition > 0) _vm->_sound->replaceBackgroundMyst(8098, 49152); - if (_state.cabinValvePosition > 12) + if (_state.cabinValvePosition > 12) { + // Compute the speed of the gauge to synchronize it with the next tree move + uint32 delay = treeNextMoveDelay(_state.cabinValvePosition); + Common::Rational rate = boilerComputeGaugeRate(_state.cabinValvePosition, delay); + boilerResetGauge(rate); + _state.treeLastMoveTime = _vm->_system->getMillis(); + } + } +} - // TODO: Complete. Play movies +Common::Rational Myst::boilerComputeGaugeRate(uint16 pressure, uint32 delay) { + Common::Rational rate = Common::Rational(2088, delay); + if (pressure < 12) + return -rate; + else + return rate; +} + +void Myst::boilerResetGauge(const Common::Rational &rate) { + if (_vm->_video->endOfVideo(_cabinGaugeMovie)) { + if (_vm->getCurCard() == 4098) { + _cabinGaugeMovie = _vm->_video->playMovie(_vm->wrapMovieFilename("cabingau", kMystStack), 243, 96); + } else { + _cabinGaugeMovie = _vm->_video->playMovie(_vm->wrapMovieFilename("cabcgfar", kMystStack), 254, 136); + } } + + Audio::Timestamp goTo; + if (rate > 0) + goTo = Audio::Timestamp(0, 0, 600); + else + goTo = _vm->_video->getDuration(_cabinGaugeMovie); + + _vm->_video->seekToTime(_cabinGaugeMovie, goTo); + _vm->_video->setVideoRate(_cabinGaugeMovie, rate); } void Myst::o_boilerIncreasePressureStop(uint16 op, uint16 var, uint16 argc, uint16 *argv) { @@ -1893,7 +1930,12 @@ void Myst::o_boilerIncreasePressureStop(uint16 op, uint16 var, uint16 argc, uint if (_state.cabinValvePosition > 0) _vm->_sound->replaceBackgroundMyst(8098, 49152); - // TODO: Play movies + if (!_vm->_video->endOfVideo(_cabinGaugeMovie)) { + uint16 delay = treeNextMoveDelay(_state.cabinValvePosition); + Common::Rational rate = boilerComputeGaugeRate(_state.cabinValvePosition, delay); + _vm->_video->setVideoRate(_cabinGaugeMovie, rate); + } + } else if (_state.cabinValvePosition > 0) _vm->_sound->replaceBackgroundMyst(4098, _state.cabinValvePosition << 10); } @@ -1903,7 +1945,8 @@ void Myst::boilerPressureIncrease_run() { if (!_vm->_sound->isPlaying(5098) && _state.cabinValvePosition < 25) { _state.cabinValvePosition++; if (_state.cabinValvePosition == 1) { - // TODO: Play fire movie + // Set fire to high + boilerFireUpdate(false); // Draw fire _vm->redrawArea(305); @@ -1927,7 +1970,8 @@ void Myst::boilerPressureDecrease_run() { if (!_vm->_sound->isPlaying(5098) && _state.cabinValvePosition > 0) { _state.cabinValvePosition--; if (_state.cabinValvePosition == 0) { - // TODO: Play fire movie + // Set fire to low + boilerFireUpdate(false); // Draw fire _vm->redrawArea(305); @@ -1961,7 +2005,12 @@ void Myst::o_boilerDecreasePressureStop(uint16 op, uint16 var, uint16 argc, uint if (_state.cabinValvePosition > 0) _vm->_sound->replaceBackgroundMyst(8098, 49152); - // TODO: Play movies + if (!_vm->_video->endOfVideo(_cabinGaugeMovie)) { + uint16 delay = treeNextMoveDelay(_state.cabinValvePosition); + Common::Rational rate = boilerComputeGaugeRate(_state.cabinValvePosition, delay); + _vm->_video->setVideoRate(_cabinGaugeMovie, rate); + } + } else { if (_state.cabinValvePosition > 0) _vm->_sound->replaceBackgroundMyst(4098, _state.cabinValvePosition << 10); @@ -2067,6 +2116,11 @@ void Myst::tree_run() { // Check if alcove is accessible treeSetAlcoveAccessible(); + if (_cabinGaugeMovie != NULL_VID_HANDLE) { + Common::Rational rate = boilerComputeGaugeRate(pressure, delay); + boilerResetGauge(rate); + } + _state.treeLastMoveTime = time; } } @@ -2968,7 +3022,12 @@ void Myst::clockReset() { _vm->_system->delayMillis(1000); _vm->_sound->replaceSoundMyst(7113); - // TODO: Play cl1wggat backwards + // Gear closing movie + VideoHandle handle = _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wggat", kMystStack) , 195, 225); + _vm->_video->seekToTime(handle, _vm->_video->getDuration(handle)); + _vm->_video->setVideoRate(handle, -1); + _vm->_video->waitUntilMovieEnds(handle); + // Redraw gear _state.gearsOpen = 0; _vm->redrawArea(40); @@ -2980,16 +3039,9 @@ void Myst::clockReset() { void Myst::clockResetWeight() { _clockWeightVideo = _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wlfch", kMystStack) , 124, 0); - if (!(_vm->getFeatures() & GF_ME)) { - // Set video bounds, weight going up - _vm->_video->setVideoBounds(_clockWeightVideo, - Audio::Timestamp(0, 2214 * 2 - _clockWeightPosition, 600), - Audio::Timestamp(0, 2214 * 2, 600)); - } else { - //FIXME: Needs QT backwards playing, for now just display the weight up - warning("Weight going back up not implemented"); - _vm->_video->drawVideoFrame(_clockWeightVideo, Audio::Timestamp(0, 0, 600)); - } + // Play the movie backwards, weight going up + _vm->_video->seekToTime(_clockWeightVideo, Audio::Timestamp(0, _clockWeightPosition, 600)); + _vm->_video->setVideoRate(_clockWeightVideo, -1); // Reset position _clockWeightPosition = 0; @@ -3246,7 +3298,7 @@ void Myst::libraryBookcaseTransform_run(void) { if (_state.libraryBookcaseDoor) { _vm->_gfx->copyImageSectionToBackBuffer(11179, Common::Rect(0, 0, 106, 81), Common::Rect(0, 72, 106, 153)); - _vm->_gfx->runTransition(6, Common::Rect(0, 72, 106, 153), 5, 10); + _vm->_gfx->runTransition(kTransitionBottomToTop, Common::Rect(0, 72, 106, 153), 5, 10); _vm->_sound->playSoundBlocking(7348); _vm->_sound->replaceBackgroundMyst(4348, 16384); } else { @@ -3510,22 +3562,60 @@ void Myst::o_treeEntry_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) { treeSetAlcoveAccessible(); } -void Myst::opcode_218(uint16 op, uint16 var, uint16 argc, uint16 *argv) { - varUnusedCheck(op, var); +void Myst::o_boilerMovies_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + debugC(kDebugScript, "Opcode %d: Boiler movies init", op); - // Used for Card 4097 (Cabin Boiler) - // TODO: Fill in logic - if (false) { - _vm->_video->playMovieBlocking(_vm->wrapMovieFilename("cabfirfr", kMystStack), 254, 244); - _vm->_video->playMovieBlocking(_vm->wrapMovieFilename("cabcgfar", kMystStack), 254, 138); + boilerFireInit(); + boilerGaugeInit(); +} + +void Myst::boilerFireInit() { + if (_vm->getCurCard() == 4098) { + _cabinFireMovie = _vm->_video->playMovie(_vm->wrapMovieFilename("cabfire", kMystStack), 240, 279, true); + _vm->_video->pauseMovie(_cabinFireMovie, true); + + _vm->redrawArea(305); + boilerFireUpdate(true); + } else { + if (_state.cabinPilotLightLit == 1 && _state.cabinValvePosition >= 1) { + _cabinFireMovie = _vm->_video->playMovie(_vm->wrapMovieFilename("cabfirfr", kMystStack), 254, 244, true); + } + } +} + +void Myst::boilerFireUpdate(bool init) { + uint position = _vm->_video->getTime(_cabinFireMovie); + + if (_state.cabinPilotLightLit == 1) { + if (_state.cabinValvePosition == 0) { + if (position > (uint)Audio::Timestamp(0, 200, 600).msecs() || init) { + _vm->_video->setVideoBounds(_cabinFireMovie, Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 100, 600)); + _vm->_video->pauseMovie(_cabinFireMovie, false); + } + } else { + if (position < (uint)Audio::Timestamp(0, 200, 600).msecs() || init) { + _vm->_video->setVideoBounds(_cabinFireMovie, Audio::Timestamp(0, 201, 600), Audio::Timestamp(0, 1900, 600)); + _vm->_video->pauseMovie(_cabinFireMovie, false); + } + } } +} - // Used for Card 4098 (Cabin Boiler) - // TODO: Fill in logic - if (false) { - _vm->_video->playMovieBlocking(_vm->wrapMovieFilename("cabfire", kMystStack), 240, 279); - _vm->_video->playMovieBlocking(_vm->wrapMovieFilename("cabingau", kMystStack), 243, 97); +void Myst::boilerGaugeInit() { + if (_vm->getCurCard() == 4098) { + _cabinGaugeMovie = _vm->_video->playMovie(_vm->wrapMovieFilename("cabingau", kMystStack), 243, 96); + } else { + _cabinGaugeMovie = _vm->_video->playMovie(_vm->wrapMovieFilename("cabcgfar", kMystStack), 254, 136); } + + Audio::Timestamp frame; + + if (_state.cabinPilotLightLit == 1 && _state.cabinValvePosition > 12) + frame = _vm->_video->getDuration(_cabinGaugeMovie); + else + frame = Audio::Timestamp(0, 0, 600); + + _vm->_video->drawVideoFrame(_cabinGaugeMovie, frame); } void Myst::o_rocketSliders_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) { @@ -3648,6 +3738,13 @@ void Myst::o_treeEntry_exit(uint16 op, uint16 var, uint16 argc, uint16 *argv) { _treeAlcove = 0; } +void Myst::o_boiler_exit(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + debugC(kDebugScript, "Opcode %d: Exit boiler card", op); + + _cabinGaugeMovie = NULL_VID_HANDLE; + _cabinFireMovie = NULL_VID_HANDLE; +} + void Myst::o_generatorControlRoom_exit(uint16 op, uint16 var, uint16 argc, uint16 *argv) { debugC(kDebugScript, "Opcode %d: Generator room exit", op); diff --git a/engines/mohawk/myst_stacks/myst.h b/engines/mohawk/myst_stacks/myst.h index e9bff08cb4..de88843d59 100644 --- a/engines/mohawk/myst_stacks/myst.h +++ b/engines/mohawk/myst_stacks/myst.h @@ -43,7 +43,7 @@ public: virtual void disablePersistentScripts(); virtual void runPersistentScripts(); -private: +protected: void setupOpcodes(); uint16 getVar(uint16 var); void toggleVar(uint16 var); @@ -52,7 +52,7 @@ private: virtual uint16 getMap() { return 9934; } void towerRotationMap_run(); - void libraryBookcaseTransform_run(); + virtual void libraryBookcaseTransform_run(); void generatorControlRoom_run(); void opcode_212_run(); void libraryCombinationBook_run(); @@ -174,7 +174,7 @@ private: DECLARE_OPCODE(o_gulls2_init); DECLARE_OPCODE(o_treeCard_init); DECLARE_OPCODE(o_treeEntry_init); - DECLARE_OPCODE(opcode_218); + DECLARE_OPCODE(o_boilerMovies_init); DECLARE_OPCODE(o_rocketSliders_init); DECLARE_OPCODE(o_rocketLinkVideo_init); DECLARE_OPCODE(o_greenBook_init); @@ -183,6 +183,7 @@ private: DECLARE_OPCODE(o_bookAddSpecialPage_exit); DECLARE_OPCODE(o_treeCard_exit); DECLARE_OPCODE(o_treeEntry_exit); + DECLARE_OPCODE(o_boiler_exit); DECLARE_OPCODE(o_generatorControlRoom_exit); @@ -259,6 +260,9 @@ private: uint16 _cabinMatchState; // 60 uint32 _matchGoOutTime; // 144 + VideoHandle _cabinFireMovie; // 240 + VideoHandle _cabinGaugeMovie; // 244 + bool _boilerPressureIncreasing; bool _boilerPressureDecreasing; bool _basementPressureIncreasing; @@ -317,6 +321,12 @@ private: Common::Point towerRotationMapComputeCoords(const Common::Point ¢er, uint16 angle); void towerRotationMapDrawLine(const Common::Point ¢er, const Common::Point &end); + void boilerFireInit(); + void boilerFireUpdate(bool init); + void boilerGaugeInit(); + Common::Rational boilerComputeGaugeRate(uint16 pressure, uint32 delay); + void boilerResetGauge(const Common::Rational &rate); + void treeSetAlcoveAccessible(); uint32 treeNextMoveDelay(uint16 pressure); diff --git a/engines/mohawk/myst_stacks/preview.cpp b/engines/mohawk/myst_stacks/preview.cpp index 0b8dcf897a..75e870281e 100644 --- a/engines/mohawk/myst_stacks/preview.cpp +++ b/engines/mohawk/myst_stacks/preview.cpp @@ -60,6 +60,7 @@ void Preview::setupOpcodes() { OVERRIDE_OPCODE(199, o_speechStop); // "Init" Opcodes + OVERRIDE_OPCODE(209, o_libraryBookcaseTransformDemo_init); OPCODE(298, o_speech_init); OPCODE(299, o_library_init); } @@ -139,7 +140,7 @@ void Preview::speech_run() { break; case 1: // Open book if (_currentCue >= 1) { - _vm->changeToCard(3001, true); + _vm->changeToCard(3001, kTransitionDissolve); _speechStep++; } @@ -147,7 +148,7 @@ void Preview::speech_run() { case 2: // Go to Myst if (_currentCue >= 2) { _vm->_gfx->fadeToBlack(); - _vm->changeToCard(3002, false); + _vm->changeToCard(3002, kNoTransition); _vm->_gfx->fadeFromBlack(); _speechStep++; @@ -164,7 +165,7 @@ void Preview::speech_run() { if (_currentCue >= 4) { _library->drawConditionalDataToScreen(0); - _vm->changeToCard(3003, true); + _vm->changeToCard(3003, kTransitionDissolve); _speechNextTime = time + 2000; _speechStep++; @@ -181,7 +182,7 @@ void Preview::speech_run() { if (time < _speechNextTime) break; - _vm->changeToCard(3004, true); + _vm->changeToCard(3004, kTransitionDissolve); _speechNextTime = time + 2000; _speechStep++; break; @@ -190,7 +191,7 @@ void Preview::speech_run() { break; _vm->_gfx->fadeToBlack(); - _vm->changeToCard(3005, false); + _vm->changeToCard(3005, kNoTransition); _vm->_gfx->fadeFromBlack(); _speechNextTime = time + 1000; _speechStep++; @@ -205,7 +206,7 @@ void Preview::speech_run() { if (time < _speechNextTime) break; - _vm->changeToCard(3006 + _speechStep - 7, true); + _vm->changeToCard(3006 + _speechStep - 7, kTransitionDissolve); _speechNextTime = time + 2000; _speechStep++; break; @@ -213,7 +214,7 @@ void Preview::speech_run() { if (time < _speechNextTime) break; - _vm->changeToCard(4329, true); + _vm->changeToCard(4329, kTransitionDissolve); _speechRunning = false; _globals.currentAge = 2; @@ -241,5 +242,22 @@ void Preview::o_library_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) { _library = static_cast<MystResourceType8 *>(_invokingResource); } +void Preview::o_libraryBookcaseTransformDemo_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + if (_libraryBookcaseChanged) { + MystResourceType7 *resource = static_cast<MystResourceType7 *>(_invokingResource); + _libraryBookcaseMovie = static_cast<MystResourceType6 *>(resource->getSubResource(getVar(303))); + _libraryBookcaseSoundId = argv[0]; + _libraryBookcaseMoving = true; + } +} + +void Preview::libraryBookcaseTransform_run() { + if (_libraryBookcaseChanged) + _state.libraryBookcaseDoor = !_state.libraryBookcaseDoor; + + Myst::libraryBookcaseTransform_run(); +} + + } // End of namespace MystStacks } // End of namespace Mohawk diff --git a/engines/mohawk/myst_stacks/preview.h b/engines/mohawk/myst_stacks/preview.h index 1e4ff3efb4..706220e8ed 100644 --- a/engines/mohawk/myst_stacks/preview.h +++ b/engines/mohawk/myst_stacks/preview.h @@ -51,6 +51,7 @@ private: DECLARE_OPCODE(o_stayHere); DECLARE_OPCODE(o_speechStop); + DECLARE_OPCODE(o_libraryBookcaseTransformDemo_init); DECLARE_OPCODE(o_speech_init); DECLARE_OPCODE(o_library_init); @@ -65,6 +66,8 @@ private: void speech_run(); void speechUpdateCue(); + + void libraryBookcaseTransform_run(); }; } // End of namespace MystStacks diff --git a/engines/mohawk/myst_stacks/selenitic.cpp b/engines/mohawk/myst_stacks/selenitic.cpp index 1473742259..a941b14eaa 100644 --- a/engines/mohawk/myst_stacks/selenitic.cpp +++ b/engines/mohawk/myst_stacks/selenitic.cpp @@ -729,11 +729,11 @@ void Selenitic::o_mazeRunnerDoorButton(uint16 op, uint16 var, uint16 argc, uint1 uint16 cardIdEntry = argv[1]; if (_mazeRunnerPosition == 288) { - _vm->changeToCard(cardIdEntry, false); + _vm->changeToCard(cardIdEntry, kNoTransition); _vm->_sound->replaceSoundMyst(cardIdEntry); animatedUpdate(argv[2], &argv[3], 10); } else if (_mazeRunnerPosition == 289) { - _vm->changeToCard(cardIdExit, false); + _vm->changeToCard(cardIdExit, kNoTransition); _vm->_sound->replaceSoundMyst(cardIdExit); animatedUpdate(argv[2], &argv[3], 10); } @@ -895,9 +895,9 @@ void Selenitic::o_soundLockButton(uint16 op, uint16 var, uint16 argc, uint16 *ar uint16 cardIdClosed = argv[0]; uint16 cardIdOpen = argv[1]; - _vm->changeToCard(cardIdClosed, true); + _vm->changeToCard(cardIdClosed, kTransitionDissolve); - _vm->changeToCard(cardIdOpen, false); + _vm->changeToCard(cardIdOpen, kNoTransition); _vm->_sound->replaceSoundMyst(argv[2]); animatedUpdate(argv[4], &argv[5], argv[3]); diff --git a/engines/mohawk/myst_stacks/slides.cpp b/engines/mohawk/myst_stacks/slides.cpp index c0bb400db1..720926904a 100644 --- a/engines/mohawk/myst_stacks/slides.cpp +++ b/engines/mohawk/myst_stacks/slides.cpp @@ -63,7 +63,7 @@ void Slides::runPersistentScripts() { // Used on Cards... if (_vm->_system->getMillis() > _nextCardTime) { _vm->_gfx->fadeToBlack(); - _vm->changeToCard(_nextCardID, false); + _vm->changeToCard(_nextCardID, kNoTransition); _vm->_gfx->fadeFromBlack(); } } diff --git a/engines/mohawk/myst_stacks/stoneship.cpp b/engines/mohawk/myst_stacks/stoneship.cpp index ef228e62f3..1359685302 100644 --- a/engines/mohawk/myst_stacks/stoneship.cpp +++ b/engines/mohawk/myst_stacks/stoneship.cpp @@ -440,9 +440,9 @@ void Stoneship::o_drawerOpenSirius(uint16 op, uint16 var, uint16 argc, uint16 *a drawer->drawConditionalDataToScreen(0, 0); } - uint16 transition = 5; + TransitionType transition = kTransitionTopToBottom; if (argc == 2 && argv[1]) - transition = 11; + transition = kTransitionCopy; _vm->_gfx->runTransition(transition, drawer->getRect(), 25, 5); } @@ -579,7 +579,7 @@ void Stoneship::o_drawerOpenAchenar(uint16 op, uint16 var, uint16 argc, uint16 * MystResourceType8 *drawer = static_cast<MystResourceType8 *>(_vm->_resources[argv[0]]); drawer->drawConditionalDataToScreen(0, 0); - _vm->_gfx->runTransition(5, drawer->getRect(), 25, 5); + _vm->_gfx->runTransition(kTransitionTopToBottom, drawer->getRect(), 25, 5); } void Stoneship::o_hologramPlayback(uint16 op, uint16 var, uint16 argc, uint16 *argv) { @@ -692,9 +692,9 @@ void Stoneship::o_chestValveVideos(uint16 op, uint16 var, uint16 argc, uint16 *a _vm->_sound->resumeBackgroundMyst(); } else { // Valve opening - // TODO: Play backwards VideoHandle valve = _vm->_video->playMovie(movie, 97, 267); - _vm->_video->setVideoBounds(valve, Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 350, 600)); + _vm->_video->seekToTime(valve, Audio::Timestamp(0, 350, 600)); + _vm->_video->setVideoRate(valve, -1); _vm->_video->waitUntilMovieEnds(valve); } } @@ -777,7 +777,7 @@ void Stoneship::o_cloudOrbLeave(uint16 op, uint16 var, uint16 argc, uint16 *argv _cloudOrbMovie->pauseMovie(true); _vm->_sound->replaceSoundMyst(_cloudOrbStopSound); - _vm->_gfx->runTransition(5, _invokingResource->getRect(), 4, 0); + _vm->_gfx->runTransition(kTransitionTopToBottom, _invokingResource->getRect(), 4, 0); } void Stoneship::o_drawerCloseOpened(uint16 op, uint16 var, uint16 argc, uint16 *argv) { @@ -794,7 +794,7 @@ void Stoneship::drawerClose(uint16 drawer) { _vm->drawResourceImages(); MystResource *res = _vm->_resources[drawer]; - _vm->_gfx->runTransition(6, res->getRect(), 25, 5); + _vm->_gfx->runTransition(kTransitionBottomToTop, res->getRect(), 25, 5); } void Stoneship::o_hologramDisplay_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) { diff --git a/engines/mohawk/resource.cpp b/engines/mohawk/resource.cpp index f01375bacf..d7e829118a 100644 --- a/engines/mohawk/resource.cpp +++ b/engines/mohawk/resource.cpp @@ -464,4 +464,4 @@ bool DOSArchive_v2::openStream(Common::SeekableReadStream *stream) { return true; } -} // End of namespace Mohawk +} // End of namespace Mohawk diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp index 32613c6185..71aa371073 100644 --- a/engines/mohawk/riven.cpp +++ b/engines/mohawk/riven.cpp @@ -177,7 +177,7 @@ Common::Error MohawkEngine_Riven::run() { } } else { // Otherwise, start us off at aspit's card 1 (the main menu) - changeToStack(aspit); + changeToStack(aspit); changeToCard(1); } @@ -830,7 +830,7 @@ static void sunnersTopStairsTimer(MohawkEngine_Riven *vm) { } else if (sunnerTime < vm->getTotalPlayTime()) { VideoHandle handle = vm->_video->playMovieRiven(vm->_rnd->getRandomNumberRng(1, 3)); - timerTime = vm->_video->getDuration(handle) + vm->_rnd->getRandomNumberRng(2, 15) * 1000; + timerTime = vm->_video->getDuration(handle).msecs() + vm->_rnd->getRandomNumberRng(2, 15) * 1000; } sunnerTime = timerTime + vm->getTotalPlayTime(); @@ -868,7 +868,7 @@ static void sunnersMidStairsTimer(MohawkEngine_Riven *vm) { VideoHandle handle = vm->_video->playMovieRiven(movie); - timerTime = vm->_video->getDuration(handle) + vm->_rnd->getRandomNumberRng(1, 10) * 1000; + timerTime = vm->_video->getDuration(handle).msecs() + vm->_rnd->getRandomNumberRng(1, 10) * 1000; } sunnerTime = timerTime + vm->getTotalPlayTime(); @@ -898,7 +898,7 @@ static void sunnersLowerStairsTimer(MohawkEngine_Riven *vm) { } else if (sunnerTime < vm->getTotalPlayTime()) { VideoHandle handle = vm->_video->playMovieRiven(vm->_rnd->getRandomNumberRng(3, 5)); - timerTime = vm->_video->getDuration(handle) + vm->_rnd->getRandomNumberRng(1, 30) * 1000; + timerTime = vm->_video->getDuration(handle).msecs() + vm->_rnd->getRandomNumberRng(1, 30) * 1000; } sunnerTime = timerTime + vm->getTotalPlayTime(); @@ -932,7 +932,7 @@ static void sunnersBeachTimer(MohawkEngine_Riven *vm) { vm->_video->activateMLST(mlstID, vm->getCurCard()); VideoHandle handle = vm->_video->playMovieRiven(mlstID); - timerTime = vm->_video->getDuration(handle) + vm->_rnd->getRandomNumberRng(1, 30) * 1000; + timerTime = vm->_video->getDuration(handle).msecs() + vm->_rnd->getRandomNumberRng(1, 30) * 1000; } sunnerTime = timerTime + vm->getTotalPlayTime(); diff --git a/engines/mohawk/riven_external.cpp b/engines/mohawk/riven_external.cpp index 337a57e3e1..384e89a4cf 100644 --- a/engines/mohawk/riven_external.cpp +++ b/engines/mohawk/riven_external.cpp @@ -1467,7 +1467,7 @@ static void catherineViewerIdleTimer(MohawkEngine_Riven *vm) { VideoHandle videoHandle = vm->_video->playMovieRiven(30); // Reset the timer - vm->installTimer(&catherineViewerIdleTimer, vm->_video->getDuration(videoHandle) + vm->_rnd->getRandomNumber(60) * 1000); + vm->installTimer(&catherineViewerIdleTimer, vm->_video->getDuration(videoHandle).msecs() + vm->_rnd->getRandomNumber(60) * 1000); } void RivenExternal::xglview_prisonon(uint16 argc, uint16 *argv) { @@ -1507,7 +1507,7 @@ void RivenExternal::xglview_prisonon(uint16 argc, uint16 *argv) { _vm->_video->activateMLST(cathMovie, _vm->getCurCard()); VideoHandle videoHandle = _vm->_video->playMovieRiven(30); - timeUntilNextMovie = _vm->_video->getDuration(videoHandle) + _vm->_rnd->getRandomNumber(60) * 1000; + timeUntilNextMovie = _vm->_video->getDuration(videoHandle).msecs() + _vm->_rnd->getRandomNumber(60) * 1000; } else { // Otherwise, just redraw the imager timeUntilNextMovie = _vm->_rnd->getRandomNumberRng(10, 20) * 1000; @@ -2335,7 +2335,7 @@ static void rebelPrisonWindowTimer(MohawkEngine_Riven *vm) { VideoHandle handle = vm->_video->playMovieRiven(movie); // Ensure the next video starts after this one ends - uint32 timeUntilNextVideo = vm->_video->getDuration(handle) + vm->_rnd->getRandomNumberRng(38, 58) * 1000; + uint32 timeUntilNextVideo = vm->_video->getDuration(handle).msecs() + vm->_rnd->getRandomNumberRng(38, 58) * 1000; // Save the time in case we leave the card and return vm->_vars["rvillagetime"] = timeUntilNextVideo + vm->getTotalPlayTime(); diff --git a/engines/mohawk/video.cpp b/engines/mohawk/video.cpp index b1b99722d5..8b0130d711 100644 --- a/engines/mohawk/video.cpp +++ b/engines/mohawk/video.cpp @@ -493,9 +493,9 @@ uint32 VideoManager::getTime(VideoHandle handle) { return _videoStreams[handle]->getTime(); } -uint32 VideoManager::getDuration(VideoHandle handle) { +Audio::Timestamp VideoManager::getDuration(VideoHandle handle) { assert(handle != NULL_VID_HANDLE); - return _videoStreams[handle]->getDuration().msecs(); + return _videoStreams[handle]->getDuration(); } bool VideoManager::endOfVideo(VideoHandle handle) { @@ -536,6 +536,16 @@ void VideoManager::setVideoLooping(VideoHandle handle, bool loop) { _videoStreams[handle].loop = loop; } +Common::Rational VideoManager::getVideoRate(VideoHandle handle) const { + assert(handle != NULL_VID_HANDLE); + return _videoStreams[handle]->getRate(); +} + +void VideoManager::setVideoRate(VideoHandle handle, const Common::Rational &rate) { + assert(handle != NULL_VID_HANDLE); + _videoStreams[handle]->setRate(rate); +} + void VideoManager::pauseMovie(VideoHandle handle, bool pause) { assert(handle != NULL_VID_HANDLE); _videoStreams[handle]->pauseVideo(pause); diff --git a/engines/mohawk/video.h b/engines/mohawk/video.h index 6d2783936d..2c4c827aa8 100644 --- a/engines/mohawk/video.h +++ b/engines/mohawk/video.h @@ -101,12 +101,14 @@ public: int getCurFrame(VideoHandle handle); uint32 getFrameCount(VideoHandle handle); uint32 getTime(VideoHandle handle); - uint32 getDuration(VideoHandle videoHandle); + Audio::Timestamp getDuration(VideoHandle videoHandle); bool endOfVideo(VideoHandle handle); void setVideoBounds(VideoHandle handle, Audio::Timestamp start, Audio::Timestamp end); void drawVideoFrame(VideoHandle handle, Audio::Timestamp time); void seekToTime(VideoHandle handle, Audio::Timestamp time); void setVideoLooping(VideoHandle handle, bool loop); + Common::Rational getVideoRate(VideoHandle handle) const; + void setVideoRate(VideoHandle handle, const Common::Rational &rate); void waitUntilMovieEnds(VideoHandle videoHandle); void delayUntilMovieEnds(VideoHandle videoHandle); void pauseMovie(VideoHandle videoHandle, bool pause); diff --git a/engines/parallaction/disk.cpp b/engines/parallaction/disk.cpp deleted file mode 100644 index f20e05771a..0000000000 --- a/engines/parallaction/disk.cpp +++ /dev/null @@ -1,145 +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. - * - */ - -#include "common/iff_container.h" -#include "common/textconsole.h" - -#include "parallaction/disk.h" -#include "parallaction/graphics.h" - -namespace Parallaction { - -void ILBMLoader::setupBuffer(uint32 w, uint32 h) { - _intBuffer = 0; - switch (_bodyMode) { - case BODYMODE_SURFACE: - if (!_surf) { - _surf = new Graphics::Surface; - assert(_surf); - } - _surf->create(w, h, Graphics::PixelFormat::createFormatCLUT8()); - _mode = Graphics::ILBMDecoder::ILBM_UNPACK_PLANES; - _intBuffer = (byte *)_surf->pixels; - break; - - case BODYMODE_MASKBUFFER: - if (!_maskBuffer) { - _maskBuffer = new MaskBuffer; - assert(_maskBuffer); - } - _maskBuffer->create(w, h); - _mode = Graphics::ILBMDecoder::ILBM_2_PACK_PLANES; - _intBuffer = _maskBuffer->data; - break; - - case BODYMODE_PATHBUFFER: - if (!_pathBuffer) { - _pathBuffer = new PathBuffer; - assert(_pathBuffer); - } - _pathBuffer->create(w, h); - _mode = Graphics::ILBMDecoder::ILBM_1_PACK_PLANES; - _intBuffer = _pathBuffer->data; - break; - - default: - error("Invalid bodyMode '%i' for ILBMLoader", _bodyMode); - break; - } -} - -bool ILBMLoader::callback(Common::IFFChunk &chunk) { - switch (chunk._type) { - case ID_BMHD: - _decoder.loadHeader(chunk._stream); - break; - - case ID_CMAP: - if (_palette) { - chunk._stream->read(_palette, chunk._size); - } - break; - - case ID_CRNG: - if (_crng) { - PaletteFxRange *ptr = &_crng[_numCRNG]; - chunk._stream->read((byte *)ptr, chunk._size); - ptr->_timer = FROM_BE_16(ptr->_timer); - ptr->_step = FROM_BE_16(ptr->_step); - ptr->_flags = FROM_BE_16(ptr->_flags); - ++_numCRNG; - } - break; - - case ID_BODY: - setupBuffer(_decoder._header.width, _decoder._header.height); - assert(_intBuffer); - _decoder.loadBitmap(_mode, _intBuffer, chunk._stream); - return true; // stop the parser - } - - return false; -} - -void ILBMLoader::load(Common::ReadStream *in, bool disposeStream) { - Common::IFFParser parser(in, disposeStream); - Common::Functor1Mem< Common::IFFChunk&, bool, ILBMLoader > c(this, &ILBMLoader::callback); - parser.parse(c); -} - -ILBMLoader::ILBMLoader(uint32 bodyMode, byte *palette, PaletteFxRange *crng) { - _bodyMode = bodyMode; - _surf = 0; - _maskBuffer = 0; - _pathBuffer = 0; - _palette = palette; - _crng = crng; - _numCRNG = 0; -} - -ILBMLoader::ILBMLoader(Graphics::Surface *surf, byte *palette, PaletteFxRange *crng) { - _bodyMode = ILBMLoader::BODYMODE_SURFACE; - _surf = surf; - _palette = palette; - _crng = crng; - _numCRNG = 0; -} - -ILBMLoader::ILBMLoader(MaskBuffer *buffer) { - _bodyMode = ILBMLoader::BODYMODE_MASKBUFFER; - _maskBuffer = buffer; - _palette = 0; - _crng = 0; - _numCRNG = 0; -} - -ILBMLoader::ILBMLoader(PathBuffer *buffer) { - _bodyMode = ILBMLoader::BODYMODE_PATHBUFFER; - _pathBuffer = buffer; - _palette = 0; - _crng = 0; - _numCRNG = 0; -} - - - -} diff --git a/engines/parallaction/disk.h b/engines/parallaction/disk.h index d1171c3179..63e33dcfbd 100644 --- a/engines/parallaction/disk.h +++ b/engines/parallaction/disk.h @@ -28,13 +28,10 @@ #include "common/archive.h" #include "common/str.h" -#include "graphics/iff.h" - namespace Common { class FSDirectory; class ReadStream; class SeekableReadStream; -struct IFFChunk; } namespace Graphics { @@ -86,36 +83,6 @@ public: virtual PathBuffer *loadPath(const char *name, uint32 w, uint32 h) { return 0; } }; -struct PaletteFxRange; - -struct ILBMLoader { - enum { - BODYMODE_SURFACE, - BODYMODE_MASKBUFFER, - BODYMODE_PATHBUFFER - }; - uint32 _bodyMode; - Graphics::Surface *_surf; - MaskBuffer *_maskBuffer; - PathBuffer *_pathBuffer; - byte *_palette; - PaletteFxRange *_crng; - uint32 _mode; - byte* _intBuffer; - uint32 _numCRNG; - Graphics::ILBMDecoder _decoder; - - ILBMLoader(uint32 bodyMode, byte *palette = 0, PaletteFxRange *crng = 0); - ILBMLoader(Graphics::Surface *surf, byte *palette = 0, PaletteFxRange *crng = 0); - ILBMLoader(MaskBuffer *buffer); - ILBMLoader(PathBuffer *buffer); - - bool callback(Common::IFFChunk &chunk); - void setupBuffer(uint32 w, uint32 h); - void load(Common::ReadStream *in, bool disposeStream = false); -}; - - class Disk_ns : public Disk { protected: diff --git a/engines/parallaction/disk_br.cpp b/engines/parallaction/disk_br.cpp index 8988897456..3135c3e8c5 100644 --- a/engines/parallaction/disk_br.cpp +++ b/engines/parallaction/disk_br.cpp @@ -20,11 +20,10 @@ * */ -#include "graphics/iff.h" - #include "common/config-manager.h" #include "common/fs.h" #include "common/textconsole.h" +#include "graphics/decoders/iff.h" #include "parallaction/parallaction.h" #include "parallaction/parser.h" @@ -459,8 +458,9 @@ void AmigaDisk_br::adjustForPalette(Graphics::Surface &surf, int transparentColo void AmigaDisk_br::loadBackground(BackgroundInfo& info, const char *filename) { byte r,g,b; - byte *p; + const byte *p; Common::SeekableReadStream *stream; + Graphics::IFFDecoder decoder; uint i; stream = tryOpenFile("backs/" + Common::String(filename), ".ap"); @@ -488,15 +488,16 @@ void AmigaDisk_br::loadBackground(BackgroundInfo& info, const char *filename) { } stream = openFile("backs/" + Common::String(filename), ".bkg"); + decoder.loadStream(*stream); - byte pal[768]; - ILBMLoader loader(&info.bg, pal); - loader.load(stream, true); - + info.bg.copyFrom(*decoder.getSurface()); info.width = info.bg.w; info.height = info.bg.h; - p = pal; + // Overwrite the first color (transparent key) in the palette + p = decoder.getPalette(); + info.palette.setEntry(0, p[0] >> 2, p[1] >> 2, p[2] >> 0); + for (i = 16; i < 32; i++) { r = *p >> 2; p++; @@ -507,9 +508,6 @@ void AmigaDisk_br::loadBackground(BackgroundInfo& info, const char *filename) { info.palette.setEntry(i, r, g, b); } - // Overwrite the first color (transparent key) in the palette - info.palette.setEntry(0, pal[0] >> 2, pal[1] >> 2, pal[2] >> 0); - // background data is drawn used the upper portion of the palette adjustForPalette(info.bg); } @@ -546,10 +544,15 @@ MaskBuffer *AmigaDisk_br::loadMask(const char *name, uint32 w, uint32 h) { return 0; } - ILBMLoader loader(ILBMLoader::BODYMODE_MASKBUFFER); - loader.load(stream, true); + Graphics::IFFDecoder decoder; + decoder.setNumRelevantPlanes(2); // use only 2 first bits from each pixels + decoder.setPixelPacking(true); // pack 4 2bit pixels into 1 byte + decoder.loadStream(*stream); - MaskBuffer *buffer = loader._maskBuffer; + MaskBuffer *buffer = new MaskBuffer; + // surface width was shrunk to 1/4th of the bitmap width due to the pixel packing + buffer->create(decoder.getSurface()->w * 4, decoder.getSurface()->h); + memcpy(buffer->data, decoder.getSurface()->pixels, buffer->size); buffer->bigEndian = true; finalpass(buffer->data, buffer->size); return buffer; @@ -580,12 +583,12 @@ GfxObj* AmigaDisk_br::loadStatic(const char* name) { Common::String sName = name; Common::SeekableReadStream *stream = openFile("ras/" + sName, ".ras"); + Graphics::IFFDecoder decoder; + decoder.loadStream(*stream); - ILBMLoader loader(ILBMLoader::BODYMODE_SURFACE); - loader.load(stream, true); - - Graphics::Surface* surf = loader._surf; + Graphics::Surface *surf = new Graphics::Surface; assert(surf); + surf->copyFrom(*decoder.getSurface()); // Static pictures are drawn used the upper half of the palette: this must be // done before shadow mask is applied. This way, only really transparent pixels @@ -717,23 +720,23 @@ GfxObj* AmigaDisk_br::loadObjects(const char *name, uint8 part) { debugC(5, kDebugDisk, "AmigaDisk_br::loadObjects"); Common::SeekableReadStream *stream = openFile(name); - ILBMLoader loader(ILBMLoader::BODYMODE_SURFACE); - loader.load(stream, true); + Graphics::IFFDecoder decoder; + decoder.loadStream(*stream); uint16 max = objectsMax[part]; if (_vm->getFeatures() & GF_DEMO) max = 72; byte *data = new byte[max * 2601]; - byte *srcPtr = (byte *)loader._surf->getBasePtr(0,0); - int w = loader._surf->w; + const byte *srcPtr = (const byte *)decoder.getSurface()->getBasePtr(0,0); + int w = decoder.getSurface()->w; // Convert to the expected display format for (int i = 0; i < max; i++) { uint16 x = (i % 8) * 51; uint16 y = (i / 8) * 51; - byte *src = srcPtr + y * w + x; + const byte *src = srcPtr + y * w + x; byte *dst = data + i * 2601; for (int h = 0; h < 51; h++) { memcpy(dst, src, 51); @@ -741,7 +744,6 @@ GfxObj* AmigaDisk_br::loadObjects(const char *name, uint8 part) { dst += 51; } } - delete loader._surf; return new GfxObj(0, new Cnv(max, 51, 51, data, true)); } diff --git a/engines/parallaction/disk_ns.cpp b/engines/parallaction/disk_ns.cpp index bad854525d..f03f16ca37 100644 --- a/engines/parallaction/disk_ns.cpp +++ b/engines/parallaction/disk_ns.cpp @@ -22,9 +22,11 @@ #include "common/config-manager.h" #include "common/fs.h" +#include "common/iff_container.h" #include "common/memstream.h" #include "common/substream.h" #include "common/textconsole.h" +#include "graphics/decoders/iff.h" #include "parallaction/parser.h" #include "parallaction/parallaction.h" @@ -312,7 +314,7 @@ void DosDisk_ns::decodeCnv(byte *data, uint16 numFrames, uint16 width, uint16 he int32 decsize = numFrames * width * height; bool packed = (stream->size() - stream->pos()) != decsize; if (packed) { - Graphics::PackBitsReadStream decoder(*stream); + Common::PackBitsReadStream decoder(*stream); decoder.read(data, decsize); } else { stream->read(data, decsize); @@ -914,17 +916,15 @@ void AmigaDisk_ns::buildMask(byte* buf) { void AmigaDisk_ns::loadBackground(BackgroundInfo& info, const char *name) { - PaletteFxRange ranges[6]; - byte pal[768]; - Common::SeekableReadStream *s = openFile(name); - ILBMLoader loader(&info.bg, pal, ranges); - loader.load(s, true); + Graphics::IFFDecoder decoder; + decoder.loadStream(*s); + info.bg.copyFrom(*decoder.getSurface()); info.width = info.bg.w; info.height = info.bg.h; - byte *p = pal; + const byte *p = decoder.getPalette(); for (uint i = 0; i < 32; i++) { byte r = *p >> 2; p++; @@ -935,8 +935,15 @@ void AmigaDisk_ns::loadBackground(BackgroundInfo& info, const char *name) { info.palette.setEntry(i, r, g, b); } - for (uint j = 0; j < 6; j++) { - info.setPaletteRange(j, ranges[j]); + const Common::Array<Graphics::IFFDecoder::PaletteRange> &paletteRanges = decoder.getPaletteRanges(); + for (uint j = 0; j < 6 && j < paletteRanges.size(); j++) { + PaletteFxRange range; + range._timer = paletteRanges[j].timer; + range._step = paletteRanges[j].step; + range._flags = paletteRanges[j].flags; + range._first = paletteRanges[j].first; + range._last = paletteRanges[j].last; + info.setPaletteRange(j, range); } } @@ -952,19 +959,25 @@ void AmigaDisk_ns::loadMask_internal(BackgroundInfo& info, const char *name) { return; // no errors if missing mask files: not every location has one } - byte pal[768]; - ILBMLoader loader(ILBMLoader::BODYMODE_MASKBUFFER, pal); - loader.load(s, true); + Graphics::IFFDecoder decoder; + decoder.setNumRelevantPlanes(2); // use only 2 first bits from each pixel + decoder.setPixelPacking(true); // pack 4 2bit pixels into 1 byte + decoder.loadStream(*s); + const byte *p = decoder.getPalette(); byte r, g, b; for (uint i = 0; i < 4; i++) { - r = pal[i*3]; - g = pal[i*3+1]; - b = pal[i*3+2]; + r = p[i*3]; + g = p[i*3+1]; + b = p[i*3+2]; info.layers[i] = (((r << 4) & 0xF00) | (g & 0xF0) | (b >> 4)) & 0xFF; } - info._mask = loader._maskBuffer; + info._mask = new MaskBuffer; + // surface width was shrunk to 1/4th of the bitmap width due to the pixel packing + info._mask->create(decoder.getSurface()->w * 4, decoder.getSurface()->h); + memcpy(info._mask->data, decoder.getSurface()->pixels, info._mask->size); + info._mask->bigEndian = true; } void AmigaDisk_ns::loadPath_internal(BackgroundInfo& info, const char *name) { @@ -977,9 +990,15 @@ void AmigaDisk_ns::loadPath_internal(BackgroundInfo& info, const char *name) { return; // no errors if missing path files: not every location has one } - ILBMLoader loader(ILBMLoader::BODYMODE_PATHBUFFER); - loader.load(s, true); - info._path = loader._pathBuffer; + Graphics::IFFDecoder decoder; + decoder.setNumRelevantPlanes(1); // use only first bit from each pixel + decoder.setPixelPacking(true); // pack 8 1bit pixels into 1 byte + decoder.loadStream(*s); + + info._path = new PathBuffer; + // surface width was shrunk to 1/8th of the bitmap width due to the pixel packing + info._path->create(decoder.getSurface()->w * 8, decoder.getSurface()->h); + memcpy(info._path->data, decoder.getSurface()->pixels, info._path->size); info._path->bigEndian = true; } diff --git a/engines/parallaction/module.mk b/engines/parallaction/module.mk index 36572a51df..f8a4e0b9a3 100644 --- a/engines/parallaction/module.mk +++ b/engines/parallaction/module.mk @@ -8,7 +8,6 @@ MODULE_OBJS := \ debug.o \ detection.o \ dialogue.o \ - disk.o \ disk_br.o \ disk_ns.o \ exec.o \ diff --git a/engines/parallaction/parser_br.cpp b/engines/parallaction/parser_br.cpp index e7f1b1b1ed..e60349ffa8 100644 --- a/engines/parallaction/parser_br.cpp +++ b/engines/parallaction/parser_br.cpp @@ -325,6 +325,7 @@ DECLARE_LOCATION_PARSER(location) { nextToken = 2; } + debugC(7, kDebugParser, "flip: %d", flip); // TODO: handle background horizontal flip (via a context parameter) if (_tokens[nextToken][0] != '\0') { diff --git a/engines/pegasus/detection.cpp b/engines/pegasus/detection.cpp index 908005b665..ba631148d5 100644 --- a/engines/pegasus/detection.cpp +++ b/engines/pegasus/detection.cpp @@ -119,12 +119,12 @@ SaveStateList PegasusMetaEngine::listSaves(const char *target) const { // The original had no pattern, so the user must rename theirs // Note that we ignore the target because saves are compatible between // all versions - Common::StringArray filenames = g_system->getSavefileManager()->listSavefiles("pegasus-*.sav"); + Common::StringArray fileNames = Pegasus::PegasusEngine::listSaveFiles(); SaveStateList saveList; - for (uint32 i = 0; i < filenames.size(); i++) { + for (uint32 i = 0; i < fileNames.size(); i++) { // Isolate the description from the file name - Common::String desc = filenames[i].c_str() + 8; + Common::String desc = fileNames[i].c_str() + 8; for (int j = 0; j < 4; j++) desc.deleteLastChar(); @@ -136,8 +136,8 @@ SaveStateList PegasusMetaEngine::listSaves(const char *target) const { void PegasusMetaEngine::removeSaveState(const char *target, int slot) const { // See listSaves() for info on the pattern - Common::StringArray filenames = g_system->getSavefileManager()->listSavefiles("pegasus-*.sav"); - g_system->getSavefileManager()->removeSavefile(filenames[slot].c_str()); + Common::StringArray fileNames = Pegasus::PegasusEngine::listSaveFiles(); + g_system->getSavefileManager()->removeSavefile(fileNames[slot].c_str()); } bool PegasusMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const { diff --git a/engines/pegasus/elements.cpp b/engines/pegasus/elements.cpp index c84d555444..87fb69a557 100644 --- a/engines/pegasus/elements.cpp +++ b/engines/pegasus/elements.cpp @@ -259,8 +259,8 @@ void FrameSequence::openFrameSequence() { _frameTimes.clear(); for (uint32 i = 0; i < _numFrames; i++) { TimeValue time = res->readUint32BE(); - _duration += time; _frameTimes.push_back(_duration); + _duration += time; } setScale(scale); diff --git a/engines/pegasus/energymonitor.cpp b/engines/pegasus/energymonitor.cpp index 8aa77eb341..be9d205360 100644 --- a/engines/pegasus/energymonitor.cpp +++ b/engines/pegasus/energymonitor.cpp @@ -262,9 +262,9 @@ void EnergyMonitor::calibrateEnergyBar() { _energyLight.setCurrentFrameIndex(0); _energyLight.hide(); - show(); setEnergyValue(0); setEnergyDrainRate(-(int32)kMaxJMPEnergy / 2); + show(); // Make sure warning light is hidden... _energyLight.hide(); diff --git a/engines/pegasus/movie.cpp b/engines/pegasus/movie.cpp index 75c287c7a6..59814a753d 100644 --- a/engines/pegasus/movie.cpp +++ b/engines/pegasus/movie.cpp @@ -161,9 +161,10 @@ void Movie::setTime(const TimeValue time, const TimeScale scale) { } void Movie::setRate(const Common::Rational rate) { - if (rate != 1 && rate != 0) { - warning("Cannot set movie rate"); - start(); + if (_video) { + _video->setRate(rate); + + TimeBase::setRate(_video->getRate()); return; } diff --git a/engines/pegasus/neighborhood/mars/reactor.cpp b/engines/pegasus/neighborhood/mars/reactor.cpp index 334fb98879..3a7ef9d7eb 100644 --- a/engines/pegasus/neighborhood/mars/reactor.cpp +++ b/engines/pegasus/neighborhood/mars/reactor.cpp @@ -244,9 +244,9 @@ void ReactorHistory::draw(const Common::Rect &) { static const CoordType kColorTops[5] = { 0, kColorHeights[0], - kColorHeights[0] + kColorHeights[1], - kColorHeights[0] + kColorHeights[1] + kColorHeights[2], - kColorHeights[0] + kColorHeights[1] + kColorHeights[2] + kColorHeights[3], + (CoordType)(kColorHeights[0] + kColorHeights[1]), + (CoordType)(kColorHeights[0] + kColorHeights[1] + kColorHeights[2]), + (CoordType)(kColorHeights[0] + kColorHeights[1] + kColorHeights[2] + kColorHeights[3]), }; if (_colors.isSurfaceValid() && _digits.isSurfaceValid()) { diff --git a/engines/pegasus/neighborhood/neighborhood.cpp b/engines/pegasus/neighborhood/neighborhood.cpp index 07be62c957..38366c4ba2 100644 --- a/engines/pegasus/neighborhood/neighborhood.cpp +++ b/engines/pegasus/neighborhood/neighborhood.cpp @@ -1761,10 +1761,10 @@ void Neighborhood::pauseTimer() { } void Neighborhood::resumeTimer() { - // NOTE: Yes, this function calls pauseFuse! - // Looks like an original game bug, will need - // to investigate how this affects gameplay. - _eventTimer.pauseFuse(); + // NOTE: The original calls pauseFuse() here, which causes a bug with the robot + // in WSC on the catwalk, causing him never to come after you if you don't act + // against him. + _eventTimer.resumeFuse(); } bool Neighborhood::timerPaused() { diff --git a/engines/pegasus/neighborhood/norad/pressuredoor.cpp b/engines/pegasus/neighborhood/norad/pressuredoor.cpp index d1378567d3..a12e971d10 100644 --- a/engines/pegasus/neighborhood/norad/pressuredoor.cpp +++ b/engines/pegasus/neighborhood/norad/pressuredoor.cpp @@ -323,7 +323,8 @@ void PressureDoor::receiveNotification(Notification *notification, const Notific _robotState = kRobotDead; _levelsMovie.stop(); _levelsMovie.setSegment((kNormalSubRoomPressure + kPressureBase) * _levelsScale, - (GameState.getNoradSubRoomPressure() + kPressureBase) * _levelsScale); + (GameState.getNoradSubRoomPressure() + kPressureBase) * _levelsScale + 1); + _levelsMovie.setTime((GameState.getNoradSubRoomPressure() + kPressureBase) * _levelsScale); _pressureCallBack.setCallBackFlag(kPressureDroppingFlag); _pressureCallBack.scheduleCallBack(kTriggerAtStart, 0, 0); _typeMovie.stop(); @@ -335,7 +336,7 @@ void PressureDoor::receiveNotification(Notification *notification, const Notific _downButton.setCurrentFrameIndex(1); _gameState = kGameOver; allowInput(false); - _levelsMovie.setRate(Common::Rational(0x5555, 0x10000) - 1); // Should match door tracker. + _levelsMovie.setRate(Common::Rational(-4, 3)); // Should match door tracker. break; case kRobotDead: allowInput(true); diff --git a/engines/pegasus/neighborhood/tsa/fulltsa.cpp b/engines/pegasus/neighborhood/tsa/fulltsa.cpp index b598841b45..9b843da5d6 100644 --- a/engines/pegasus/neighborhood/tsa/fulltsa.cpp +++ b/engines/pegasus/neighborhood/tsa/fulltsa.cpp @@ -622,6 +622,13 @@ void RipTimer::draw(const Common::Rect &updateRect) { } void RipTimer::timeChanged(const TimeValue newTime) { + // WORKAROUND: If the timer isn't running, don't run the following code. + // Fixes use of the code when it shouldn't be running (since this is an + // IdlerAnimation, this is called on useIdleTime() but this specific + // timer only makes sense when used as an actual timer). + if (!isRunning()) + return; + Common::Rect bounds; getBounds(bounds); diff --git a/engines/pegasus/pegasus.cpp b/engines/pegasus/pegasus.cpp index 420ca39331..eedfaa7db3 100644 --- a/engines/pegasus/pegasus.cpp +++ b/engines/pegasus/pegasus.cpp @@ -33,6 +33,7 @@ #include "common/textconsole.h" #include "common/translation.h" #include "common/random.h" +#include "backends/keymapper/keymapper.h" #include "base/plugins.h" #include "base/version.h" #include "gui/saveload.h" @@ -151,6 +152,7 @@ Common::Error PegasusEngine::run() { } // Set up input + initKeymap(); InputHandler::setInputHandler(this); allowInput(true); @@ -637,9 +639,15 @@ void PegasusEngine::writeContinueStream(Common::WriteStream *stream) { delete[] data; } +Common::StringArray PegasusEngine::listSaveFiles() { + Common::StringArray fileNames = g_system->getSavefileManager()->listSavefiles("pegasus-*.sav"); + Common::sort(fileNames.begin(), fileNames.end()); + return fileNames; +} + Common::Error PegasusEngine::loadGameState(int slot) { - Common::StringArray filenames = _saveFileMan->listSavefiles("pegasus-*.sav"); - Common::InSaveFile *loadFile = _saveFileMan->openForLoading(filenames[slot]); + Common::StringArray fileNames = listSaveFiles(); + Common::InSaveFile *loadFile = _saveFileMan->openForLoading(fileNames[slot]); if (!loadFile) return Common::kUnknownError; @@ -649,7 +657,23 @@ Common::Error PegasusEngine::loadGameState(int slot) { return valid ? Common::kNoError : Common::kUnknownError; } +static bool isValidSaveFileChar(char c) { + // Limit it to letters, digits, and a few other characters that should be safe + return Common::isAlnum(c) || c == ' ' || c == '_' || c == '+' || c == '-' || c == '.'; +} + +static bool isValidSaveFileName(const Common::String &desc) { + for (uint32 i = 0; i < desc.size(); i++) + if (!isValidSaveFileChar(desc[i])) + return false; + + return true; +} + Common::Error PegasusEngine::saveGameState(int slot, const Common::String &desc) { + if (!isValidSaveFileName(desc)) + return Common::Error(Common::kCreatingFileFailed, _("Invalid save file name")); + Common::String output = Common::String::format("pegasus-%s.sav", desc.c_str()); Common::OutSaveFile *saveFile = _saveFileMan->openForSaving(output, false); if (!saveFile) @@ -667,19 +691,35 @@ void PegasusEngine::receiveNotification(Notification *notification, const Notifi case kGameStartingFlag: { useMenu(new MainMenu()); - if (!isDemo()) { + if (isDemo()) { + // Start playing the music earlier here + ((MainMenu *)_gameMenu)->startMainMenuLoop(); + + // Show the intro splash screen + showTempScreen("Images/Demo/NGsplashScrn.pict"); + + if (shouldQuit()) { + useMenu(0); + return; + } + + // Fade out and then back in with the main menu + _gfx->doFadeOutSync(); + _gfx->updateDisplay(); + _gfx->doFadeInSync(); + } else { + // Display the intro runIntro(); resetIntroTimer(); - } else { - showTempScreen("Images/Demo/NGsplashScrn.pict"); - } - if (shouldQuit()) - return; + if (shouldQuit()) + return; - _gfx->invalRect(Common::Rect(0, 0, 640, 480)); - _gfx->updateDisplay(); - ((MainMenu *)_gameMenu)->startMainMenuLoop(); + // Now display the main menu + _gfx->invalRect(Common::Rect(0, 0, 640, 480)); + _gfx->updateDisplay(); + ((MainMenu *)_gameMenu)->startMainMenuLoop(); + } break; } case kPlayerDiedFlag: @@ -818,7 +858,8 @@ void PegasusEngine::doGameMenuCommand(const GameMenuCommand command) { case kMenuCmdDeathQuitDemo: if (isDemo()) showTempScreen("Images/Demo/NGquitScrn.pict"); - _system->quit(); + _gfx->doFadeOutSync(); + quitGame(); break; case kMenuCmdOverview: stopIntroTimer(); @@ -1132,8 +1173,12 @@ void PegasusEngine::doInterfaceOverview() { controllerHighlight.hide(); } - overviewText.setTime(time * 3 + 2, 15); - overviewText.redrawMovieWorld(); + // The original just constantly redraws the frame, but that + // doesn't actually need to be done. + if ((time * 3 + 2) * 40 != overviewText.getTime()) { + overviewText.setTime(time * 3 + 2, 15); + overviewText.redrawMovieWorld(); + } refreshDisplay(); _system->delayMillis(10); @@ -1421,6 +1466,10 @@ void PegasusEngine::switchGameMode(const GameMode newMode, const GameMode oldMod } bool PegasusEngine::canSwitchGameMode(const GameMode newMode, const GameMode oldMode) { + // WORKAROUND: Don't allow game mode switches when the interface is not set up. + // Prevents segfaults when pressing 'i' when in the space chase. + if (!g_interface) + return false; if (newMode == kModeInventoryPick && oldMode == kModeBiochipPick) return false; if (newMode == kModeBiochipPick && oldMode == kModeInventoryPick) @@ -2344,4 +2393,41 @@ uint PegasusEngine::getNeighborhoodCD(const NeighborhoodID neighborhood) const { return 1; } +void PegasusEngine::initKeymap() { +#ifdef ENABLE_KEYMAPPER + static const char *const kKeymapName = "pegasus"; + Common::Keymapper *const mapper = _eventMan->getKeymapper(); + + // Do not try to recreate same keymap over again + if (mapper->getKeymap(kKeymapName) != 0) + return; + + Common::Keymap *const engineKeyMap = new Common::Keymap(kKeymapName); + + // Since the game has multiple built-in keys for each of these anyway, + // this just attempts to remap one of them. + const Common::KeyActionEntry keyActionEntries[] = { + { Common::KEYCODE_UP, "UP", _("Up/Zoom In/Move Forward/Open Doors") }, + { Common::KEYCODE_DOWN, "DWN", _("Down/Zoom Out") }, + { Common::KEYCODE_LEFT, "TL", _("Turn Left") }, + { Common::KEYCODE_RIGHT, "TR", _("Turn Right") }, + { Common::KEYCODE_BACKQUOTE, "TIV", _("Display/Hide Inventory Tray") }, + { Common::KEYCODE_BACKSPACE, "TBI", _("Display/Hide Biochip Tray") }, + { Common::KEYCODE_RETURN, "ENT", _("Action/Select") }, + { Common::KEYCODE_t, "TMA", _("Toggle Center Data Display") }, + { Common::KEYCODE_i, "TIN", _("Display/Hide Info Screen") }, + { Common::KEYCODE_ESCAPE, "PM", _("Display/Hide Pause Menu") }, + { Common::KEYCODE_e, "WTF", _("???") } // easter egg key (without being completely upfront about it) + }; + + for (uint i = 0; i < ARRAYSIZE(keyActionEntries); i++) { + Common::Action *const act = new Common::Action(engineKeyMap, keyActionEntries[i].id, keyActionEntries[i].description); + act->addKeyEvent(keyActionEntries[i].ks); + } + + mapper->addGameKeymap(engineKeyMap); + mapper->pushKeymap(kKeymapName, true); +#endif +} + } // End of namespace Pegasus diff --git a/engines/pegasus/pegasus.h b/engines/pegasus/pegasus.h index 2a8ba22470..246414a9d0 100644 --- a/engines/pegasus/pegasus.h +++ b/engines/pegasus/pegasus.h @@ -30,6 +30,7 @@ #include "common/macresman.h" #include "common/rect.h" #include "common/scummsys.h" +#include "common/str-array.h" #include "common/system.h" #include "common/util.h" @@ -195,6 +196,7 @@ public: bool saveRequested() const { return _saveRequested; } void requestLoad() { _loadRequested = true; } bool loadRequested() const { return _loadRequested; } + static Common::StringArray listSaveFiles(); protected: Common::Error run(); @@ -265,6 +267,7 @@ private: void doSubChase(); uint getNeighborhoodCD(const NeighborhoodID neighborhood) const; uint _currentCD; + void initKeymap(); // Menu GameMenu *_gameMenu; diff --git a/engines/pegasus/timers.cpp b/engines/pegasus/timers.cpp index 3b875038cc..50cc9bc6d8 100644 --- a/engines/pegasus/timers.cpp +++ b/engines/pegasus/timers.cpp @@ -73,13 +73,8 @@ TimeBase::TimeBase(const TimeScale preferredScale) { } TimeBase::~TimeBase() { - if (_master) - _master->_slaves.remove(this); - ((PegasusEngine *)g_engine)->removeTimeBase(this); disposeAllCallBacks(); - - // TODO: Remove slaves? Make them remove themselves? } void TimeBase::setTime(const TimeValue time, const TimeScale scale) { @@ -88,20 +83,23 @@ void TimeBase::setTime(const TimeValue time, const TimeScale scale) { } TimeValue TimeBase::getTime(const TimeScale scale) { + // HACK: Emulate the master TimeBase code here for the one case that needs it in the + // game. Note that none of the master TimeBase code in this file should actually be + // used as a reference for anything ever. + if (_master) + return _master->getTime(scale); + return _time.getNumerator() * ((scale == 0) ? _preferredScale : scale) / _time.getDenominator(); } void TimeBase::setRate(const Common::Rational rate) { _rate = rate; + _lastMillis = 0; if (_rate == 0) _paused = false; } -Common::Rational TimeBase::getEffectiveRate() const { - return _rate * ((_master == 0) ? 1 : _master->getEffectiveRate()); -} - void TimeBase::start() { if (_paused) _pausedRate = 1; @@ -192,18 +190,15 @@ TimeValue TimeBase::getDuration(const TimeScale scale) const { } void TimeBase::setMasterTimeBase(TimeBase *tb) { - // TODO: We're just ignoring the master (except for effective rate) - // for now to simplify things - if (_master) - _master->_slaves.remove(this); - _master = tb; - - if (_master) - _master->_slaves.push_back(this); } void TimeBase::updateTime() { + if (_master) { + _master->updateTime(); + return; + } + if (_lastMillis == 0) { _lastMillis = g_system->getMillis(); } else { @@ -211,7 +206,7 @@ void TimeBase::updateTime() { if (_lastMillis == curTime) // No change return; - _time += Common::Rational(curTime - _lastMillis, 1000) * getEffectiveRate(); + _time += Common::Rational(curTime - _lastMillis, 1000) * getRate(); _lastMillis = curTime; } } @@ -233,8 +228,6 @@ void TimeBase::checkCallBacks() { else if (_time <= startTime) _time = startTime; - // TODO: Update the slaves? - Common::Rational time = Common::Rational(getTime(), getScale()); // Check if we've triggered any callbacks diff --git a/engines/pegasus/timers.h b/engines/pegasus/timers.h index bcdca6e860..944930d21b 100644 --- a/engines/pegasus/timers.h +++ b/engines/pegasus/timers.h @@ -26,7 +26,6 @@ #ifndef PEGASUS_TIMERS_H #define PEGASUS_TIMERS_H -#include "common/list.h" #include "common/rational.h" #include "common/func.h" @@ -122,11 +121,6 @@ protected: Common::Rational _time; uint32 _lastMillis, _pauseStart; - -private: - Common::Rational getEffectiveRate() const; - - Common::List<TimeBase *> _slaves; }; // Type passed to initCallBack() diff --git a/engines/queen/display.cpp b/engines/queen/display.cpp index cd9a1075fa..d7b20c203e 100644 --- a/engines/queen/display.cpp +++ b/engines/queen/display.cpp @@ -29,6 +29,7 @@ #include "graphics/cursorman.h" #include "graphics/palette.h" #include "graphics/surface.h" +#include "graphics/decoders/iff.h" #include "graphics/decoders/pcx.h" #include "queen/display.h" @@ -701,7 +702,7 @@ void Display::setupPanel() { uint8 *data = _vm->resource()->loadFile(dataName, 0, &dataSize); if (_vm->resource()->getPlatform() == Common::kPlatformAmiga) { - decodeLBM(data, dataSize, _panelBuf, PANEL_W, &panelWidth, &panelHeight, _pal.panel, 0, 32, 144); + decodeIFF(data, dataSize, _panelBuf, PANEL_W, &panelWidth, &panelHeight, _pal.panel, 0, 32, 144); } else { WRITE_LE_UINT16(data + 14, PANEL_H - 10); decodePCX(data, dataSize, _panelBuf + PANEL_W * 10, PANEL_W, &panelWidth, &panelHeight, _pal.panel, 144, 256); @@ -720,7 +721,7 @@ void Display::setupNewRoom(const char *name, uint16 room) { uint8 *data = _vm->resource()->loadFile(dataName, 0, &dataSize); if (_vm->resource()->getPlatform() == Common::kPlatformAmiga) { - decodeLBM(data, dataSize, _backdropBuf, BACKDROP_W, &_bdWidth, &_bdHeight, _pal.room, 0, 32); + decodeIFF(data, dataSize, _backdropBuf, BACKDROP_W, &_bdWidth, &_bdHeight, _pal.room, 0, 32); if (_bdHeight < BACKDROP_H) { memset(_backdropBuf + _bdHeight * BACKDROP_W, 0, (BACKDROP_H - _bdHeight) * BACKDROP_W); } @@ -828,73 +829,22 @@ void Display::decodePCX(const uint8 *src, uint32 srcSize, uint8 *dst, uint16 dst memcpy(dst + y * dstPitch, pcxSurface->getBasePtr(0, y), pcxSurface->w); } -void Display::decodeLBM(const uint8 *src, uint32 srcSize, uint8 *dst, uint16 dstPitch, uint16 *w, uint16 *h, uint8 *pal, uint16 palStart, uint16 palEnd, uint8 colorBase) { - int planeCount = 0, planePitch = 0; - const uint8 *srcEnd = src + srcSize; - src += 12; - while (src < srcEnd) { - uint32 type = READ_BE_UINT32(src); - uint32 size = READ_BE_UINT32(src + 4); - src += 8; - switch (type) { - case MKTAG('B','M','H','D'): { - *w = READ_BE_UINT16(src + 0); - *h = READ_BE_UINT16(src + 2); - planeCount = src[8]; - planePitch = ((*w + 15) >> 4) * 2; - } - break; - case MKTAG('C','M','A','P'): { - assert(palStart <= palEnd && palEnd <= size / 3); - memcpy(pal, src + palStart * 3, (palEnd - palStart) * 3); - } - break; - case MKTAG('B','O','D','Y'): { - uint32 planarSize = (*h) * planeCount * planePitch; - uint8 *planarBuf = new uint8[planarSize]; - uint8 *dstPlanar = planarBuf; - for (int y = 0; y < *h; ++y) { - for (int p = 0; p < planeCount; ++p) { - const uint8 *end = dstPlanar + planePitch; - while (dstPlanar < end) { - int code = (int8)*src++; - if (code != -128) { - if (code < 0) { - code = -code + 1; - memset(dstPlanar, *src++, code); - } else { - ++code; - memcpy(dstPlanar, src, code); - src += code; - } - dstPlanar += code; - } - } - } - } - src = planarBuf; - for (int y = 0; y < *h; ++y) { - for (int x = 0; x < *w / 8; ++x) { - for (int b = 0; b < 8; ++b) { - const uint8 mask = (1 << (7 - b)); - uint8 color = 0; - for (int p = 0; p < planeCount; ++p) { - if (src[planePitch * p + x] & mask) { - color |= 1 << p; - } - } - dst[x * 8 + b] = colorBase + color; - } - } - src += planeCount * planePitch; - dst += dstPitch; - } - delete[] planarBuf; - } - return; - } - src += size; - } +void Display::decodeIFF(const uint8 *src, uint32 srcSize, uint8 *dst, uint16 dstPitch, uint16 *w, uint16 *h, uint8 *pal, uint16 palStart, uint16 palEnd, uint8 colorBase) { + Common::MemoryReadStream str(src, srcSize); + + ::Graphics::IFFDecoder iff; + if (!iff.loadStream(str)) + error("Error while reading IFF image"); + + const ::Graphics::Surface *iffSurface = iff.getSurface(); + *w = iffSurface->w; + *h = iffSurface->h; + + assert(palStart <= palEnd && palEnd <= 256); + memcpy(pal, iff.getPalette() + palStart * 3, (palEnd - palStart) * 3); + for (uint16 y = 0; y < iffSurface->h; y++) + for(uint16 x = 0; x < iffSurface->w; x++) + dst[(y * dstPitch) + x] = *(const byte *)iffSurface->getBasePtr(x, y) + colorBase; } void Display::horizontalScrollUpdate(int16 xCamera) { diff --git a/engines/queen/display.h b/engines/queen/display.h index 4256b19d72..8a8aaef5a6 100644 --- a/engines/queen/display.h +++ b/engines/queen/display.h @@ -116,8 +116,8 @@ public: //! decode PCX picture data void decodePCX(const uint8 *src, uint32 srcSize, uint8 *dst, uint16 dstPitch, uint16 *w, uint16 *h, uint8 *pal, uint16 palStart, uint16 palEnd); - //! decode ILBM picture data - void decodeLBM(const uint8 *src, uint32 srcSize, uint8 *dst, uint16 dstPitch, uint16 *w, uint16 *h, uint8 *pal, uint16 palStart, uint16 palEnd, uint8 colorBase = 0); + //! decode IFF picture data + void decodeIFF(const uint8 *src, uint32 srcSize, uint8 *dst, uint16 dstPitch, uint16 *w, uint16 *h, uint8 *pal, uint16 palStart, uint16 palEnd, uint8 colorBase = 0); void horizontalScrollUpdate(int16 xCamera); void horizontalScroll(int16 scroll); diff --git a/engines/queen/journal.cpp b/engines/queen/journal.cpp index 704019641b..474f72eca5 100644 --- a/engines/queen/journal.cpp +++ b/engines/queen/journal.cpp @@ -400,7 +400,7 @@ static void removeLeadingAndTrailingSpaces(char *dst, size_t dstSize, const char while (src[lastNonSpaceIndex] == ' ') --lastNonSpaceIndex; - size_t newLen = lastNonSpaceIndex - firstNonSpaceIndex + 1; + uint newLen = lastNonSpaceIndex - firstNonSpaceIndex + 1; assert(newLen < dstSize); for (size_t i = 0; i < newLen; ++i) { dst[i] = src[firstNonSpaceIndex + i]; @@ -559,7 +559,7 @@ void Journal::updateTextField(uint16 ascii, int keycode) { } break; default: - if (isprint((char)ascii) && + if (Common::isPrint((char)ascii) && _textField.textCharsCount < (sizeof(_textField.text) - 1) && _vm->display()->textWidth(_textField.text) < _textField.w) { _textField.text[_textField.textCharsCount] = (char)ascii; diff --git a/engines/queen/sound.cpp b/engines/queen/sound.cpp index ac58dda728..6731a51e04 100644 --- a/engines/queen/sound.cpp +++ b/engines/queen/sound.cpp @@ -246,8 +246,8 @@ void PCSound::playSong(int16 songNum) { if (!musicOn()) return; - int override = (_vm->resource()->isDemo()) ? _songDemo[songNum - 1].override : _song[songNum - 1].override; - switch (override) { + int overrideCmd = (_vm->resource()->isDemo()) ? _songDemo[songNum - 1].overrideCmd : _song[songNum - 1].overrideCmd; + switch (overrideCmd) { // Override all songs case 1: break; @@ -771,4 +771,4 @@ bool AmigaSound::playSpecialSfx(int16 sfx) { return true; } -} //End of namespace Queen +} // End of namespace Queen diff --git a/engines/queen/sound.h b/engines/queen/sound.h index 371500f356..6a5dfc2c28 100644 --- a/engines/queen/sound.h +++ b/engines/queen/sound.h @@ -39,7 +39,7 @@ struct SongData { int16 volume; int16 tempo; int16 reverb; - int16 override; + int16 overrideCmd; int16 ignore; }; diff --git a/engines/queen/talk.cpp b/engines/queen/talk.cpp index 94bc105bb0..1531510ba4 100644 --- a/engines/queen/talk.cpp +++ b/engines/queen/talk.cpp @@ -96,7 +96,6 @@ void Talk::talk(const char *filename, int personInRoom, char *cutawayFilename) { } int16 oldLevel = 0; - bool personWalking = false; // FIXME: unused // Lines 828-846 in talk.c for (i = 1; i <= 4; i++) { @@ -174,8 +173,7 @@ void Talk::talk(const char *filename, int personInRoom, char *cutawayFilename) { if (1 == choicesLeft) { // Automatically run the final dialogue option - if (speak(_talkString[0], &person, otherVoiceFilePrefix)) - personWalking = true; + speak(_talkString[0], &person, otherVoiceFilePrefix); if (_vm->input()->talkQuit()) break; @@ -251,8 +249,7 @@ void Talk::talk(const char *filename, int personInRoom, char *cutawayFilename) { findDialogueString(_person1PtrOff, head, _pMax, _talkString[0]); if (_talkString[0][0] != '\0') { sprintf(otherVoiceFilePrefix, "%2d%4xP", _talkKey, head); - if (speak(_talkString[0], &person, otherVoiceFilePrefix)) - personWalking = true; + speak(_talkString[0], &person, otherVoiceFilePrefix); } } } diff --git a/engines/saga/detection.cpp b/engines/saga/detection.cpp index 9c178559f2..f6872c41ad 100644 --- a/engines/saga/detection.cpp +++ b/engines/saga/detection.cpp @@ -156,7 +156,8 @@ bool SagaMetaEngine::hasFeature(MetaEngineFeature f) const { (f == kSupportsDeleteSave) || (f == kSavesSupportMetaInfo) || (f == kSavesSupportThumbnail) || - (f == kSavesSupportCreationDate); + (f == kSavesSupportCreationDate) || + (f == kSavesSupportPlayTime); } bool Saga::SagaEngine::hasFeature(EngineFeature f) const { @@ -270,7 +271,10 @@ SaveStateDescriptor SagaMetaEngine::querySaveMetaInfos(const char *target, int s desc.setSaveTime(hour, minutes); - // TODO: played time + if (version >= 8) { + uint32 playTime = in->readUint32BE(); + desc.setPlayTime(playTime * 1000); + } } delete in; diff --git a/engines/saga/events.cpp b/engines/saga/events.cpp index ec3ef2f6f9..d98cef0740 100644 --- a/engines/saga/events.cpp +++ b/engines/saga/events.cpp @@ -332,13 +332,22 @@ int Events::handleOneShot(Event *event) { #ifdef ENABLE_IHNM if (_vm->getGameId() == GID_IHNM) { + PalEntry portraitBgColor = _vm->_interface->_portraitBgColor; + byte portraitColor = (_vm->getLanguage() == Common::ES_ESP) ? 253 : 254; + + // Set the portrait bg color, in case a saved state is restored from the + // launcher. In this case, sfSetPortraitBgColor is not called, thus the + // portrait color will always be 0 (black). + if (portraitBgColor.red == 0 && portraitBgColor.green == 0 && portraitBgColor.blue == 0) + portraitBgColor.green = 255; + if (_vm->_spiritualBarometer > 255) - _vm->_gfx->setPaletteColor(kIHNMColorPortrait, 0xff, 0xff, 0xff); + _vm->_gfx->setPaletteColor(portraitColor, 0xff, 0xff, 0xff); else - _vm->_gfx->setPaletteColor(kIHNMColorPortrait, - _vm->_spiritualBarometer * _vm->_interface->_portraitBgColor.red / 256, - _vm->_spiritualBarometer * _vm->_interface->_portraitBgColor.green / 256, - _vm->_spiritualBarometer * _vm->_interface->_portraitBgColor.blue / 256); + _vm->_gfx->setPaletteColor(portraitColor, + _vm->_spiritualBarometer * portraitBgColor.red / 256, + _vm->_spiritualBarometer * portraitBgColor.green / 256, + _vm->_spiritualBarometer * portraitBgColor.blue / 256); } #endif diff --git a/engines/saga/music.cpp b/engines/saga/music.cpp index 13850a0b6d..0eebf3f175 100644 --- a/engines/saga/music.cpp +++ b/engines/saga/music.cpp @@ -30,6 +30,7 @@ #include "audio/audiostream.h" #include "audio/mididrv.h" #include "audio/midiparser.h" +#include "audio/midiparser_qt.h" #include "audio/decoders/raw.h" #include "common/config-manager.h" #include "common/file.h" @@ -76,19 +77,14 @@ void MusicDriver::play(SagaEngine *vm, ByteArray *buffer, bool loop) { } // 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 + if (!memcmp(buffer->getBuffer(), "FORM", 4)) { _parser = MidiParser::createParser_XMIDI(); + // ITE had MT32 mapped instruments + _isGM = (vm->getGameId() != GID_ITE); } else { - if (!memcmp(buffer->getBuffer(), "FORM", 4)) { - _parser = MidiParser::createParser_XMIDI(); - // ITE had MT32 mapped instruments - _isGM = (vm->getGameId() != GID_ITE); - } else { - _parser = MidiParser::createParser_SMF(); - // ITE with standalone MIDI files is General MIDI - _isGM = (vm->getGameId() == GID_ITE); - } + _parser = MidiParser::createParser_SMF(); + // ITE with standalone MIDI files is General MIDI + _isGM = (vm->getGameId() == GID_ITE); } if (!_parser->loadMusic(buffer->getBuffer(), buffer->size())) @@ -107,6 +103,27 @@ void MusicDriver::play(SagaEngine *vm, ByteArray *buffer, bool loop) { _isPlaying = true; } +void MusicDriver::playQuickTime(const Common::String &musicName, bool loop) { + // IHNM Mac uses QuickTime MIDI + _parser = MidiParser::createParser_QT(); + _isGM = true; + + if (!((MidiParser_QT *)_parser)->loadFromContainerFile(musicName)) + error("MusicDriver::playQuickTime(): Failed to load file '%s'", musicName.c_str()); + + _parser->setTrack(0); + _parser->setMidiDriver(this); + _parser->setTimerRate(_driver->getBaseTempo()); + _parser->property(MidiParser::mpCenterPitchWheelOnUnload, 1); + _parser->property(MidiParser::mpSendSustainOffOnNotesOff, 1); + + // Handle music looping + _parser->property(MidiParser::mpAutoLoop, loop); +// _isLooping = loop; + + _isPlaying = true; +} + void MusicDriver::pause() { _isPlaying = false; } @@ -343,31 +360,19 @@ void Music::play(uint32 resourceId, MusicFlags flags) { // Load MIDI/XMI resource data if (_vm->getGameId() == GID_IHNM && _vm->isMacResources()) { - // Load the external music file for Mac IHNM -#if 0 - Common::File musicFile; - char musicFileName[40]; - sprintf(musicFileName, "Music/Music%02x", resourceId); - musicFile.open(musicFileName); - resourceSize = musicFile.size(); - resourceData = new byte[resourceSize]; - musicFile.read(resourceData, resourceSize); - musicFile.close(); - - // TODO: The Mac music format is unsupported (QuickTime MIDI) - // so stop here -#endif - return; + // Load the external music file for Mac IHNM + _player->playQuickTime(Common::String::format("Music/Music%02x", resourceId), flags & MUSIC_LOOP); } else { if (_currentMusicBuffer == &_musicBuffer[1]) { _currentMusicBuffer = &_musicBuffer[0]; } else { _currentMusicBuffer = &_musicBuffer[1]; } + _vm->_resource->loadResource(_musicContext, resourceId, *_currentMusicBuffer); + _player->play(_vm, _currentMusicBuffer, (flags & MUSIC_LOOP)); } - _player->play(_vm, _currentMusicBuffer, (flags & MUSIC_LOOP)); setVolume(_vm->_musicVolume); } diff --git a/engines/saga/music.h b/engines/saga/music.h index 5a4e662af4..081fab21f6 100644 --- a/engines/saga/music.h +++ b/engines/saga/music.h @@ -46,6 +46,7 @@ public: MusicDriver(); void play(SagaEngine *vm, ByteArray *buffer, bool loop); + void playQuickTime(const Common::String &musicName, bool loop); virtual void pause(); virtual void resume(); diff --git a/engines/saga/resource.cpp b/engines/saga/resource.cpp index 1b0dfa2f22..8025a949d4 100644 --- a/engines/saga/resource.cpp +++ b/engines/saga/resource.cpp @@ -200,15 +200,15 @@ bool Resource::createContexts() { //// Detect and add voice files ///////////////////////////////////////////// SoundFileInfo voiceFiles[] = { - { GID_ITE, "voices.rsc", false , (_soundFileName[0] == 0) ? GAME_SOUNDFILE : 0}, - { GID_ITE, "voices.cmp", true , (_soundFileName[0] == 0) ? GAME_SOUNDFILE : 0}, - { GID_ITE, "voicesd.rsc", false , (_soundFileName[0] == 0) ? GAME_SOUNDFILE : 0}, - { GID_ITE, "voicesd.cmp", true , (_soundFileName[0] == 0) ? GAME_SOUNDFILE : 0}, + { GID_ITE, "voices.rsc", false , (uint16)((_soundFileName[0] == 0) ? GAME_SOUNDFILE : 0)}, + { GID_ITE, "voices.cmp", true , (uint16)((_soundFileName[0] == 0) ? GAME_SOUNDFILE : 0)}, + { GID_ITE, "voicesd.rsc", false , (uint16)((_soundFileName[0] == 0) ? GAME_SOUNDFILE : 0)}, + { GID_ITE, "voicesd.cmp", true , (uint16)((_soundFileName[0] == 0) ? GAME_SOUNDFILE : 0)}, // The resources in the Wyrmkeep combined Windows/Mac/Linux CD version are little endian, but // the voice file is big endian. If we got such a version with mixed files, mark this voice file // as big endian - { GID_ITE, "inherit the earth voices", false , _vm->isBigEndian() ? 0 : GAME_SWAPENDIAN}, - { GID_ITE, "inherit the earth voices.cmp", true , _vm->isBigEndian() ? 0 : GAME_SWAPENDIAN}, + { GID_ITE, "inherit the earth voices", false , (uint16)(_vm->isBigEndian() ? 0 : GAME_SWAPENDIAN)}, + { GID_ITE, "inherit the earth voices.cmp", true , (uint16)(_vm->isBigEndian() ? 0 : GAME_SWAPENDIAN)}, { GID_ITE, "ite voices.bin", false , GAME_MACBINARY}, #ifdef ENABLE_IHNM { GID_IHNM, "voicess.res", false , 0}, diff --git a/engines/saga/saga.cpp b/engines/saga/saga.cpp index 6e272d37c0..239a3be9db 100644 --- a/engines/saga/saga.cpp +++ b/engines/saga/saga.cpp @@ -202,6 +202,8 @@ SagaEngine::~SagaEngine() { } Common::Error SagaEngine::run() { + setTotalPlayTime(0); + // Assign default values to the config manager, in case settings are missing ConfMan.registerDefault("talkspeed", "255"); ConfMan.registerDefault("subtitles", "true"); diff --git a/engines/saga/saga.h b/engines/saga/saga.h index 829425aeaf..01cab21f5d 100644 --- a/engines/saga/saga.h +++ b/engines/saga/saga.h @@ -395,9 +395,7 @@ enum ColorId { kITEColorBlue = 0x93, kITEColorLightBlue94 = 0x94, kITEColorLightBlue96 = 0x96, - kITEColorGreen = 0xba, - - kIHNMColorPortrait = 0xfe + kITEColorGreen = 0xba }; enum KnownColor { diff --git a/engines/saga/saveload.cpp b/engines/saga/saveload.cpp index 6a5a7d8e14..3cd44eba40 100644 --- a/engines/saga/saveload.cpp +++ b/engines/saga/saveload.cpp @@ -34,7 +34,7 @@ #include "saga/scene.h" #include "saga/script.h" -#define CURRENT_SAGA_VER 7 +#define CURRENT_SAGA_VER 8 namespace Saga { @@ -204,10 +204,11 @@ void SagaEngine::save(const char *fileName, const char *saveName) { uint32 saveDate = ((curTime.tm_mday & 0xFF) << 24) | (((curTime.tm_mon + 1) & 0xFF) << 16) | ((curTime.tm_year + 1900) & 0xFFFF); uint16 saveTime = ((curTime.tm_hour & 0xFF) << 8) | ((curTime.tm_min) & 0xFF); + uint32 playTime = g_engine->getTotalPlayTime() / 1000; out->writeUint32BE(saveDate); out->writeUint16BE(saveTime); - // TODO: played time + out->writeUint32BE(playTime); // Surrounding scene out->writeSint32LE(_scene->getOutsetSceneNumber()); @@ -299,7 +300,11 @@ void SagaEngine::load(const char *fileName) { in->readUint32BE(); // save date in->readUint16BE(); // save time - // TODO: played time + + if (_saveHeader.version >= 8) { + uint32 playTime = in->readUint32BE(); + g_engine->setTotalPlayTime(playTime * 1000); + } } // Clear pending events here, and don't process queued music events diff --git a/engines/saga/scene.cpp b/engines/saga/scene.cpp index 35d923f821..75876b1c90 100644 --- a/engines/saga/scene.cpp +++ b/engines/saga/scene.cpp @@ -41,9 +41,10 @@ #include "saga/actor.h" #include "saga/resource.h" -#include "graphics/iff.h" #include "common/util.h" +#include "graphics/decoders/iff.h" + namespace Saga { static int initSceneDoors[SCENE_DOORS_MAX] = { @@ -450,11 +451,11 @@ void Scene::changeScene(int16 sceneNumber, int actorsEntrance, SceneTransitionTy debug(5, "Scene::changeScene(%d, %d, %d, %d)", sceneNumber, actorsEntrance, transitionType, chapter); // This is used for latter ITE demos where all places on world map except - // Tent Faire are substituted with LBM picture and short description + // Tent Faire are substituted with IFF picture and short description if (_vm->_hasITESceneSubstitutes) { for (int i = 0; i < ARRAYSIZE(sceneSubstitutes); i++) { if (sceneSubstitutes[i].sceneId == sceneNumber) { - byte *pal, colors[768]; + const byte *pal; Common::File file; Rect rect; PalEntry cPal[PAL_ENTRIES]; @@ -462,12 +463,12 @@ void Scene::changeScene(int16 sceneNumber, int actorsEntrance, SceneTransitionTy _vm->_interface->setMode(kPanelSceneSubstitute); if (file.open(sceneSubstitutes[i].image)) { - Graphics::Surface bbmBuffer; - Graphics::decodePBM(file, bbmBuffer, colors); - pal = colors; - rect.setWidth(bbmBuffer.w); - rect.setHeight(bbmBuffer.h); - _vm->_gfx->drawRegion(rect, (const byte*)bbmBuffer.pixels); + Graphics::IFFDecoder decoder; + decoder.loadStream(file); + pal = decoder.getPalette(); + rect.setWidth(decoder.getSurface()->w); + rect.setHeight(decoder.getSurface()->h); + _vm->_gfx->drawRegion(rect, (const byte *)decoder.getSurface()->pixels); for (int j = 0; j < PAL_ENTRIES; j++) { cPal[j].red = *pal++; cPal[j].green = *pal++; diff --git a/engines/saga/sfuncs_ihnm.cpp b/engines/saga/sfuncs_ihnm.cpp index 3fbf3b6e67..fdfd0fdf2c 100644 --- a/engines/saga/sfuncs_ihnm.cpp +++ b/engines/saga/sfuncs_ihnm.cpp @@ -168,17 +168,25 @@ void Script::sfSetChapterPoints(SCRIPTFUNC_PARAMS) { _vm->_ethicsPoints[chapter] = thread->pop(); int16 barometer = thread->pop(); static PalEntry cur_pal[PAL_ENTRIES]; + PalEntry portraitBgColor = _vm->_interface->_portraitBgColor; + byte portraitColor = (_vm->getLanguage() == Common::ES_ESP) ? 253 : 254; _vm->_spiritualBarometer = _vm->_ethicsPoints[chapter] * 256 / barometer; _vm->_scene->setChapterPointsChanged(true); // don't save this music when saving in IHNM + // Set the portrait bg color, in case a saved state is restored from the + // launcher. In this case, sfSetPortraitBgColor is not called, thus the + // portrait color will always be 0 (black). + if (portraitBgColor.red == 0 && portraitBgColor.green == 0 && portraitBgColor.blue == 0) + portraitBgColor.green = 255; + if (_vm->_spiritualBarometer > 255) - _vm->_gfx->setPaletteColor(kIHNMColorPortrait, 0xff, 0xff, 0xff); + _vm->_gfx->setPaletteColor(portraitColor, 0xff, 0xff, 0xff); else - _vm->_gfx->setPaletteColor(kIHNMColorPortrait, - _vm->_spiritualBarometer * _vm->_interface->_portraitBgColor.red / 256, - _vm->_spiritualBarometer * _vm->_interface->_portraitBgColor.green / 256, - _vm->_spiritualBarometer * _vm->_interface->_portraitBgColor.blue / 256); + _vm->_gfx->setPaletteColor(portraitColor, + _vm->_spiritualBarometer * portraitBgColor.red / 256, + _vm->_spiritualBarometer * portraitBgColor.green / 256, + _vm->_spiritualBarometer * portraitBgColor.blue / 256); _vm->_gfx->getCurrentPal(cur_pal); _vm->_gfx->setPalette(cur_pal); diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 5ae8245e5a..1bf3323a7b 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -3633,6 +3633,8 @@ bool Console::cmdAddresses(int argc, const char **argv) { DebugPrintf(" - ?obj -- Looks up an object with the specified name, uses its address. This will abort if\n"); DebugPrintf(" the object name is ambiguous; in that case, a list of addresses and indices is provided.\n"); DebugPrintf(" ?obj.idx may be used to disambiguate 'obj' by the index 'idx'.\n"); + DebugPrintf(" Underscores are used as substitute characters for spaces in object names.\n"); + DebugPrintf(" For example, an object named \"Glass Jar\" can be accessed as \"Glass_Jar\".\n"); return true; } @@ -3764,6 +3766,8 @@ static int parse_reg_t(EngineState *s, const char *str, reg_t *dest, bool mayBeV charsCountObject++; if ((*strLoop >= 'I') && (*strLoop <= 'Z')) charsCountObject++; + if (*strLoop == '_') // underscores are used as substitutes for spaces in object names + charsCountObject++; } strLoop++; } @@ -3836,10 +3840,16 @@ static int parse_reg_t(EngineState *s, const char *str, reg_t *dest, bool mayBeV index = strtol(tmp + 1, &endptr, 16); if (*endptr) return -1; - // Chop of the index + // Chop off the index str_objname = Common::String(str_objname.c_str(), tmp); } + // Replace all underscores in the name with spaces + for (uint i = 0; i < str_objname.size(); i++) { + if (str_objname[i] == '_') + str_objname.setChar(' ', i); + } + // Now all values are available; iterate over all objects. *dest = s->_segMan->findObjectByName(str_objname, index); if (dest->isNull()) diff --git a/engines/sci/decompressor.cpp b/engines/sci/decompressor.cpp index 82af6eca43..306825008d 100644 --- a/engines/sci/decompressor.cpp +++ b/engines/sci/decompressor.cpp @@ -590,6 +590,8 @@ void DecompressorLZW::reorderView(byte *src, byte *dest) { if (celindex < cel_total) { warning("View decompression generated too few (%d / %d) headers", celindex, cel_total); + free(cc_pos); + free(cc_lengths); return; } diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 8e8b818854..5640319e3f 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -581,6 +581,15 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, + // Freddy Pharkas - French DOS Floppy (supplied by misterhands in bug report #3589449) + // Executable scanning reports "1.cfs.081" + {"freddypharkas", "Floppy", { + {"resource.map", 0, "a32674e7fbf7b213b4a066c8037f16b6", 5816}, + {"resource.000", 0, "fed4808fdb72486908ac7ad0044b14d8", 5233230}, + {"resource.msg", 0, "4dc478f5c73b57e5d690bdfffdcf1c44", 816518}, + AD_LISTEND}, + Common::FR_FRA, Common::kPlatformPC, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, + // Freddy Pharkas - Windows (supplied by abevi in bug report #2612718) // Executable scanning reports "1.cfs.081" // SCI interpreter version 1.001.132 (just a guess) @@ -3121,6 +3130,15 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::DE_DEU, Common::kPlatformPC, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, + // Quest for Glory 3 - French DOS v1.1 (supplied by misterhands in bug report #3586214) + // Executable scanning reports "L.rry.083" + {"qfg3", "", { + {"resource.map", 0, "19e2bf9b693932b5e2bb59b9f9ab86c9", 5958}, + {"resource.000", 0, "6178ad2e83e58e4671ca03315f7a6498", 5868000}, + {"resource.msg", 0, "0fa1047002df904b8d1807bb7bab4fab", 267210}, + AD_LISTEND}, + Common::FR_FRA, Common::kPlatformPC, 0, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, + // Quest for Glory 3 - Spanish DOS CD (from jvprat) // Executable scanning reports "L.rry.083", VERSION file reports "1.000.000, June 30, 1994" {"qfg3", "", { @@ -3281,7 +3299,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.msg", 0, "1aeafe2b495de288d002109650b66614", 1364}, {"resource.000", 0, "8e10d4f05c1fd9f883384fa38a898489", 377394}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, // Slater & Charlie Go Camping - English DOS/Windows {"slater", "", { @@ -3289,7 +3307,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "21f85414124dc23e54544a5536dc35cd", 4044}, {"resource.msg", 0, "c44f51fb955eae266fecf360ebcd5ad2", 1132}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, // Slater & Charlie Go Camping - English DOS/Windows (Sierra Originals) @@ -3298,7 +3316,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "21f85414124dc23e54544a5536dc35cd", 4044}, {"resource.msg", 0, "c44f51fb955eae266fecf360ebcd5ad2", 1132}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, // Slater & Charlie Go Camping - English Macintosh {"slater", "", { @@ -3628,7 +3646,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "ed90a8e3ccc53af6633ff6ab58392bae", 7054}, {"resource.000", 0, "63247e3901ab8963d4eece73747832e0", 5157378}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO5(GUIO_MIDIGM, GAMEOPTION_SQ4_SILVER_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, + Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO4(GAMEOPTION_SQ4_SILVER_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, // Space Quest 4 - English Windows CD (from the Space Quest Collection) // Executable scanning reports "1.001.064", VERSION file reports "1.0" diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index f985a69ebc..e3ebce80fb 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -427,18 +427,23 @@ reg_t kUpdatePlane(EngineState *s, int argc, reg_t *argv); reg_t kSetShowStyle(EngineState *s, int argc, reg_t *argv); reg_t kGetHighPlanePri(EngineState *s, int argc, reg_t *argv); reg_t kFrameOut(EngineState *s, int argc, reg_t *argv); + reg_t kIsOnMe(EngineState *s, int argc, reg_t *argv); // kOnMe for SCI2, kIsOnMe for SCI2.1 +reg_t kInPolygon(EngineState *s, int argc, reg_t *argv); +reg_t kObjectIntersect(EngineState *s, int argc, reg_t *argv); + reg_t kListIndexOf(EngineState *s, int argc, reg_t *argv); reg_t kListEachElementDo(EngineState *s, int argc, reg_t *argv); reg_t kListFirstTrue(EngineState *s, int argc, reg_t *argv); reg_t kListAllTrue(EngineState *s, int argc, reg_t *argv); -reg_t kInPolygon(EngineState *s, int argc, reg_t *argv); -reg_t kObjectIntersect(EngineState *s, int argc, reg_t *argv); + reg_t kEditText(EngineState *s, int argc, reg_t *argv); reg_t kMakeSaveCatName(EngineState *s, int argc, reg_t *argv); reg_t kMakeSaveFileName(EngineState *s, int argc, reg_t *argv); reg_t kSetScroll(EngineState *s, int argc, reg_t *argv); reg_t kPalCycle(EngineState *s, int argc, reg_t *argv); +reg_t kPalVaryUnknown(EngineState *s, int argc, reg_t *argv); +reg_t kPalVaryUnknown2(EngineState *s, int argc, reg_t *argv); // SCI2.1 Kernel Functions reg_t kText(EngineState *s, int argc, reg_t *argv); @@ -513,7 +518,6 @@ 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); reg_t kPaletteSetFromResource(EngineState *s, int argc, reg_t *argv); reg_t kPaletteSetFlag(EngineState *s, int argc, reg_t *argv); diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index d0c9b9b1cf..d7858180f1 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -156,7 +156,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { // 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, 11, MAP_CALL(DoSoundFade), NULL, kDoSoundFade_workarounds }, { SIG_SOUNDSCI21, 12, MAP_CALL(DoSoundSetHold), NULL, NULL }, { SIG_SOUNDSCI21, 13, MAP_CALL(DoSoundDummy), NULL, NULL }, { SIG_SOUNDSCI21, 14, MAP_CALL(DoSoundSetVolume), NULL, NULL }, @@ -202,7 +202,10 @@ 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 }, +#ifdef ENABLE_SCI32 { SIG_SCI32, 8, MAP_CALL(PalVaryUnknown), "i", NULL }, + { SIG_SCI32, 9, MAP_CALL(PalVaryUnknown2), "i", NULL }, +#endif SCI_SUBOPENTRY_TERMINATOR }; diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index da377319c0..a65bcc215e 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -722,11 +722,6 @@ reg_t kPalVaryPauseResume(EngineState *s, int argc, reg_t *argv) { return NULL_REG; } -reg_t kPalVaryUnknown(EngineState *s, int argc, reg_t *argv) { - // Unknown (seems to be SCI32 exclusive) - return NULL_REG; -} - reg_t kAssertPalette(EngineState *s, int argc, reg_t *argv) { GuiResourceId paletteId = argv[0].toUint16(); diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp index 8b3afeef99..cd735d1233 100644 --- a/engines/sci/engine/kgraphics32.cpp +++ b/engines/sci/engine/kgraphics32.cpp @@ -323,19 +323,29 @@ reg_t kScrollWindow(EngineState *s, int argc, reg_t *argv) { uint16 op = argv[0].toUint16(); switch (op) { case 0: // Init + // TODO: Init reads the nsLeft, nsTop, nsRight, nsBottom, + // borderColor, fore, back, mode, font, plane selectors + // from the window in argv[1]. g_sci->_gfxFrameout->initScrollText(argv[2].toUint16()); // maxItems g_sci->_gfxFrameout->clearScrollTexts(); return argv[1]; // kWindow case 1: // Show message, called by ScrollableWindow::addString case 14: // Modify message, called by ScrollableWindow::modifyString - // 5 or 6 parameters - // Seems to be called with 5 parameters when the narrator speaks, and - // with 6 when Roger speaks + // TODO: The parameters in Modify are shifted by one: the first + // argument is the handle of the text to modify. The others + // are as Add. { Common::String text = s->_segMan->getString(argv[2]); - uint16 x = 0;//argv[3].toUint16(); // TODO: can't be x (values are all wrong) - uint16 y = 0;//argv[4].toUint16(); // TODO: can't be y (values are all wrong) - // TODO: argv[5] is an optional unknown parameter (an integer set to 0) + uint16 x = 0; + uint16 y = 0; + // TODO: argv[3] is font + // TODO: argv[4] is color + // TODO: argv[5] is alignment (0 = left, 1 = center, 2 = right) + // font,color,alignment may also be -1. (Maybe same as previous?) + // TODO: argv[6] is an optional bool, defaulting to true if not present. + // If true, the old contents are scrolled out of view. + // TODO: Return a handle of the inserted text. (Used for modify/insert) + // This handle looks like it should also be usable by kString. g_sci->_gfxFrameout->addScrollTextEntry(text, kWindow, x, y, (op == 14)); } break; @@ -363,22 +373,27 @@ reg_t kScrollWindow(EngineState *s, int argc, reg_t *argv) { g_sci->_gfxFrameout->lastScrollText(); break; case 9: // Resize, called by ScrollableWindow::resize and ScrollerWindow::resize - // TODO + // TODO: This reads the nsLeft, nsTop, nsRight, nsBottom + // selectors from the SCI object passed in argv[2]. kStub(s, argc, argv); break; case 10: // Where, called by ScrollableWindow::where - // TODO - // argv[2] is an unknown integer + // TODO: + // Gives the current relative scroll location as a fraction + // with argv[2] as the denominator. (Return value is the numerator.) // Silenced the warnings because of the high amount of console spam //kStub(s, argc, argv); break; case 11: // Go, called by ScrollableWindow::scrollTo - // 2 extra parameters here - // TODO + // TODO: + // Two arguments provide a fraction: argv[2] is num., argv[3] is denom. + // Scrolls to the relative location given by the fraction. kStub(s, argc, argv); break; case 12: // Insert, called by ScrollableWindow::insertString - // 3 extra parameters here + // 5 extra parameters here: + // handle of insert location (new string takes that position). + // text, font, color, alignment // TODO kStub(s, argc, argv); break; @@ -668,6 +683,22 @@ reg_t kSetScroll(EngineState *s, int argc, reg_t *argv) { return kStub(s, argc, argv); } +reg_t kPalVaryUnknown(EngineState *s, int argc, reg_t *argv) { + // TODO: Unknown (seems to be SCI32 exclusive) + return kStub(s, argc, argv); +} + +reg_t kPalVaryUnknown2(EngineState *s, int argc, reg_t *argv) { + // TODO: Unknown (seems to be SCI32 exclusive) + // It seems to be related to the day/night palette effects in QFG4, and + // accepts a palette resource ID. It is triggered right when the night + // effect is initially applied (when exiting the caves). + // In QFG4, there are two scene palettes: 790 for night, and 791 for day. + // Initially, the game starts at night time, but this is called with the + // ID of the day time palette (i.e. 791). + return kStub(s, argc, argv); +} + reg_t kPalCycle(EngineState *s, int argc, reg_t *argv) { // Examples: GK1 room 480 (Bayou ritual), LSL6 room 100 (title screen) diff --git a/engines/sci/engine/kmath.cpp b/engines/sci/engine/kmath.cpp index 4b8fadbb84..b2aaa01b45 100644 --- a/engines/sci/engine/kmath.cpp +++ b/engines/sci/engine/kmath.cpp @@ -77,18 +77,7 @@ reg_t kSqrt(EngineState *s, int argc, reg_t *argv) { return make_reg(0, (int16) sqrt((float) ABS(argv[0].toSint16()))); } -/** - * Returns the angle (in degrees) between the two points determined by (x1, y1) - * and (x2, y2). The angle ranges from 0 to 359 degrees. - * What this function does is pretty simple but apparently the original is not - * accurate. - */ -uint16 kGetAngleWorker(int16 x1, int16 y1, int16 x2, int16 y2) { - // SCI1 games (QFG2 and newer) use a simple atan implementation. SCI0 games - // use a somewhat less accurate calculation (below). - if (getSciVersion() >= SCI_VERSION_1_EGA_ONLY) - return (int16)(360 - atan2((double)(x1 - x2), (double)(y1 - y2)) * 57.2958) % 360; - +uint16 kGetAngle_SCI0(int16 x1, int16 y1, int16 x2, int16 y2) { int16 xRel = x2 - x1; int16 yRel = y1 - y2; // y-axis is mirrored. int16 angle; @@ -118,6 +107,75 @@ uint16 kGetAngleWorker(int16 x1, int16 y1, int16 x2, int16 y2) { return angle; } +// atan2 for first octant, x >= y >= 0. Returns [0,45] (inclusive) +int kGetAngle_SCI1_atan2_base(int y, int x) { + if (x == 0) + return 0; + + // fixed point tan(a) + int tan_fp = 10000 * y / x; + + if ( tan_fp >= 1000 ) { + // For tan(a) >= 0.1, interpolate between multiples of 5 degrees + + // 10000 * tan([5, 10, 15, 20, 25, 30, 35, 40, 45]) + const int tan_table[] = { 875, 1763, 2679, 3640, 4663, 5774, + 7002, 8391, 10000 }; + + // Look up tan(a) in our table + int i = 1; + while (tan_fp > tan_table[i]) ++i; + + // The angle a is between 5*i and 5*(i+1). We linearly interpolate. + int dist = tan_table[i] - tan_table[i-1]; + int interp = (5 * (tan_fp - tan_table[i-1]) + dist/2) / dist; + return 5*i + interp; + } else { + // for tan(a) < 0.1, tan(a) is approximately linear in a. + // tan'(0) = 1, so in degrees the slope of atan is 180/pi = 57.29... + return (57 * y + x/2) / x; + } +} + +int kGetAngle_SCI1_atan2(int y, int x) { + if (y < 0) { + int a = kGetAngle_SCI1_atan2(-y, -x); + if (a == 180) + return 0; + else + return 180 + a; + } + if (x < 0) + return 90 + kGetAngle_SCI1_atan2(-x, y); + if (y > x) + return 90 - kGetAngle_SCI1_atan2_base(x, y); + else + return kGetAngle_SCI1_atan2_base(y, x); + +} + +uint16 kGetAngle_SCI1(int16 x1, int16 y1, int16 x2, int16 y2) { + // We flip things around to get into the standard atan2 coordinate system + return kGetAngle_SCI1_atan2(x2 - x1, y1 - y2); + +} + +/** + * Returns the angle (in degrees) between the two points determined by (x1, y1) + * and (x2, y2). The angle ranges from 0 to 359 degrees. + * What this function does is pretty simple but apparently the original is not + * accurate. + */ + +uint16 kGetAngleWorker(int16 x1, int16 y1, int16 x2, int16 y2) { + if (getSciVersion() >= SCI_VERSION_1_EGA_ONLY) + return kGetAngle_SCI1(x1, y1, x2, y2); + else + return kGetAngle_SCI0(x1, y1, x2, y2); +} + + + reg_t kGetAngle(EngineState *s, int argc, reg_t *argv) { // Based on behavior observed with a test program created with // SCI Studio. diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp index c4db0b891c..65e139e1ee 100644 --- a/engines/sci/engine/kstring.cpp +++ b/engines/sci/engine/kstring.cpp @@ -155,30 +155,47 @@ reg_t kReadNumber(EngineState *s, int argc, reg_t *argv) { source++; /* Skip whitespace */ int16 result = 0; + int16 sign = 1; + if (*source == '-') { + sign = -1; + source++; + } if (*source == '$') { // Hexadecimal input - result = (int16)strtol(source + 1, NULL, 16); + source++; + char c; + while ((c = *source++) != 0) { + int16 x = 0; + if ((c >= '0') && (c <= '9')) + x = c - '0'; + else if ((c >= 'a') && (c <= 'f')) + x = c - 'a' + 10; + else if ((c >= 'A') && (c <= 'F')) + x = c - 'A' + 10; + else + // Stop if we encounter anything other than a digit (like atoi) + break; + result *= 16; + result += x; + } } else { // 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 == '-') { - // FIXME: Setting result to -1 does _not_ negate the output. - result = -1; - source++; - } - while (*source) { - if ((*source < '0') || (*source > '9')) + char c; + while ((c = *source++) != 0) { + if ((c < '0') || (c > '9')) // Stop if we encounter anything other than a digit (like atoi) break; result *= 10; - result += *source - 0x30; - source++; + result += c - '0'; } } + result *= sign; + return make_reg(0, result); } @@ -489,6 +506,7 @@ reg_t kGetMessage(EngineState *s, int argc, reg_t *argv) { reg_t kMessage(EngineState *s, int argc, reg_t *argv) { uint func = argv[0].toUint16(); + uint16 module = (argc >= 2) ? argv[1].toUint16() : 0; #ifdef ENABLE_SCI32 if (getSciVersion() >= SCI_VERSION_2) { @@ -518,19 +536,44 @@ reg_t kMessage(EngineState *s, int argc, reg_t *argv) { if (argc >= 6) tuple = MessageTuple(argv[2].toUint16(), argv[3].toUint16(), argv[4].toUint16(), argv[5].toUint16()); + // WORKAROUND for a script bug in Pepper. When using objects together, + // there is code inside script 894 that shows appropriate messages. + // In the case of the jar of cabbage (noun 26), the relevant message + // shown when using any object with it is missing. This leads to the + // script code being triggered, which modifies the jar's noun and + // message selectors, and renders it useless. Thus, when using any + // object with the jar of cabbage, it's effectively corrupted, and + // can't be used on the goat to empty it, therefore the game reaches + // an unsolvable state. It's almost impossible to patch the offending + // script, as it is used in many cases. But we can prevent the + // corruption of the jar here: if the message is found, the offending + // code is never reached and the jar is never corrupted. To do this, + // we substitute all verbs on the cabbage jar with the default verb, + // which shows the "Cannot use this object with the jar" message, and + // never triggers the offending script code that corrupts the object. + // This only affects the jar of cabbage - any other object, including + // the empty jar has a different noun, thus it's unaffected. + // Fixes bug #3601090. + // NOTE: To fix a corrupted jar object, type "send Glass_Jar message 52" + // in the debugger. + if (g_sci->getGameId() == GID_PEPPER && func == 0 && argc >= 6 && module == 894 && + tuple.noun == 26 && tuple.cond == 0 && tuple.seq == 1 && + !s->_msgState->getMessage(module, tuple, NULL_REG)) + tuple.verb = 0; + switch (func) { case K_MESSAGE_GET: - return make_reg(0, s->_msgState->getMessage(argv[1].toUint16(), tuple, (argc == 7 ? argv[6] : NULL_REG))); + return make_reg(0, s->_msgState->getMessage(module, tuple, (argc == 7 ? argv[6] : NULL_REG))); case K_MESSAGE_NEXT: return make_reg(0, s->_msgState->nextMessage((argc == 2 ? argv[1] : NULL_REG))); case K_MESSAGE_SIZE: - return make_reg(0, s->_msgState->messageSize(argv[1].toUint16(), tuple)); + return make_reg(0, s->_msgState->messageSize(module, tuple)); case K_MESSAGE_REFCOND: case K_MESSAGE_REFVERB: case K_MESSAGE_REFNOUN: { MessageTuple t; - if (s->_msgState->messageRef(argv[1].toUint16(), tuple, t)) { + if (s->_msgState->messageRef(module, tuple, t)) { switch (func) { case K_MESSAGE_REFCOND: return make_reg(0, t.cond); @@ -545,9 +588,9 @@ reg_t kMessage(EngineState *s, int argc, reg_t *argv) { } case K_MESSAGE_LASTMESSAGE: { MessageTuple msg; - int module; + int lastModule; - s->_msgState->lastQuery(module, msg); + s->_msgState->lastQuery(lastModule, msg); bool ok = false; @@ -556,7 +599,7 @@ reg_t kMessage(EngineState *s, int argc, reg_t *argv) { if (buffer) { ok = true; - WRITE_LE_UINT16(buffer, module); + WRITE_LE_UINT16(buffer, lastModule); WRITE_LE_UINT16(buffer + 2, msg.noun); WRITE_LE_UINT16(buffer + 4, msg.verb); WRITE_LE_UINT16(buffer + 6, msg.cond); @@ -567,7 +610,7 @@ reg_t kMessage(EngineState *s, int argc, reg_t *argv) { if (buffer) { ok = true; - buffer[0] = make_reg(0, module); + buffer[0] = make_reg(0, lastModule); buffer[1] = make_reg(0, msg.noun); buffer[2] = make_reg(0, msg.verb); buffer[3] = make_reg(0, msg.cond); diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index ff3f19b53d..b2d95c599e 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -696,8 +696,9 @@ void GfxPalette::saveLoadWithSerializer(Common::Serializer &s) { s.syncAsSint32LE(_palVaryPaused); } + _palVarySignal = 0; + if (s.isLoading() && _palVaryResourceId != -1) { - _palVarySignal = 0; palVaryInstallTimer(); } } diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp index 8639b6ef71..c928cf3569 100644 --- a/engines/sci/engine/script_patches.cpp +++ b/engines/sci/engine/script_patches.cpp @@ -883,12 +883,38 @@ const uint16 qfg1vgaPatchDialogHeader[] = { PATCH_END }; +// When clicking on the crusher in room 331, Ego approaches him to talk to him, +// an action that is handled by moveToCrusher::changeState in script 331. The +// scripts set Ego to move close to the crusher, but when Ego is running instead +// of walking, the target coordinates specified by script 331 are never reached, +// as Ego is making larger steps, and never reaches the required spot. This is an +// edge case that can occur when Ego is set to run. Normally, when clicking on +// the crusher, ego is supposed to move close to position 79, 165. We change it +// to 85, 165, which is not an edge case thus the freeze is avoided. +// Fixes bug #3585189. +const byte qfg1vgaSignatureMoveToCrusher[] = { + 9, + 0x51, 0x1f, // class Motion + 0x36, // push + 0x39, 0x4f, // pushi 4f (79 - x) + 0x38, 0xa5, 0x00, // pushi 00a5 (165 - y) + 0x7c, // pushSelf + 0 +}; + +const uint16 qfg1vgaPatchMoveToCrusher[] = { + PATCH_ADDTOOFFSET | +3, + 0x39, 0x55, // pushi 55 (85 - x) + PATCH_END +}; + // script, description, magic DWORD, adjust const SciScriptSignature qfg1vgaSignatures[] = { { 215, "fight event issue", 1, PATCH_MAGICDWORD(0x6d, 0x76, 0x51, 0x07), -1, qfg1vgaSignatureFightEvents, qfg1vgaPatchFightEvents }, { 216, "weapon master event issue", 1, PATCH_MAGICDWORD(0x6d, 0x76, 0x51, 0x07), -1, qfg1vgaSignatureFightEvents, qfg1vgaPatchFightEvents }, { 814, "window text temp space", 1, PATCH_MAGICDWORD(0x3f, 0xba, 0x87, 0x00), 0, qfg1vgaSignatureTempSpace, qfg1vgaPatchTempSpace }, { 814, "dialog header offset", 3, PATCH_MAGICDWORD(0x5b, 0x04, 0x80, 0x36), 0, qfg1vgaSignatureDialogHeader, qfg1vgaPatchDialogHeader }, + { 331, "moving to crusher", 1, PATCH_MAGICDWORD(0x51, 0x1f, 0x36, 0x39), 0, qfg1vgaSignatureMoveToCrusher, qfg1vgaPatchMoveToCrusher }, SCI_SIGNATUREENTRY_TERMINATOR }; diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index db510c2545..ff7e601fcb 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -140,7 +140,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { 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_QFG2, 500, 500, 0, "lightNextCandleS", "changeState", -1, -1, { WORKAROUND_FAKE, 0 } }, // Inside the last room, while Ad Avis performs the ritual to summon the genie - bug #3148418 { GID_QFG2, -1, 700, 0, NULL, "showSign", -1, 10, { WORKAROUND_FAKE, 0 } }, // Occurs sometimes when reading a sign in Raseir, Shapeir et al - bugs #3272735, #3275413 - { GID_QFG3, 510, 510, 0, "awardPrize", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // Simbani warrior challenge, after throwing the spears and retrieving the ring - bug #3049435 + { GID_QFG3, 510, 510, 0, "awardPrize", "changeState", -1, 0, { WORKAROUND_FAKE, 1 } }, // Simbani warrior challenge, after throwing the spears and retrieving the ring - bug #3049435. Must be non-zero, otherwise the prize is awarded twice - bug #3575570. { 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 @@ -151,6 +151,8 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { 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, happens sometimes in fight scenes + { GID_QFG4, 520, 64950, 0, "fLake2", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // CD version, at the lake, when meeting the Rusalka and attempting to leave + { GID_QFG4, 800, 64950, 0, "View", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // CD version, in the room with the spider pillar, when climbing on the pillar { GID_RAMA, 12, 64950, -1, "InterfaceFeature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // Demo, right when it starts { GID_RAMA, 12, 64950, -1, "hiliteOptText", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // Demo, right when it starts { GID_RAMA, 12, 64950, -1, "View", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // Demo, right when it starts @@ -246,6 +248,7 @@ const SciWorkaroundEntry kDoSoundFade_workarounds[] = { { 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 + { GID_QFG4, -1, 64989, 0, "longSong", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // CD version: many places, parameter 4 is an object (longSong) SCI_WORKAROUNDENTRY_TERMINATOR }; diff --git a/engines/sci/event.cpp b/engines/sci/event.cpp index 14443db1e2..7318fe2f68 100644 --- a/engines/sci/event.cpp +++ b/engines/sci/event.cpp @@ -160,9 +160,15 @@ SciEvent EventManager::getScummVMEvent() { noEvent.mousePos = input.mousePos = mousePos; - if (!found || ev.type == Common::EVENT_MOUSEMOVE) - return noEvent; + if (!found || ev.type == Common::EVENT_MOUSEMOVE) { + int modifiers = em->getModifierState(); + noEvent.modifiers = + ((modifiers & Common::KBD_ALT) ? SCI_KEYMOD_ALT : 0) | + ((modifiers & Common::KBD_CTRL) ? SCI_KEYMOD_CTRL : 0) | + ((modifiers & Common::KBD_SHIFT) ? SCI_KEYMOD_LSHIFT | SCI_KEYMOD_RSHIFT : 0); + return noEvent; + } if (ev.type == Common::EVENT_QUIT) { input.type = SCI_EVENT_QUIT; return input; diff --git a/engines/sci/graphics/animate.h b/engines/sci/graphics/animate.h index 5e2e39ea1a..52da7d6ec6 100644 --- a/engines/sci/graphics/animate.h +++ b/engines/sci/graphics/animate.h @@ -51,7 +51,6 @@ enum ViewScaleSignals { 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) kScaleSignalHoyle4SpecialHandling = 0x0004 // HOYLE4-exclusive: special handling inside kAnimate, is used when giving out cards - }; struct AnimateEntry { diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 8b7fa2c384..e251bd3dc0 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -349,6 +349,36 @@ void GfxFrameout::deletePlaneLine(reg_t object, reg_t hunkId) { } } +// Adapted from GfxAnimate::applyGlobalScaling() +void GfxFrameout::applyGlobalScaling(FrameoutEntry *itemEntry, Common::Rect planeRect, int16 celHeight) { + // Global scaling uses global var 2 and some other stuff to calculate scaleX/scaleY + int16 maxScale = readSelectorValue(_segMan, itemEntry->object, SELECTOR(maxScale)); + int16 maxCelHeight = (maxScale * celHeight) >> 7; + reg_t globalVar2 = g_sci->getEngineState()->variables[VAR_GLOBAL][2]; // current room object + int16 vanishingY = readSelectorValue(_segMan, globalVar2, SELECTOR(vanishingY)); + + int16 fixedPortY = planeRect.bottom - vanishingY; + int16 fixedEntryY = itemEntry->y - vanishingY; + if (!fixedEntryY) + fixedEntryY = 1; + + if ((celHeight == 0) || (fixedPortY == 0)) + error("global scaling panic"); + + itemEntry->scaleY = (maxCelHeight * fixedEntryY) / fixedPortY; + itemEntry->scaleY = (itemEntry->scaleY * maxScale) / celHeight; + + // Make sure that the calculated value is sane + if (itemEntry->scaleY < 1 /*|| itemEntry->scaleY > 128*/) + itemEntry->scaleY = 128; + + itemEntry->scaleX = itemEntry->scaleY; + + // and set objects scale selectors + //writeSelectorValue(_segMan, itemEntry->object, SELECTOR(scaleX), itemEntry->scaleX); + //writeSelectorValue(_segMan, itemEntry->object, SELECTOR(scaleY), itemEntry->scaleY); +} + void GfxFrameout::kernelAddScreenItem(reg_t object) { // Ignore invalid items if (!_segMan->isObject(object)) { @@ -390,8 +420,15 @@ void GfxFrameout::kernelUpdateScreenItem(reg_t object) { itemEntry->priority = itemEntry->y; itemEntry->signal = readSelectorValue(_segMan, object, SELECTOR(signal)); - itemEntry->scaleX = readSelectorValue(_segMan, object, SELECTOR(scaleX)); - itemEntry->scaleY = readSelectorValue(_segMan, object, SELECTOR(scaleY)); + itemEntry->scaleSignal = readSelectorValue(_segMan, object, SELECTOR(scaleSignal)); + + if (itemEntry->scaleSignal & kScaleSignalDoScaling32) { + itemEntry->scaleX = readSelectorValue(_segMan, object, SELECTOR(scaleX)); + itemEntry->scaleY = readSelectorValue(_segMan, object, SELECTOR(scaleY)); + } else { + itemEntry->scaleX = 128; + itemEntry->scaleY = 128; + } itemEntry->visible = true; // Check if the entry can be hidden @@ -650,7 +687,13 @@ void GfxFrameout::kernelFrameout() { _paint32->fillRect(it->planeRect, it->planeBack); _coordAdjuster->pictureSetDisplayArea(it->planeRect); - _palette->drewPicture(it->pictureId); + // Invoking drewPicture() with an invalid picture ID in SCI32 results in + // invalidating the palVary palette when a palVary effect is active. This + // is quite obvious in QFG4, where the day time palette is incorrectly + // shown when exiting the caves, and the correct night time palette + // flashes briefly each time that kPalVaryInit is called. + if (it->pictureId != 0xFFFF) + _palette->drewPicture(it->pictureId); FrameoutList itemList; @@ -699,6 +742,14 @@ void GfxFrameout::kernelFrameout() { // 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 if (view) { + // Process global scaling, if needed. + // TODO: Seems like SCI32 always processes global scaling for scaled objects + // TODO: We can only process symmetrical scaling for now (i.e. same value for scaleX/scaleY) + if ((itemEntry->scaleSignal & kScaleSignalDoScaling32) && + !(itemEntry->scaleSignal & kScaleSignalDisableGlobalScaling32) && + (itemEntry->scaleX == itemEntry->scaleY)) + applyGlobalScaling(itemEntry, it->planeRect, view->getHeight(itemEntry->loopNo, itemEntry->celNo)); + if ((itemEntry->scaleX == 128) && (itemEntry->scaleY == 128)) view->getCelRect(itemEntry->loopNo, itemEntry->celNo, itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->celRect); @@ -726,7 +777,12 @@ void GfxFrameout::kernelFrameout() { continue; } - g_sci->_gfxCompare->setNSRect(itemEntry->object, nsRect); + // FIXME: We should not update the object's NS rect here. + // This breaks the sliders in the control panel screen in + // QFG4, but disabling it does not change any functionality, + // as the object(s) will be drawn on screen with the + // calculated coordinates. + //g_sci->_gfxCompare->setNSRect(itemEntry->object, nsRect); } // Don't attempt to draw sprites that are outside the visible diff --git a/engines/sci/graphics/frameout.h b/engines/sci/graphics/frameout.h index 5fd2824224..5ef770486f 100644 --- a/engines/sci/graphics/frameout.h +++ b/engines/sci/graphics/frameout.h @@ -97,11 +97,18 @@ struct ScrollTextEntry { typedef Common::Array<ScrollTextEntry> ScrollTextList; +enum ViewScaleSignals32 { + kScaleSignalDoScaling32 = 0x0001, // enables scaling when drawing that cel (involves scaleX and scaleY) + kScaleSignalUnk1 = 0x0002, // unknown + kScaleSignalDisableGlobalScaling32 = 0x0004 +}; + class GfxCache; class GfxCoordAdjuster32; class GfxPaint32; class GfxPalette; class GfxScreen; + /** * Frameout class, kFrameout and relevant functions for SCI32 games */ @@ -113,6 +120,7 @@ public: void kernelAddPlane(reg_t object); void kernelUpdatePlane(reg_t object); void kernelDeletePlane(reg_t object); + void applyGlobalScaling(FrameoutEntry *itemEntry, Common::Rect planeRect, int16 celHeight); void kernelAddScreenItem(reg_t object); void kernelUpdateScreenItem(reg_t object); void kernelDeleteScreenItem(reg_t object); diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 53d69cdcca..9b6eff6edc 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -386,9 +386,9 @@ void GfxPalette::setRemappingPercentGray(byte color, byte percent) { // Note: This is not what the original does, but the results are the same visually for (int i = 0; i < 256; i++) { - byte rComponent = _sysPalette.colors[i].r * _remappingPercentToSet * 0.30 / 100; - byte gComponent = _sysPalette.colors[i].g * _remappingPercentToSet * 0.59 / 100; - byte bComponent = _sysPalette.colors[i].b * _remappingPercentToSet * 0.11 / 100; + byte rComponent = (byte)(_sysPalette.colors[i].r * _remappingPercentToSet * 0.30 / 100); + byte gComponent = (byte)(_sysPalette.colors[i].g * _remappingPercentToSet * 0.59 / 100); + byte bComponent = (byte)(_sysPalette.colors[i].b * _remappingPercentToSet * 0.11 / 100); byte luminosity = rComponent + gComponent + bComponent; _remappingByPercent[i] = kernelFindColor(luminosity, luminosity, luminosity); } @@ -722,11 +722,6 @@ void GfxPalette::kernelRestore(reg_t memoryHandle) { } void GfxPalette::kernelAssertPalette(GuiResourceId resourceId) { - // Sometimes invalid viewIds are asked for, ignore those (e.g. qfg1vga) - //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(); if (viewPalette) { diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 15b18ce8e6..1f5c354d1f 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -699,9 +699,11 @@ void SciEngine::runGame() { patchGameSaveRestore(); setLauncherLanguage(); _gamestate->gameIsRestarting = GAMEISRESTARTING_RESTART; + _gamestate->_throttleLastTime = 0; if (_gfxMenu) _gfxMenu->reset(); _gamestate->abortScriptProcessing = kAbortNone; + _gamestate->_syncedAudioOptions = false; } else if (_gamestate->abortScriptProcessing == kAbortLoadGame) { _gamestate->abortScriptProcessing = kAbortNone; _gamestate->_executionStack.clear(); @@ -713,6 +715,7 @@ void SciEngine::runGame() { syncSoundSettings(); syncIngameAudioOptions(); + // Games do not set their audio settings when loading } else { break; // exit loop } diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 7782ab4e48..a76b3b3876 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -116,7 +116,7 @@ void SoundCommandParser::processInitSound(reg_t obj) { newSound->resourceId = resourceId; newSound->soundObj = obj; newSound->loop = readSelectorValue(_segMan, obj, SELECTOR(loop)); - newSound->priority = readSelectorValue(_segMan, obj, SELECTOR(pri)) & 0xFF; + newSound->priority = readSelectorValue(_segMan, obj, SELECTOR(priority)) & 0xFF; if (_soundVersion >= SCI_VERSION_1_EARLY) newSound->volume = CLIP<int>(readSelectorValue(_segMan, obj, SELECTOR(vol)), 0, MUSIC_VOLUME_MAX); newSound->reverb = -1; // initialize to SCI invalid, it'll be set correctly in soundInitSnd() below @@ -441,7 +441,7 @@ reg_t SoundCommandParser::kDoSoundUpdate(int argc, reg_t *argv, reg_t acc) { int16 objVol = CLIP<int>(readSelectorValue(_segMan, obj, SELECTOR(vol)), 0, 255); if (objVol != musicSlot->volume) _music->soundSetVolume(musicSlot, objVol); - uint32 objPrio = readSelectorValue(_segMan, obj, SELECTOR(pri)); + uint32 objPrio = readSelectorValue(_segMan, obj, SELECTOR(priority)); if (objPrio != musicSlot->priority) _music->soundSetPriority(musicSlot, objPrio); return acc; diff --git a/engines/scumm/debugger.cpp b/engines/scumm/debugger.cpp index dc5acbdb7d..9b6dd1e687 100644 --- a/engines/scumm/debugger.cpp +++ b/engines/scumm/debugger.cpp @@ -741,10 +741,6 @@ bool ScummDebugger::Cmd_PrintDraft(int argc, const char **argv) { "Silence", "Shaping", "Unmaking", "Transcendence" }; - int odds[] = { - 15162, 15676, 16190, 64, 16961, 17475, 17989, 18503, - 73, 19274, 76, 77, 20302, 20816, 21330, 84 - }; const char *notes = "cdefgabC"; int i, base, draft; @@ -754,9 +750,9 @@ bool ScummDebugger::Cmd_PrintDraft(int argc, const char **argv) { return true; } - // There are 16 drafts, stored from variable 50 or 100 and upwards. - // Each draft occupies two variables. Even-numbered variables contain - // the notes for each draft, and a number of flags: + // There are 16 drafts, stored from variable 50, 55 or 100 and upwards. + // Each draft occupies two variables, the first of which contains the + // notes for the draft and a number of flags. // // +---+---+---+---+-----+-----+-----+-----+ // | A | B | C | D | 444 | 333 | 222 | 111 | @@ -771,13 +767,16 @@ bool ScummDebugger::Cmd_PrintDraft(int argc, const char **argv) { // 222 The second note // 111 The first note // - // I don't yet know what the odd-numbered variables are used for. - // Possibly they store information on where and/or how the draft can - // be used. They appear to remain constant throughout the game. + // I don't yet know what the second variable is used for. Possibly to + // store information on where and/or how the draft can be used. They + // appear to remain constant throughout the game. if (_vm->_game.version == 4 || _vm->_game.platform == Common::kPlatformPCEngine) { // DOS CD version / PC-Engine version base = 100; + } else if (_vm->_game.platform == Common::kPlatformMacintosh) { + // Macintosh version + base = 55; } else { // All (?) other versions base = 50; @@ -801,28 +800,13 @@ bool ScummDebugger::Cmd_PrintDraft(int argc, const char **argv) { DebugPrintf("Learned all drafts and notes.\n"); return true; } - - // During the testing of EGA Loom we had some trouble with the - // drafts data structure being overwritten. I don't expect - // this command is particularly useful any more, but it will - // attempt to repair the (probably) static part of it. - - if (strcmp(argv[1], "fix") == 0) { - for (i = 0; i < 16; i++) - _vm->_scummVars[base + 2 * i + 1] = odds[i]; - DebugPrintf( - "An attempt has been made to repair\n" - "the internal drafts data structure.\n" - "Continue on your own risk.\n"); - return true; - } } // Probably the most useful command for ordinary use: list the drafts. for (i = 0; i < 16; i++) { draft = _vm->_scummVars[base + i * 2]; - DebugPrintf("%d %-13s %c%c%c%c %c%c %5d %c\n", + DebugPrintf("%d %-13s %c%c%c%c %c%c\n", base + 2 * i, names[i], notes[draft & 0x0007], @@ -830,9 +814,7 @@ bool ScummDebugger::Cmd_PrintDraft(int argc, const char **argv) { notes[(draft & 0x01c0) >> 6], notes[(draft & 0x0e00) >> 9], (draft & 0x2000) ? 'K' : ' ', - (draft & 0x4000) ? 'U' : ' ', - _vm->_scummVars[base + 2 * i + 1], - (_vm->_scummVars[base + 2 * i + 1] != odds[i]) ? '!' : ' '); + (draft & 0x4000) ? 'U' : ' '); } return true; diff --git a/engines/scumm/gfx.cpp b/engines/scumm/gfx.cpp index ffff329036..50ff0b3988 100644 --- a/engines/scumm/gfx.cpp +++ b/engines/scumm/gfx.cpp @@ -3609,7 +3609,7 @@ void Gdi::unkDecode9(byte *dst, int dstPitch, const byte *src, int height) const int i; uint buffer = 0, mask = 128; int h = height; - i = run = 0; + run = 0; int x = 8; for (;;) { diff --git a/engines/scumm/he/sound_he.cpp b/engines/scumm/he/sound_he.cpp index f94b74ac45..1afb1b4074 100644 --- a/engines/scumm/he/sound_he.cpp +++ b/engines/scumm/he/sound_he.cpp @@ -804,7 +804,7 @@ void ScummEngine_v80he::createSound(int snd1id, int snd2id) { byte *snd1Ptr, *snd2Ptr; byte *sbng1Ptr, *sbng2Ptr; byte *sdat1Ptr, *sdat2Ptr; - byte *src, *dst, *tmp; + byte *src, *dst; int len, offs, size; int sdat1size, sdat2size; @@ -844,6 +844,7 @@ void ScummEngine_v80he::createSound(int snd1id, int snd2id) { if (sbng1Ptr != NULL && sbng2Ptr != NULL) { if (chan != -1 && ((SoundHE *)_sound)->_heChannel[chan].codeOffs > 0) { + // Copy any code left over to the beginning of the code block int curOffs = ((SoundHE *)_sound)->_heChannel[chan].codeOffs; src = snd1Ptr + curOffs; @@ -851,29 +852,33 @@ void ScummEngine_v80he::createSound(int snd1id, int snd2id) { size = READ_BE_UINT32(sbng1Ptr + 4); len = sbng1Ptr - snd1Ptr + size - curOffs; - byte *data = (byte *)malloc(len); - memcpy(data, src, len); - memcpy(dst, data, len); - free(data); + memmove(dst, src, len); + // Now seek to the end of this code block dst = sbng1Ptr + 8; while ((size = READ_LE_UINT16(dst)) != 0) dst += size; } else { + // We're going to overwrite the code block completely dst = sbng1Ptr + 8; } - ((SoundHE *)_sound)->_heChannel[chan].codeOffs = sbng1Ptr - snd1Ptr + 8; + // Reset the current code offset to the beginning of the code block + if (chan >= 0) + ((SoundHE *)_sound)->_heChannel[chan].codeOffs = sbng1Ptr - snd1Ptr + 8; - tmp = sbng2Ptr + 8; + // Seek to the end of the code block for sound 2 + byte *tmp = sbng2Ptr + 8; while ((offs = READ_LE_UINT16(tmp)) != 0) { tmp += offs; } + // Copy the code block for sound 2 to the code block for sound 1 src = sbng2Ptr + 8; len = tmp - sbng2Ptr - 6; memcpy(dst, src, len); + // Rewrite the time for this new code block to be after the sound 1 code block int32 time; while ((size = READ_LE_UINT16(dst)) != 0) { time = READ_LE_UINT32(dst + 2); @@ -883,6 +888,7 @@ void ScummEngine_v80he::createSound(int snd1id, int snd2id) { } } + // Find the data pointers and sizes if (findSoundTag(MKTAG('d','a','t','a'), snd1Ptr)) { sdat1Ptr = findSoundTag(MKTAG('d','a','t','a'), snd1Ptr); assert(sdat1Ptr); @@ -906,6 +912,8 @@ void ScummEngine_v80he::createSound(int snd1id, int snd2id) { sdat1size = _sndDataSize - _sndPtrOffs; if (sdat2size < sdat1size) { + // We have space leftover at the end of sound 1 + // -> Just append sound 2 src = sdat2Ptr + 8; dst = sdat1Ptr + 8 + _sndPtrOffs; len = sdat2size; @@ -915,6 +923,8 @@ void ScummEngine_v80he::createSound(int snd1id, int snd2id) { _sndPtrOffs += sdat2size; _sndTmrOffs += sdat2size; } else { + // We might not have enough space leftover at the end of sound 1 + // -> Append as much of possible of sound 2 to sound 1 src = sdat2Ptr + 8; dst = sdat1Ptr + 8 + _sndPtrOffs; len = sdat1size; @@ -922,6 +932,8 @@ void ScummEngine_v80he::createSound(int snd1id, int snd2id) { memcpy(dst, src, len); if (sdat2size != sdat1size) { + // We don't have enough space + // -> Start overwriting the beginning of the sound again src = sdat2Ptr + 8 + sdat1size; dst = sdat1Ptr + 8; len = sdat2size - sdat1size; diff --git a/engines/scumm/imuse/imuse.cpp b/engines/scumm/imuse/imuse.cpp index 016ba89e7b..b69ce552bc 100644 --- a/engines/scumm/imuse/imuse.cpp +++ b/engines/scumm/imuse/imuse.cpp @@ -363,7 +363,7 @@ void IMuseInternal::pause(bool paused) { _paused = paused; } -int IMuseInternal::save_or_load(Serializer *ser, ScummEngine *scumm) { +int IMuseInternal::save_or_load(Serializer *ser, ScummEngine *scumm, bool fixAfterLoad) { Common::StackLock lock(_mutex, "IMuseInternal::save_or_load()"); const SaveLoadEntry mainEntries[] = { MKLINE(IMuseInternal, _queue_end, sleUint8, VER(8)), @@ -440,7 +440,16 @@ int IMuseInternal::save_or_load(Serializer *ser, ScummEngine *scumm) { for (i = 0; i < 8; ++i) ser->saveLoadEntries(0, volumeFaderEntries); - if (ser->isLoading()) { + // Normally, we have to fix up the data structures after loading a + // saved game. But there are cases where we don't. For instance, The + // Macintosh version of Monkey Island 1 used to convert the Mac0 music + // resources to General MIDI and play it through iMUSE as a rough + // approximation. Now it has its own player, but old savegame still + // have the iMUSE data in them. We have to skip that data, using a + // dummy iMUSE object, but since the resource is no longer recognizable + // to iMUSE, the fixup fails hard. So yes, this is a bit of a hack. + + if (ser->isLoading() && fixAfterLoad) { // Load all sounds that we need fix_players_after_load(scumm); fix_parts_after_load(); diff --git a/engines/scumm/imuse/imuse.h b/engines/scumm/imuse/imuse.h index 23449e470b..cce5309229 100644 --- a/engines/scumm/imuse/imuse.h +++ b/engines/scumm/imuse/imuse.h @@ -62,7 +62,7 @@ public: public: virtual void on_timer(MidiDriver *midi) = 0; virtual void pause(bool paused) = 0; - virtual int save_or_load(Serializer *ser, ScummEngine *scumm) = 0; + virtual int save_or_load(Serializer *ser, ScummEngine *scumm, bool fixAfterLoad = true) = 0; virtual bool get_sound_active(int sound) const = 0; virtual int32 doCommand(int numargs, int args[]) = 0; virtual int clear_queue() = 0; diff --git a/engines/scumm/imuse/imuse_internal.h b/engines/scumm/imuse/imuse_internal.h index 846e2d7545..6be564a517 100644 --- a/engines/scumm/imuse/imuse_internal.h +++ b/engines/scumm/imuse/imuse_internal.h @@ -518,7 +518,7 @@ protected: public: // IMuse interface void pause(bool paused); - int save_or_load(Serializer *ser, ScummEngine *scumm); + int save_or_load(Serializer *ser, ScummEngine *scumm, bool fixAfterLoad = true); bool get_sound_active(int sound) const; int32 doCommand(int numargs, int args[]); uint32 property(int prop, uint32 value); diff --git a/engines/scumm/imuse/imuse_part.cpp b/engines/scumm/imuse/imuse_part.cpp index 89c16a8bb5..5e928f3d44 100644 --- a/engines/scumm/imuse/imuse_part.cpp +++ b/engines/scumm/imuse/imuse_part.cpp @@ -111,8 +111,19 @@ void Part::saveLoadWithSerializer(Serializer *ser) { } void Part::set_detune(int8 detune) { - _detune_eff = clamp((_detune = detune) + _player->getDetune(), -128, 127); - sendPitchBend(); + // Sam&Max does not have detune, so we just ignore this here. We still get + // this called, since Sam&Max uses the same controller for a different + // purpose. + if (_se->_game_id == GID_SAMNMAX) { +#if 0 + if (_mc) { + _mc->controlChange(17, detune + 0x40); + } +#endif + } else { + _detune_eff = clamp((_detune = detune) + _player->getDetune(), -128, 127); + sendPitchBend(); + } } void Part::pitchBend(int16 value) { diff --git a/engines/scumm/module.mk b/engines/scumm/module.mk index 8499c9bad3..28884d7f78 100644 --- a/engines/scumm/module.mk +++ b/engines/scumm/module.mk @@ -36,6 +36,7 @@ MODULE_OBJS := \ object.o \ palette.o \ player_apple2.o \ + player_mac.o \ player_mod.o \ player_nes.o \ player_pce.o \ @@ -47,7 +48,9 @@ MODULE_OBJS := \ player_v2base.o \ player_v2cms.o \ player_v3a.o \ + player_v3m.o \ player_v4a.o \ + player_v5m.o \ resource_v2.o \ resource_v3.o \ resource_v4.o \ diff --git a/engines/scumm/music.h b/engines/scumm/music.h index a527c77b72..9fd14d830e 100644 --- a/engines/scumm/music.h +++ b/engines/scumm/music.h @@ -24,6 +24,7 @@ #define SCUMM_MUSIC_H #include "common/scummsys.h" +#include "engines/scumm/saveload.h" namespace Scumm { @@ -78,6 +79,11 @@ public: * @return the music timer */ virtual int getMusicTimer() { return 0; } + + /** + * Save or load the music state. + */ + virtual void saveLoadWithSerializer(Serializer *ser) {} }; } // End of namespace Scumm diff --git a/engines/scumm/object.cpp b/engines/scumm/object.cpp index 77c75c4ad6..ed77a863cd 100644 --- a/engines/scumm/object.cpp +++ b/engines/scumm/object.cpp @@ -433,10 +433,14 @@ void ScummEngine::getObjectXYPos(int object, int &x, int &y, int &dir) { y = od.y_pos + (int16)READ_LE_UINT16(&imhd->old.hotspot[state].y); } } else if (_game.version <= 2) { - if (od.actordir) { - x = od.walk_x; - y = od.walk_y; - } else { + x = od.walk_x; + y = od.walk_y; + + // Adjust x, y when no actor direction is set, but only perform this + // adjustment for V0 games (e.g. MM C64), otherwise certain scenes in + // newer games are affected as well (e.g. the interior of the Shuttle + // Bus scene in Zak V2, where no actor is present). Refer to bug #3526089. + if (!od.actordir && _game.version == 0) { x = od.x_pos + od.width / 2; y = od.y_pos + od.height / 2; } diff --git a/engines/scumm/player_mac.cpp b/engines/scumm/player_mac.cpp new file mode 100644 index 0000000000..c16c85bff3 --- /dev/null +++ b/engines/scumm/player_mac.cpp @@ -0,0 +1,415 @@ +/* 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. + * + */ + +#include "common/macresman.h" +#include "common/translation.h" +#include "engines/engine.h" +#include "gui/message.h" +#include "scumm/player_mac.h" +#include "scumm/resource.h" +#include "scumm/scumm.h" +#include "scumm/imuse/imuse.h" + +namespace Scumm { + +Player_Mac::Player_Mac(ScummEngine *scumm, Audio::Mixer *mixer, int numberOfChannels, int channelMask, bool fadeNoteEnds) + : _vm(scumm), + _mixer(mixer), + _sampleRate(_mixer->getOutputRate()), + _soundPlaying(-1), + _numberOfChannels(numberOfChannels), + _channelMask(channelMask), + _fadeNoteEnds(fadeNoteEnds) { + assert(scumm); + assert(mixer); +} + +void Player_Mac::init() { + _channel = new Player_Mac::Channel[_numberOfChannels]; + + int i; + + for (i = 0; i < _numberOfChannels; i++) { + _channel[i]._looped = false; + _channel[i]._length = 0; + _channel[i]._data = NULL; + _channel[i]._pos = 0; + _channel[i]._pitchModifier = 0; + _channel[i]._velocity = 0; + _channel[i]._remaining = 0; + _channel[i]._notesLeft = false; + _channel[i]._instrument._data = NULL; + _channel[i]._instrument._size = 0; + _channel[i]._instrument._rate = 0; + _channel[i]._instrument._loopStart = 0; + _channel[i]._instrument._loopEnd = 0; + _channel[i]._instrument._baseFreq = 0; + _channel[i]._instrument._pos = 0; + _channel[i]._instrument._subPos = 0; + } + + _pitchTable[116] = 1664510; + _pitchTable[117] = 1763487; + _pitchTable[118] = 1868350; + _pitchTable[119] = 1979447; + _pitchTable[120] = 2097152; + _pitchTable[121] = 2221855; + _pitchTable[122] = 2353973; + _pitchTable[123] = 2493948; + _pitchTable[124] = 2642246; + _pitchTable[125] = 2799362; + _pitchTable[126] = 2965820; + _pitchTable[127] = 3142177; + for (i = 115; i >= 0; --i) { + _pitchTable[i] = _pitchTable[i + 12] / 2; + } + + setMusicVolume(255); + + if (!checkMusicAvailable()) { + return; + } + + _mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); +} + +Player_Mac::~Player_Mac() { + Common::StackLock lock(_mutex); + _mixer->stopHandle(_soundHandle); + stopAllSounds_Internal(); + delete[] _channel; +} + +void Player_Mac::saveLoadWithSerializer(Serializer *ser) { + Common::StackLock lock(_mutex); + if (ser->getVersion() < VER(94)) { + if (_vm->_game.id == GID_MONKEY && ser->isLoading()) { + IMuse *dummyImuse = IMuse::create(_vm->_system, NULL, NULL); + dummyImuse->save_or_load(ser, _vm, false); + delete dummyImuse; + } + } else { + static const SaveLoadEntry musicEntries[] = { + MKLINE(Player_Mac, _sampleRate, sleUint32, VER(94)), + MKLINE(Player_Mac, _soundPlaying, sleInt16, VER(94)), + MKEND() + }; + + static const SaveLoadEntry channelEntries[] = { + MKLINE(Channel, _pos, sleUint16, VER(94)), + MKLINE(Channel, _pitchModifier, sleInt32, VER(94)), + MKLINE(Channel, _velocity, sleUint8, VER(94)), + MKLINE(Channel, _remaining, sleUint32, VER(94)), + MKLINE(Channel, _notesLeft, sleUint8, VER(94)), + MKEND() + }; + + static const SaveLoadEntry instrumentEntries[] = { + MKLINE(Instrument, _pos, sleUint32, VER(94)), + MKLINE(Instrument, _subPos, sleUint32, VER(94)), + MKEND() + }; + + uint32 mixerSampleRate = _sampleRate; + int i; + + ser->saveLoadEntries(this, musicEntries); + + if (ser->isLoading() && _soundPlaying != -1) { + const byte *ptr = _vm->getResourceAddress(rtSound, _soundPlaying); + assert(ptr); + loadMusic(ptr); + } + + ser->saveLoadArrayOf(_channel, _numberOfChannels, sizeof(Channel), channelEntries); + for (i = 0; i < _numberOfChannels; i++) { + ser->saveLoadEntries(&_channel[i], instrumentEntries); + } + + if (ser->isLoading()) { + // If necessary, adjust the channel data to fit the + // current sample rate. + if (_soundPlaying != -1 && _sampleRate != mixerSampleRate) { + double mult = (double)_sampleRate / (double)mixerSampleRate; + for (i = 0; i < _numberOfChannels; i++) { + _channel[i]._pitchModifier = (int)((double)_channel[i]._pitchModifier * mult); + _channel[i]._remaining = (int)((double)_channel[i]._remaining / mult); + } + } + _sampleRate = mixerSampleRate; + } + } +} + +void Player_Mac::setMusicVolume(int vol) { + debug(5, "Player_Mac::setMusicVolume(%d)", vol); +} + +void Player_Mac::stopAllSounds_Internal() { + if (_soundPlaying != -1) { + _vm->_res->unlock(rtSound, _soundPlaying); + } + _soundPlaying = -1; + for (int i = 0; i < _numberOfChannels; i++) { + // The channel data is managed by the resource manager, so + // don't delete that. + delete[] _channel[i]._instrument._data; + _channel[i]._instrument._data = NULL; + + _channel[i]._remaining = 0; + _channel[i]._notesLeft = false; + } +} + +void Player_Mac::stopAllSounds() { + Common::StackLock lock(_mutex); + debug(5, "Player_Mac::stopAllSounds()"); + stopAllSounds_Internal(); +} + +void Player_Mac::stopSound(int nr) { + Common::StackLock lock(_mutex); + debug(5, "Player_Mac::stopSound(%d)", nr); + + if (nr == _soundPlaying) { + stopAllSounds(); + } +} + +void Player_Mac::startSound(int nr) { + Common::StackLock lock(_mutex); + debug(5, "Player_Mac::startSound(%d)", nr); + + stopAllSounds_Internal(); + + const byte *ptr = _vm->getResourceAddress(rtSound, nr); + assert(ptr); + + if (!loadMusic(ptr)) { + return; + } + + _vm->_res->lock(rtSound, nr); + _soundPlaying = nr; +} + +bool Player_Mac::Channel::loadInstrument(Common::SeekableReadStream *stream) { + uint16 soundType = stream->readUint16BE(); + if (soundType != 1) { + warning("Player_Mac::loadInstrument: Unsupported sound type %d", soundType); + return false; + } + uint16 typeCount = stream->readUint16BE(); + if (typeCount != 1) { + warning("Player_Mac::loadInstrument: Unsupported data type count %d", typeCount); + return false; + } + uint16 dataType = stream->readUint16BE(); + if (dataType != 5) { + warning("Player_Mac::loadInstrument: Unsupported data type %d", dataType); + return false; + } + + stream->readUint32BE(); // initialization option + + uint16 cmdCount = stream->readUint16BE(); + if (cmdCount != 1) { + warning("Player_Mac::loadInstrument: Unsupported command count %d", cmdCount); + return false; + } + uint16 command = stream->readUint16BE(); + if (command != 0x8050 && command != 0x8051) { + warning("Player_Mac::loadInstrument: Unsupported command 0x%04X", command); + return false; + } + + stream->readUint16BE(); // 0 + uint32 soundHeaderOffset = stream->readUint32BE(); + + stream->seek(soundHeaderOffset); + + uint32 soundDataOffset = stream->readUint32BE(); + uint32 size = stream->readUint32BE(); + uint32 rate = stream->readUint32BE() >> 16; + uint32 loopStart = stream->readUint32BE(); + uint32 loopEnd = stream->readUint32BE(); + byte encoding = stream->readByte(); + byte baseFreq = stream->readByte(); + + if (encoding != 0) { + warning("Player_Mac::loadInstrument: Unsupported encoding %d", encoding); + return false; + } + + stream->skip(soundDataOffset); + + byte *data = new byte[size]; + stream->read(data, size); + + _instrument._data = data; + _instrument._size = size; + _instrument._rate = rate; + _instrument._loopStart = loopStart; + _instrument._loopEnd = loopEnd; + _instrument._baseFreq = baseFreq; + + return true; +} + +int Player_Mac::getMusicTimer() { + return 0; +} + +int Player_Mac::getSoundStatus(int nr) const { + return _soundPlaying == nr; +} + +uint32 Player_Mac::durationToSamples(uint16 duration) { + // The correct formula should be: + // + // (duration * 473 * _sampleRate) / (4 * 480 * 480) + // + // But that's likely to cause integer overflow, so we do it in two + // steps and hope that the rounding error won't be noticeable. + // + // The original code is a bit unclear on if it should be 473 or 437, + // but since the comments indicated 473 I'm assuming 437 was a typo. + uint32 samples = (duration * _sampleRate) / (4 * 480); + samples = (samples * 473) / 480; + return samples; +} + +int Player_Mac::noteToPitchModifier(byte note, Instrument *instrument) { + if (note > 0) { + const int pitchIdx = note + 60 - instrument->_baseFreq; + // I don't want to use floating-point arithmetics here, but I + // ran into overflow problems with the church music in Monkey + // Island. It's only once per note, so it should be ok. + double mult = (double)instrument->_rate / (double)_sampleRate; + return (int)(mult * _pitchTable[pitchIdx]); + } else { + return 0; + } +} + +int Player_Mac::readBuffer(int16 *data, const int numSamples) { + Common::StackLock lock(_mutex); + + memset(data, 0, numSamples * 2); + if (_soundPlaying == -1) { + return numSamples; + } + + bool notesLeft = false; + + for (int i = 0; i < _numberOfChannels; i++) { + if (!(_channelMask & (1 << i))) { + continue; + } + + uint samplesLeft = numSamples; + int16 *ptr = data; + + while (samplesLeft > 0) { + int generated; + if (_channel[i]._remaining == 0) { + uint32 samples; + int pitchModifier; + byte velocity; + if (getNextNote(i, samples, pitchModifier, velocity)) { + _channel[i]._remaining = samples; + _channel[i]._pitchModifier = pitchModifier; + _channel[i]._velocity = velocity; + + } else { + _channel[i]._pitchModifier = 0; + _channel[i]._velocity = 0; + _channel[i]._remaining = samplesLeft; + } + } + generated = MIN<uint32>(_channel[i]._remaining, samplesLeft); + if (_channel[i]._velocity != 0) { + _channel[i]._instrument.generateSamples(ptr, _channel[i]._pitchModifier, _channel[i]._velocity, generated, _channel[i]._remaining, _fadeNoteEnds); + } + ptr += generated; + samplesLeft -= generated; + _channel[i]._remaining -= generated; + } + + if (_channel[i]._notesLeft) { + notesLeft = true; + } + } + + if (!notesLeft) { + stopAllSounds_Internal(); + } + + return numSamples; +} + +void Player_Mac::Instrument::generateSamples(int16 *data, int pitchModifier, int volume, int numSamples, int remainingSamplesOnNote, bool fadeNoteEnds) { + int samplesLeft = numSamples; + while (samplesLeft) { + _subPos += pitchModifier; + while (_subPos >= 0x10000) { + _subPos -= 0x10000; + _pos++; + if (_pos >= _loopEnd) { + _pos = _loopStart; + } + } + + int newSample = (((int16)((_data[_pos] << 8) ^ 0x8000)) * volume) / 255; + + if (fadeNoteEnds) { + // Fade out the last 100 samples on each note. Even at + // low output sample rates this is just a fraction of a + // second, but it gets rid of distracting "pops" at the + // end when the sample would otherwise go abruptly from + // something to nothing. This was particularly + // noticeable on the distaff notes in Loom. + // + // The reason it's conditional is that Monkey Island + // appears to have a "hold current note" command, and + // if we fade out the current note in that case we + // will actually introduce new "pops". + + remainingSamplesOnNote--; + if (remainingSamplesOnNote < 100) { + newSample = (newSample * remainingSamplesOnNote) / 100; + } + } + + int sample = *data + newSample; + if (sample > 32767) { + sample = 32767; + } else if (sample < -32768) { + sample = -32768; + } + + *data++ = sample; + samplesLeft--; + } +} + +} // End of namespace Scumm diff --git a/engines/scumm/player_mac.h b/engines/scumm/player_mac.h new file mode 100644 index 0000000000..09307b4e57 --- /dev/null +++ b/engines/scumm/player_mac.h @@ -0,0 +1,133 @@ +/* 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. + * + */ + +#ifndef SCUMM_PLAYER_MAC_H +#define SCUMM_PLAYER_MAC_H + +#include "common/scummsys.h" +#include "common/util.h" +#include "common/mutex.h" +#include "scumm/music.h" +#include "scumm/saveload.h" +#include "audio/audiostream.h" +#include "audio/mixer.h" + +#define RES_SND MKTAG('s', 'n', 'd', ' ') + +class Mixer; + +namespace Scumm { + +class ScummEngine; + +/** + * Scumm Macintosh music driver, base class. + */ +class Player_Mac : public Audio::AudioStream, public MusicEngine { +public: + Player_Mac(ScummEngine *scumm, Audio::Mixer *mixer, int numberOfChannels, int channelMask, bool fadeNoteEnds); + virtual ~Player_Mac(); + + void init(); + + // MusicEngine API + virtual void setMusicVolume(int vol); + virtual void startSound(int sound); + virtual void stopSound(int sound); + virtual void stopAllSounds(); + virtual int getMusicTimer(); + virtual int getSoundStatus(int sound) const; + + // AudioStream API + virtual int readBuffer(int16 *buffer, const int numSamples); + virtual bool isStereo() const { return false; } + virtual bool endOfData() const { return false; } + virtual int getRate() const { return _sampleRate; } + + virtual void saveLoadWithSerializer(Serializer *ser); + +private: + Common::Mutex _mutex; + Audio::Mixer *const _mixer; + Audio::SoundHandle _soundHandle; + uint32 _sampleRate; + int _soundPlaying; + + void stopAllSounds_Internal(); + + struct Instrument { + byte *_data; + uint32 _size; + uint32 _rate; + uint32 _loopStart; + uint32 _loopEnd; + byte _baseFreq; + + uint _pos; + uint _subPos; + + void newNote() { + _pos = 0; + _subPos = 0; + } + + void generateSamples(int16 *data, int pitchModifier, int volume, int numSamples, int remainingSamplesOnNote, bool fadeNoteEnds); + }; + + int _pitchTable[128]; + int _numberOfChannels; + int _channelMask; + bool _fadeNoteEnds; + + virtual bool checkMusicAvailable() { return false; } + virtual bool loadMusic(const byte *ptr) { return false; } + virtual bool getNextNote(int ch, uint32 &samples, int &pitchModifier, byte &velocity) { return false; } + +protected: + struct Channel { + virtual ~Channel() {} + + Instrument _instrument; + bool _looped; + uint32 _length; + const byte *_data; + + uint _pos; + int _pitchModifier; + byte _velocity; + uint32 _remaining; + + bool _notesLeft; + + bool loadInstrument(Common::SeekableReadStream *stream); + }; + + ScummEngine *const _vm; + Channel *_channel; + + uint32 durationToSamples(uint16 duration); + int noteToPitchModifier(byte note, Instrument *instrument); +}; + +} // End of namespace Scumm + +#endif diff --git a/engines/scumm/player_v3m.cpp b/engines/scumm/player_v3m.cpp new file mode 100644 index 0000000000..0f222d84fe --- /dev/null +++ b/engines/scumm/player_v3m.cpp @@ -0,0 +1,214 @@ +/* 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. + * + */ + +/* + We have the following information from Lars Christensen (lechimp) and + Jamieson Christian (jamieson630): + + RESOURCE DATA + LE 2 bytes Resource size + 2 bytes Unknown + 2 bytes 'so' + 14 bytes Unknown + BE 2 bytes Instrument for Stream 1 + BE 2 bytes Instrument for Stream 2 + BE 2 bytes Instrument for Stream 3 + BE 2 bytes Instrument for Stream 4 + BE 2 bytes Instrument for Stream 5 + BE 2 bytes Offset to Stream 1 + BE 2 bytes Offset to Stream 2 + BE 2 bytes Offset to Stream 3 + BE 2 bytes Offset to Stream 4 + BE 2 bytes Offset to Stream 5 + ? bytes The streams + + STREAM DATA + BE 2 bytes Unknown (always 1?) + 2 bytes Unknown (always 0?) + BE 2 bytes Number of events in stream + ? bytes Stream data + + Each stream event is exactly 3 bytes, therefore one can + assert that numEvents == (streamSize - 6) / 3. The + polyphony of a stream appears to be 1; in other words, only + one note at a time can be playing in each stream. The next + event is not executed until the current note (or rest) is + finished playing; therefore, note duration also serves as the + time delta between events. + + FOR EACH EVENTS + BE 2 bytes Note duration + 1 byte Note number to play (0 = rest/silent) + + Oh, and quick speculation -- Stream 1 may be used for a + single-voice interleaved version of the music, where Stream 2- + 5 represent a version of the music in up to 4-voice + polyphony, one voice per stream. I postulate thus because + the first stream of the Mac Loom theme music contains + interleaved voices, whereas the second stream seemed to + contain only the pizzicato bottom-end harp. Stream 5, in this + example, is empty, so if my speculation is correct, this + particular musical number supports 3-voice polyphony at + most. I must check out Streams 3 and 4 to see what they + contain. + + ========== + + The instruments appear to be identified by their resource IDs: + + 1000 Dual Harp + 10895 harp1 + 11445 strings1 + 11548 silent + 13811 staff1 + 15703 brass1 + 16324 flute1 + 25614 accordian 1 + 28110 f horn1 + 29042 bassoon1 +*/ + +#include "common/macresman.h" +#include "common/translation.h" +#include "engines/engine.h" +#include "gui/message.h" +#include "scumm/player_v3m.h" +#include "scumm/scumm.h" + +namespace Scumm { + +Player_V3M::Player_V3M(ScummEngine *scumm, Audio::Mixer *mixer) + : Player_Mac(scumm, mixer, 5, 0x1E, true) { + assert(_vm->_game.id == GID_LOOM); + + // Channel 0 seems to be what was played on low-end macs, that couldn't + // handle multi-channel music and play the game at the same time. I'm + // not sure if stream 4 is ever used, but let's use it just in case. +} + +// \xAA is a trademark glyph in Mac OS Roman. We try that, but also the Windows +// version, the UTF-8 version, and just plain without in case the file system +// can't handle exotic characters like that. + +static const char *loomFileNames[] = { + "Loom\xAA", + "Loom\x99", + "Loom\xE2\x84\xA2", + "Loom" +}; + +bool Player_V3M::checkMusicAvailable() { + Common::MacResManager resource; + + for (int i = 0; i < ARRAYSIZE(loomFileNames); i++) { + if (resource.exists(loomFileNames[i])) { + return true; + } + } + + GUI::MessageDialog dialog(_( + "Could not find the 'Loom' Macintosh executable to read the\n" + "instruments from. Music will be disabled."), _("OK")); + dialog.runModal(); + return false; +} + +bool Player_V3M::loadMusic(const byte *ptr) { + Common::MacResManager resource; + bool found = false; + + for (int i = 0; i < ARRAYSIZE(loomFileNames); i++) { + if (resource.open(loomFileNames[i])) { + found = true; + break; + } + } + + if (!found) { + return false; + } + + if (ptr[4] != 's' || ptr[5] != 'o') { + // Like the original we ignore all sound resources which do not have + // a 'so' tag in them. + // See bug #3602239 ("Mac Loom crashes using opening spell on + // gravestone") for a case where this is required. Loom Mac tries to + // play resource 11 here. This resource is no Mac sound resource + // though, it is a PC Speaker resource. A test with the original + // interpreter also has shown that no sound is played while the + // screen is shaking. + debug(5, "Player_V3M::loadMusic: Skipping unknown music type %02X%02X", ptr[4], ptr[5]); + resource.close(); + return false; + } + + uint i; + for (i = 0; i < 5; i++) { + int instrument = READ_BE_UINT16(ptr + 20 + 2 * i); + int offset = READ_BE_UINT16(ptr + 30 + 2 * i); + + _channel[i]._looped = false; + _channel[i]._length = READ_BE_UINT16(ptr + offset + 4) * 3; + _channel[i]._data = ptr + offset + 6; + _channel[i]._pos = 0; + _channel[i]._pitchModifier = 0; + _channel[i]._velocity = 0; + _channel[i]._remaining = 0; + _channel[i]._notesLeft = true; + + Common::SeekableReadStream *stream = resource.getResource(RES_SND, instrument); + if (_channel[i].loadInstrument(stream)) { + debug(6, "Player_V3M::loadMusic: Channel %d - Loaded Instrument %d (%s)", i, instrument, resource.getResName(RES_SND, instrument).c_str()); + } else { + resource.close(); + return false; + } + } + + resource.close(); + return true; +} + +bool Player_V3M::getNextNote(int ch, uint32 &samples, int &pitchModifier, byte &velocity) { + _channel[ch]._instrument.newNote(); + if (_channel[ch]._pos >= _channel[ch]._length) { + if (!_channel[ch]._looped) { + _channel[ch]._notesLeft = false; + return false; + } + _channel[ch]._pos = 0; + } + uint16 duration = READ_BE_UINT16(&_channel[ch]._data[_channel[ch]._pos]); + byte note = _channel[ch]._data[_channel[ch]._pos + 2]; + samples = durationToSamples(duration); + if (note > 0) { + pitchModifier = noteToPitchModifier(note, &_channel[ch]._instrument); + velocity = 127; + } else { + pitchModifier = 0; + velocity = 0; + } + _channel[ch]._pos += 3; + return true; +} + +} // End of namespace Scumm diff --git a/engines/scumm/player_v3m.h b/engines/scumm/player_v3m.h new file mode 100644 index 0000000000..359bab32a9 --- /dev/null +++ b/engines/scumm/player_v3m.h @@ -0,0 +1,54 @@ +/* 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. + * + */ + +#ifndef SCUMM_PLAYER_V3M_H +#define SCUMM_PLAYER_V3M_H + +#include "common/scummsys.h" +#include "common/util.h" +#include "common/mutex.h" +#include "scumm/music.h" +#include "scumm/player_mac.h" +#include "audio/audiostream.h" +#include "audio/mixer.h" + +class Mixer; + +namespace Scumm { + +class ScummEngine; + +/** + * Scumm V3 Macintosh music driver. + */ +class Player_V3M : public Player_Mac { +public: + Player_V3M(ScummEngine *scumm, Audio::Mixer *mixer); + + virtual bool checkMusicAvailable(); + virtual bool loadMusic(const byte *ptr); + virtual bool getNextNote(int ch, uint32 &samples, int &pitchModifier, byte &velocity); +}; + +} // End of namespace Scumm + +#endif diff --git a/engines/scumm/player_v5m.cpp b/engines/scumm/player_v5m.cpp new file mode 100644 index 0000000000..500f3bbc40 --- /dev/null +++ b/engines/scumm/player_v5m.cpp @@ -0,0 +1,246 @@ +/* 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. + * + */ + +/* + From Markus Magnuson (superqult) we got this information: + Mac0 + --- + 4 bytes - 'SOUN' + BE 4 bytes - block length + + 4 bytes - 'Mac0' + BE 4 bytes - (blockLength - 27) + 28 bytes - ??? + + do this three times (once for each channel): + 4 bytes - 'Chan' + BE 4 bytes - channel length + 4 bytes - instrument name (e.g. 'MARI') + + do this for ((chanLength-24)/4) times: + 2 bytes - note duration + 1 byte - note value + 1 byte - note velocity + + 4 bytes - ??? + 4 bytes - 'Loop'/'Done' + 4 bytes - ??? + + 1 byte - 0x09 + --- + + The instruments presumably correspond to the snd resource names in the + Monkey Island executable: + + Instruments + "MARI" - MARIMBA + "PLUC" - PLUCK + "HARM" - HARMONIC + "PIPE" - PIPEORGAN + "TROM" - TROMBONE + "STRI" - STRINGS + "HORN" - HORN + "VIBE" - VIBES + "SHAK" - SHAKUHACHI + "PANP" - PANPIPE + "WHIS" - WHISTLE + "ORGA" - ORGAN3 + "BONG" - BONGO + "BASS" - BASS + + --- + + Note values <= 1 are silent. +*/ + +#include "common/macresman.h" +#include "common/translation.h" +#include "engines/engine.h" +#include "gui/message.h" +#include "scumm/player_v5m.h" +#include "scumm/scumm.h" + +namespace Scumm { + +Player_V5M::Player_V5M(ScummEngine *scumm, Audio::Mixer *mixer) + : Player_Mac(scumm, mixer, 3, 0x07, false) { + assert(_vm->_game.id == GID_MONKEY); +} + +// Try both with and without underscore in the filename, because hfsutils may +// turn the space into an underscore. At least, it did for me. + +static const char *monkeyIslandFileNames[] = { + "Monkey Island", + "Monkey_Island" +}; + +bool Player_V5M::checkMusicAvailable() { + Common::MacResManager resource; + + for (int i = 0; i < ARRAYSIZE(monkeyIslandFileNames); i++) { + if (resource.exists(monkeyIslandFileNames[i])) { + return true; + } + } + + GUI::MessageDialog dialog(_( + "Could not find the 'Monkey Island' Macintosh executable to read the\n" + "instruments from. Music will be disabled."), _("OK")); + dialog.runModal(); + return false; +} + +bool Player_V5M::loadMusic(const byte *ptr) { + Common::MacResManager resource; + bool found = false; + uint i; + + for (i = 0; i < ARRAYSIZE(monkeyIslandFileNames); i++) { + if (resource.open(monkeyIslandFileNames[i])) { + found = true; + break; + } + } + + if (!found) { + return false; + } + + ptr += 8; + // TODO: Decipher the unknown bytes in the header. For now, skip 'em + ptr += 28; + + Common::MacResIDArray idArray = resource.getResIDArray(RES_SND); + + // Load the three channels and their instruments + for (i = 0; i < 3; i++) { + assert(READ_BE_UINT32(ptr) == MKTAG('C', 'h', 'a', 'n')); + uint32 len = READ_BE_UINT32(ptr + 4); + uint32 instrument = READ_BE_UINT32(ptr + 8); + + _channel[i]._length = len - 20; + _channel[i]._data = ptr + 12; + _channel[i]._looped = (READ_BE_UINT32(ptr + len - 8) == MKTAG('L', 'o', 'o', 'p')); + _channel[i]._pos = 0; + _channel[i]._pitchModifier = 0; + _channel[i]._velocity = 0; + _channel[i]._remaining = 0; + _channel[i]._notesLeft = true; + + for (uint j = 0; j < idArray.size(); j++) { + Common::String name = resource.getResName(RES_SND, idArray[j]); + if (instrument == READ_BE_UINT32(name.c_str())) { + debug(6, "Player_V5M::loadMusic: Channel %d: Loading instrument '%s'", i, name.c_str()); + Common::SeekableReadStream *stream = resource.getResource(RES_SND, idArray[j]); + + if (!_channel[i].loadInstrument(stream)) { + resource.close(); + return false; + } + + break; + } + } + + ptr += len; + } + + resource.close(); + + // The last note of each channel is just zeroes. We will adjust this + // note so that all the channels end at the same time. + + uint32 samples[3]; + uint32 maxSamples = 0; + for (i = 0; i < 3; i++) { + samples[i] = 0; + for (uint j = 0; j < _channel[i]._length; j += 4) { + samples[i] += durationToSamples(READ_BE_UINT16(&_channel[i]._data[j])); + } + if (samples[i] > maxSamples) { + maxSamples = samples[i]; + } + } + + for (i = 0; i < 3; i++) { + _lastNoteSamples[i] = maxSamples - samples[i]; + } + + return true; +} + +bool Player_V5M::getNextNote(int ch, uint32 &samples, int &pitchModifier, byte &velocity) { + if (_channel[ch]._pos >= _channel[ch]._length) { + if (!_channel[ch]._looped) { + _channel[ch]._notesLeft = false; + return false; + } + // FIXME: Jamieson630: The jump seems to be happening + // too quickly! There should maybe be a pause after + // the last Note Off? But I couldn't find one in the + // MI1 Lookout music, where I was hearing problems. + _channel[ch]._pos = 0; + } + uint16 duration = READ_BE_UINT16(&_channel[ch]._data[_channel[ch]._pos]); + byte note = _channel[ch]._data[_channel[ch]._pos + 2]; + samples = durationToSamples(duration); + + if (note != 1) { + _channel[ch]._instrument.newNote(); + } + + if (note > 1) { + pitchModifier = noteToPitchModifier(note, &_channel[ch]._instrument); + velocity = _channel[ch]._data[_channel[ch]._pos + 3]; + } else if (note == 1) { + // This is guesswork, but Monkey Island uses two different + // "special" note values: 0, which is clearly a rest, and 1 + // which is... I thought at first it was a "soft" key off, to + // fade out the note, but listening to the music in a Mac + // emulator (which unfortunately doesn't work all that well), + // I hear no trace of fading out. + // + // It could mean "change the volume on the current note", but + // I can't hear that either, and it always seems to use the + // exact same velocity on this note. + // + // So it appears it really just is a "hold the current note", + // but why? Couldn't they just have made the original note + // longer? + + pitchModifier = _channel[ch]._pitchModifier; + velocity = _channel[ch]._velocity; + } else { + pitchModifier = 0; + velocity = 0; + } + + _channel[ch]._pos += 4; + + if (_channel[ch]._pos >= _channel[ch]._length) { + samples = _lastNoteSamples[ch]; + } + return true; +} + +} // End of namespace Scumm diff --git a/engines/scumm/player_v5m.h b/engines/scumm/player_v5m.h new file mode 100644 index 0000000000..b2079ee331 --- /dev/null +++ b/engines/scumm/player_v5m.h @@ -0,0 +1,57 @@ +/* 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. + * + */ + +#ifndef SCUMM_PLAYER_V5M_H +#define SCUMM_PLAYER_V5M_H + +#include "common/scummsys.h" +#include "common/util.h" +#include "common/mutex.h" +#include "scumm/music.h" +#include "scumm/player_mac.h" +#include "audio/audiostream.h" +#include "audio/mixer.h" + +class Mixer; + +namespace Scumm { + +class ScummEngine; + +/** + * Scumm V5 Macintosh music driver. + */ +class Player_V5M : public Player_Mac { +public: + Player_V5M(ScummEngine *scumm, Audio::Mixer *mixer); + + virtual bool checkMusicAvailable(); + virtual bool loadMusic(const byte *ptr); + virtual bool getNextNote(int ch, uint32 &samples, int &pitchModifier, byte &velocity); + +private: + uint32 _lastNoteSamples[3]; +}; + +} // End of namespace Scumm + +#endif diff --git a/engines/scumm/saveload.cpp b/engines/scumm/saveload.cpp index 72896e097a..3453e53a18 100644 --- a/engines/scumm/saveload.cpp +++ b/engines/scumm/saveload.cpp @@ -1477,9 +1477,13 @@ void ScummEngine::saveOrLoad(Serializer *s) { } - // Save/load FM-Towns audio status - if (_townsPlayer) - _townsPlayer->saveLoadWithSerializer(s); + // + // Save/load music engine status + // + if (_musicEngine) { + _musicEngine->saveLoadWithSerializer(s); + } + // // Save/load the charset renderer state diff --git a/engines/scumm/saveload.h b/engines/scumm/saveload.h index a640bc1e17..7b2ff91ad3 100644 --- a/engines/scumm/saveload.h +++ b/engines/scumm/saveload.h @@ -47,7 +47,7 @@ namespace Scumm { * only saves/loads those which are valid for the version of the savegame * which is being loaded/saved currently. */ -#define CURRENT_VER 93 +#define CURRENT_VER 94 /** * An auxillary macro, used to specify savegame versions. We use this instead @@ -74,7 +74,7 @@ namespace Scumm { * what POD means refer to <http://en.wikipedia.org/wiki/Plain_Old_Data_Structures> or * to <http://www.informit.com/guides/content.asp?g=cplusplus&seqNum=32&rl=1>) */ -#define OFFS(type,item) (((ptrdiff_t)(&((type *)42)->type::item))-42) +#define OFFS(type,item) ((uint32)(((ptrdiff_t)(&((type *)42)->type::item))-42)) /** * Similar to the OFFS macro, this macro computes the size (in bytes) of a @@ -84,19 +84,19 @@ namespace Scumm { // Any item that is still in use automatically gets a maxVersion equal to CURRENT_VER #define MKLINE(type,item,saveas,minVer) {OFFS(type,item),saveas,SIZE(type,item),minVer,CURRENT_VER} -#define MKARRAY(type,item,saveas,dim,minVer) {OFFS(type,item),128|saveas,SIZE(type,item),minVer,CURRENT_VER}, {dim,1,0,0,0} -#define MKARRAY2(type,item,saveas,dim,dim2,rowlen,minVer) {OFFS(type,item),128|saveas,SIZE(type,item),minVer,CURRENT_VER}, {dim,dim2,rowlen,0,0} +#define MKARRAY(type,item,saveas,dim,minVer) {OFFS(type,item),128|saveas,SIZE(type,item),minVer,CURRENT_VER}, {(uint32)(dim),1,0,0,0} +#define MKARRAY2(type,item,saveas,dim,dim2,rowlen,minVer) {OFFS(type,item),128|saveas,SIZE(type,item),minVer,CURRENT_VER}, {(uint32)(dim),(uint32)(dim2),(uint16)(rowlen),0,0} // Use this if you have an entry that used to be smaller: #define MKLINE_OLD(type,item,saveas,minVer,maxVer) {OFFS(type,item),saveas,SIZE(type,item),minVer,maxVer} -#define MKARRAY_OLD(type,item,saveas,dim,minVer,maxVer) {OFFS(type,item),128|saveas,SIZE(type,item),minVer,maxVer}, {dim,1,0,0,0} -#define MKARRAY2_OLD(type,item,saveas,dim,dim2,rowlen,minVer,maxVer) {OFFS(type,item),128|saveas,SIZE(type,item),minVer,maxVer}, {dim,dim2,rowlen,0,0} +#define MKARRAY_OLD(type,item,saveas,dim,minVer,maxVer) {OFFS(type,item),128|saveas,SIZE(type,item),minVer,maxVer}, {(uint32)(dim),1,0,0,0} +#define MKARRAY2_OLD(type,item,saveas,dim,dim2,rowlen,minVer,maxVer) {OFFS(type,item),128|saveas,SIZE(type,item),minVer,maxVer}, {(uint32)(dim),(uint32)(dim2),(uint16)(rowlen),0,0} // An obsolete item/array, to be ignored upon load. We retain the type/item params to make it easier to debug. // Obsolete items have size == 0. #define MK_OBSOLETE(type,item,saveas,minVer,maxVer) {0,saveas,0,minVer,maxVer} -#define MK_OBSOLETE_ARRAY(type,item,saveas,dim,minVer,maxVer) {0,128|saveas,0,minVer,maxVer}, {dim,1,0,0,0} -#define MK_OBSOLETE_ARRAY2(type,item,saveas,dim,dim2,rowlen,minVer,maxVer) {0,128|saveas,0,minVer,maxVer}, {dim,dim2,rowlen,0,0} +#define MK_OBSOLETE_ARRAY(type,item,saveas,dim,minVer,maxVer) {0,128|saveas,0,minVer,maxVer}, {(uint32)(dim),1,0,0,0} +#define MK_OBSOLETE_ARRAY2(type,item,saveas,dim,dim2,rowlen,minVer,maxVer) {0,128|saveas,0,minVer,maxVer}, {(uint32)(dim),(uint32)(dim2),(uint16)(rowlen),0,0} // End marker #define MKEND() {0xFFFF,0xFF,0xFF,0,0} diff --git a/engines/scumm/script.cpp b/engines/scumm/script.cpp index d8c4948ea8..8587fb8092 100644 --- a/engines/scumm/script.cpp +++ b/engines/scumm/script.cpp @@ -1366,9 +1366,15 @@ void ScummEngine::runInputScript(int clickArea, int val, int mode) { // Clicks are handled differently in Indy3 mac: param 2 of the // input script is set to 0 for normal clicks, and to 1 for double clicks. + // The EGA DOS version of Loom also checks that the second click happens + // close enough to the first one, but that seems like overkill. uint32 time = _system->getMillis(); args[2] = (time < _lastInputScriptTime + 500); // 500 ms double click delay _lastInputScriptTime = time; + } else if (_game.id == GID_LOOM && _game.platform == Common::kPlatformMacintosh) { + uint32 time = _system->getMillis(); + VAR(52) = (time < _lastInputScriptTime + 500); // 500 ms double click delay + _lastInputScriptTime = time; } if (verbScript) diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp index 2c79fb8de0..3afeeda13d 100644 --- a/engines/scumm/scumm.cpp +++ b/engines/scumm/scumm.cpp @@ -61,7 +61,9 @@ #include "scumm/player_v2cms.h" #include "scumm/player_v2a.h" #include "scumm/player_v3a.h" +#include "scumm/player_v3m.h" #include "scumm/player_v4a.h" +#include "scumm/player_v5m.h" #include "scumm/resource.h" #include "scumm/he/resource_he.h" #include "scumm/scumm_v0.h" @@ -1819,6 +1821,12 @@ void ScummEngine::setupMusic(int midi) { #endif } else if (_game.platform == Common::kPlatformAmiga && _game.version <= 4) { _musicEngine = new Player_V4A(this, _mixer); + } else if (_game.platform == Common::kPlatformMacintosh && _game.id == GID_LOOM) { + _musicEngine = new Player_V3M(this, _mixer); + ((Player_V3M *)_musicEngine)->init(); + } else if (_game.platform == Common::kPlatformMacintosh && _game.id == GID_MONKEY) { + _musicEngine = new Player_V5M(this, _mixer); + ((Player_V5M *)_musicEngine)->init(); } else if (_game.id == GID_MANIAC && _game.version == 1) { _musicEngine = new Player_V1(this, _mixer, MidiDriver::getMusicType(dev) != MT_PCSPK); } else if (_game.version <= 2) { @@ -1858,6 +1866,8 @@ void ScummEngine::setupMusic(int midi) { if (_sound->_musicType == MDT_ADLIB || _sound->_musicType == MDT_TOWNS || multi_midi) { adlibMidiDriver = MidiDriver::createMidi(MidiDriver::detectDevice(_sound->_musicType == MDT_TOWNS ? MDT_TOWNS : MDT_ADLIB)); adlibMidiDriver->property(MidiDriver::PROP_OLD_ADLIB, (_game.features & GF_SMALL_HEADER) ? 1 : 0); + // Try to use OPL3 mode for Sam&Max when possible. + adlibMidiDriver->property(MidiDriver::PROP_SCUMM_OPL3, (_game.id == GID_SAMNMAX) ? 1 : 0); } else if (_sound->_musicType == MDT_PCSPK) { adlibMidiDriver = new PcSpkDriver(_mixer); } diff --git a/engines/scumm/sound.cpp b/engines/scumm/sound.cpp index a1cecfa0b3..2fe16c5441 100644 --- a/engines/scumm/sound.cpp +++ b/engines/scumm/sound.cpp @@ -346,29 +346,6 @@ void Sound::playSound(int soundID) { warning("Scumm::Sound::playSound: encountered audio resoure with chunk type 'SOUN' and sound type %d", type); } } - else if ((_vm->_game.id == GID_LOOM) && (_vm->_game.platform == Common::kPlatformMacintosh)) { - // Mac version of Loom uses yet another sound format - /* - playSound #9 (room 70) - 000000: 55 00 00 45 73 6f 00 64 01 00 00 00 00 00 00 00 |U..Eso.d........| - 000010: 00 05 00 8e 2a 8f 2d 1c 2a 8f 2a 8f 2d 1c 00 28 |....*.-.*.*.-..(| - 000020: 00 31 00 3a 00 43 00 4c 00 01 00 00 00 01 00 64 |.1.:.C.L.......d| - 000030: 5a 00 01 00 00 00 01 00 64 00 00 01 00 00 00 01 |Z.......d.......| - 000040: 00 64 5a 00 01 00 00 00 01 00 64 5a 00 01 00 00 |.dZ.......dZ....| - 000050: 00 01 00 64 00 00 00 00 00 00 00 07 00 00 00 64 |...d...........d| - 000060: 64 00 00 4e 73 6f 00 64 01 00 00 00 00 00 00 00 |d..Nso.d........| - 000070: 00 05 00 89 3d 57 2d 1c 3d 57 3d 57 2d 1c 00 28 |....=W-.=W=W-..(| - playSound #16 (room 69) - 000000: dc 00 00 a5 73 6f 00 64 01 00 00 00 00 00 00 00 |....so.d........| - 000010: 00 05 00 00 2a 8f 03 e8 03 e8 03 e8 03 e8 00 28 |....*..........(| - 000020: 00 79 00 7f 00 85 00 d6 00 01 00 00 00 19 01 18 |.y..............| - 000030: 2f 00 18 00 01 18 32 00 18 00 01 18 36 00 18 00 |/.....2.....6...| - 000040: 01 18 3b 00 18 00 01 18 3e 00 18 00 01 18 42 00 |..;.....>.....B.| - 000050: 18 00 01 18 47 00 18 00 01 18 4a 00 18 00 01 18 |....G.....J.....| - 000060: 4e 00 10 00 01 18 53 00 10 00 01 18 56 00 10 00 |N.....S.....V...| - 000070: 01 18 5a 00 10 00 02 28 5f 00 01 00 00 00 00 00 |..Z....(_.......| - */ - } else if ((_vm->_game.platform == Common::kPlatformMacintosh) && (_vm->_game.id == GID_INDY3) && READ_BE_UINT16(ptr + 8) == 0x1C) { // Sound format as used in Indy3 EGA Mac. // It seems to be closely related to the Amiga format, see player_v3a.cpp @@ -414,8 +391,7 @@ void Sound::playSound(int soundID) { } else { - if (_vm->_game.id == GID_MONKEY_VGA || _vm->_game.id == GID_MONKEY_EGA - || (_vm->_game.id == GID_MONKEY && _vm->_game.platform == Common::kPlatformMacintosh)) { + if (_vm->_game.id == GID_MONKEY_VGA || _vm->_game.id == GID_MONKEY_EGA) { // Works around the fact that in some places in MonkeyEGA/VGA, // the music is never explicitly stopped. // Rather it seems that starting a new music is supposed to @@ -1086,9 +1062,6 @@ void Sound::saveLoadWithSerializer(Serializer *ser) { #pragma mark --- Sound resource handling --- #pragma mark - -static void convertMac0Resource(ResourceManager *res, ResId idx, byte *src_ptr, int size); - - /* * TODO: The way we handle sound/music resources really is one huge hack. * We probably should reconsider how we do this, and maybe come up with a @@ -1208,11 +1181,9 @@ int ScummEngine::readSoundResource(ResId idx) { case MKTAG('M','a','c','0'): _fileHandle->seek(-12, SEEK_CUR); total_size = _fileHandle->readUint32BE() - 8; - ptr = (byte *)calloc(total_size, 1); + ptr = _res->createResource(rtSound, idx, total_size); _fileHandle->read(ptr, total_size); //dumpResource("sound-", idx, ptr); - convertMac0Resource(_res, idx, ptr, total_size); - free(ptr); return 1; case MKTAG('M','a','c','1'): @@ -1445,219 +1416,6 @@ static byte *writeVLQ(byte *ptr, int value) { return ptr; } -static byte Mac0ToGMInstrument(uint32 type, int &transpose) { - transpose = 0; - switch (type) { - case MKTAG('M','A','R','I'): return 12; - case MKTAG('P','L','U','C'): return 45; - case MKTAG('H','A','R','M'): return 22; - case MKTAG('P','I','P','E'): return 19; - case MKTAG('T','R','O','M'): transpose = -12; return 57; - case MKTAG('S','T','R','I'): return 48; - case MKTAG('H','O','R','N'): return 60; - case MKTAG('V','I','B','E'): return 11; - case MKTAG('S','H','A','K'): return 77; - case MKTAG('P','A','N','P'): return 75; - case MKTAG('W','H','I','S'): return 76; - case MKTAG('O','R','G','A'): return 17; - case MKTAG('B','O','N','G'): return 115; - case MKTAG('B','A','S','S'): transpose = -24; return 35; - default: - error("Unknown Mac0 instrument %s found", tag2str(type)); - } -} - -static void convertMac0Resource(ResourceManager *res, ResId idx, byte *src_ptr, int size) { - /* - From Markus Magnuson (superqult) we got this information: - Mac0 - --- - 4 bytes - 'SOUN' - BE 4 bytes - block length - - 4 bytes - 'Mac0' - BE 4 bytes - (blockLength - 27) - 28 bytes - ??? - - do this three times (once for each channel): - 4 bytes - 'Chan' - BE 4 bytes - channel length - 4 bytes - instrument name (e.g. 'MARI') - - do this for ((chanLength-24)/4) times: - 2 bytes - note duration - 1 byte - note value - 1 byte - note velocity - - 4 bytes - ??? - 4 bytes - 'Loop'/'Done' - 4 bytes - ??? - - 1 byte - 0x09 - --- - - Instruments (General Midi): - "MARI" - Marimba (12) - "PLUC" - Pizzicato Strings (45) - "HARM" - Harmonica (22) - "PIPE" - Church Organ? (19) or Flute? (73) or Bag Pipe (109) - "TROM" - Trombone (57) - "STRI" - String Ensemble (48 or 49) - "HORN" - French Horn? (60) or English Horn? (69) - "VIBE" - Vibraphone (11) - "SHAK" - Shakuhachi? (77) - "PANP" - Pan Flute (75) - "WHIS" - Whistle (78) / Bottle (76) - "ORGA" - Drawbar Organ (16; but could also be 17-20) - "BONG" - Woodblock? (115) - "BASS" - Bass (32-39) - - - Now the task could be to convert this into MIDI, to be fed into iMuse. - Or we do something similiar to what is done in Player_V3, assuming - we can identify SFX in the MI datafiles for each of the instruments - listed above. - */ - -#if 0 - byte *ptr = _res->createResource(rtSound, idx, size); - memcpy(ptr, src_ptr, size); -#else - const int ppqn = 480; - byte *ptr, *start_ptr; - - int total_size = 0; - total_size += kMIDIHeaderSize; // Header - total_size += 7; // Tempo META - total_size += 3 * 3; // Three program change mesages - total_size += 22; // Possible jump SysEx - total_size += 5; // EOT META - - int i, len; - byte track_instr[3]; - byte *track_data[3]; - int track_len[3]; - int track_transpose[3]; - bool looped = false; - - src_ptr += 8; - // TODO: Decipher the unknown bytes in the header. For now, skip 'em - src_ptr += 28; - - // Parse the three channels - for (i = 0; i < 3; i++) { - assert(READ_BE_UINT32(src_ptr) == MKTAG('C','h','a','n')); - len = READ_BE_UINT32(src_ptr + 4); - track_len[i] = len - 24; - track_instr[i] = Mac0ToGMInstrument(READ_BE_UINT32(src_ptr + 8), track_transpose[i]); - track_data[i] = src_ptr + 12; - src_ptr += len; - looped = (READ_BE_UINT32(src_ptr - 8) == MKTAG('L','o','o','p')); - - // For each note event, we need up to 6 bytes for the - // Note On (3 VLQ, 3 event), and 6 bytes for the Note - // Off (3 VLQ, 3 event). So 12 bytes total. - total_size += 12 * track_len[i]; - } - assert(*src_ptr == 0x09); - - // Create sound resource - start_ptr = res->createResource(rtSound, idx, total_size); - - // Insert MIDI header - ptr = writeMIDIHeader(start_ptr, "GMD ", ppqn, total_size); - - // Write a tempo change Meta event - // 473 / 4 Hz, convert to micro seconds. - uint32 dw = 1000000 * 437 / 4 / ppqn; // 1000000 * ppqn * 4 / 473; - memcpy(ptr, "\x00\xFF\x51\x03", 4); ptr += 4; - *ptr++ = (byte)((dw >> 16) & 0xFF); - *ptr++ = (byte)((dw >> 8) & 0xFF); - *ptr++ = (byte)(dw & 0xFF); - - // Insert program change messages - *ptr++ = 0; // VLQ - *ptr++ = 0xC0; - *ptr++ = track_instr[0]; - *ptr++ = 0; // VLQ - *ptr++ = 0xC1; - *ptr++ = track_instr[1]; - *ptr++ = 0; // VLQ - *ptr++ = 0xC2; - *ptr++ = track_instr[2]; - - // And now, the actual composition. Please turn all cell phones - // and pagers off during the performance. Thank you. - uint16 nextTime[3] = { 1, 1, 1 }; - int stage[3] = { 0, 0, 0 }; - - while (track_len[0] | track_len[1] | track_len[2]) { - int best = -1; - uint16 bestTime = 0xFFFF; - for (i = 0; i < 3; ++i) { - if (track_len[i] && nextTime[i] < bestTime) { - bestTime = nextTime[i]; - best = i; - } - } - assert (best != -1); - - if (!stage[best]) { - // We are STARTING this event. - if (track_data[best][2] > 1) { - // Note On - ptr = writeVLQ(ptr, nextTime[best]); - *ptr++ = 0x90 | best; - *ptr++ = track_data[best][2] + track_transpose[best]; - *ptr++ = track_data[best][3] * 127 / 100; // Scale velocity - for (i = 0; i < 3; ++i) - nextTime[i] -= bestTime; - } - nextTime[best] += READ_BE_UINT16 (track_data[best]); - stage[best] = 1; - } else { - // We are ENDING this event. - if (track_data[best][2] > 1) { - // There was a Note On, so do a Note Off - ptr = writeVLQ(ptr, nextTime[best]); - *ptr++ = 0x80 | best; - *ptr++ = track_data[best][2] + track_transpose[best]; - *ptr++ = track_data[best][3] * 127 / 100; // Scale velocity - for (i = 0; i < 3; ++i) - nextTime[i] -= bestTime; - } - track_data[best] += 4; - track_len[best] -= 4; - stage[best] = 0; - } - } - - // Is this a looped song? If so, effect a loop by - // using the S&M maybe_jump SysEx command. - // FIXME: Jamieson630: The jump seems to be happening - // too quickly! There should maybe be a pause after - // the last Note Off? But I couldn't find one in the - // MI1 Lookout music, where I was hearing problems. - if (looped) { - memcpy(ptr, "\x00\xf0\x13\x7d\x30\00", 6); ptr += 6; // maybe_jump - memcpy(ptr, "\x00\x00", 2); ptr += 2; // cmd -> 0 means always jump - memcpy(ptr, "\x00\x00\x00\x00", 4); ptr += 4; // track -> 0 (only track) - memcpy(ptr, "\x00\x00\x00\x01", 4); ptr += 4; // beat -> 1 (first beat) - memcpy(ptr, "\x00\x00\x00\x01", 4); ptr += 4; // tick -> 1 - memcpy(ptr, "\x00\xf7", 2); ptr += 2; // SysEx end marker - } - - // Insert end of song META - memcpy(ptr, "\x00\xff\x2f\x00\x00", 5); ptr += 5; - - assert(ptr <= start_ptr + total_size); - - // Rewrite MIDI header, this time with true size - total_size = ptr - start_ptr; - ptr = writeMIDIHeader(start_ptr, "GMD ", ppqn, total_size); -#endif -} - static void convertADResource(ResourceManager *res, const GameSettings& game, ResId idx, byte *src_ptr, int size) { // We will ignore the PPQN in the original resource, because // it's invalid anyway. We use a constant PPQN of 480. diff --git a/engines/sky/compact.cpp b/engines/sky/compact.cpp index cf9bd55b1a..ee165934a0 100644 --- a/engines/sky/compact.cpp +++ b/engines/sky/compact.cpp @@ -34,7 +34,7 @@ namespace Sky { #define SKY_CPT_SIZE 419427 -#define OFFS(type,item) (((ptrdiff_t)(&((type *)42)->item))-42) +#define OFFS(type,item) ((uint32)(((ptrdiff_t)(&((type *)42)->item))-42)) #define MK32(type,item) OFFS(type, item),0,0,0 #define MK16(type,item) OFFS(type, item),0 #define MK32_A5(type, item) MK32(type, item[0]), MK32(type, item[1]), \ diff --git a/engines/sword1/detection.cpp b/engines/sword1/detection.cpp index 5662e4672b..f3af04c81d 100644 --- a/engines/sword1/detection.cpp +++ b/engines/sword1/detection.cpp @@ -143,9 +143,24 @@ GameDescriptor SwordMetaEngine::findGame(const char *gameid) const { return GameDescriptor(); } -void Sword1CheckDirectory(const Common::FSList &fslist, bool *filesFound) { +void Sword1CheckDirectory(const Common::FSList &fslist, bool *filesFound, bool recursion = false) { for (Common::FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) { if (!file->isDirectory()) { + // The required game data files can be located in the game directory, or in + // a subdirectory called "clusters". In the latter case, we don't want to + // detect the game in that subdirectory, as this will detect the game twice + // when mass add is searching inside a directory. In this case, the first + // result (the game directory) will be correct, but the second result (the + // clusters subdirectory) will be wrong, as the optional speech, music and + // video data files will be ignored. Note that this fix will skip the game + // data files if the user has placed them inside a "clusters" subdirectory, + // or if he/she points ScummVM directly to the "clusters" directory of the + // game CD. Fixes bug #3049346. + Common::String directory = file->getParent().getName(); + directory.toLowercase(); + if (directory.hasPrefix("clusters") && directory.size() <= 9 && !recursion) + continue; + const char *fileName = file->getName().c_str(); for (int cnt = 0; cnt < NUM_FILES_TO_CHECK; cnt++) if (scumm_stricmp(fileName, g_filesToCheck[cnt]) == 0) @@ -155,7 +170,7 @@ void Sword1CheckDirectory(const Common::FSList &fslist, bool *filesFound) { if (scumm_stricmp(file->getName().c_str(), g_dirNames[cnt]) == 0) { Common::FSList fslist2; if (file->getChildren(fslist2, Common::FSNode::kListFilesOnly)) - Sword1CheckDirectory(fslist2, filesFound); + Sword1CheckDirectory(fslist2, filesFound, true); } } } diff --git a/engines/sword2/sword2.cpp b/engines/sword2/sword2.cpp index 458a2d33ed..dfa6a23320 100644 --- a/engines/sword2/sword2.cpp +++ b/engines/sword2/sword2.cpp @@ -144,22 +144,52 @@ GameDescriptor Sword2MetaEngine::findGame(const char *gameid) const { return GameDescriptor(g->gameid, g->description); } -GameList Sword2MetaEngine::detectGames(const Common::FSList &fslist) const { +bool isFullGame(const Common::FSList &fslist) { + Common::FSList::const_iterator file; + + // We distinguish between the two versions by the presense of paris.clu + for (file = fslist.begin(); file != fslist.end(); ++file) { + if (!file->isDirectory()) { + if (file->getName().equalsIgnoreCase("paris.clu")) + return true; + } + } + + return false; +} + +GameList detectGamesImpl(const Common::FSList &fslist, bool recursion = false) { GameList detectedGames; const Sword2::GameSettings *g; Common::FSList::const_iterator file; - - // TODO: It would be nice if we had code here which distinguishes - // between the 'sword2' and 'sword2demo' targets. The current code - // can't do that since they use the same detectname. + bool isFullVersion = isFullGame(fslist); for (g = Sword2::sword2_settings; g->gameid; ++g) { // Iterate over all files in the given directory for (file = fslist.begin(); file != fslist.end(); ++file) { if (!file->isDirectory()) { - const char *fileName = file->getName().c_str(); + // The required game data files can be located in the game directory, or in + // a subdirectory called "clusters". In the latter case, we don't want to + // detect the game in that subdirectory, as this will detect the game twice + // when mass add is searching inside a directory. In this case, the first + // result (the game directory) will be correct, but the second result (the + // clusters subdirectory) will be wrong, as the optional speech, music and + // video data files will be ignored. Note that this fix will skip the game + // data files if the user has placed them inside a "clusters" subdirectory, + // or if he/she points ScummVM directly to the "clusters" directory of the + // game CD. Fixes bug #3049336. + Common::String directory = file->getParent().getName(); + directory.toLowercase(); + if (directory.hasPrefix("clusters") && directory.size() <= 9 && !recursion) + continue; + + if (file->getName().equalsIgnoreCase(g->detectname)) { + // Make sure that the sword2 demo is not mixed up with the + // full version, since they use the same filename for detection + if ((g->features == Sword2::GF_DEMO && isFullVersion) || + (g->features == 0 && !isFullVersion)) + continue; - if (0 == scumm_stricmp(g->detectname, fileName)) { // Match found, add to list of candidates, then abort inner loop. detectedGames.push_back(GameDescriptor(g->gameid, g->description, Common::UNK_LANG, Common::kPlatformUnknown, GUIO2(GUIO_NOMIDI, GUIO_NOASPECT))); break; @@ -174,12 +204,10 @@ GameList Sword2MetaEngine::detectGames(const Common::FSList &fslist) const { // present e.g. if the user copied the data straight from CD. for (file = fslist.begin(); file != fslist.end(); ++file) { if (file->isDirectory()) { - const char *fileName = file->getName().c_str(); - - if (0 == scumm_stricmp("clusters", fileName)) { + if (file->getName().equalsIgnoreCase("clusters")) { Common::FSList recList; if (file->getChildren(recList, Common::FSNode::kListAll)) { - GameList recGames(detectGames(recList)); + GameList recGames(detectGamesImpl(recList, true)); if (!recGames.empty()) { detectedGames.push_back(recGames); break; @@ -194,6 +222,10 @@ GameList Sword2MetaEngine::detectGames(const Common::FSList &fslist) const { return detectedGames; } +GameList Sword2MetaEngine::detectGames(const Common::FSList &fslist) const { + return detectGamesImpl(fslist); +} + SaveStateList Sword2MetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; diff --git a/engines/sword25/gfx/graphicengine.cpp b/engines/sword25/gfx/graphicengine.cpp index 6f5da32bc4..216d801f3e 100644 --- a/engines/sword25/gfx/graphicengine.cpp +++ b/engines/sword25/gfx/graphicengine.cpp @@ -376,10 +376,10 @@ bool GraphicEngine::saveThumbnailScreenshot(const Common::String &filename) { void GraphicEngine::ARGBColorToLuaColor(lua_State *L, uint color) { lua_Number components[4] = { - (color >> 16) & 0xff, // Rot - (color >> 8) & 0xff, // Grün - color & 0xff, // Blau - color >> 24, // Alpha + (lua_Number)((color >> 16) & 0xff), // Rot + (lua_Number)((color >> 8) & 0xff), // Grün + (lua_Number)(color & 0xff), // Blau + (lua_Number)(color >> 24), // Alpha }; lua_newtable(L); diff --git a/engines/sword25/util/lua/ldo.cpp b/engines/sword25/util/lua/ldo.cpp index 5d9667f4f0..c162a62e98 100644 --- a/engines/sword25/util/lua/ldo.cpp +++ b/engines/sword25/util/lua/ldo.cpp @@ -6,12 +6,10 @@ // FIXME: LUAI_THROW and LUAI_TRY use either throw/catch or setjmp/longjmp. -// Neither of these is supported in ScummVM. So we need to come up -// with a replacement. The most simple, direct and crude approach: -// Replace "throw" with an "error()" call. Of course we only -// would want to do that if this actually never happens... -#define FORBIDDEN_SYMBOL_EXCEPTION_setjmp -#define FORBIDDEN_SYMBOL_EXCEPTION_longjmp +// Neither of these is supported in ScummVM. Calls to LUAI_THROW have been +// replaced with error() in ScummVM, but the calls to LUAI_TRY remain +#define FORBIDDEN_SYMBOL_EXCEPTION_setjmp // for LUAI_TRY, i.e. try() +#define FORBIDDEN_SYMBOL_EXCEPTION_longjmp // for LUAI_TRY and LUAI_THROW, i.e. throw() #include "common/textconsole.h" @@ -103,12 +101,10 @@ static void resetstack (lua_State *L, int status) { void luaD_throw (lua_State *L, int errcode) { if (L->errorJmp) { L->errorJmp->status = errcode; - // FIXME: LUAI_THROW and LUAI_TRY use either throw/catch or setjmp/longjmp. - // Neither of these is supported in ScummVM. So we need to come up - // with a replacement. The most simple, direct and crude approach: - // Replace "throw" with an "error()" call. Of course we only - // would want to do that if this actually never happens... - LUAI_THROW(L, L->errorJmp); + // LUAI_THROW has been replaced with an error message in ScummVM, together + // with the LUA error code and description + //LUAI_THROW(L, L->errorJmp); + error("LUA error occured, error code is %d (%s)", errcode, luaErrorDescription[errcode]); } else { L->status = cast_byte(errcode); @@ -129,9 +125,8 @@ int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) { L->errorJmp = &lj; // FIXME: LUAI_THROW and LUAI_TRY use either throw/catch or setjmp/longjmp. // Neither of these is supported in ScummVM. So we need to come up - // with a replacement. The most simple, direct and crude approach: - // Replace "throw" with an "error()" call. Of course we only - // would want to do that if this actually never happens... + // with a replacement. Calls to LUAI_THROW have been replaced with error() + // in ScummVM, but the calls to LUAI_TRY remain LUAI_TRY(L, &lj, (*f)(L, ud); ); diff --git a/engines/sword25/util/lua/llex.cpp b/engines/sword25/util/lua/llex.cpp index f8433d3afa..423f0285ca 100644 --- a/engines/sword25/util/lua/llex.cpp +++ b/engines/sword25/util/lua/llex.cpp @@ -4,6 +4,8 @@ ** See Copyright Notice in lua.h */ +// FIXME: Do not directly use iscntrl from ctype.h. +#define FORBIDDEN_SYMBOL_EXCEPTION_iscntrl #include "common/util.h" diff --git a/engines/sword25/util/lua/lua.h b/engines/sword25/util/lua/lua.h index 08ad80d70f..768ec1ad74 100644 --- a/engines/sword25/util/lua/lua.h +++ b/engines/sword25/util/lua/lua.h @@ -48,6 +48,15 @@ #define LUA_ERRMEM 4 #define LUA_ERRERR 5 +// Added in ScummVM. Refer to http://www.lua.org/manual/5.1/manual.html +static const char* luaErrorDescription[] = { + "No error", + "Coroutine yield", // not an actual error, see lua_resume + "Runtime error", + "Syntax error during pre-compilation", // refer to lua_load + "Memory allocation error", + "Error while running the error handler function" +}; typedef struct lua_State lua_State; diff --git a/engines/sword25/util/lua/luaconf.h b/engines/sword25/util/lua/luaconf.h index 53d0f55290..fb85983998 100644 --- a/engines/sword25/util/lua/luaconf.h +++ b/engines/sword25/util/lua/luaconf.h @@ -621,7 +621,7 @@ union luai_Cast { double l_d; long l_l; }; #else /* default handling with long jumps */ -#define LUAI_THROW(L,c) longjmp((c)->b, 1) +//#define LUAI_THROW(L,c) longjmp((c)->b, 1) // replaced with error() in ScummVM #define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) { a } #define luai_jmpbuf jmp_buf diff --git a/engines/testbed/config-params.cpp b/engines/testbed/config-params.cpp index d7ead48f63..e89da0b07f 100644 --- a/engines/testbed/config-params.cpp +++ b/engines/testbed/config-params.cpp @@ -69,4 +69,4 @@ void ConfigParams::deleteWriteStream() { } } -} // End of namespace Testbed +} // End of namespace Testbed diff --git a/engines/testbed/config.cpp b/engines/testbed/config.cpp index 6bd4c82b41..6b56616c9b 100644 --- a/engines/testbed/config.cpp +++ b/engines/testbed/config.cpp @@ -304,4 +304,4 @@ void TestbedConfigManager::selectTestsuites() { _configFileInterface.clear(); } -} // End of namespace Testbed +} // End of namespace Testbed diff --git a/engines/testbed/sound.cpp b/engines/testbed/sound.cpp index bb7ae2c055..5af1d8ca31 100644 --- a/engines/testbed/sound.cpp +++ b/engines/testbed/sound.cpp @@ -277,4 +277,4 @@ SoundSubsystemTestSuite::SoundSubsystemTestSuite() { addTest("SampleRates", &SoundSubsystem::sampleRates, true); } -} // End of namespace Testbed +} // End of namespace Testbed diff --git a/engines/tinsel/actors.cpp b/engines/tinsel/actors.cpp index 0ba8b7cdba..531a8e3d12 100644 --- a/engines/tinsel/actors.cpp +++ b/engines/tinsel/actors.cpp @@ -406,7 +406,7 @@ void ActorEvent(CORO_PARAM, int ano, TINSEL_EVENT tEvent, bool bWait, int myEsca * @param bRunScript Flag for whether to run actor's script for the scene */ void StartActor(const T1_ACTOR_STRUC *as, bool bRunScript) { - SCNHANDLE hActorId = FROM_LE_32(as->hActorId); + SCNHANDLE hActorId = FROM_32(as->hActorId); // Zero-out many things actorInfo[hActorId - 1].bHidden = false; @@ -418,15 +418,15 @@ void StartActor(const T1_ACTOR_STRUC *as, bool bRunScript) { actorInfo[hActorId - 1].presObj = NULL; // Store current scene's parameters for this actor - actorInfo[hActorId - 1].mtype = FROM_LE_32(as->masking); - actorInfo[hActorId - 1].actorCode = FROM_LE_32(as->hActorCode); + actorInfo[hActorId - 1].mtype = FROM_32(as->masking); + actorInfo[hActorId - 1].actorCode = FROM_32(as->hActorCode); // Run actor's script for this scene if (bRunScript) { if (bActorsOn) actorInfo[hActorId - 1].bAlive = true; - if (actorInfo[hActorId - 1].bAlive && FROM_LE_32(as->hActorCode)) + if (actorInfo[hActorId - 1].bAlive && FROM_32(as->hActorCode)) ActorEvent(hActorId, STARTUP, PLR_NOEVENT); } } @@ -465,11 +465,11 @@ void StartTaggedActors(SCNHANDLE ah, int numActors, bool bRunScript) { assert(as->hActorCode); // Store current scene's parameters for this tagged actor - taggedActors[i].id = FROM_LE_32(as->hActorId); - taggedActors[i].hTagText = FROM_LE_32(as->hTagText); - taggedActors[i].tagPortionV = FROM_LE_32(as->tagPortionV); - taggedActors[i].tagPortionH = FROM_LE_32(as->tagPortionH); - taggedActors[i].hActorCode = FROM_LE_32(as->hActorCode); + taggedActors[i].id = FROM_32(as->hActorId); + taggedActors[i].hTagText = FROM_32(as->hTagText); + taggedActors[i].tagPortionV = FROM_32(as->tagPortionV); + taggedActors[i].tagPortionH = FROM_32(as->tagPortionH); + taggedActors[i].hActorCode = FROM_32(as->hActorCode); // Run actor's script for this scene if (bRunScript) { @@ -1310,9 +1310,9 @@ void SetActorRGB(int ano, COLORREF color) { assert(ano >= 0 && ano <= NumActors); if (ano) - actorInfo[ano - 1].textColor = TO_LE_32(color); + actorInfo[ano - 1].textColor = TO_32(color); else - defaultColor = TO_LE_32(color); + defaultColor = TO_32(color); } /** diff --git a/engines/tinsel/anim.cpp b/engines/tinsel/anim.cpp index 034296ccc7..a1ec02186c 100644 --- a/engines/tinsel/anim.cpp +++ b/engines/tinsel/anim.cpp @@ -44,9 +44,9 @@ SCRIPTSTATE DoNextFrame(ANIM *pAnim) { while (1) { // repeat until a real image debugC(DEBUG_DETAILED, kTinselDebugAnimations, "DoNextFrame %ph index=%d, op=%xh", (byte *)pAnim, pAnim->scriptIndex, - FROM_LE_32(pAni[pAnim->scriptIndex].op)); + FROM_32(pAni[pAnim->scriptIndex].op)); - switch ((int32)FROM_LE_32(pAni[pAnim->scriptIndex].op)) { + switch ((int32)FROM_32(pAni[pAnim->scriptIndex].op)) { case ANI_END: // end of animation script // move to next opcode @@ -61,7 +61,7 @@ SCRIPTSTATE DoNextFrame(ANIM *pAnim) { pAnim->scriptIndex++; // jump to new frame position - pAnim->scriptIndex += (int32)FROM_LE_32(pAni[pAnim->scriptIndex].op); + pAnim->scriptIndex += (int32)FROM_32(pAni[pAnim->scriptIndex].op); // go fetch a real image break; @@ -101,7 +101,7 @@ SCRIPTSTATE DoNextFrame(ANIM *pAnim) { // move to x adjustment operand pAnim->scriptIndex++; - MultiAdjustXY(pAnim->pObject, (int32)FROM_LE_32(pAni[pAnim->scriptIndex].op), 0); + MultiAdjustXY(pAnim->pObject, (int32)FROM_32(pAni[pAnim->scriptIndex].op), 0); // next opcode pAnim->scriptIndex++; @@ -114,7 +114,7 @@ SCRIPTSTATE DoNextFrame(ANIM *pAnim) { // move to y adjustment operand pAnim->scriptIndex++; - MultiAdjustXY(pAnim->pObject, 0, (int32)FROM_LE_32(pAni[pAnim->scriptIndex].op)); + MultiAdjustXY(pAnim->pObject, 0, (int32)FROM_32(pAni[pAnim->scriptIndex].op)); // next opcode pAnim->scriptIndex++; @@ -128,11 +128,11 @@ SCRIPTSTATE DoNextFrame(ANIM *pAnim) { // move to x adjustment operand pAnim->scriptIndex++; - x = (int32)FROM_LE_32(pAni[pAnim->scriptIndex].op); + x = (int32)FROM_32(pAni[pAnim->scriptIndex].op); // move to y adjustment operand pAnim->scriptIndex++; - y = (int32)FROM_LE_32(pAni[pAnim->scriptIndex].op); + y = (int32)FROM_32(pAni[pAnim->scriptIndex].op); MultiAdjustXY(pAnim->pObject, x, y); @@ -189,7 +189,7 @@ SCRIPTSTATE DoNextFrame(ANIM *pAnim) { default: // must be an actual animation frame handle // set objects new animation frame - pAnim->pObject->hShape = FROM_LE_32(pAni[pAnim->scriptIndex].hFrame); + pAnim->pObject->hShape = FROM_32(pAni[pAnim->scriptIndex].hFrame); // re-shape the object MultiReshape(pAnim->pObject); @@ -273,7 +273,7 @@ void SkipFrames(ANIM *pAnim, int numFrames) { while (1) { // repeat until a real image - switch ((int32)FROM_LE_32(pAni[pAnim->scriptIndex].op)) { + switch ((int32)FROM_32(pAni[pAnim->scriptIndex].op)) { case ANI_END: // end of animation script // going off the end is probably a error, but only in Tinsel 1 if (!TinselV2) @@ -286,7 +286,7 @@ void SkipFrames(ANIM *pAnim, int numFrames) { pAnim->scriptIndex++; // jump to new frame position - pAnim->scriptIndex += (int32)FROM_LE_32(pAni[pAnim->scriptIndex].op); + pAnim->scriptIndex += (int32)FROM_32(pAni[pAnim->scriptIndex].op); if (TinselV2) // Done if skip to jump @@ -323,7 +323,7 @@ void SkipFrames(ANIM *pAnim, int numFrames) { // move to x adjustment operand pAnim->scriptIndex++; - MultiAdjustXY(pAnim->pObject, (int32)FROM_LE_32(pAni[pAnim->scriptIndex].op), 0); + MultiAdjustXY(pAnim->pObject, (int32)FROM_32(pAni[pAnim->scriptIndex].op), 0); // next opcode pAnim->scriptIndex++; @@ -334,7 +334,7 @@ void SkipFrames(ANIM *pAnim, int numFrames) { // move to y adjustment operand pAnim->scriptIndex++; - MultiAdjustXY(pAnim->pObject, 0, (int32)FROM_LE_32(pAni[pAnim->scriptIndex].op)); + MultiAdjustXY(pAnim->pObject, 0, (int32)FROM_32(pAni[pAnim->scriptIndex].op)); // next opcode pAnim->scriptIndex++; @@ -346,11 +346,11 @@ void SkipFrames(ANIM *pAnim, int numFrames) { // move to x adjustment operand pAnim->scriptIndex++; - x = (int32)FROM_LE_32(pAni[pAnim->scriptIndex].op); + x = (int32)FROM_32(pAni[pAnim->scriptIndex].op); // move to y adjustment operand pAnim->scriptIndex++; - y = (int32)FROM_LE_32(pAni[pAnim->scriptIndex].op); + y = (int32)FROM_32(pAni[pAnim->scriptIndex].op); MultiAdjustXY(pAnim->pObject, x, y); @@ -389,7 +389,7 @@ void SkipFrames(ANIM *pAnim, int numFrames) { pAnim->scriptIndex++; } else { // set objects new animation frame - pAnim->pObject->hShape = FROM_LE_32(pAni[pAnim->scriptIndex].hFrame); + pAnim->pObject->hShape = FROM_32(pAni[pAnim->scriptIndex].hFrame); // re-shape the object MultiReshape(pAnim->pObject); @@ -414,7 +414,7 @@ bool AboutToJumpOrEnd(PANIM pAnim) { for (;;) { // repeat until a real image - switch (FROM_LE_32(pAni[zzz].op)) { + switch (FROM_32(pAni[zzz].op)) { case ANI_END: // end of animation script case ANI_JUMP: // do animation jump return true; diff --git a/engines/tinsel/bg.cpp b/engines/tinsel/bg.cpp index a3e21a8227..ed15bfef2a 100644 --- a/engines/tinsel/bg.cpp +++ b/engines/tinsel/bg.cpp @@ -124,28 +124,28 @@ static void BGmainProcess(CORO_PARAM, const void *param) { pReel = (const FREEL *)param; // Get the MULTI_INIT structure - pmi = (const MULTI_INIT *)LockMem(FROM_LE_32(pReel->mobj)); + pmi = (const MULTI_INIT *)LockMem(FROM_32(pReel->mobj)); // Initialize and insert the object, and initialize its script. g_pBG[0] = MultiInitObject(pmi); MultiInsertObject(GetPlayfieldList(FIELD_WORLD), g_pBG[0]); - InitStepAnimScript(&g_thisAnim[0], g_pBG[0], FROM_LE_32(pReel->script), g_BGspeed); + InitStepAnimScript(&g_thisAnim[0], g_pBG[0], FROM_32(pReel->script), g_BGspeed); g_bgReels = 1; } else { /*** At start of scene ***/ pFilm = (const FILM *)LockMem(g_hBackground); - g_bgReels = FROM_LE_32(pFilm->numreels); + g_bgReels = FROM_32(pFilm->numreels); int i; for (i = 0; i < g_bgReels; i++) { // Get the MULTI_INIT structure - pmi = (PMULTI_INIT) LockMem(FROM_LE_32(pFilm->reels[i].mobj)); + pmi = (PMULTI_INIT) LockMem(FROM_32(pFilm->reels[i].mobj)); // Initialize and insert the object, and initialize its script. g_pBG[i] = MultiInitObject(pmi); MultiInsertObject(GetPlayfieldList(FIELD_WORLD), g_pBG[i]); MultiSetZPosition(g_pBG[i], 0); - InitStepAnimScript(&g_thisAnim[i], g_pBG[i], FROM_LE_32(pFilm->reels[i].script), g_BGspeed); + InitStepAnimScript(&g_thisAnim[i], g_pBG[i], FROM_32(pFilm->reels[i].script), g_BGspeed); if (i > 0) g_pBG[i-1]->pSlave = g_pBG[i]; @@ -170,11 +170,11 @@ static void BGmainProcess(CORO_PARAM, const void *param) { // New background during scene if (!TinselV2) { pReel = (const FREEL *)param; - InitStepAnimScript(&g_thisAnim[0], g_pBG[0], FROM_LE_32(pReel->script), g_BGspeed); + InitStepAnimScript(&g_thisAnim[0], g_pBG[0], FROM_32(pReel->script), g_BGspeed); StepAnimScript(&g_thisAnim[0]); } else { pFilm = (const FILM *)LockMem(g_hBackground); - assert(g_bgReels == (int32)FROM_LE_32(pFilm->numreels)); + assert(g_bgReels == (int32)FROM_32(pFilm->numreels)); // Just re-initialize the scripts. for (int i = 0; i < g_bgReels; i++) { @@ -198,7 +198,7 @@ static void BGotherProcess(CORO_PARAM, const void *param) { CORO_END_CONTEXT(_ctx); const FREEL *pReel = (const FREEL *)param; - const MULTI_INIT *pmi = (const MULTI_INIT *)LockMem(FROM_LE_32(pReel->mobj)); + const MULTI_INIT *pmi = (const MULTI_INIT *)LockMem(FROM_32(pReel->mobj)); CORO_BEGIN_CODE(_ctx); @@ -206,7 +206,7 @@ static void BGotherProcess(CORO_PARAM, const void *param) { _ctx->pObj = MultiInitObject(pmi); MultiInsertObject(GetPlayfieldList(FIELD_WORLD), _ctx->pObj); - InitStepAnimScript(&_ctx->anim, g_pBG[0], FROM_LE_32(pReel->script), g_BGspeed); + InitStepAnimScript(&_ctx->anim, g_pBG[0], FROM_32(pReel->script), g_BGspeed); while (StepAnimScript(&_ctx->anim) != ScriptFinished) CORO_SLEEP(1); @@ -249,16 +249,16 @@ void StartupBackground(CORO_PARAM, SCNHANDLE hFilm) { pim = GetImageFromFilm(hFilm, 0, NULL, NULL, &pfilm); - SetBackPal(FROM_LE_32(pim->hImgPal)); + SetBackPal(FROM_32(pim->hImgPal)); // Extract the film speed - g_BGspeed = ONE_SECOND / FROM_LE_32(pfilm->frate); + g_BGspeed = ONE_SECOND / FROM_32(pfilm->frate); // Start display process for each reel in the film CoroScheduler.createProcess(PID_REEL, BGmainProcess, &pfilm->reels[0], sizeof(FREEL)); if (TinselV0) { - for (uint i = 1; i < FROM_LE_32(pfilm->numreels); ++i) + for (uint i = 1; i < FROM_32(pfilm->numreels); ++i) CoroScheduler.createProcess(PID_REEL, BGotherProcess, &pfilm->reels[i], sizeof(FREEL)); } diff --git a/engines/tinsel/bmv.cpp b/engines/tinsel/bmv.cpp index 438fd52a81..106e1542d5 100644 --- a/engines/tinsel/bmv.cpp +++ b/engines/tinsel/bmv.cpp @@ -529,9 +529,9 @@ int BMVPlayer::MovieCommand(char cmd, int commandOffset) { if (cmd & CD_PRINT) { PRINT_CMD *pCmd = (PRINT_CMD *)(bigBuffer + commandOffset); - MovieText(Common::nullContext, (int16)READ_LE_UINT16(&pCmd->stringId), - (int16)READ_LE_UINT16(&pCmd->x), - (int16)READ_LE_UINT16(&pCmd->y), + MovieText(Common::nullContext, (int16)READ_16(&pCmd->stringId), + (int16)READ_16(&pCmd->x), + (int16)READ_16(&pCmd->y), pCmd->fontId, NULL, pCmd->duration); @@ -542,9 +542,9 @@ int BMVPlayer::MovieCommand(char cmd, int commandOffset) { TALK_CMD *pCmd = (TALK_CMD *)(bigBuffer + commandOffset); talkColor = TINSEL_RGB(pCmd->r, pCmd->g, pCmd->b); - MovieText(Common::nullContext, (int16)READ_LE_UINT16(&pCmd->stringId), - (int16)READ_LE_UINT16(&pCmd->x), - (int16)READ_LE_UINT16(&pCmd->y), + MovieText(Common::nullContext, (int16)READ_16(&pCmd->stringId), + (int16)READ_16(&pCmd->x), + (int16)READ_16(&pCmd->y), 0, &talkColor, pCmd->duration); @@ -622,7 +622,7 @@ int BMVPlayer::FollowingPacket(int thisPacket, bool bReallyImportant) { if (nextReadSlot*SLOT_SIZE >= thisPacket && thisPacket+3 >= nextReadSlot*SLOT_SIZE) return thisPacket + 3; } - length = (int32)READ_LE_UINT32(bigBuffer + thisPacket + 1); + length = (int32)READ_32(bigBuffer + thisPacket + 1); length &= 0x00ffffff; return thisPacket + length + 4; } @@ -886,7 +886,7 @@ bool BMVPlayer::DoBMVFrame() { return true; default: - length = (int32)READ_LE_UINT32(data + 1); + length = (int32)READ_32(data + 1); length &= 0x00ffffff; graphOffset = nextUseOffset + 4; // Skip command byte and length @@ -922,7 +922,7 @@ bool BMVPlayer::DoBMVFrame() { } if (*data & CD_XSCR) { - xscr = (int16)READ_LE_UINT16(bigBuffer + graphOffset); + xscr = (int16)READ_16(bigBuffer + graphOffset); graphOffset += sz_XSCR_pkt; // Skip scroll offset length -= sz_XSCR_pkt; } else if (*data & BIT0) diff --git a/engines/tinsel/cursor.cpp b/engines/tinsel/cursor.cpp index bf901c03b6..a83e7cd9ca 100644 --- a/engines/tinsel/cursor.cpp +++ b/engines/tinsel/cursor.cpp @@ -125,7 +125,7 @@ static void InitCurTrailObj(int i, int x, int y) { pim = GetImageFromFilm(g_hCursorFilm, i+1, &pfr, &pmi, &pfilm);// Get pointer to image assert(BgPal()); // No background palette - pim->hImgPal = TO_LE_32(BgPal()); + pim->hImgPal = TO_32(BgPal()); // Initialize and insert the object, set its Z-pos, and hide it g_ntrailData[i].trailObj = MultiInitObject(pmi); @@ -134,7 +134,7 @@ static void InitCurTrailObj(int i, int x, int y) { MultiSetAniXY(g_ntrailData[i].trailObj, x, y); // Initialize the animation script - InitStepAnimScript(&g_ntrailData[i].trailAnim, g_ntrailData[i].trailObj, FROM_LE_32(pfr->script), ONE_SECOND / FROM_LE_32(pfilm->frate)); + InitStepAnimScript(&g_ntrailData[i].trailAnim, g_ntrailData[i].trailObj, FROM_32(pfr->script), ONE_SECOND / FROM_32(pfilm->frate)); StepAnimScript(&g_ntrailData[i].trailAnim); } @@ -237,7 +237,7 @@ void RestoreMainCursor() { if (g_McurObj != NULL) { pfilm = (const FILM *)LockMem(g_hCursorFilm); - InitStepAnimScript(&g_McurAnim, g_McurObj, FROM_LE_32(pfilm->reels->script), ONE_SECOND / FROM_LE_32(pfilm->frate)); + InitStepAnimScript(&g_McurAnim, g_McurObj, FROM_32(pfilm->reels->script), ONE_SECOND / FROM_32(pfilm->frate)); StepAnimScript(&g_McurAnim); } g_bHiddenCursor = false; @@ -324,14 +324,14 @@ IMAGE *GetImageFromReel(const FREEL *pfr, const MULTI_INIT **ppmi) { const MULTI_INIT *pmi; const FRAME *pFrame; - pmi = (const MULTI_INIT *)LockMem(FROM_LE_32(pfr->mobj)); + pmi = (const MULTI_INIT *)LockMem(FROM_32(pfr->mobj)); if (ppmi) *ppmi = pmi; - pFrame = (const FRAME *)LockMem(FROM_LE_32(pmi->hMulFrame)); + pFrame = (const FRAME *)LockMem(FROM_32(pmi->hMulFrame)); // get pointer to image - return (IMAGE *)LockMem(READ_LE_UINT32(pFrame)); + return (IMAGE *)LockMem(READ_32(pFrame)); } /** @@ -379,18 +379,18 @@ void SetAuxCursor(SCNHANDLE hFilm) { pim = GetImageFromFilm(hFilm, 0, &pfr, &pmi, &pfilm);// Get pointer to image assert(BgPal()); // no background palette - pim->hImgPal = TO_LE_32(BgPal()); // Poke in the background palette + pim->hImgPal = TO_32(BgPal()); // Poke in the background palette - g_ACoX = (short)(FROM_LE_16(pim->imgWidth)/2 - ((int16) FROM_LE_16(pim->anioffX))); - g_ACoY = (short)((FROM_LE_16(pim->imgHeight) & ~C16_FLAG_MASK)/2 - - ((int16) FROM_LE_16(pim->anioffY))); + g_ACoX = (short)(FROM_16(pim->imgWidth)/2 - ((int16) FROM_16(pim->anioffX))); + g_ACoY = (short)((FROM_16(pim->imgHeight) & ~C16_FLAG_MASK)/2 - + ((int16) FROM_16(pim->anioffY))); // Initialize and insert the auxillary cursor object g_AcurObj = MultiInitObject(pmi); MultiInsertObject(GetPlayfieldList(FIELD_STATUS), g_AcurObj); // Initialize the animation and set its position - InitStepAnimScript(&g_AcurAnim, g_AcurObj, FROM_LE_32(pfr->script), ONE_SECOND / FROM_LE_32(pfilm->frate)); + InitStepAnimScript(&g_AcurAnim, g_AcurObj, FROM_32(pfr->script), ONE_SECOND / FROM_32(pfilm->frate)); MultiSetAniXY(g_AcurObj, x - g_ACoX, y - g_ACoY); MultiSetZPosition(g_AcurObj, Z_ACURSOR); @@ -481,14 +481,14 @@ static void InitCurObj() { if (TinselV2) { pFilm = (const FILM *)LockMem(g_hCursorFilm); pfr = (const FREEL *)&pFilm->reels[0]; - pmi = (MULTI_INIT *)LockMem(FROM_LE_32(pfr->mobj)); + pmi = (MULTI_INIT *)LockMem(FROM_32(pfr->mobj)); PokeInPalette(pmi); } else { assert(BgPal()); // no background palette pim = GetImageFromFilm(g_hCursorFilm, 0, &pfr, &pmi, &pFilm);// Get pointer to image - pim->hImgPal = TO_LE_32(BgPal()); + pim->hImgPal = TO_32(BgPal()); g_AcurObj = NULL; // No auxillary cursor } @@ -496,7 +496,7 @@ static void InitCurObj() { g_McurObj = MultiInitObject(pmi); MultiInsertObject(GetPlayfieldList(FIELD_STATUS), g_McurObj); - InitStepAnimScript(&g_McurAnim, g_McurObj, FROM_LE_32(pfr->script), ONE_SECOND / FROM_LE_32(pFilm->frate)); + InitStepAnimScript(&g_McurAnim, g_McurObj, FROM_32(pfr->script), ONE_SECOND / FROM_32(pFilm->frate)); } /** @@ -620,7 +620,7 @@ void DwInitCursor(SCNHANDLE bfilm) { g_hCursorFilm = bfilm; pfilm = (const FILM *)LockMem(g_hCursorFilm); - g_numTrails = FROM_LE_32(pfilm->numreels) - 1; + g_numTrails = FROM_32(pfilm->numreels) - 1; assert(g_numTrails <= MAX_TRAILERS); } diff --git a/engines/tinsel/detection_tables.h b/engines/tinsel/detection_tables.h index 631c2dce14..f6b1487561 100644 --- a/engines/tinsel/detection_tables.h +++ b/engines/tinsel/detection_tables.h @@ -69,7 +69,7 @@ static const TinselGameDescription gameDescriptions[] = { 0, TINSEL_V1, }, -#if 0 + { // Macintosh CD Demo V1 version, with *.scn files, see tracker #3110936 { "dw", @@ -89,7 +89,7 @@ static const TinselGameDescription gameDescriptions[] = { GF_SCNFILES, TINSEL_V1, }, -#endif + { // Multilingual Floppy V1 with *.gra files. // Note: It contains no english subtitles. { @@ -474,7 +474,6 @@ static const TinselGameDescription gameDescriptions[] = { }, #endif -#if 0 { // Mac multilanguage CD { "dw", @@ -491,12 +490,10 @@ static const TinselGameDescription gameDescriptions[] = { }, GID_DW1, 0, - GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, + GF_SCNFILES, TINSEL_V1, }, -#endif - { // German CD re-release "Neon Edition" // Note: This release has ENGLISH.TXT (with german content) instead of GERMAN.TXT { diff --git a/engines/tinsel/dialogs.cpp b/engines/tinsel/dialogs.cpp index 56ee2ea752..d0c99f7830 100644 --- a/engines/tinsel/dialogs.cpp +++ b/engines/tinsel/dialogs.cpp @@ -234,8 +234,8 @@ enum PARTS_INDEX { #define NM_RS_R_INSET 4 #define NM_RS_THICKNESS 5 #define NM_MOVE_AREA_B_Y 30 -#define NM_SLIDE_INSET (TinselV2 ? 18 : 15) // X offset (from right) of left of scroll region -#define NM_SLIDE_THICKNESS (TinselV2 ? 13 : 4) // thickness of scroll region +#define NM_SLIDE_INSET (TinselV2 ? 18 : 9) // X offset (from right) of left of scroll region +#define NM_SLIDE_THICKNESS (TinselV2 ? 13 : 7) // thickness of scroll region #define NM_UP_ARROW_TOP 34 // Y offset of top of up arrow #define NM_UP_ARROW_BOTTOM 49 // Y offset of bottom of up arrow #define NM_DN_ARROW_TOP 22 // Y offset (from bottom) of top of down arrow @@ -1143,7 +1143,7 @@ static void FirstScene(int first) { // Fill in the rest for (i = 0; i < NUM_RGROUP_BOXES && i + first < g_numScenes; i++) { cd.box[i].textMethod = TM_STRINGNUM; - cd.box[i].ixText = FROM_LE_32(g_pHopper[i + first].hSceneDesc); + cd.box[i].ixText = FROM_32(g_pHopper[i + first].hSceneDesc); } // Blank out the spare ones (if any) while (i < NUM_RGROUP_BOXES) { @@ -1166,10 +1166,10 @@ static void SetChosenScene() { static void FirstEntry(int first) { int i; - g_InvD[INV_MENU].hInvTitle = FROM_LE_32(g_pChosenScene->hSceneDesc); + g_InvD[INV_MENU].hInvTitle = FROM_32(g_pChosenScene->hSceneDesc); // get number of entrances - g_numEntries = FROM_LE_32(g_pChosenScene->numEntries); + g_numEntries = FROM_32(g_pChosenScene->numEntries); // Force first to a sensible value if (first > g_numEntries-NUM_RGROUP_BOXES) @@ -1179,7 +1179,7 @@ static void FirstEntry(int first) { for (i = 0; i < NUM_RGROUP_BOXES && i < g_numEntries; i++) { cd.box[i].textMethod = TM_STRINGNUM; - cd.box[i].ixText = FROM_LE_32(g_pEntries[FROM_LE_32(g_pChosenScene->entryIndex) + i + first].hDesc); + cd.box[i].ixText = FROM_32(g_pEntries[FROM_32(g_pChosenScene->entryIndex) + i + first].hDesc); } // Blank out the spare ones (if any) while (i < NUM_RGROUP_BOXES) { @@ -1191,17 +1191,17 @@ static void FirstEntry(int first) { } static void HopAction() { - PHOPENTRY pEntry = g_pEntries + FROM_LE_32(g_pChosenScene->entryIndex) + cd.selBox + cd.extraBase; + PHOPENTRY pEntry = g_pEntries + FROM_32(g_pChosenScene->entryIndex) + cd.selBox + cd.extraBase; - uint32 hScene = FROM_LE_32(g_pChosenScene->hScene); - uint32 eNumber = FROM_LE_32(pEntry->eNumber); + uint32 hScene = FROM_32(g_pChosenScene->hScene); + uint32 eNumber = FROM_32(pEntry->eNumber); debugC(DEBUG_BASIC, kTinselDebugAnimations, "Scene hopper chose scene %xh,%d\n", hScene, eNumber); - if (FROM_LE_32(pEntry->flags) & fCall) { + if (FROM_32(pEntry->flags) & fCall) { SaveScene(Common::nullContext); NewScene(Common::nullContext, g_pChosenScene->hScene, pEntry->eNumber, TRANS_FADE); } - else if (FROM_LE_32(pEntry->flags) & fHook) + else if (FROM_32(pEntry->flags) & fHook) HookScene(hScene, eNumber, TRANS_FADE); else NewScene(Common::nullContext, hScene, eNumber, TRANS_CUT); @@ -2568,7 +2568,7 @@ static OBJECT *AddInvObject(int num, const FREEL **pfreel, const FILM **pfilm) { pim = GetImageFromFilm(invObj->hIconFilm, 0, pfreel, &pmi, pfilm); // Poke in the background palette - pim->hImgPal = TO_LE_32(BgPal()); + pim->hImgPal = TO_32(BgPal()); // Set up the multi-object pPlayObj = MultiInitObject(pmi); @@ -2609,7 +2609,7 @@ static void FillInInventory() { MultiSetAniXY(g_iconArray[n], g_InvD[g_ino].inventoryX + xpos , g_InvD[g_ino].inventoryY + ypos); MultiSetZPosition(g_iconArray[n], Z_INV_ICONS); - InitStepAnimScript(&g_iconAnims[n], g_iconArray[n], FROM_LE_32(pfr->script), ONE_SECOND / FROM_LE_32(pfilm->frate)); + InitStepAnimScript(&g_iconAnims[n], g_iconArray[n], FROM_32(pfr->script), ONE_SECOND / FROM_32(pfilm->frate)); n++; } @@ -2697,17 +2697,17 @@ static OBJECT *AddObject(const FREEL *pfreel, int num) { pim = GetImageFromReel(pfreel, &pmi); // Poke in the background palette - pim->hImgPal = TO_LE_32(BgPal()); + pim->hImgPal = TO_32(BgPal()); // Horrible bodge involving global variables to save // width and/or height of some window frame components if (num == g_TL) { - g_TLwidth = FROM_LE_16(pim->imgWidth); - g_TLheight = FROM_LE_16(pim->imgHeight) & ~C16_FLAG_MASK; + g_TLwidth = FROM_16(pim->imgWidth); + g_TLheight = FROM_16(pim->imgHeight) & ~C16_FLAG_MASK; } else if (num == g_TR) { - g_TRwidth = FROM_LE_16(pim->imgWidth); + g_TRwidth = FROM_16(pim->imgWidth); } else if (num == g_BL) { - g_BLheight = FROM_LE_16(pim->imgHeight) & ~C16_FLAG_MASK; + g_BLheight = FROM_16(pim->imgHeight) & ~C16_FLAG_MASK; } // Set up and insert the multi-object @@ -2723,7 +2723,7 @@ static OBJECT *AddObject(const FREEL *pfreel, int num) { static void AddSlider(OBJECT **slide, const FILM *pfilm) { g_SlideObject = *slide = AddObject(&pfilm->reels[IX_SLIDE], -1); - MultiSetAniXY(*slide, MultiRightmost(g_RectObject) + (TinselV2 ? NM_SLX : -M_SXOFF + 2) - 1, + MultiSetAniXY(*slide, MultiRightmost(g_RectObject) + (TinselV2 ? NM_SLX : -M_SXOFF + 2), g_InvD[g_ino].inventoryY + g_sliderYpos); MultiSetZPosition(*slide, Z_INV_MFRAME); } @@ -3318,7 +3318,7 @@ static void ConstructInventory(InventoryType filling) { } } } else if (g_InvD[g_ino].NoofItems > g_InvD[g_ino].NoofHicons*g_InvD[g_ino].NoofVicons) { - g_sliderYmin = g_TLheight - (TinselV2 ? 2 : 1); + g_sliderYmin = g_TLheight - (TinselV2 ? 1 : 2); g_sliderYmax = g_TLheight + eV + (TinselV2 ? 12 : 10); AddSlider(&retObj[n++], pfilm); } @@ -3406,9 +3406,9 @@ static void AlterCursor(int num) { pim = GetImageFromFilm(g_hWinParts, num, &pfreel); // Poke in the background palette - pim->hImgPal = TO_LE_32(BgPal()); + pim->hImgPal = TO_32(BgPal()); - SetTempCursor(FROM_LE_32(pfreel->script)); + SetTempCursor(FROM_32(pfreel->script)); } enum InvCursorFN {IC_AREA, IC_DROP}; @@ -4861,50 +4861,101 @@ static void InvDragEnd() { g_Xchange = g_Ychange = 0; // Probably no need, but does no harm! } -static void MenuPageDown() { +static bool MenuDown(int lines) { if (cd.box == loadBox || cd.box == saveBox) { - if (cd.extraBase < MAX_SAVED_FILES-NUM_RGROUP_BOXES) { - FirstFile(cd.extraBase+(NUM_RGROUP_BOXES - 1)); + if (cd.extraBase < MAX_SAVED_FILES - NUM_RGROUP_BOXES) { + FirstFile(cd.extraBase + lines); AddBoxes(true); - cd.selBox = NUM_RGROUP_BOXES - 1; - Select(cd.selBox, true); + return true; } } else if (cd.box == hopperBox1) { if (cd.extraBase < g_numScenes - NUM_RGROUP_BOXES) { - FirstScene(cd.extraBase + (NUM_RGROUP_BOXES - 1)); + FirstScene(cd.extraBase + lines); AddBoxes(true); - if (cd.selBox) - cd.selBox = NUM_RGROUP_BOXES - 1; - Select(cd.selBox, true); + return true; } } else if (cd.box == hopperBox2) { if (cd.extraBase < g_numEntries - NUM_RGROUP_BOXES) { - FirstEntry(cd.extraBase+(NUM_RGROUP_BOXES - 1)); + FirstEntry(cd.extraBase + lines); AddBoxes(true); - if (cd.selBox) - cd.selBox = NUM_RGROUP_BOXES - 1; - Select(cd.selBox, true); + return true; } } + return false; } -static void MenuPageUp() { +static bool MenuUp(int lines) { if (cd.extraBase > 0) { if (cd.box == loadBox || cd.box == saveBox) - FirstFile(cd.extraBase-(NUM_RGROUP_BOXES - 1)); + FirstFile(cd.extraBase - lines); else if (cd.box == hopperBox1) - FirstScene(cd.extraBase-(NUM_RGROUP_BOXES - 1)); + FirstScene(cd.extraBase - lines); else if (cd.box == hopperBox2) - FirstEntry(cd.extraBase-(NUM_RGROUP_BOXES - 1)); + FirstEntry(cd.extraBase - lines); else - return; + return false; AddBoxes(true); + return true; + } + return false; +} + +static void MenuRollDown() { + if (MenuDown(1)) { + if (cd.selBox > 0) + cd.selBox--; + Select(cd.selBox, true); + } +} + +static void MenuRollUp() { + if (MenuUp(1)) { + if (cd.selBox < NUM_RGROUP_BOXES - 1) + cd.selBox++; + Select(cd.selBox, true); + } +} + +static void MenuPageDown() { + if (MenuDown(NUM_RGROUP_BOXES - 1)) { + cd.selBox = NUM_RGROUP_BOXES - 1; + Select(cd.selBox, true); + } +} + +static void MenuPageUp() { + if (MenuUp(NUM_RGROUP_BOXES - 1)) { cd.selBox = 0; Select(cd.selBox, true); } } +static void InventoryDown() { + // This code is a copy of the IB_SLIDE_DOWN case in InvWalkTo + // TODO: So share this duplicate code + if (g_InvD[g_ino].NoofVicons == 1) + if (g_InvD[g_ino].FirstDisp + g_InvD[g_ino].NoofHicons*g_InvD[g_ino].NoofVicons < g_InvD[g_ino].NoofItems) + g_InvD[g_ino].FirstDisp += g_InvD[g_ino].NoofHicons; + for (int i = 1; i < g_InvD[g_ino].NoofVicons; i++) { + if (g_InvD[g_ino].FirstDisp + g_InvD[g_ino].NoofHicons*g_InvD[g_ino].NoofVicons < g_InvD[g_ino].NoofItems) + g_InvD[g_ino].FirstDisp += g_InvD[g_ino].NoofHicons; + } + g_ItemsChanged = true; +} + +static void InventoryUp() { + // This code is a copy of the I_SLIDE_UP case in InvWalkTo + // TODO: So share this duplicate code + if (g_InvD[g_ino].NoofVicons == 1) + g_InvD[g_ino].FirstDisp -= g_InvD[g_ino].NoofHicons; + for (int i = 1; i < g_InvD[g_ino].NoofVicons; i++) + g_InvD[g_ino].FirstDisp -= g_InvD[g_ino].NoofHicons; + if (g_InvD[g_ino].FirstDisp < 0) + g_InvD[g_ino].FirstDisp = 0; + g_ItemsChanged = true; +} + /**************************************************************************/ /************** Incoming events - further processing **********************/ /**************************************************************************/ @@ -5399,42 +5450,47 @@ extern void EventToInventory(PLR_EVENT pEvent, const Common::Point &coOrds) { case PLR_PGDN: if (g_ino == INV_MENU) { - // Only act if load or save screen + // Load or Save screen MenuPageDown(); } else { - // This code is a copy of the IB_SLIDE_DOWN case in InvWalkTo - // TODO: So share this duplicate code - if (g_InvD[g_ino].NoofVicons == 1) - if (g_InvD[g_ino].FirstDisp + g_InvD[g_ino].NoofHicons*g_InvD[g_ino].NoofVicons < g_InvD[g_ino].NoofItems) - g_InvD[g_ino].FirstDisp += g_InvD[g_ino].NoofHicons; - for (int i = 1; i < g_InvD[g_ino].NoofVicons; i++) { - if (g_InvD[g_ino].FirstDisp + g_InvD[g_ino].NoofHicons*g_InvD[g_ino].NoofVicons < g_InvD[g_ino].NoofItems) - g_InvD[g_ino].FirstDisp += g_InvD[g_ino].NoofHicons; - } - g_ItemsChanged = true; + // Inventory window + InventoryDown(); } break; case PLR_PGUP: if (g_ino == INV_MENU) { - // Only act if load or save screen + // Load or Save screen MenuPageUp(); } else { - // This code is a copy of the I_SLIDE_UP case in InvWalkTo - // TODO: So share this duplicate code - if (g_InvD[g_ino].NoofVicons == 1) - g_InvD[g_ino].FirstDisp -= g_InvD[g_ino].NoofHicons; - for (int i = 1; i < g_InvD[g_ino].NoofVicons; i++) - g_InvD[g_ino].FirstDisp -= g_InvD[g_ino].NoofHicons; - if (g_InvD[g_ino].FirstDisp < 0) - g_InvD[g_ino].FirstDisp = 0; - g_ItemsChanged = true; + // Inventory window + InventoryUp(); + } + break; + + case PLR_WHEEL_DOWN: + if (g_ino == INV_MENU) { + // Load or Save screen + MenuRollDown(); + } else { + // Inventory window + InventoryDown(); + } + break; + + case PLR_WHEEL_UP: + if (g_ino == INV_MENU) { + // Load or Save screen + MenuRollUp(); + } else { + // Inventory window + InventoryUp(); } break; case PLR_HOME: if (g_ino == INV_MENU) { - // Only act if load or save screen + // Load or Save screen if (cd.box == loadBox || cd.box == saveBox) FirstFile(0); else if (cd.box == hopperBox1) @@ -5448,6 +5504,7 @@ extern void EventToInventory(PLR_EVENT pEvent, const Common::Point &coOrds) { cd.selBox = 0; Select(cd.selBox, true); } else { + // Inventory window g_InvD[g_ino].FirstDisp = 0; g_ItemsChanged = true; } @@ -5455,6 +5512,7 @@ extern void EventToInventory(PLR_EVENT pEvent, const Common::Point &coOrds) { case PLR_END: if (g_ino == INV_MENU) { + // Load or Save screen if (cd.box == loadBox || cd.box == saveBox) FirstFile(MAX_SAVED_FILES); // Will get reduced to appropriate value else if (cd.box == hopperBox1) @@ -5468,6 +5526,7 @@ extern void EventToInventory(PLR_EVENT pEvent, const Common::Point &coOrds) { cd.selBox = 0; Select(cd.selBox, true); } else { + // Inventory window g_InvD[g_ino].FirstDisp = g_InvD[g_ino].NoofItems - g_InvD[g_ino].NoofHicons*g_InvD[g_ino].NoofVicons; if (g_InvD[g_ino].FirstDisp < 0) g_InvD[g_ino].FirstDisp = 0; @@ -5560,21 +5619,6 @@ extern void RegisterIcons(void *cptr, int num) { memmove(destP, srcP, 12); destP->attribute = 0; } - } else if (TinselV1Mac) { - // Macintosh version has BE encoded resources, so the values need to be byte swapped - MEM_NODE *node = MemoryAllocFixed(g_numObjects * sizeof(INV_OBJECT)); - assert(node); - g_invObjects = (INV_OBJECT *)MemoryDeref(node); - assert(g_invObjects); - INV_OBJECT *srcP = (INV_OBJECT *)cptr; - INV_OBJECT *destP = (INV_OBJECT *)g_invObjects; - - for (int i = 0; i < num; ++i, ++destP, ++srcP) { - destP->id = FROM_BE_32(srcP->id); - destP->hIconFilm = FROM_BE_32(srcP->hIconFilm); - destP->hScript = FROM_BE_32(srcP->hScript); - destP->attribute = FROM_BE_32(srcP->attribute); - } } else if (TinselV2) { if (g_invFilms == NULL) { // First time - allocate memory @@ -5613,7 +5657,7 @@ extern void setInvWinParts(SCNHANDLE hf) { #ifdef DEBUG pfilm = (const FILM *)LockMem(hf); - assert(FROM_LE_32(pfilm->numreels) >= (uint32)(TinselV2 ? T2_HOPEDFORREELS : T1_HOPEDFORREELS)); // not as many reels as expected + assert(FROM_32(pfilm->numreels) >= (uint32)(TinselV2 ? T2_HOPEDFORREELS : T1_HOPEDFORREELS)); // not as many reels as expected #endif } @@ -5630,7 +5674,7 @@ extern void setFlagFilms(SCNHANDLE hf) { #ifdef DEBUG pfilm = (const FILM *)LockMem(hf); - assert(FROM_LE_32(pfilm->numreels) >= HOPEDFORFREELS); // not as many reels as expected + assert(FROM_32(pfilm->numreels) >= HOPEDFORFREELS); // not as many reels as expected #endif } diff --git a/engines/tinsel/events.cpp b/engines/tinsel/events.cpp index 1aa4d34227..61d3903f1a 100644 --- a/engines/tinsel/events.cpp +++ b/engines/tinsel/events.cpp @@ -389,7 +389,8 @@ void PlayerEvent(PLR_EVENT pEvent, const Common::Point &coOrds) { "PLR_PROV_WALKTO", "PLR_WALKTO", "PLR_LOOK", "PLR_ACTION", "PLR_ESCAPE", "PLR_MENU", "PLR_QUIT", "PLR_PGUP", "PLR_PGDN", "PLR_HOME", "PLR_END", "PLR_DRAG1_START", "PLR_DRAG1_END", "PLR_DRAG2_START", "PLR_DRAG2_END", - "PLR_JUMP", "PLR_NOEVENT"}; + "PLR_JUMP", "PLR_NOEVENT", "PLR_SAVE", "PLR_LOAD", "PLR_WHEEL_UP", + "PLR_WHEEL_DOWN"}; debugC(DEBUG_BASIC, kTinselDebugActions, "%s - (%d,%d)", actionList[pEvent], coOrds.x, coOrds.y); static uint32 lastRealAction = 0; // FIXME: Avoid non-const global vars diff --git a/engines/tinsel/events.h b/engines/tinsel/events.h index cdf5ae2ae4..51669e4680 100644 --- a/engines/tinsel/events.h +++ b/engines/tinsel/events.h @@ -65,6 +65,8 @@ enum PLR_EVENT { PLR_NOEVENT = 16, PLR_SAVE = 17, PLR_LOAD = 18, + PLR_WHEEL_UP = 19, + PLR_WHEEL_DOWN = 20, // Aliases used for DW1 actions PLR_SLEFT = PLR_WALKTO, diff --git a/engines/tinsel/faders.cpp b/engines/tinsel/faders.cpp index c1574ff963..e9517103a9 100644 --- a/engines/tinsel/faders.cpp +++ b/engines/tinsel/faders.cpp @@ -106,7 +106,7 @@ static void FadeProcess(CORO_PARAM, const void *param) { FadingPalette(pFade->pPalQ, true); // get pointer to palette - reduce pointer indirection a bit - _ctx->pPalette = (PALETTE *)LockMem(pFade->pPalQ->hPal); + _ctx->pPalette = (PALETTE *)LockMem(FROM_32(pFade->pPalQ->hPal)); for (_ctx->pColMult = pFade->pColorMultTable; *_ctx->pColMult >= 0; _ctx->pColMult++) { // go through all multipliers in table - until a negative entry @@ -117,10 +117,10 @@ static void FadeProcess(CORO_PARAM, const void *param) { pFade->pPalQ->numColors, (uint32) *_ctx->pColMult); else FadePalette(_ctx->fadeRGB, _ctx->pPalette->palRGB, - FROM_LE_32(_ctx->pPalette->numColors), (uint32) *_ctx->pColMult); + FROM_32(_ctx->pPalette->numColors), (uint32) *_ctx->pColMult); // send new palette to video DAC - UpdateDACqueue(pFade->pPalQ->posInDAC, FROM_LE_32(_ctx->pPalette->numColors), _ctx->fadeRGB); + UpdateDACqueue(pFade->pPalQ->posInDAC, FROM_32(_ctx->pPalette->numColors), _ctx->fadeRGB); // allow time for video DAC to be updated CORO_SLEEP(1); diff --git a/engines/tinsel/font.cpp b/engines/tinsel/font.cpp index 54aa7cc15f..3dba56468b 100644 --- a/engines/tinsel/font.cpp +++ b/engines/tinsel/font.cpp @@ -102,16 +102,16 @@ void FettleFontPal(SCNHANDLE fontPal) { assert(g_hTalkFont); // Talk font not declared pFont = (const FONT *)LockMem(g_hTagFont); - pImg = (IMAGE *)LockMem(FROM_LE_32(pFont->fontInit.hObjImg)); // get image for char 0 + pImg = (IMAGE *)LockMem(FROM_32(pFont->fontInit.hObjImg)); // get image for char 0 if (!TinselV2) - pImg->hImgPal = TO_LE_32(fontPal); + pImg->hImgPal = TO_32(fontPal); else pImg->hImgPal = 0; pFont = (const FONT *)LockMem(g_hTalkFont); - pImg = (IMAGE *)LockMem(FROM_LE_32(pFont->fontInit.hObjImg)); // get image for char 0 + pImg = (IMAGE *)LockMem(FROM_32(pFont->fontInit.hObjImg)); // get image for char 0 if (!TinselV2) - pImg->hImgPal = TO_LE_32(fontPal); + pImg->hImgPal = TO_32(fontPal); else pImg->hImgPal = 0; diff --git a/engines/tinsel/graphics.cpp b/engines/tinsel/graphics.cpp index 9b06b1a501..b917775360 100644 --- a/engines/tinsel/graphics.cpp +++ b/engines/tinsel/graphics.cpp @@ -73,7 +73,7 @@ uint8* psxPJCRLEUnwinder(uint16 imageWidth, uint16 imageHeight, uint8 *srcIdx) { while (remainingBlocks) { // Repeat until all blocks are decompressed if (!controlBits) { - controlData = READ_LE_UINT16(srcIdx); + controlData = READ_16(srcIdx); srcIdx += 2; // If bit 15 of controlData is enabled, compression data is type 1. @@ -92,7 +92,7 @@ uint8* psxPJCRLEUnwinder(uint16 imageWidth, uint16 imageHeight, uint8 *srcIdx) { // If there is compression, we need to fetch an index // to be treated as "base" for compression. if (compressionType != 0) { - controlData = READ_LE_UINT16(srcIdx); + controlData = READ_16(srcIdx); srcIdx += 2; baseIndex = controlData; } @@ -114,7 +114,7 @@ uint8* psxPJCRLEUnwinder(uint16 imageWidth, uint16 imageHeight, uint8 *srcIdx) { switch (compressionType) { case 0: // No compression, plain copy of indexes while (decremTiles) { - WRITE_LE_UINT16(dstIdx, READ_LE_UINT16(srcIdx)); + WRITE_LE_UINT16(dstIdx, READ_16(srcIdx)); srcIdx += 2; dstIdx += 2; decremTiles--; @@ -212,6 +212,82 @@ static void t0WrtNonZero(DRAWOBJECT *pObj, uint8 *srcP, uint8 *destP, bool apply } /** + * Straight rendering with transparency support, Mac variant + */ +static void MacDrawTiles(DRAWOBJECT *pObj, uint8 *srcP, uint8 *destP, bool applyClipping) { + int yClip = 0; + + if (applyClipping) { + // Adjust the height down to skip any bottom clipping + pObj->height -= pObj->botClip; + yClip = pObj->topClip; + } + + // Simple RLE-like scheme: the two first bytes of each data chunk determine + // if bytes should be repeated or copied. + // Example: 10 00 00 20 will repeat byte 0x0 0x10 times, and will copy 0x20 + // bytes from the input stream afterwards + + // Vertical loop + for (int y = 0; y < pObj->height; ++y) { + // Get the start of the next line output + uint8 *tempDest = destP; + + int leftClip = applyClipping ? pObj->leftClip : 0; + int rightClip = applyClipping ? pObj->rightClip : 0; + + // Horizontal loop + for (int x = 0; x < pObj->width; ) { + byte repeatBytes = *srcP++; + + if (repeatBytes) { + uint clipAmount = MIN<int>(repeatBytes, leftClip); + leftClip -= clipAmount; + x += clipAmount; + + // Repeat of a given color + byte color = *srcP++; + int runLength = repeatBytes - clipAmount; + int rptLength = MAX(MIN(runLength, pObj->width - rightClip - x), 0); + if (yClip == 0) { + if (color != 0) + memset(tempDest, color, rptLength); + tempDest += rptLength; + } + + x += runLength; + } else { + // Copy a specified sequence length of pixels + byte copyBytes = *srcP++; + + uint clipAmount = MIN<int>(copyBytes, leftClip); + leftClip -= clipAmount; + x += clipAmount; + srcP += clipAmount; + + int runLength = copyBytes - clipAmount; + int rptLength = MAX(MIN(runLength, pObj->width - rightClip - x), 0); + if (yClip == 0) { + memmove(tempDest, srcP, rptLength); + tempDest += rptLength; + } + + int overflow = (copyBytes % 2) == 0 ? 0 : 2 - (copyBytes % 2); + x += runLength; + srcP += runLength + overflow; + } + } // horizontal loop + + // Move to next line + if (yClip > 0) + --yClip; + else + destP += SCREEN_WIDTH; + } // vertical loop +} + + +/** * Straight rendering with transparency support, PSX variant supporting also 4-BIT clut data */ static void PsxDrawTiles(DRAWOBJECT *pObj, uint8 *srcP, uint8 *destP, bool applyClipping, bool fourBitClut, uint32 psxSkipBytes, byte *psxMapperTable, bool transparency) { @@ -822,120 +898,59 @@ void DrawObject(DRAWOBJECT *pObj) { // Handle various draw types uint8 typeId = pObj->flags & 0xff; + int packType = pObj->flags >> 14; // TinselV2 - if (TinselV2) { - // Tinsel v2 decoders - // Initial switch statement for the different bit packing types - int packType = pObj->flags >> 14; - - if (packType == 0) { - // No color packing - switch (typeId) { - case 0x01: - case 0x11: - case 0x41: - case 0x51: - case 0x81: - case 0xC1: - t2WrtNonZero(pObj, srcPtr, destPtr, typeId >= 0x40, (typeId & 0x10) != 0); - break; - case 0x02: - case 0x42: - // This renderer called 'RlWrtAll', but is the same as t2WrtNonZero - t2WrtNonZero(pObj, srcPtr, destPtr, typeId >= 0x40, false); - break; - case 0x04: - case 0x44: - // WrtConst with/without clipping - WrtConst(pObj, destPtr, typeId == 0x44); - break; - case 0x08: - case 0x48: - WrtAll(pObj, srcPtr, destPtr, typeId >= 0x40); - break; - case 0x84: - case 0xC4: - // WrtTrans with/without clipping - WrtTrans(pObj, destPtr, typeId == 0xC4); - break; - default: - error("Unknown drawing type %d", typeId); - } - } else { - // 1 = 16 from 240 - // 2 = 16 from 224 - // 3 = variable color - if (packType == 1) pObj->baseCol = 0xF0; - else if (packType == 2) pObj->baseCol = 0xE0; - - PackedWrtNonZero(pObj, srcPtr, destPtr, (pObj->flags & DMA_CLIP) != 0, - (pObj->flags & DMA_FLIPH), packType); - } + if (TinselV2 && packType != 0) { + // Color packing for TinselV2 + + if (packType == 1) + pObj->baseCol = 0xF0; // 16 from 240 + else if (packType == 2) + pObj->baseCol = 0xE0; // 16 from 224 + // 3 = variable color - } else if (TinselV1PSX) { - // Tinsel v1 decoders, PSX specific variants + PackedWrtNonZero(pObj, srcPtr, destPtr, (pObj->flags & DMA_CLIP) != 0, + (pObj->flags & DMA_FLIPH), packType); + } else { switch (typeId) { - case 0x01: - case 0x41: - PsxDrawTiles(pObj, srcPtr, destPtr, typeId >= 0x40, psxFourBitClut, psxSkipBytes, psxMapperTable, true); - break; - case 0x08: - case 0x48: - PsxDrawTiles(pObj, srcPtr, destPtr, typeId >= 0x40, psxFourBitClut, psxSkipBytes, psxMapperTable, false); - break; - case 0x84: - case 0xC4: - // WrtTrans with/without clipping - WrtTrans(pObj, destPtr, typeId == 0xC4); - break; - case 0x04: - case 0x44: - // WrtConst with/without clipping - WrtConst(pObj, destPtr, typeId == 0x44); + case 0x01: // all versions, draw sprite without clipping + case 0x41: // all versions, draw sprite with clipping + case 0x02: // TinselV2, draw sprite without clipping + case 0x11: // TinselV2, draw sprite without clipping, flipped horizontally + case 0x42: // TinselV2, draw sprite with clipping + case 0x51: // TinselV2, draw sprite with clipping, flipped horizontally + case 0x81: // TinselV2, draw sprite with clipping + case 0xC1: // TinselV2, draw sprite with clipping + assert(TinselV2 || (typeId == 0x01 || typeId == 0x41)); + + if (TinselV2) + t2WrtNonZero(pObj, srcPtr, destPtr, typeId >= 0x40, (typeId & 0x10) != 0); + else if (TinselV1PSX) + PsxDrawTiles(pObj, srcPtr, destPtr, typeId == 0x41, psxFourBitClut, psxSkipBytes, psxMapperTable, true); + else if (TinselV1Mac) + MacDrawTiles(pObj, srcPtr, destPtr, typeId == 0x41); + else if (TinselV1) + WrtNonZero(pObj, srcPtr, destPtr, typeId == 0x41); + else if (TinselV0) + t0WrtNonZero(pObj, srcPtr, destPtr, typeId == 0x41); break; - default: - error("Unknown drawing type %d", typeId); - } - } else if (TinselV1) { - // Tinsel v1 decoders - switch (typeId) { - case 0x01: - case 0x08: - case 0x41: - case 0x48: - WrtNonZero(pObj, srcPtr, destPtr, typeId >= 0x40); + case 0x08: // draw background without clipping + case 0x48: // draw background with clipping + if (TinselV2 || TinselV1Mac || TinselV0) + WrtAll(pObj, srcPtr, destPtr, typeId == 0x48); + else if (TinselV1PSX) + PsxDrawTiles(pObj, srcPtr, destPtr, typeId == 0x48, psxFourBitClut, psxSkipBytes, psxMapperTable, false); + else if (TinselV1) + WrtNonZero(pObj, srcPtr, destPtr, typeId == 0x48); break; - - case 0x04: - case 0x44: - // WrtConst with/without clipping + case 0x04: // fill with constant color without clipping + case 0x44: // fill with constant color with clipping WrtConst(pObj, destPtr, typeId == 0x44); break; - - case 0x84: - case 0xC4: - // WrtTrans with/without clipping + case 0x84: // draw transparent surface without clipping + case 0xC4: // draw transparent surface with clipping WrtTrans(pObj, destPtr, typeId == 0xC4); break; - - default: - error("Unknown drawing type %d", typeId); - } - } else { - // Tinsel v0 decoders - switch (typeId) { - case 0x01: - case 0x41: - t0WrtNonZero(pObj, srcPtr, destPtr, typeId >= 0x40); - break; - case 0x08: - case 0x48: - WrtAll(pObj, srcPtr, destPtr, typeId >= 0x40); - break; - case 0x84: - case 0xC4: - WrtTrans(pObj, destPtr, (typeId & 0x40) != 0); - break; default: error("Unknown drawing type %d", typeId); } diff --git a/engines/tinsel/handle.cpp b/engines/tinsel/handle.cpp index 14d588dcec..3921414b01 100644 --- a/engines/tinsel/handle.cpp +++ b/engines/tinsel/handle.cpp @@ -30,6 +30,7 @@ #include "tinsel/dw.h" #include "tinsel/handle.h" #include "tinsel/heapmem.h" // heap memory manager +#include "tinsel/scn.h" // for the DW1 Mac resource handler #include "tinsel/timers.h" // for DwGetCurrentTime() #include "tinsel/tinsel.h" #include "tinsel/scene.h" @@ -85,7 +86,6 @@ static char g_szCdPlayFile[100]; static void LoadFile(MEMHANDLE *pH); // load a memory block as a file - /** * Loads the graphics handle table index file and preloads all the * permanent graphics etc. @@ -300,7 +300,7 @@ void LoadFile(MEMHANDLE *pH) { // discardable - unlock the memory MemoryUnlock(pH->_node); - + // set the loaded flag pH->filesize |= fLoaded; @@ -322,6 +322,7 @@ void LoadFile(MEMHANDLE *pH) { */ byte *LockMem(SCNHANDLE offset) { uint32 handle = offset >> SCNHANDLE_SHIFT; // calc memory handle to use + //debug("Locking offset of type %d (%x), offset %d, handle %d", (offset & HANDLEMASK) >> SCNHANDLE_SHIFT, (offset & HANDLEMASK) >> SCNHANDLE_SHIFT, offset & OFFSETMASK, handle); MEMHANDLE *pH; // points to table entry // range check the memory handle diff --git a/engines/tinsel/multiobj.cpp b/engines/tinsel/multiobj.cpp index c48fefdd22..37769a7819 100644 --- a/engines/tinsel/multiobj.cpp +++ b/engines/tinsel/multiobj.cpp @@ -40,22 +40,22 @@ OBJECT *MultiInitObject(const MULTI_INIT *pInitTbl) { OBJECT *pFirst, *pObj; // object pointers FRAME *pFrame; // list of images for the multi-part object - if (FROM_LE_32(pInitTbl->hMulFrame)) { + if (FROM_32(pInitTbl->hMulFrame)) { // we have a frame handle - pFrame = (FRAME *)LockMem(FROM_LE_32(pInitTbl->hMulFrame)); + pFrame = (FRAME *)LockMem(FROM_32(pInitTbl->hMulFrame)); - obj_init.hObjImg = READ_LE_UINT32(pFrame); // first objects shape + obj_init.hObjImg = READ_32(pFrame); // first objects shape } else { // this must be a animation list for a NULL object pFrame = NULL; obj_init.hObjImg = 0; // first objects shape } // init the object init table - obj_init.objFlags = (int)FROM_LE_32(pInitTbl->mulFlags); // all objects have same flags - obj_init.objID = (int)FROM_LE_32(pInitTbl->mulID); // all objects have same ID - obj_init.objX = (int)FROM_LE_32(pInitTbl->mulX); // all objects have same X ani pos - obj_init.objY = (int)FROM_LE_32(pInitTbl->mulY); // all objects have same Y ani pos - obj_init.objZ = (int)FROM_LE_32(pInitTbl->mulZ); // all objects have same Z pos + obj_init.objFlags = (int)FROM_32(pInitTbl->mulFlags); // all objects have same flags + obj_init.objID = (int)FROM_32(pInitTbl->mulID); // all objects have same ID + obj_init.objX = (int)FROM_32(pInitTbl->mulX); // all objects have same X ani pos + obj_init.objY = (int)FROM_32(pInitTbl->mulY); // all objects have same Y ani pos + obj_init.objZ = (int)FROM_32(pInitTbl->mulZ); // all objects have same Z pos // create and init the first object pObj = pFirst = InitObject(&obj_init); @@ -65,9 +65,9 @@ OBJECT *MultiInitObject(const MULTI_INIT *pInitTbl) { pFrame++; - while (READ_LE_UINT32(pFrame) != 0) { + while (READ_32(pFrame) != 0) { // set next objects shape - obj_init.hObjImg = READ_LE_UINT32(pFrame); + obj_init.hObjImg = READ_32(pFrame); // create next object and link to previous pObj = pObj->pSlave = InitObject(&obj_init); @@ -378,9 +378,9 @@ void MultiReshape(OBJECT *pMultiObj) { // update previous pMultiObj->hMirror = hFrame; - while (READ_LE_UINT32(pFrame) != 0 && pMultiObj != NULL) { + while (READ_32(pFrame) != 0 && pMultiObj != NULL) { // a normal image - update the current object with this image - AnimateObject(pMultiObj, READ_LE_UINT32(pFrame)); + AnimateObject(pMultiObj, READ_32(pFrame)); // move to next image for this frame pFrame++; diff --git a/engines/tinsel/music.cpp b/engines/tinsel/music.cpp index b3bfbcc5dc..dab2a897fc 100644 --- a/engines/tinsel/music.cpp +++ b/engines/tinsel/music.cpp @@ -135,6 +135,10 @@ bool PlayMidiSequence(uint32 dwFileOffset, bool bLoop) { if (ConfMan.hasKey("mute")) mute = ConfMan.getBool("mute"); + // The Macintosh version of DW1 uses raw PCM for music + if (TinselV1Mac) + return _vm->_sound->playDW1MacMusic(dwFileOffset); + SetMidiVolume(mute ? 0 : _vm->_config->_musicVolume); // the index and length of the last tune loaded @@ -281,6 +285,11 @@ void OpenMidiFiles() { if (TinselV0 || TinselV2) return; + // The Macintosh version of DW1 does not use MIDI for music. + // It uses PCM music instead, which is quite big to be preloaded here. + if (TinselV1Mac) + return; + if (g_midiBuffer.pDat) // already allocated return; @@ -784,8 +793,8 @@ bool PCMMusicPlayer::getNextChunk() { // Set parameters for this chunk of music id = _scriptNum; while (id--) - script = scriptBuffer + READ_LE_UINT32(script); - snum = FROM_LE_32(script[_scriptIndex++]); + script = scriptBuffer + READ_32(script); + snum = FROM_32(script[_scriptIndex++]); if (snum == MUSIC_JUMP || snum == MUSIC_END) { // Let usual code sort it out! @@ -797,11 +806,11 @@ bool PCMMusicPlayer::getNextChunk() { musicSegments = (MusicSegment *) LockMem(_hSegment); - assert(FROM_LE_32(musicSegments[snum].numChannels) == 1); - assert(FROM_LE_32(musicSegments[snum].bitsPerSample) == 16); + assert(FROM_32(musicSegments[snum].numChannels) == 1); + assert(FROM_32(musicSegments[snum].bitsPerSample) == 16); - sampleOffset = FROM_LE_32(musicSegments[snum].sampleOffset); - sampleLength = FROM_LE_32(musicSegments[snum].sampleLength); + sampleOffset = FROM_32(musicSegments[snum].sampleOffset); + sampleLength = FROM_32(musicSegments[snum].sampleLength); sampleCLength = (((sampleLength + 63) & ~63)*33)/64; if (!file.open(_filename)) @@ -839,14 +848,14 @@ bool PCMMusicPlayer::getNextChunk() { id = _scriptNum; while (id--) - script = scriptBuffer + READ_LE_UINT32(script); - snum = FROM_LE_32(script[_scriptIndex]); + script = scriptBuffer + READ_32(script); + snum = FROM_32(script[_scriptIndex]); if (snum == MUSIC_END) { _state = S_END2; } else { if (snum == MUSIC_JUMP) - _scriptIndex = FROM_LE_32(script[_scriptIndex+1]); + _scriptIndex = FROM_32(script[_scriptIndex+1]); _state = _forcePlay ? S_NEW : S_NEXT; _forcePlay = false; diff --git a/engines/tinsel/object.cpp b/engines/tinsel/object.cpp index cbe5b0a88f..cbf1c86649 100644 --- a/engines/tinsel/object.cpp +++ b/engines/tinsel/object.cpp @@ -302,23 +302,23 @@ void GetAniOffset(SCNHANDLE hImg, int flags, int *pAniX, int *pAniY) { const IMAGE *pImg = (const IMAGE *)LockMem(hImg); // set ani X - *pAniX = (int16) FROM_LE_16(pImg->anioffX); + *pAniX = (int16) FROM_16(pImg->anioffX); // set ani Y - *pAniY = (int16) FROM_LE_16(pImg->anioffY); + *pAniY = (int16) FROM_16(pImg->anioffY); if (flags & DMA_FLIPH) { // we are flipped horizontally // set ani X = -ani X + width - 1 - *pAniX = -*pAniX + FROM_LE_16(pImg->imgWidth) - 1; + *pAniX = -*pAniX + FROM_16(pImg->imgWidth) - 1; } if (flags & DMA_FLIPV) { // we are flipped vertically // set ani Y = -ani Y + height - 1 - *pAniY = -*pAniY + (FROM_LE_16(pImg->imgHeight) & ~C16_FLAG_MASK) - 1; + *pAniY = -*pAniY + (FROM_16(pImg->imgHeight) & ~C16_FLAG_MASK) - 1; } } else // null image @@ -385,13 +385,13 @@ OBJECT *InitObject(const OBJ_INIT *pInitTbl) { pObj->pPal = pPalQ; // set objects size - pObj->width = FROM_LE_16(pImg->imgWidth); - pObj->height = FROM_LE_16(pImg->imgHeight) & ~C16_FLAG_MASK; + pObj->width = FROM_16(pImg->imgWidth); + pObj->height = FROM_16(pImg->imgHeight) & ~C16_FLAG_MASK; pObj->flags &= ~C16_FLAG_MASK; - pObj->flags |= FROM_LE_16(pImg->imgHeight) & C16_FLAG_MASK; + pObj->flags |= FROM_16(pImg->imgHeight) & C16_FLAG_MASK; // set objects bitmap definition - pObj->hBits = FROM_LE_32(pImg->hImgBits); + pObj->hBits = FROM_32(pImg->hImgBits); // get animation offset of object GetAniOffset(pObj->hImg, pInitTbl->objFlags, &aniX, &aniY); @@ -442,13 +442,13 @@ void AnimateObjectFlags(OBJECT *pAniObj, int newflags, SCNHANDLE hNewImg) { const IMAGE *pNewImg = (IMAGE *)LockMem(hNewImg); // setup new shape - pAniObj->width = FROM_LE_16(pNewImg->imgWidth); - pAniObj->height = FROM_LE_16(pNewImg->imgHeight) & ~C16_FLAG_MASK; + pAniObj->width = FROM_16(pNewImg->imgWidth); + pAniObj->height = FROM_16(pNewImg->imgHeight) & ~C16_FLAG_MASK; newflags &= ~C16_FLAG_MASK; - newflags |= FROM_LE_16(pNewImg->imgHeight) & C16_FLAG_MASK; + newflags |= FROM_16(pNewImg->imgHeight) & C16_FLAG_MASK; // set objects bitmap definition - pAniObj->hBits = FROM_LE_32(pNewImg->hImgBits); + pAniObj->hBits = FROM_32(pNewImg->hImgBits); } else { // null image pAniObj->width = 0; pAniObj->height = 0; @@ -494,7 +494,7 @@ OBJECT *RectangleObject(SCNHANDLE hPal, int color, int width, int height) { OBJECT *pRect = InitObject(&rectObj); // allocate a palette for this object - pPalQ = AllocPalette(hPal); + pPalQ = AllocPalette(FROM_32(hPal)); // make sure palette allocated assert(pPalQ != NULL); diff --git a/engines/tinsel/palette.cpp b/engines/tinsel/palette.cpp index e6c9467fab..04018172c0 100644 --- a/engines/tinsel/palette.cpp +++ b/engines/tinsel/palette.cpp @@ -102,7 +102,7 @@ void psxPaletteMapper(PALQ *originalPal, uint8 *psxClut, byte *mapperTable) { memset(mapperTable, 0, 16); for (int j = 1; j < 16; j++) { - clutEntry = READ_LE_UINT16(psxClut + (sizeof(uint16) * j)); + clutEntry = READ_16(psxClut + (sizeof(uint16) * j)); if (clutEntry) { if (clutEntry == 0x7EC0) { // This is an already known value, used by the in-game text mapperTable[j] = 232; @@ -110,7 +110,7 @@ void psxPaletteMapper(PALQ *originalPal, uint8 *psxClut, byte *mapperTable) { } // Check for correspondent color - for (uint i = 0; (i < FROM_LE_32(pal->numColors)) && !colorFound; i++) { + for (uint i = 0; (i < FROM_32(pal->numColors)) && !colorFound; i++) { // get R G B values in the same way as psx format converters uint16 psxEquivalent = TINSEL_PSX_RGB(TINSEL_GetRValue(pal->palRGB[i]) >> 3, TINSEL_GetGValue(pal->palRGB[i]) >> 3, TINSEL_GetBValue(pal->palRGB[i]) >> 3); @@ -152,7 +152,7 @@ void PalettesToVideoDAC() { // we are using a palette handle // get hardware palette pointer - pPalette = (const PALETTE *)LockMem(pDACtail->pal.hRGBarray); + pPalette = (const PALETTE *)LockMem(FROM_32(pDACtail->pal.hRGBarray)); // get RGB pointer pColors = pPalette->palRGB; @@ -170,6 +170,12 @@ void PalettesToVideoDAC() { pal[i * 3 + 2] = TINSEL_GetBValue(pColors[i]); } + // In DW1 Mac, color 254 should be black, like in the PC version. + // We fix it here. + if (TinselV1Mac) { + pal[254 * 3 + 0] = pal[254 * 3 + 1] = pal[254 * 3 + 2] = 0; + } + // update the system palette g_system->getPaletteManager()->setPalette(pal, pDACtail->destDACindex, pDACtail->numColors); @@ -298,7 +304,7 @@ PALQ *AllocPalette(SCNHANDLE hNewPal) { PALETTE *pNewPal; // get pointer to new palette - pNewPal = (PALETTE *)LockMem(hNewPal); + pNewPal = (PALETTE *)LockMem(FROM_32(hNewPal)); // search all structs in palette allocator - see if palette already allocated for (p = g_palAllocData; p < g_palAllocData + NUM_PALETTES; p++) { @@ -318,7 +324,7 @@ PALQ *AllocPalette(SCNHANDLE hNewPal) { p->objCount = 1; // init number of objects using palette p->posInDAC = iDAC; // set palettes start pos in video DAC p->hPal = hNewPal; // set hardware palette data - p->numColors = FROM_LE_32(pNewPal->numColors); // set number of colors in palette + p->numColors = FROM_32(pNewPal->numColors); // set number of colors in palette if (TinselV2) // Copy all the colors @@ -430,24 +436,24 @@ void SwapPalette(PALQ *pPalQ, SCNHANDLE hNewPal) { // validate palette Q pointer assert(pPalQ >= g_palAllocData && pPalQ <= g_palAllocData + NUM_PALETTES - 1); - if (pPalQ->numColors >= (int)FROM_LE_32(pNewPal->numColors)) { + if (pPalQ->numColors >= (int)FROM_32(pNewPal->numColors)) { // new palette will fit the slot // install new palette pPalQ->hPal = hNewPal; if (TinselV2) { - pPalQ->numColors = FROM_LE_32(pNewPal->numColors); + pPalQ->numColors = FROM_32(pNewPal->numColors); // Copy all the colors - memcpy(pPalQ->palRGB, pNewPal->palRGB, FROM_LE_32(pNewPal->numColors) * sizeof(COLORREF)); + memcpy(pPalQ->palRGB, pNewPal->palRGB, FROM_32(pNewPal->numColors) * sizeof(COLORREF)); if (!pPalQ->bFading) // Q the change to the video DAC - UpdateDACqueue(pPalQ->posInDAC, FROM_LE_32(pNewPal->numColors), pPalQ->palRGB); + UpdateDACqueue(pPalQ->posInDAC, FROM_32(pNewPal->numColors), pPalQ->palRGB); } else { // Q the change to the video DAC - UpdateDACqueueHandle(pPalQ->posInDAC, FROM_LE_32(pNewPal->numColors), hNewPal); + UpdateDACqueueHandle(pPalQ->posInDAC, FROM_32(pNewPal->numColors), hNewPal); } } else { // # colors are different - will have to update all following palette entries @@ -546,7 +552,7 @@ void CreateTranslucentPalette(SCNHANDLE hPalette) { // leave background color alone g_transPalette[0] = 0; - for (uint i = 0; i < FROM_LE_32(pPal->numColors); i++) { + for (uint i = 0; i < FROM_32(pPal->numColors); i++) { // get the RGB color model values uint8 red = TINSEL_GetRValue(pPal->palRGB[i]); uint8 green = TINSEL_GetGValue(pPal->palRGB[i]); @@ -574,7 +580,7 @@ void CreateGhostPalette(SCNHANDLE hPalette) { // leave background color alone g_ghostPalette[0] = 0; - for (i = 0; i < (int)FROM_LE_32(pPal->numColors); i++) { + for (i = 0; i < (int)FROM_32(pPal->numColors); i++) { // get the RGB color model values uint8 red = TINSEL_GetRValue(pPal->palRGB[i]); uint8 green = TINSEL_GetGValue(pPal->palRGB[i]); diff --git a/engines/tinsel/palette.h b/engines/tinsel/palette.h index af58a7ffbd..49a78ae236 100644 --- a/engines/tinsel/palette.h +++ b/engines/tinsel/palette.h @@ -30,11 +30,11 @@ namespace Tinsel { typedef uint32 COLORREF; -#define TINSEL_RGB(r,g,b) ((COLORREF)TO_LE_32(((uint8)(r)|((uint16)(g)<<8))|(((uint32)(uint8)(b))<<16))) +#define TINSEL_RGB(r,g,b) ((COLORREF)TO_32(((uint8)(r)|((uint16)(g)<<8))|(((uint32)(uint8)(b))<<16))) -#define TINSEL_GetRValue(rgb) ((uint8)(FROM_LE_32(rgb))) -#define TINSEL_GetGValue(rgb) ((uint8)(((uint16)(FROM_LE_32(rgb)))>>8)) -#define TINSEL_GetBValue(rgb) ((uint8)((FROM_LE_32(rgb))>>16)) +#define TINSEL_GetRValue(rgb) ((uint8)(FROM_32(rgb))) +#define TINSEL_GetGValue(rgb) ((uint8)(((uint16)(FROM_32(rgb)))>>8)) +#define TINSEL_GetBValue(rgb) ((uint8)((FROM_32(rgb))>>16)) #define TINSEL_PSX_RGB(r,g,b) ((uint16)(((uint8)(r))|((uint16)(g)<<5)|(((uint16)(b))<<10))) diff --git a/engines/tinsel/pcode.cpp b/engines/tinsel/pcode.cpp index 04bc2856ca..7e439e83a9 100644 --- a/engines/tinsel/pcode.cpp +++ b/engines/tinsel/pcode.cpp @@ -420,7 +420,7 @@ void RegisterGlobals(int num) { g_numGlobals = num; g_hMasterScript = !TinselV2 ? 0 : - READ_LE_UINT32(FindChunk(MASTER_SCNHANDLE, CHUNK_MASTER_SCRIPT)); + READ_32(FindChunk(MASTER_SCNHANDLE, CHUNK_MASTER_SCRIPT)); // Allocate RAM for pGlobals and make sure it's allocated g_pGlobals = (int32 *)calloc(g_numGlobals, sizeof(int32)); diff --git a/engines/tinsel/play.cpp b/engines/tinsel/play.cpp index 9e0baa749e..e202278953 100644 --- a/engines/tinsel/play.cpp +++ b/engines/tinsel/play.cpp @@ -81,9 +81,9 @@ static void PokeInPalette(SCNHANDLE hMulFrame) { pFrame = (const FRAME *)LockMem(hMulFrame); // get pointer to image - pim = (IMAGE *)LockMem(READ_LE_UINT32(pFrame)); // handle to image + pim = (IMAGE *)LockMem(READ_32(pFrame)); // handle to image - pim->hImgPal = TO_LE_32(BgPal()); + pim->hImgPal = TO_32(BgPal()); } } @@ -96,12 +96,12 @@ void PokeInPalette(const MULTI_INIT *pmi) { // Could be an empty column if (pmi->hMulFrame) { - pFrame = (FRAME *)LockMem(FROM_LE_32(pmi->hMulFrame)); + pFrame = (FRAME *)LockMem(FROM_32(pmi->hMulFrame)); // get pointer to image - pim = (IMAGE *)LockMem(READ_LE_UINT32(pFrame)); // handle to image + pim = (IMAGE *)LockMem(READ_32(pFrame)); // handle to image - pim->hImgPal = TO_LE_32(BgPal()); + pim->hImgPal = TO_32(BgPal()); } } @@ -234,8 +234,8 @@ static void SoundReel(CORO_PARAM, SCNHANDLE hFilm, int column, int speed, PMULTI_INIT pmi; // MULTI_INIT structure pReel = GetReel(hFilm, actorCol - 1); - pmi = (PMULTI_INIT) LockMem(FROM_LE_32(pReel->mobj)); - _ctx->reelActor = (int32)FROM_LE_32(pmi->mulID); + pmi = (PMULTI_INIT) LockMem(FROM_32(pReel->mobj)); + _ctx->reelActor = (int32)FROM_32(pmi->mulID); } else _ctx->reelActor = 0; @@ -251,27 +251,27 @@ static void SoundReel(CORO_PARAM, SCNHANDLE hFilm, int column, int speed, pFilm = (FILM *)LockMem(hFilm); pReel = &pFilm->reels[column]; - pAni = (ANI_SCRIPT *)LockMem(FROM_LE_32(pReel->script)); + pAni = (ANI_SCRIPT *)LockMem(FROM_32(pReel->script)); if (_ctx->speed == -1) { - _ctx->speed = (ONE_SECOND/FROM_LE_32(pFilm->frate)); + _ctx->speed = (ONE_SECOND/FROM_32(pFilm->frate)); // Restored reel for (;;) { - if (FROM_LE_32(pAni[_ctx->frameNumber].op) == ANI_END) + if (FROM_32(pAni[_ctx->frameNumber].op) == ANI_END) break; - else if (FROM_LE_32(pAni[_ctx->frameNumber].op) == ANI_JUMP) { + else if (FROM_32(pAni[_ctx->frameNumber].op) == ANI_JUMP) { _ctx->frameNumber++; - _ctx->frameNumber += FROM_LE_32(pAni[_ctx->frameNumber].op); + _ctx->frameNumber += FROM_32(pAni[_ctx->frameNumber].op); break; } // Could check for the other stuff here // but they really dont happen // OH YES THEY DO - else if (FROM_LE_32(pAni[_ctx->frameNumber].op) == ANI_ADJUSTX - || FROM_LE_32(pAni[_ctx->frameNumber].op) == ANI_ADJUSTY) { + else if (FROM_32(pAni[_ctx->frameNumber].op) == ANI_ADJUSTX + || FROM_32(pAni[_ctx->frameNumber].op) == ANI_ADJUSTY) { _ctx->frameNumber += 2; - } else if (FROM_LE_32(pAni[_ctx->frameNumber].op) == ANI_ADJUSTXY) { + } else if (FROM_32(pAni[_ctx->frameNumber].op) == ANI_ADJUSTXY) { _ctx->frameNumber += 3; } else { // ANI_STOP, ANI_HIDE, ANI_HFLIP, @@ -281,7 +281,7 @@ static void SoundReel(CORO_PARAM, SCNHANDLE hFilm, int column, int speed, } } - switch (FROM_LE_32(pAni[_ctx->frameNumber].op)) { + switch (FROM_32(pAni[_ctx->frameNumber].op)) { case ANI_END: // Stop this sample if repeating if (_ctx->sampleNumber && _ctx->bLooped) @@ -292,9 +292,9 @@ static void SoundReel(CORO_PARAM, SCNHANDLE hFilm, int column, int speed, case ANI_JUMP: _ctx->frameNumber++; - assert((int32)FROM_LE_32(pAni[_ctx->frameNumber].op) < 0); + assert((int32)FROM_32(pAni[_ctx->frameNumber].op) < 0); - _ctx->frameNumber += FROM_LE_32(pAni[_ctx->frameNumber].op); + _ctx->frameNumber += FROM_32(pAni[_ctx->frameNumber].op); assert(_ctx->frameNumber >= 0); continue; @@ -329,15 +329,15 @@ static void SoundReel(CORO_PARAM, SCNHANDLE hFilm, int column, int speed, if (_ctx->sampleNumber) _vm->_sound->stopSpecSample(_ctx->sampleNumber, 0); - _ctx->sampleNumber = FROM_LE_32(pAni[_ctx->frameNumber++].op); + _ctx->sampleNumber = FROM_32(pAni[_ctx->frameNumber++].op); if (_ctx->sampleNumber > 0) _ctx->bLooped = false; else { _ctx->sampleNumber = ~_ctx->sampleNumber; _ctx->bLooped = true; } - x = (short)(FROM_LE_32(pAni[_ctx->frameNumber].op) >> 16); - y = (short)(FROM_LE_32(pAni[_ctx->frameNumber].op) & 0xffff); + x = (short)(FROM_32(pAni[_ctx->frameNumber].op) >> 16); + y = (short)(FROM_32(pAni[_ctx->frameNumber].op) & 0xffff); if (x == 0) x = -1; @@ -451,10 +451,10 @@ static void t1PlayReel(CORO_PARAM, const PPINIT *ppi) { _ctx->pfreel = &pfilm->reels[ppi->column]; // Get the MULTI_INIT structure - pmi = (const MULTI_INIT *)LockMem(FROM_LE_32(_ctx->pfreel->mobj)); + pmi = (const MULTI_INIT *)LockMem(FROM_32(_ctx->pfreel->mobj)); // Save actor's ID - _ctx->reelActor = (int32)FROM_LE_32(pmi->mulID); + _ctx->reelActor = (int32)FROM_32(pmi->mulID); /**** New (experimental? bit 5/1/95 ****/ if (!TinselV0 && !actorAlive(_ctx->reelActor)) @@ -488,7 +488,7 @@ static void t1PlayReel(CORO_PARAM, const PPINIT *ppi) { return; // Poke in the background palette - PokeInPalette(FROM_LE_32(pmi->hMulFrame)); + PokeInPalette(FROM_32(pmi->hMulFrame)); // Set up and insert the multi-object _ctx->pPlayObj = MultiInitObject(pmi); @@ -534,7 +534,7 @@ static void t1PlayReel(CORO_PARAM, const PPINIT *ppi) { if (ppi->actorid == 0 && !actorAlive(_ctx->reelActor)) _ctx->lifeNoMatter = true; - InitStepAnimScript(&_ctx->thisAnim, _ctx->pPlayObj, FROM_LE_32(_ctx->pfreel->script), ppi->speed); + InitStepAnimScript(&_ctx->thisAnim, _ctx->pPlayObj, FROM_32(_ctx->pfreel->script), ppi->speed); // If first column, set Z position as per // Otherwise, column 0's + column number @@ -706,16 +706,16 @@ static void t2PlayReel(CORO_PARAM, int x, int y, bool bRestore, int speed, SCNHA // Get the reel and MULTI_INIT structure _ctx->pFreel = GetReel(hFilm, column); - _ctx->pmi = (MULTI_INIT *)LockMem(FROM_LE_32(_ctx->pFreel->mobj)); + _ctx->pmi = (MULTI_INIT *)LockMem(FROM_32(_ctx->pFreel->mobj)); - if ((int32)FROM_LE_32(_ctx->pmi->mulID) == -2) { + if ((int32)FROM_32(_ctx->pmi->mulID) == -2) { CORO_INVOKE_ARGS(SoundReel, (CORO_SUBCTX, hFilm, column, speed, myescEvent, - FROM_LE_32(_ctx->pmi->otherFlags) & OTH_RELATEDACTOR)); + FROM_32(_ctx->pmi->otherFlags) & OTH_RELATEDACTOR)); return; } // Save actor's ID - _ctx->reelActor = FROM_LE_32(_ctx->pmi->mulID); + _ctx->reelActor = FROM_32(_ctx->pmi->mulID); UpdateActorEsc(_ctx->reelActor, myescEvent); @@ -759,8 +759,8 @@ static void t2PlayReel(CORO_PARAM, int x, int y, bool bRestore, int speed, SCNHA // Set ghost bit if wanted if (ActorIsGhost(_ctx->reelActor)) { - assert(FROM_LE_32(_ctx->pmi->mulFlags) == DMA_WNZ || FROM_LE_32(_ctx->pmi->mulFlags) == (DMA_WNZ | DMA_GHOST)); - _ctx->pmi->mulFlags = TO_LE_32(FROM_LE_32(_ctx->pmi->mulFlags) | DMA_GHOST); + assert(FROM_32(_ctx->pmi->mulFlags) == DMA_WNZ || FROM_32(_ctx->pmi->mulFlags) == (DMA_WNZ | DMA_GHOST)); + _ctx->pmi->mulFlags = TO_32(FROM_32(_ctx->pmi->mulFlags) | DMA_GHOST); } // Set up and insert the multi-object @@ -793,10 +793,10 @@ static void t2PlayReel(CORO_PARAM, int x, int y, bool bRestore, int speed, SCNHA /* * Sort out x and y */ - assert( ((FROM_LE_32(_ctx->pmi->otherFlags) & OTH_RELATIVE) && !(FROM_LE_32(_ctx->pmi->otherFlags) & OTH_ABSOLUTE)) - || ((FROM_LE_32(_ctx->pmi->otherFlags) & OTH_ABSOLUTE) && !(FROM_LE_32(_ctx->pmi->otherFlags) & OTH_RELATIVE)) ); + assert( ((FROM_32(_ctx->pmi->otherFlags) & OTH_RELATIVE) && !(FROM_32(_ctx->pmi->otherFlags) & OTH_ABSOLUTE)) + || ((FROM_32(_ctx->pmi->otherFlags) & OTH_ABSOLUTE) && !(FROM_32(_ctx->pmi->otherFlags) & OTH_RELATIVE)) ); - _ctx->bRelative = FROM_LE_32(_ctx->pmi->otherFlags) & OTH_RELATIVE; + _ctx->bRelative = FROM_32(_ctx->pmi->otherFlags) & OTH_RELATIVE; if (_ctx->bRelative) { // Use actor's position. If (x, y) specified, move the actor. @@ -808,7 +808,7 @@ static void t2PlayReel(CORO_PARAM, int x, int y, bool bRestore, int speed, SCNHA x = y = 0; // Use (0,0) if no specified // Add embedded co-ords - MultiSetAniXY(_ctx->pPlayObj, x + FROM_LE_32(_ctx->pmi->mulX), y + FROM_LE_32(_ctx->pmi->mulY)); + MultiSetAniXY(_ctx->pPlayObj, x + FROM_32(_ctx->pmi->mulX), y + FROM_32(_ctx->pmi->mulY)); /* * Sort out z @@ -824,10 +824,10 @@ static void t2PlayReel(CORO_PARAM, int x, int y, bool bRestore, int speed, SCNHA // N.B. It HAS been ensured that the first column gets here first - if ((int32)FROM_LE_32(_ctx->pmi->mulZ) != -1) { + if ((int32)FROM_32(_ctx->pmi->mulZ) != -1) { // Z override in script - baseZfact = FROM_LE_32(_ctx->pmi->mulZ); + baseZfact = FROM_32(_ctx->pmi->mulZ); baseZposn = (baseZfact << ZSHIFT) + MultiLowest(_ctx->pPlayObj); if (bTop) baseZposn += Z_TOPPLAY; @@ -850,7 +850,7 @@ static void t2PlayReel(CORO_PARAM, int x, int y, bool bRestore, int speed, SCNHA * another reel starts up for this actor, * or the actor gets killed. */ - InitStepAnimScript(&_ctx->thisAnim, _ctx->pPlayObj, FROM_LE_32(_ctx->pFreel->script), speed); + InitStepAnimScript(&_ctx->thisAnim, _ctx->pPlayObj, FROM_32(_ctx->pFreel->script), speed); if (bRestore || (ActorEsc(_ctx->reelActor) == true && ActorEev(_ctx->reelActor) != GetEscEvents())) { @@ -952,10 +952,10 @@ void NewestFilm(SCNHANDLE film, const FREEL *reel) { const MULTI_INIT *pmi; // MULTI_INIT structure // Get the MULTI_INIT structure - pmi = (const MULTI_INIT *)LockMem(FROM_LE_32(reel->mobj)); + pmi = (const MULTI_INIT *)LockMem(FROM_32(reel->mobj)); - if (!TinselV2 || ((int32)FROM_LE_32(pmi->mulID) != -2)) - SetActorLatestFilm((int32)FROM_LE_32(pmi->mulID), film); + if (!TinselV2 || ((int32)FROM_32(pmi->mulID) != -2)) + SetActorLatestFilm((int32)FROM_32(pmi->mulID), film); } // ******************************************************* @@ -988,7 +988,7 @@ void PlayFilm(CORO_PARAM, SCNHANDLE hFilm, int x, int y, int actorid, bool splay ppi.y = y; ppi.z = 0; ppi.bRestore = false; - ppi.speed = (ONE_SECOND / FROM_LE_32(pFilm->frate)); + ppi.speed = (ONE_SECOND / FROM_32(pFilm->frate)); ppi.actorid = actorid; ppi.splay = splay; ppi.bTop = bTop; @@ -997,7 +997,7 @@ void PlayFilm(CORO_PARAM, SCNHANDLE hFilm, int x, int y, int actorid, bool splay ppi.myescEvent = myescEvent; // Start display process for each reel in the film - for (int i = FROM_LE_32(pFilm->numreels) - 1; i >= 0; i--) { + for (int i = FROM_32(pFilm->numreels) - 1; i >= 0; i--) { NewestFilm(hFilm, &pFilm->reels[i]); ppi.column = i; @@ -1049,7 +1049,7 @@ void PlayFilmc(CORO_PARAM, SCNHANDLE hFilm, int x, int y, int actorid, bool spla _ctx->ppi.y = y; _ctx->ppi.z = 0; _ctx->ppi.bRestore = false; - _ctx->ppi.speed = (ONE_SECOND / FROM_LE_32(pFilm->frate)); + _ctx->ppi.speed = (ONE_SECOND / FROM_32(pFilm->frate)); _ctx->ppi.actorid = actorid; _ctx->ppi.splay = splay; _ctx->ppi.bTop = bTop; @@ -1059,7 +1059,7 @@ void PlayFilmc(CORO_PARAM, SCNHANDLE hFilm, int x, int y, int actorid, bool spla // Start display process for each secondary reel in the film in Tinsel 1, // or all of them in Tinsel 2 - for (int i = FROM_LE_32(pFilm->numreels) - 1; i >= (TinselV2 ? 0 : 1); i--) { + for (int i = FROM_32(pFilm->numreels) - 1; i >= (TinselV2 ? 0 : 1); i--) { NewestFilm(hFilm, &pFilm->reels[i]); _ctx->ppi.column = i; @@ -1109,7 +1109,7 @@ void RestoreActorReels(SCNHANDLE hFilm, short reelnum, short z, int x, int y) { ppi.x = x; ppi.y = y; ppi.z = z; - ppi.speed = (ONE_SECOND / FROM_LE_32(pfilm->frate)); + ppi.speed = (ONE_SECOND / FROM_32(pfilm->frate)); ppi.actorid = 0; ppi.splay = false; ppi.bTop = false; @@ -1147,15 +1147,15 @@ void RestoreActorReels(SCNHANDLE hFilm, int actor, int x, int y) { ppi.x = (short)x; ppi.y = (short)y; ppi.bRestore = true; - ppi.speed = (short)(ONE_SECOND/FROM_LE_32(pFilm->frate)); + ppi.speed = (short)(ONE_SECOND/FROM_32(pFilm->frate)); ppi.bTop = false; ppi.myescEvent = 0; // Search backwards for now as later column will be the one - for (i = (int)FROM_LE_32(pFilm->numreels) - 1; i >= 0; i--) { + for (i = (int)FROM_32(pFilm->numreels) - 1; i >= 0; i--) { pFreel = &pFilm->reels[i]; - pmi = (PMULTI_INIT) LockMem(FROM_LE_32(pFreel->mobj)); - if ((int32)FROM_LE_32(pmi->mulID) == actor) { + pmi = (PMULTI_INIT) LockMem(FROM_32(pFreel->mobj)); + if ((int32)FROM_32(pmi->mulID) == actor) { ppi.column = (short)i; NewestFilm(hFilm, &pFilm->reels[i]); @@ -1173,8 +1173,8 @@ void RestoreActorReels(SCNHANDLE hFilm, int actor, int x, int y) { int ExtractActor(SCNHANDLE hFilm) { const FILM *pFilm = (const FILM *)LockMem(hFilm); const FREEL *pReel = &pFilm->reels[0]; - const MULTI_INIT *pmi = (const MULTI_INIT *)LockMem(FROM_LE_32(pReel->mobj)); - return (int)FROM_LE_32(pmi->mulID); + const MULTI_INIT *pmi = (const MULTI_INIT *)LockMem(FROM_32(pReel->mobj)); + return (int)FROM_32(pmi->mulID); } } // End of namespace Tinsel diff --git a/engines/tinsel/polygons.cpp b/engines/tinsel/polygons.cpp index d8c1cef0b6..8a984c78f9 100644 --- a/engines/tinsel/polygons.cpp +++ b/engines/tinsel/polygons.cpp @@ -154,13 +154,13 @@ public: void setIndex(int index); - POLY_TYPE getType() const { return (POLY_TYPE)FROM_LE_32(type); } - int getNodecount() const { return (int)FROM_LE_32(nodecount); } - int getNodeX(int i) const { return (int)FROM_LE_32(nlistx[i]); } - int getNodeY(int i) const { return (int)FROM_LE_32(nlisty[i]); } + POLY_TYPE getType() const { return (POLY_TYPE)FROM_32(type); } + int getNodecount() const { return (int)FROM_32(nodecount); } + int getNodeX(int i) const { return (int)FROM_32(nlistx[i]); } + int getNodeY(int i) const { return (int)FROM_32(nlisty[i]); } // get Inter-node line structure - const LINEINFO *getLineinfo(int i) const { return ((const LINEINFO *)(_pStart + (int)FROM_LE_32(plinelist))) + i; } + const LINEINFO *getLineinfo(int i) const { return ((const LINEINFO *)(_pStart + (int)FROM_32(plinelist))) + i; } protected: POLY_TYPE type; ///< type of polygon @@ -230,8 +230,8 @@ void Poly::nextPoly() { const byte *pRecord = _pData; int typeVal = nextLong(_pData); - if ((FROM_LE_32(typeVal) == 5) && TinselV2) - typeVal = TO_LE_32(6); + if ((FROM_32(typeVal) == 5) && TinselV2) + typeVal = TO_32(6); type = (POLY_TYPE)typeVal; for (int i = 0; i < 4; ++i) @@ -275,8 +275,8 @@ void Poly::nextPoly() { pnodelisty = nextLong(_pData); plinelist = nextLong(_pData); - nlistx = (const int32 *)(_pStart + (int)FROM_LE_32(pnodelistx)); - nlisty = (const int32 *)(_pStart + (int)FROM_LE_32(pnodelisty)); + nlistx = (const int32 *)(_pStart + (int)FROM_32(pnodelistx)); + nlisty = (const int32 *)(_pStart + (int)FROM_32(pnodelisty)); if (TinselV0) // Skip to the last 4 bytes of the record for the hScript value @@ -591,16 +591,16 @@ void FindBestPoint(HPOLYGON hp, int *x, int *y, int *pline) { for (int i = 0; i < ptp.getNodecount() - 1; i++) { const LINEINFO *line = ptp.getLineinfo(i); - const int32 a = (int)FROM_LE_32(line->a); - const int32 b = (int)FROM_LE_32(line->b); - const int32 c = (int)FROM_LE_32(line->c); + const int32 a = (int)FROM_32(line->a); + const int32 b = (int)FROM_32(line->b); + const int32 c = (int)FROM_32(line->c); #if 1 // TODO: If the comments of the LINEINFO struct are correct, then it contains mostly // duplicate data, probably in an effort to safe CPU cycles. Even on the slowest devices // we support, calculating a product of two ints is not an issue. // So we can just load & endian convert a,b,c, then replace stuff like - // (int)FROM_LE_32(line->ab) + // (int)FROM_32(line->ab) // by simply a*b, which makes it easier to understand what the code does, too. // Just in case there is some bugged data, I leave this code here for verifying it. // Let's leave it in for some time. @@ -608,14 +608,14 @@ void FindBestPoint(HPOLYGON hp, int *x, int *y, int *pline) { // One bad thing: We use sqrt to compute a square root. Might not be a good idea, // speed wise. Maybe we should take Vicent's fp_sqroot. But that's a problem for later. - int32 a2 = (int)FROM_LE_32(line->a2); ///< a squared - int32 b2 = (int)FROM_LE_32(line->b2); ///< b squared - int32 a2pb2 = (int)FROM_LE_32(line->a2pb2); ///< a squared + b squared - int32 ra2pb2 = (int)FROM_LE_32(line->ra2pb2); ///< root(a squared + b squared) + int32 a2 = (int)FROM_32(line->a2); ///< a squared + int32 b2 = (int)FROM_32(line->b2); ///< b squared + int32 a2pb2 = (int)FROM_32(line->a2pb2); ///< a squared + b squared + int32 ra2pb2 = (int)FROM_32(line->ra2pb2); ///< root(a squared + b squared) - int32 ab = (int)FROM_LE_32(line->ab); - int32 ac = (int)FROM_LE_32(line->ac); - int32 bc = (int)FROM_LE_32(line->bc); + int32 ab = (int)FROM_32(line->ab); + int32 ac = (int)FROM_32(line->ac); + int32 bc = (int)FROM_32(line->bc); assert(a*a == a2); assert(b*b == b2); @@ -676,9 +676,9 @@ void FindBestPoint(HPOLYGON hp, int *x, int *y, int *pline) { // A point on a line is nearest const LINEINFO *line = ptp.getLineinfo(nearestL); - const int32 a = (int)FROM_LE_32(line->a); - const int32 b = (int)FROM_LE_32(line->b); - const int32 c = (int)FROM_LE_32(line->c); + const int32 a = (int)FROM_32(line->a); + const int32 b = (int)FROM_32(line->b); + const int32 c = (int)FROM_32(line->c); dropX = ((b*b * h) - (a*b * k) - a*c) / (a*a + b*b); dropY = ((a*a * k) - (a*b * h) - b*c) / (a*a + b*b); *x = dropX; @@ -994,15 +994,15 @@ int GetScale(HPOLYGON hPath, int y) { Poly ptp(LockMem(pHandle), Polys[hPath]->pIndex); // Path is of a constant scale? - if (FROM_LE_32(ptp.scale2) == 0) - return FROM_LE_32(ptp.scale1); + if (FROM_32(ptp.scale2) == 0) + return FROM_32(ptp.scale1); - assert(FROM_LE_32(ptp.scale1) >= FROM_LE_32(ptp.scale2)); + assert(FROM_32(ptp.scale1) >= FROM_32(ptp.scale2)); - zones = FROM_LE_32(ptp.scale1) - FROM_LE_32(ptp.scale2) + 1; + zones = FROM_32(ptp.scale1) - FROM_32(ptp.scale2) + 1; zlen = (Polys[hPath]->pbottom - Polys[hPath]->ptop) / zones; - scale = FROM_LE_32(ptp.scale1); + scale = FROM_32(ptp.scale1); top = Polys[hPath]->ptop; do { @@ -1011,7 +1011,7 @@ int GetScale(HPOLYGON hPath, int y) { return scale; } while (--scale); - return FROM_LE_32(ptp.scale2); + return FROM_32(ptp.scale2); } /** @@ -1033,15 +1033,15 @@ int GetBrightness(HPOLYGON hPath, int y) { Poly ptp(LockMem(pHandle), Polys[hPath]->pIndex); // Path is of a constant brightness? - if (FROM_LE_32(ptp.bright1) == FROM_LE_32(ptp.bright2)) - return FROM_LE_32(ptp.bright1); + if (FROM_32(ptp.bright1) == FROM_32(ptp.bright2)) + return FROM_32(ptp.bright1); - assert(FROM_LE_32(ptp.bright1) >= FROM_LE_32(ptp.bright2)); + assert(FROM_32(ptp.bright1) >= FROM_32(ptp.bright2)); - zones = FROM_LE_32(ptp.bright1) - FROM_LE_32(ptp.bright2) + 1; + zones = FROM_32(ptp.bright1) - FROM_32(ptp.bright2) + 1; zlen = (Polys[hPath]->pbottom - Polys[hPath]->ptop) / zones; - brightness = FROM_LE_32(ptp.bright1); + brightness = FROM_32(ptp.bright1); top = Polys[hPath]->ptop; do { @@ -1050,7 +1050,7 @@ int GetBrightness(HPOLYGON hPath, int y) { return brightness; } while (--brightness); - return FROM_LE_32(ptp.bright2); + return FROM_32(ptp.bright2); } @@ -1079,9 +1079,9 @@ void GetTagTag(HPOLYGON hp, SCNHANDLE *hTagText, int *tagx, int *tagy) { Poly ptp(LockMem(pHandle), Polys[hp]->pIndex); - *tagx = (int)FROM_LE_32(ptp.tagx) + (TinselV2 ? volatileStuff[hp].xoff : 0); - *tagy = (int)FROM_LE_32(ptp.tagy) + (TinselV2 ? volatileStuff[hp].yoff : 0); - *hTagText = FROM_LE_32(ptp.hTagtext); + *tagx = (int)FROM_32(ptp.tagx) + (TinselV2 ? volatileStuff[hp].xoff : 0); + *tagy = (int)FROM_32(ptp.tagy) + (TinselV2 ? volatileStuff[hp].yoff : 0); + *hTagText = FROM_32(ptp.hTagtext); } /** @@ -1092,7 +1092,7 @@ SCNHANDLE GetPolyFilm(HPOLYGON hp) { Poly ptp(LockMem(pHandle), Polys[hp]->pIndex); - return FROM_LE_32(ptp.hFilm); + return FROM_32(ptp.hFilm); } /** @@ -1103,7 +1103,7 @@ SCNHANDLE GetPolyScript(HPOLYGON hp) { Poly ptp(LockMem(pHandle), Polys[hp]->pIndex); - return FROM_LE_32(ptp.hScript); + return FROM_32(ptp.hScript); } REEL GetPolyReelType(HPOLYGON hp) { @@ -1115,7 +1115,7 @@ REEL GetPolyReelType(HPOLYGON hp) { Poly ptp(LockMem(pHandle), Polys[hp]->pIndex); - return (REEL)FROM_LE_32(ptp.reel); + return (REEL)FROM_32(ptp.reel); } int32 GetPolyZfactor(HPOLYGON hp) { @@ -1124,7 +1124,7 @@ int32 GetPolyZfactor(HPOLYGON hp) { Poly ptp(LockMem(pHandle), Polys[hp]->pIndex); - return (int)FROM_LE_32(ptp.zFactor); + return (int)FROM_32(ptp.zFactor); } int numNodes(HPOLYGON hp) { @@ -1319,11 +1319,11 @@ static bool MatchingLevels(PPOLYGON p1, PPOLYGON p2) { Poly pp1(pps, p1->pIndex); // This polygon 1 Poly pp2(pps, p2->pIndex); // This polygon 2 - assert((int32)FROM_LE_32(pp1.level1) <= (int32)FROM_LE_32(pp1.level2)); - assert((int32)FROM_LE_32(pp2.level1) <= (int32)FROM_LE_32(pp2.level2)); + assert((int32)FROM_32(pp1.level1) <= (int32)FROM_32(pp1.level2)); + assert((int32)FROM_32(pp2.level1) <= (int32)FROM_32(pp2.level2)); - for (int pl = (int32)FROM_LE_32(pp1.level1); pl <= (int32)FROM_LE_32(pp1.level2); pl++) { - if (pl >= (int32)FROM_LE_32(pp2.level1) && pl <= (int32)FROM_LE_32(pp2.level2)) + for (int pl = (int32)FROM_32(pp1.level1); pl <= (int32)FROM_32(pp1.level2); pl++) { + if (pl >= (int32)FROM_32(pp2.level1) && pl <= (int32)FROM_32(pp2.level2)) return true; } @@ -1604,17 +1604,17 @@ static PPOLYGON CommonInits(PTYPE polyType, int pno, const Poly &ptp, bool bRest p->pIndex = pno; for (i = 0; i < 4; i++) { // Polygon definition - p->cx[i] = (short)FROM_LE_32(ptp.x[i]); - p->cy[i] = (short)FROM_LE_32(ptp.y[i]); + p->cx[i] = (short)FROM_32(ptp.x[i]); + p->cy[i] = (short)FROM_32(ptp.y[i]); } if (!bRestart) { hp = PolygonIndex(p); - volatileStuff[hp].xoff = (short)FROM_LE_32(ptp.xoff); - volatileStuff[hp].yoff = (short)FROM_LE_32(ptp.yoff); + volatileStuff[hp].xoff = (short)FROM_32(ptp.xoff); + volatileStuff[hp].yoff = (short)FROM_32(ptp.yoff); } - p->polyID = FROM_LE_32(ptp.id); // Identifier + p->polyID = FROM_32(ptp.id); // Identifier FiddlyBit(p); @@ -1731,7 +1731,7 @@ static void InitEffect(const Poly &ptp, int pno, bool bRestart) { static void InitRefer(const Poly &ptp, int pno, bool bRestart) { PPOLYGON p = CommonInits(REFER, pno, ptp, bRestart); - p->subtype = FROM_LE_32(ptp.reftype); // Refer type + p->subtype = FROM_32(ptp.reftype); // Refer type } @@ -1990,8 +1990,8 @@ void GetPolyNode(HPOLYGON hp, int *pNodeX, int *pNodeY) { *pNodeX = 480; *pNodeY = 408; } else { - *pNodeX = FROM_LE_32(ptp.nodex); - *pNodeY = FROM_LE_32(ptp.nodey); + *pNodeX = FROM_32(ptp.nodex); + *pNodeY = FROM_32(ptp.nodey); } if (TinselV2) { diff --git a/engines/tinsel/rince.cpp b/engines/tinsel/rince.cpp index ba8f47f9cf..3e6334f583 100644 --- a/engines/tinsel/rince.cpp +++ b/engines/tinsel/rince.cpp @@ -550,7 +550,7 @@ void AlterMover(PMOVER pMover, SCNHANDLE film, AR_FUNCTION fn) { pfilm = (const FILM *)LockMem(film); assert(pfilm != NULL); - InitStepAnimScript(&pMover->actorAnim, pMover->actorObj, FROM_LE_32(pfilm->reels[0].script), ONE_SECOND / FROM_LE_32(pfilm->frate)); + InitStepAnimScript(&pMover->actorAnim, pMover->actorObj, FROM_32(pfilm->reels[0].script), ONE_SECOND / FROM_32(pfilm->frate)); if (!TinselV2) pMover->stepCount = 0; @@ -643,7 +643,7 @@ void SetMoverWalkReel(PMOVER pMover, DIRECTION reel, int scale, bool force) { pfilm = (const FILM *)LockMem(whichReel); assert(pfilm != NULL); // no film - InitStepAnimScript(&pMover->actorAnim, pMover->actorObj, FROM_LE_32(pfilm->reels[0].script), 1); + InitStepAnimScript(&pMover->actorAnim, pMover->actorObj, FROM_32(pfilm->reels[0].script), 1); // Synchronised walking reels assert(pMover->stepCount >= 0); @@ -704,14 +704,14 @@ static void MoverProcessHelper(int X, int Y, int id, PMOVER pMover) { InitialPathChecks(pMover, X, Y); pfilm = (const FILM *)LockMem(pMover->walkReels[0][FORWARD]); - pmi = (const MULTI_INIT *)LockMem(FROM_LE_32(pfilm->reels[0].mobj)); + pmi = (const MULTI_INIT *)LockMem(FROM_32(pfilm->reels[0].mobj)); //--- - pFrame = (const FRAME *)LockMem(FROM_LE_32(pmi->hMulFrame)); + pFrame = (const FRAME *)LockMem(FROM_32(pmi->hMulFrame)); // get pointer to image - pim = (IMAGE *)LockMem(READ_LE_UINT32(pFrame)); // handle to image - pim->hImgPal = TO_LE_32(BgPal()); + pim = (IMAGE *)LockMem(READ_32(pFrame)); // handle to image + pim->hImgPal = TO_32(BgPal()); //--- pMover->actorObj = MultiInitObject(pmi); @@ -722,7 +722,7 @@ static void MoverProcessHelper(int X, int Y, int id, PMOVER pMover) { MultiInsertObject(GetPlayfieldList(FIELD_WORLD), pMover->actorObj); storeActorReel(id, NULL, 0, pMover->actorObj, 0, 0, 0); - InitStepAnimScript(&pMover->actorAnim, pMover->actorObj, FROM_LE_32(pfilm->reels[0].script), ONE_SECOND / FROM_LE_32(pfilm->frate)); + InitStepAnimScript(&pMover->actorAnim, pMover->actorObj, FROM_32(pfilm->reels[0].script), ONE_SECOND / FROM_32(pfilm->frate)); pMover->stepCount = 0; MultiSetAniXY(pMover->actorObj, pMover->objX, pMover->objY); @@ -802,7 +802,7 @@ void T2MoverProcess(CORO_PARAM, const void *param) { InitialPathChecks(pMover, rpos->X, rpos->Y); pFilm = (FILM *)LockMem(pMover->walkReels[i][FORWARD]); // Any old reel - pmi = (PMULTI_INIT)LockMem(FROM_LE_32(pFilm->reels[0].mobj)); + pmi = (PMULTI_INIT)LockMem(FROM_32(pFilm->reels[0].mobj)); // Poke in the background palette PokeInPalette(pmi); diff --git a/engines/tinsel/saveload.cpp b/engines/tinsel/saveload.cpp index 2ef92d853f..acff196916 100644 --- a/engines/tinsel/saveload.cpp +++ b/engines/tinsel/saveload.cpp @@ -540,8 +540,8 @@ static void SaveFailure(Common::OutSaveFile *f) { if (f) { delete f; _vm->getSaveFileMan()->removeSavefile(g_SaveSceneName); - g_SaveSceneName = NULL; // Invalidate save name } + g_SaveSceneName = NULL; // Invalidate save name GUI::MessageDialog dialog(_("Failed to save game state to file.")); dialog.runModal(); } diff --git a/engines/tinsel/scene.cpp b/engines/tinsel/scene.cpp index c5444517f1..9181f85afb 100644 --- a/engines/tinsel/scene.cpp +++ b/engines/tinsel/scene.cpp @@ -86,8 +86,8 @@ struct SCENE_STRUC { SCNHANDLE hTaggedActor; // handle to table of tagged actors int32 numProcess; // number of processes in this scene SCNHANDLE hProcess; // handle to table of processes - SCNHANDLE hMusicScript; // handle to music script data - SCNHANDLE hMusicSegment;// handle to music segments + SCNHANDLE hMusicScript; // handle to music script data - Tinsel 2 only + SCNHANDLE hMusicSegment;// handle to music segments - Tinsel 2 only } PACKED_STRUCT; /** entrance structure - one per entrance */ @@ -130,15 +130,15 @@ const SCENE_STRUC *GetSceneStruc(const byte *pStruc) { const byte *p = pStruc; memset(&g_tempStruc, 0, sizeof(SCENE_STRUC)); - g_tempStruc.numEntrance = READ_UINT32(p); p += sizeof(uint32); - g_tempStruc.numPoly = READ_UINT32(p); p += sizeof(uint32); - g_tempStruc.numTaggedActor = READ_UINT32(p); p += sizeof(uint32); - g_tempStruc.defRefer = READ_UINT32(p); p += sizeof(uint32); - g_tempStruc.hSceneScript = READ_UINT32(p); p += sizeof(uint32); - g_tempStruc.hEntrance = READ_UINT32(p); p += sizeof(uint32); - g_tempStruc.hPoly = READ_UINT32(p); p += sizeof(uint32); - g_tempStruc.hTaggedActor = READ_UINT32(p); p += sizeof(uint32); - + g_tempStruc.numEntrance = FROM_LE_32(READ_32(p)); p += sizeof(uint32); + g_tempStruc.numPoly = FROM_LE_32(READ_32(p)); p += sizeof(uint32); + g_tempStruc.numTaggedActor = FROM_LE_32(READ_32(p)); p += sizeof(uint32); + g_tempStruc.defRefer = FROM_LE_32(READ_32(p)); p += sizeof(uint32); + g_tempStruc.hSceneScript = FROM_LE_32(READ_32(p)); p += sizeof(uint32); + g_tempStruc.hEntrance = FROM_LE_32(READ_32(p)); p += sizeof(uint32); + g_tempStruc.hPoly = FROM_LE_32(READ_32(p)); p += sizeof(uint32); + g_tempStruc.hTaggedActor = FROM_LE_32(READ_32(p)); p += sizeof(uint32); + return &g_tempStruc; } @@ -159,7 +159,8 @@ static void SceneTinselProcess(CORO_PARAM, const void *param) { // The following myEscape value setting is used for enabling title screen skipping in DW1 if (TinselV1 && (g_sceneCtr == 1)) g_initialMyEscape = GetEscEvents(); // DW1 PSX has its own scene skipping script code for scenes 2 and 3 (bug #3541542). - _ctx->myEscape = (TinselV1 && (g_sceneCtr < (TinselV1PSX ? 2 : 4))) ? g_initialMyEscape : 0; + // Same goes for DW1 Mac. + _ctx->myEscape = (TinselV1 && (g_sceneCtr < ((TinselV1PSX || TinselV1Mac) ? 2 : 4))) ? g_initialMyEscape : 0; // get the stuff copied to process when it was created _ctx->pInit = (const TP_INIT *)param; @@ -167,7 +168,7 @@ static void SceneTinselProcess(CORO_PARAM, const void *param) { assert(_ctx->pInit->hTinselCode); // Must have some code to run _ctx->pic = InitInterpretContext(GS_SCENE, - READ_LE_UINT32(&_ctx->pInit->hTinselCode), + _ctx->pInit->hTinselCode, TinselV2 ? _ctx->pInit->event : NOEVENT, NOPOLY, // No polygon 0, // No actor @@ -209,7 +210,7 @@ void SendSceneTinselProcess(TINSEL_EVENT event) { */ static void LoadScene(SCNHANDLE scene, int entry) { - uint i; + int32 i; TP_INIT init; const SCENE_STRUC *ss; const ENTRANCE_STRUC *es; @@ -223,7 +224,7 @@ static void LoadScene(SCNHANDLE scene, int entry) { // CdPlay() stuff byte *cptr = FindChunk(scene, CHUNK_CDPLAY_FILENUM); assert(cptr); - i = READ_LE_UINT32(cptr); + i = READ_32(cptr); assert(i < 512); cptr = FindChunk(scene, CHUNK_CDPLAY_FILENAME); assert(cptr); @@ -238,18 +239,17 @@ static void LoadScene(SCNHANDLE scene, int entry) { // Music stuff char *cptr = (char *)FindChunk(scene, CHUNK_MUSIC_FILENAME); assert(cptr); - _vm->_pcmMusic->setMusicSceneDetails(FROM_LE_32(ss->hMusicScript), - FROM_LE_32(ss->hMusicSegment), cptr); + _vm->_pcmMusic->setMusicSceneDetails(ss->hMusicScript, ss->hMusicSegment, cptr); } if (entry == NO_ENTRY_NUM) { // Restoring scene // Initialize all the polygons for this scene - InitPolygons(FROM_LE_32(ss->hPoly), FROM_LE_32(ss->numPoly), true); + InitPolygons(ss->hPoly, ss->numPoly, true); // Initialize the actors for this scene - StartTaggedActors(FROM_LE_32(ss->hTaggedActor), FROM_LE_32(ss->numTaggedActor), false); + StartTaggedActors(ss->hTaggedActor, ss->numTaggedActor, false); if (TinselV2) // Returning from cutscene @@ -259,18 +259,18 @@ static void LoadScene(SCNHANDLE scene, int entry) { // Genuine new scene // Initialize all the polygons for this scene - InitPolygons(FROM_LE_32(ss->hPoly), FROM_LE_32(ss->numPoly), false); + InitPolygons(ss->hPoly, ss->numPoly, false); // Initialize the actors for this scene - StartTaggedActors(FROM_LE_32(ss->hTaggedActor), FROM_LE_32(ss->numTaggedActor), true); + StartTaggedActors(ss->hTaggedActor, ss->numTaggedActor, true); // Run the appropriate entrance code (if any) - es = (const ENTRANCE_STRUC *)LockMem(FROM_LE_32(ss->hEntrance)); - for (i = 0; i < FROM_LE_32(ss->numEntrance); i++) { - if (FROM_LE_32(es->eNumber) == (uint)entry) { + es = (const ENTRANCE_STRUC *)LockMem(ss->hEntrance); + for (i = 0; i < ss->numEntrance; i++) { + if (FROM_32(es->eNumber) == (uint)entry) { if (es->hScript) { init.event = STARTUP; - init.hTinselCode = es->hScript; + init.hTinselCode = FROM_32(es->hScript); CoroScheduler.createProcess(PID_TCODE, SceneTinselProcess, &init, sizeof(init)); } @@ -285,7 +285,7 @@ static void LoadScene(SCNHANDLE scene, int entry) { } - if (i == FROM_LE_32(ss->numEntrance)) + if (i == ss->numEntrance) error("Non-existant scene entry number"); if (ss->hSceneScript) { @@ -297,10 +297,10 @@ static void LoadScene(SCNHANDLE scene, int entry) { } // Default refer type - SetDefaultRefer(FROM_LE_32(ss->defRefer)); + SetDefaultRefer(ss->defRefer); // Scene's processes - SceneProcesses(FROM_LE_32(ss->numProcess), FROM_LE_32(ss->hProcess)); + SceneProcesses(ss->numProcess, ss->hProcess); } diff --git a/engines/tinsel/sched.cpp b/engines/tinsel/sched.cpp index 4bf356ba36..a73b4b9b97 100644 --- a/engines/tinsel/sched.cpp +++ b/engines/tinsel/sched.cpp @@ -109,7 +109,7 @@ void RestoreSceneProcess(INT_CONTEXT *pic) { pStruc = (PROCESS_STRUC *)LockMem(g_hSceneProcess); for (i = 0; i < g_numSceneProcess; i++) { - if (FROM_LE_32(pStruc[i].hProcessCode) == pic->hCode) { + if (FROM_32(pStruc[i].hProcessCode) == pic->hCode) { CoroScheduler.createProcess(PID_PROCESS + i, RestoredProcessProcess, &pic, sizeof(pic)); break; @@ -137,11 +137,11 @@ void SceneProcessEvent(CORO_PARAM, uint32 procID, TINSEL_EVENT event, bool bWait _ctx->pStruc = (PROCESS_STRUC *)LockMem(g_hSceneProcess); for (i = 0; i < g_numSceneProcess; i++) { - if (FROM_LE_32(_ctx->pStruc[i].processId) == procID) { + if (FROM_32(_ctx->pStruc[i].processId) == procID) { assert(_ctx->pStruc[i].hProcessCode); // Must have some code to run _ctx->pic = InitInterpretContext(GS_PROCESS, - FROM_LE_32(_ctx->pStruc[i].hProcessCode), + FROM_32(_ctx->pStruc[i].hProcessCode), event, NOPOLY, // No polygon 0, // No actor @@ -176,7 +176,7 @@ void KillSceneProcess(uint32 procID) { pStruc = (PROCESS_STRUC *) LockMem(g_hSceneProcess); for (i = 0; i < g_numSceneProcess; i++) { - if (FROM_LE_32(pStruc[i].processId) == procID) { + if (FROM_32(pStruc[i].processId) == procID) { CoroScheduler.killMatchingProcess(PID_PROCESS + i, -1); break; } @@ -293,8 +293,8 @@ void GlobalProcesses(uint32 numProcess, byte *pProcess) { byte *p = pProcess; for (uint i = 0; i < numProcess; ++i, p += 8) { - g_pGlobalProcess[i].processId = READ_LE_UINT32(p); - g_pGlobalProcess[i].hProcessCode = READ_LE_UINT32(p + 4); + g_pGlobalProcess[i].processId = READ_32(p); + g_pGlobalProcess[i].hProcessCode = READ_32(p + 4); } } diff --git a/engines/tinsel/sound.cpp b/engines/tinsel/sound.cpp index e052302cfd..03aa3767c4 100644 --- a/engines/tinsel/sound.cpp +++ b/engines/tinsel/sound.cpp @@ -74,7 +74,7 @@ SoundManager::~SoundManager() { */ // playSample for DiscWorld 1 bool SoundManager::playSample(int id, Audio::Mixer::SoundType type, Audio::SoundHandle *handle) { - // Floppy version has no sample file + // Floppy version has no sample file. if (!_vm->isCD()) return false; @@ -102,7 +102,7 @@ bool SoundManager::playSample(int id, Audio::Mixer::SoundType type, Audio::Sound error(FILE_IS_CORRUPT, _vm->getSampleFile(g_sampleLanguage)); // read the length of the sample - uint32 sampleLen = _sampleStream.readUint32(); + uint32 sampleLen = _sampleStream.readUint32LE(); if (_sampleStream.eos() || _sampleStream.err()) error(FILE_IS_CORRUPT, _vm->getSampleFile(g_sampleLanguage)); @@ -177,6 +177,48 @@ bool SoundManager::playSample(int id, Audio::Mixer::SoundType type, Audio::Sound return true; } +bool SoundManager::playDW1MacMusic(int dwFileOffset) { + Common::File s; + + if (!s.open("midi.dat")) + error(CANNOT_FIND_FILE, "midi.dat"); + + s.seek(dwFileOffset); + uint32 length = s.readUint32BE(); + + // TODO: It's a bad idea to load the music track in a buffer. + // We should use a SubReadStream instead, and keep midi.dat open. + // However, the track lengths aren't that big (about 1-4MB), + // so this shouldn't be a major issue. + byte *soundData = (byte *)malloc(length); + assert(soundData); + + // read all of the sample + if (s.read(soundData, length) != length) + error(FILE_IS_CORRUPT, "midi.dat"); + + Common::SeekableReadStream *memStream = new Common::MemoryReadStream(soundData, length); + + Audio::SoundHandle *handle = &_channels[kChannelDW1MacMusic].handle; + //_channels[kChannelDW1MacMusic].sampleNum = dwFileOffset; + + // Stop any previously playing music track + _vm->_mixer->stopHandle(*handle); + + // FIXME: Should set this in a different place ;) + _vm->_mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, _vm->_config->_musicVolume); + + // TODO: Compression support (MP3/OGG/FLAC) for midi.dat in DW1 Mac + Audio::RewindableAudioStream *musicStream = Audio::makeRawStream(memStream, 22050, Audio::FLAG_UNSIGNED, DisposeAfterUse::YES); + + if (musicStream) + _vm->_mixer->playStream(Audio::Mixer::kMusicSoundType, handle, Audio::makeLoopingAudioStream(musicStream, 0)); + + s.close(); + + return true; +} + // playSample for DiscWorld 2 bool SoundManager::playSample(int id, int sub, bool bLooped, int x, int y, int priority, Audio::Mixer::SoundType type, Audio::SoundHandle *handle) { @@ -257,7 +299,7 @@ bool SoundManager::playSample(int id, int sub, bool bLooped, int x, int y, int p error(FILE_IS_CORRUPT, _vm->getSampleFile(g_sampleLanguage)); // read the length of the sample - uint32 sampleLen = _sampleStream.readUint32(); + uint32 sampleLen = _sampleStream.readUint32LE(); if (_sampleStream.eos() || _sampleStream.err()) error(FILE_IS_CORRUPT, _vm->getSampleFile(g_sampleLanguage)); @@ -270,12 +312,12 @@ bool SoundManager::playSample(int id, int sub, bool bLooped, int x, int y, int p // Skipping for (int32 i = 0; i < sub; i++) { - sampleLen = _sampleStream.readUint32(); + sampleLen = _sampleStream.readUint32LE(); _sampleStream.skip(sampleLen); if (_sampleStream.eos() || _sampleStream.err()) error(FILE_IS_CORRUPT, _vm->getSampleFile(g_sampleLanguage)); } - sampleLen = _sampleStream.readUint32(); + sampleLen = _sampleStream.readUint32LE(); if (_sampleStream.eos() || _sampleStream.err()) error(FILE_IS_CORRUPT, _vm->getSampleFile(g_sampleLanguage)); } @@ -369,7 +411,6 @@ bool SoundManager::offscreenChecks(int x, int &y) { } int8 SoundManager::getPan(int x) { - if (x == -1) return 0; @@ -416,14 +457,13 @@ bool SoundManager::sampleExists(int id) { /** * Returns true if a sample is currently playing. */ -bool SoundManager::sampleIsPlaying(int id) { +bool SoundManager::sampleIsPlaying() { if (!TinselV2) return _vm->_mixer->isSoundHandleActive(_channels[kChannelTinsel1].handle); for (int i = 0; i < kNumChannels; i++) - if (_channels[i].sampleNum == id) - if (_vm->_mixer->isSoundHandleActive(_channels[i].handle)) - return true; + if (_vm->_mixer->isSoundHandleActive(_channels[i].handle)) + return true; return false; } @@ -432,8 +472,6 @@ bool SoundManager::sampleIsPlaying(int id) { * Stops any currently playing sample. */ void SoundManager::stopAllSamples() { - // stop currently playing sample - if (!TinselV2) { _vm->_mixer->stopHandle(_channels[kChannelTinsel1].handle); return; @@ -466,12 +504,21 @@ void SoundManager::setSFXVolumes(uint8 volume) { _vm->_mixer->setChannelVolume(_channels[i].handle, volume); } +void SoundManager::showSoundError(const char *errorMsg, const char *soundFile) { + Common::String msg; + msg = Common::String::format(errorMsg, soundFile); + GUI::MessageDialog dialog(msg, "OK"); + dialog.runModal(); + + error("%s", msg.c_str()); +} + /** * Opens and inits all sound sample files. */ void SoundManager::openSampleFiles() { // Floppy and demo versions have no sample files, except for the Discworld 2 demo - if (!_vm->isCD() || TinselV0) + if (!_vm->isCD()) return; TinselFile f; @@ -480,42 +527,26 @@ void SoundManager::openSampleFiles() { // already allocated return; - // open sample index file in binary mode + // Open sample index (*.idx) in binary mode if (f.open(_vm->getSampleIndex(g_sampleLanguage))) { - // get length of index file - f.seek(0, SEEK_END); // move to end of file - _sampleIndexLen = f.pos(); // get file pointer - f.seek(0, SEEK_SET); // back to beginning - + uint32 fileSize = f.size(); + _sampleIndex = (uint32 *)malloc(fileSize); if (_sampleIndex == NULL) { - // allocate a buffer for the indices - _sampleIndex = (uint32 *)malloc(_sampleIndexLen); - - // make sure memory allocated - if (_sampleIndex == NULL) { - // disable samples if cannot alloc buffer for indices - // TODO: Disabled sound if we can't load the sample index? - return; - } + showSoundError(NO_MEM, _vm->getSampleIndex(g_sampleLanguage)); + return; } - // load data - if (f.read(_sampleIndex, _sampleIndexLen) != (uint32)_sampleIndexLen) - // file must be corrupt if we get to here - error(FILE_IS_CORRUPT, _vm->getSampleFile(g_sampleLanguage)); + _sampleIndexLen = fileSize / 4; // total sample of indices (DWORDs) - // close the file - f.close(); - - // convert file size to size in DWORDs - _sampleIndexLen /= sizeof(uint32); - -#ifdef SCUMM_BIG_ENDIAN - // Convert all ids from LE to native format + // Load data for (int i = 0; i < _sampleIndexLen; ++i) { - _sampleIndex[i] = SWAP_BYTES_32(_sampleIndex[i]); + _sampleIndex[i] = f.readUint32LE(); + if (f.err()) { + showSoundError(FILE_READ_ERROR, _vm->getSampleIndex(g_sampleLanguage)); + } } -#endif + + f.close(); // Detect format of soundfile by looking at 1st sample-index switch (TO_BE_32(_sampleIndex[0])) { @@ -523,48 +554,31 @@ void SoundManager::openSampleFiles() { debugC(DEBUG_DETAILED, kTinselDebugSound, "Detected MP3 sound-data"); _soundMode = kMP3Mode; break; - case MKTAG('O','G','G',' '): debugC(DEBUG_DETAILED, kTinselDebugSound, "Detected OGG sound-data"); _soundMode = kVorbisMode; break; - case MKTAG('F','L','A','C'): debugC(DEBUG_DETAILED, kTinselDebugSound, "Detected FLAC sound-data"); _soundMode = kFLACMode; break; - default: debugC(DEBUG_DETAILED, kTinselDebugSound, "Detected original sound-data"); break; } - // Normally the 1st sample-index points to nothing at all + + // Normally the 1st sample index points to nothing at all. We use it to + // determine if the game's sample files have been compressed, thus restore + // it here _sampleIndex[0] = 0; } else { - char buf[50]; - sprintf(buf, CANNOT_FIND_FILE, _vm->getSampleIndex(g_sampleLanguage)); - GUI::MessageDialog dialog(buf, "OK"); - dialog.runModal(); - - error(CANNOT_FIND_FILE, _vm->getSampleIndex(g_sampleLanguage)); + showSoundError(FILE_READ_ERROR, _vm->getSampleIndex(g_sampleLanguage)); } - // open sample file in binary mode + // Open sample file (*.smp) in binary mode if (!_sampleStream.open(_vm->getSampleFile(g_sampleLanguage))) { - char buf[50]; - sprintf(buf, CANNOT_FIND_FILE, _vm->getSampleFile(g_sampleLanguage)); - GUI::MessageDialog dialog(buf, "OK"); - dialog.runModal(); - - error(CANNOT_FIND_FILE, _vm->getSampleFile(g_sampleLanguage)); + showSoundError(FILE_READ_ERROR, _vm->getSampleFile(g_sampleLanguage)); } - -/* - // gen length of the largest sample - sampleBuffer.size = _sampleStream.readUint32LE(); - if (_sampleStream.eos() || _sampleStream.err()) - error(FILE_IS_CORRUPT, _vm->getSampleFile(g_sampleLanguage)); -*/ } void SoundManager::closeSampleStream() { diff --git a/engines/tinsel/sound.h b/engines/tinsel/sound.h index d7083b3b21..8510c1618f 100644 --- a/engines/tinsel/sound.h +++ b/engines/tinsel/sound.h @@ -51,7 +51,8 @@ protected: enum { kChannelTalk = 0, kChannelTinsel1 = 0, // Always using this channel for DW1 - kChannelSFX = 1 + kChannelSFX = 1, + kChannelDW1MacMusic = 2 }; static const int kNumChannels = kChannelSFX + kNumSFX; @@ -108,6 +109,7 @@ public: bool playSample(int id, Audio::Mixer::SoundType type, Audio::SoundHandle *handle = 0); bool playSample(int id, int sub, bool bLooped, int x, int y, int priority, Audio::Mixer::SoundType type, Audio::SoundHandle *handle = 0); + bool playDW1MacMusic(int dwFileOffset); void stopAllSamples(); // Stops any currently playing sample void stopSpecSample(int id, int sub = 0); // Stops a specific sample @@ -115,11 +117,13 @@ public: void setSFXVolumes(uint8 volume); bool sampleExists(int id); - bool sampleIsPlaying(int id = -1); + bool sampleIsPlaying(); - // TODO: Internal method, make this protected? void openSampleFiles(); void closeSampleStream(); + +private: + void showSoundError(const char *errorMsg, const char *soundFile); }; } // End of namespace Tinsel diff --git a/engines/tinsel/strres.cpp b/engines/tinsel/strres.cpp index 5a29a4d2cd..19a1ee94d6 100644 --- a/engines/tinsel/strres.cpp +++ b/engines/tinsel/strres.cpp @@ -165,15 +165,15 @@ static byte *FindStringBase(int id) { // skip to the correct chunk while (chunkSkip-- != 0) { // make sure chunk id is correct - assert(READ_LE_UINT32(pText + index) == CHUNK_STRING || READ_LE_UINT32(pText + index) == CHUNK_MBSTRING); + assert(READ_32(pText + index) == CHUNK_STRING || READ_32(pText + index) == CHUNK_MBSTRING); - if (READ_LE_UINT32(pText + index + sizeof(uint32)) == 0) { + if (READ_32(pText + index + sizeof(uint32)) == 0) { // string does not exist return NULL; } // get index to next chunk - index = READ_LE_UINT32(pText + index + sizeof(uint32)); + index = READ_32(pText + index + sizeof(uint32)); } // skip over chunk id and offset diff --git a/engines/tinsel/text.cpp b/engines/tinsel/text.cpp index 5eb092d00d..150eb2bdde 100644 --- a/engines/tinsel/text.cpp +++ b/engines/tinsel/text.cpp @@ -46,24 +46,24 @@ int StringLengthPix(char *szStr, const FONT *pFont) { if (c & 0x80) c = ((c & ~0x80) << 8) + *++szStr; } - hImg = FROM_LE_32(pFont->fontDef[c]); + hImg = FROM_32(pFont->fontDef[c]); if (hImg) { // there is a IMAGE for this character const IMAGE *pChar = (const IMAGE *)LockMem(hImg); // add width of font bitmap - strLen += FROM_LE_16(pChar->imgWidth); + strLen += FROM_16(pChar->imgWidth); } else // use width of space character - strLen += FROM_LE_32(pFont->spaceSize); + strLen += FROM_32(pFont->spaceSize); // finally add the inter-character spacing - strLen += FROM_LE_32(pFont->xSpacing); + strLen += FROM_32(pFont->xSpacing); } // return length of line in pixels - minus inter-char spacing for last character - strLen -= FROM_LE_32(pFont->xSpacing); + strLen -= FROM_32(pFont->xSpacing); return (strLen > 0) ? strLen : 0; } @@ -125,10 +125,10 @@ OBJECT *ObjectTextOut(OBJECT **pList, char *szStr, int color, // get image for capital W assert(pFont->fontDef[(int)'W']); - pImg = (const IMAGE *)LockMem(FROM_LE_32(pFont->fontDef[(int)'W'])); + pImg = (const IMAGE *)LockMem(FROM_32(pFont->fontDef[(int)'W'])); // get height of capital W for offset to next line - yOffset = FROM_LE_16(pImg->imgHeight) & ~C16_FLAG_MASK; + yOffset = FROM_16(pImg->imgHeight) & ~C16_FLAG_MASK; while (*szStr) { // x justify the text according to the mode flags @@ -140,24 +140,24 @@ OBJECT *ObjectTextOut(OBJECT **pList, char *szStr, int color, if (c & 0x80) c = ((c & ~0x80) << 8) + *++szStr; } - hImg = FROM_LE_32(pFont->fontDef[c]); + hImg = FROM_32(pFont->fontDef[c]); if (hImg == 0) { // no image for this character // add font spacing for a space character - xJustify += FROM_LE_32(pFont->spaceSize); + xJustify += FROM_32(pFont->spaceSize); } else { // printable character int aniX, aniY; // char image animation offsets OBJ_INIT oi; - oi.hObjImg = FROM_LE_32(pFont->fontInit.hObjImg); - oi.objFlags = FROM_LE_32(pFont->fontInit.objFlags); - oi.objID = FROM_LE_32(pFont->fontInit.objID); - oi.objX = FROM_LE_32(pFont->fontInit.objX); - oi.objY = FROM_LE_32(pFont->fontInit.objY); - oi.objZ = FROM_LE_32(pFont->fontInit.objZ); + oi.hObjImg = FROM_32(pFont->fontInit.hObjImg); + oi.objFlags = FROM_32(pFont->fontInit.objFlags); + oi.objID = FROM_32(pFont->fontInit.objID); + oi.objX = FROM_32(pFont->fontInit.objX); + oi.objY = FROM_32(pFont->fontInit.objY); + oi.objZ = FROM_32(pFont->fontInit.objZ); // allocate and init a character object if (pFirst == NULL) @@ -172,9 +172,9 @@ OBJECT *ObjectTextOut(OBJECT **pList, char *szStr, int color, // fill in character object pChar->hImg = hImg; // image def - pChar->width = FROM_LE_16(pImg->imgWidth); // width of chars bitmap - pChar->height = FROM_LE_16(pImg->imgHeight) & ~C16_FLAG_MASK; // height of chars bitmap - pChar->hBits = FROM_LE_32(pImg->hImgBits); // bitmap + pChar->width = FROM_16(pImg->imgWidth); // width of chars bitmap + pChar->height = FROM_16(pImg->imgHeight) & ~C16_FLAG_MASK; // height of chars bitmap + pChar->hBits = FROM_32(pImg->hImgBits); // bitmap // check for absolute positioning if (mode & TXT_ABSOLUTE) @@ -203,8 +203,8 @@ OBJECT *ObjectTextOut(OBJECT **pList, char *szStr, int color, CopyObject(pShad, pChar); // add shadow offsets to characters position - pShad->xPos += intToFrac(FROM_LE_32(pFont->xShadow)); - pShad->yPos += intToFrac(FROM_LE_32(pFont->yShadow)); + pShad->xPos += intToFrac(FROM_32(pFont->xShadow)); + pShad->yPos += intToFrac(FROM_32(pFont->yShadow)); // shadow is behind the character pShad->zPos--; @@ -232,18 +232,18 @@ OBJECT *ObjectTextOut(OBJECT **pList, char *szStr, int color, pChar = pChar->pSlave; // add character spacing - xJustify += FROM_LE_16(pImg->imgWidth); + xJustify += FROM_16(pImg->imgWidth); } // finally add the inter-character spacing - xJustify += FROM_LE_32(pFont->xSpacing); + xJustify += FROM_32(pFont->xSpacing); // next character in string ++szStr; } // adjust the text y position and add the inter-line spacing - yPos += yOffset + FROM_LE_32(pFont->ySpacing); + yPos += yOffset + FROM_32(pFont->ySpacing); // check for newline if (c == LF_CHAR) diff --git a/engines/tinsel/tinlib.cpp b/engines/tinsel/tinlib.cpp index 058f8eb6fd..6a396b9b01 100644 --- a/engines/tinsel/tinlib.cpp +++ b/engines/tinsel/tinlib.cpp @@ -3684,7 +3684,7 @@ static void TranslucentIndex(unsigned index) { } /** - * Play a sample. + * Play a sample (DW1 only). */ static void TryPlaySample(CORO_PARAM, int sample, bool bComplete, bool escOn, int myEscape) { CORO_BEGIN_CONTEXT; diff --git a/engines/tinsel/tinsel.cpp b/engines/tinsel/tinsel.cpp index e09e2c1dcf..e836fdff1f 100644 --- a/engines/tinsel/tinsel.cpp +++ b/engines/tinsel/tinsel.cpp @@ -430,6 +430,14 @@ static void MouseProcess(CORO_PARAM, const void *) { ProcessButEvent(PLR_DRAG2_END); break; + case Common::EVENT_WHEELUP: + PlayerEvent(PLR_WHEEL_UP, mousePos); + break; + + case Common::EVENT_WHEELDOWN: + PlayerEvent(PLR_WHEEL_DOWN, mousePos); + break; + default: break; } @@ -722,21 +730,20 @@ void LoadBasicChunks() { cptr = FindChunk(INV_OBJ_SCNHANDLE, CHUNK_OBJECTS); -#ifdef SCUMM_BIG_ENDIAN - //convert to native endianness + // Convert to native endianness INV_OBJECT *io = (INV_OBJECT *)cptr; for (int i = 0; i < numObjects; i++, io++) { - io->id = FROM_LE_32(io->id); - io->hIconFilm = FROM_LE_32(io->hIconFilm); - io->hScript = FROM_LE_32(io->hScript); - io->attribute = FROM_LE_32(io->attribute); + io->id = FROM_32(io->id); + io->hIconFilm = FROM_32(io->hIconFilm); + io->hScript = FROM_32(io->hScript); + io->attribute = FROM_32(io->attribute); } -#endif RegisterIcons(cptr, numObjects); cptr = FindChunk(MASTER_SCNHANDLE, CHUNK_TOTAL_POLY); - if (cptr != NULL) + // Max polygons are 0 in DW1 Mac (both in the demo and the full version) + if (cptr != NULL && *cptr != 0) MaxPolygons(*cptr); if (TinselV2) { @@ -1046,6 +1053,8 @@ bool TinselEngine::pollEvent() { case Common::EVENT_LBUTTONUP: case Common::EVENT_RBUTTONDOWN: case Common::EVENT_RBUTTONUP: + case Common::EVENT_WHEELUP: + case Common::EVENT_WHEELDOWN: // Add button to queue for the mouse process _mouseButtons.push_back(event.type); break; @@ -1053,7 +1062,7 @@ bool TinselEngine::pollEvent() { case Common::EVENT_MOUSEMOVE: { // This fragment takes care of Tinsel 2 when it's been compiled with - // blank areas at the top and bottom of thes creen + // blank areas at the top and bottom of the screen int ySkip = TinselV2 ? (g_system->getHeight() - _vm->screen().h) / 2 : 0; if ((event.mouse.y >= ySkip) && (event.mouse.y < (g_system->getHeight() - ySkip))) _mousePos = Common::Point(event.mouse.x, event.mouse.y - ySkip); diff --git a/engines/tinsel/tinsel.h b/engines/tinsel/tinsel.h index 123249125e..ec504b69cd 100644 --- a/engines/tinsel/tinsel.h +++ b/engines/tinsel/tinsel.h @@ -78,7 +78,7 @@ enum TinselGameFeatures { /** * The following is the ScummVM definitions of the various Tinsel versions: * TINSEL_V0 - This was an early engine version that was only used in the Discworld 1 - * demo. It is not currently supported. + * demo. * TINSEL_V1 - This was the engine version used by Discworld 1. Note that there were two * major releases: an earlier version that used *.gra files, and a later one that * used *.scn files, and contained certain script and engine bugfixes. In ScummVM, @@ -135,6 +135,9 @@ typedef bool (*KEYFPTR)(const Common::KeyState &); #define READ_16(v) (TinselV1Mac ? READ_BE_UINT16(v) : READ_LE_UINT16(v)) #define READ_32(v) (TinselV1Mac ? READ_BE_UINT32(v) : READ_LE_UINT32(v)) +#define FROM_16(v) (TinselV1Mac ? FROM_BE_16(v) : FROM_LE_16(v)) +#define FROM_32(v) (TinselV1Mac ? FROM_BE_32(v) : FROM_LE_32(v)) +#define TO_32(v) (TinselV1Mac ? TO_BE_32(v) : TO_LE_32(v)) // Global reference to the TinselEngine object extern TinselEngine *_vm; diff --git a/engines/toltecs/console.cpp b/engines/toltecs/console.cpp new file mode 100644 index 0000000000..f3394909ed --- /dev/null +++ b/engines/toltecs/console.cpp @@ -0,0 +1,79 @@ +/* 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. + * + */ + +#include "gui/debugger.h" + +#include "toltecs/console.h" +//#include "toltecs/palette.h" +#include "toltecs/resource.h" +//#include "toltecs/sound.h" +#include "toltecs/toltecs.h" + +namespace Toltecs { + +Console::Console(ToltecsEngine *vm) : GUI::Debugger(), _vm(vm) { + DCmd_Register("room", WRAP_METHOD(Console, Cmd_Room)); + DCmd_Register("dump", WRAP_METHOD(Console, Cmd_Dump)); +} + +Console::~Console() { +} + +bool Console::Cmd_Room(int argc, const char **argv) { + if (argc < 2) { + DebugPrintf("Current room number is %d\n", _vm->_sceneResIndex); +#if 0 + DebugPrintf("Calling this command with the room number changes the room\n"); + DebugPrintf("WARNING: It's a bad idea to warp to rooms with this, as the room object scripts are not loaded\n"); +#endif + return true; +#if 0 + } else { + int roomNum = atoi(argv[1]); + + // sfClearPaletteFragments + _vm->_palette->clearFragments(); + + // sfLoadScene + _vm->_sound->stopAll(); + _vm->_res->purgeCache(); + _vm->loadScene(roomNum); +#endif + } + + return false; +} + +bool Console::Cmd_Dump(int argc, const char **argv) { + if (argc < 2) { + DebugPrintf("Usage: dump <resource number>\n"); + return true; + } + + int resNum = atoi(argv[1]); + _vm->_arc->dump(resNum); + DebugPrintf("Resource %d has been dumped to disk\n", resNum); + + return true; +} + +} // End of namespace Toltecs diff --git a/engines/toltecs/console.h b/engines/toltecs/console.h new file mode 100644 index 0000000000..bcdfd0cf04 --- /dev/null +++ b/engines/toltecs/console.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. + * + */ + +#ifndef TOLTECS_CONSOLE_H +#define TOLTECS_CONSOLE_H + +#include "gui/debugger.h" + +namespace Toltecs { + +class ToltecsEngine; + +class Console : public GUI::Debugger { +public: + Console(ToltecsEngine *vm); + virtual ~Console(void); + +private: + ToltecsEngine *_vm; + + bool Cmd_Dump(int argc, const char **argv); + bool Cmd_Room(int argc, const char **argv); +}; + +} // End of namespace Toltecs +#endif diff --git a/engines/toltecs/detection.cpp b/engines/toltecs/detection.cpp index c1a57638c2..788f813762 100644 --- a/engines/toltecs/detection.cpp +++ b/engines/toltecs/detection.cpp @@ -24,6 +24,8 @@ #include "base/plugins.h" #include "engines/advancedDetector.h" + +#include "common/translation.h" #include "common/savefile.h" #include "common/str-array.h" #include "common/system.h" @@ -97,19 +99,6 @@ static const ToltecsGameDescription gameDescriptions[] = { }, { - // 3 Skulls of the Toltecs German Demo version - { - "toltecs", - 0, - AD_ENTRY1s("WESTERN", "1c85e82712d24f1d5c1ea2a66ddd75c2", 47730038), - Common::DE_DEU, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO1(GUIO_NONE) - }, - }, - - { // 3 Skulls of the Toltecs French version { "toltecs", @@ -149,11 +138,44 @@ static const ToltecsGameDescription gameDescriptions[] = { }, }, + { + // 3 Skulls of the Toltecs English Demo version + { + "toltecs", + 0, + AD_ENTRY1s("WESTERN", "53a0abd1c0bc5cad8ba18f0e56877705", 46241833), + Common::EN_ANY, + Common::kPlatformPC, + ADGF_DEMO, + GUIO1(GUIO_NONE) + }, + }, + + { + // 3 Skulls of the Toltecs German Demo version + { + "toltecs", + 0, + AD_ENTRY1s("WESTERN", "1c85e82712d24f1d5c1ea2a66ddd75c2", 47730038), + Common::DE_DEU, + Common::kPlatformPC, + ADGF_DEMO, + GUIO1(GUIO_NONE) + }, + }, + { AD_TABLE_END_MARKER } }; } // End of namespace Toltecs +static const ExtraGuiOption toltecsExtraGuiOption = { + _s("Use original save/load screens"), + _s("Use the original save/load screens, instead of the ScummVM ones"), + "originalsaveload", + false +}; + class ToltecsMetaEngine : public AdvancedMetaEngine { public: ToltecsMetaEngine() : AdvancedMetaEngine(Toltecs::gameDescriptions, sizeof(Toltecs::ToltecsGameDescription), toltecsGames) { @@ -170,6 +192,7 @@ public: virtual bool hasFeature(MetaEngineFeature f) const; virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const; + virtual const ExtraGuiOptions getExtraGuiOptions(const Common::String &target) const; SaveStateList listSaves(const char *target) const; virtual int getMaximumSaveSlot() const; void removeSaveState(const char *target, int slot) const; @@ -202,6 +225,12 @@ bool ToltecsMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADG return gd != 0; } +const ExtraGuiOptions ToltecsMetaEngine::getExtraGuiOptions(const Common::String &target) const { + ExtraGuiOptions options; + options.push_back(toltecsExtraGuiOption); + return options; +} + SaveStateList ToltecsMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Toltecs::ToltecsEngine::SaveHeader header; @@ -295,7 +324,7 @@ SaveStateDescriptor ToltecsMetaEngine::querySaveMetaInfos(const char *target, in } return SaveStateDescriptor(); -} // End of namespace Toltecs +} // End of namespace Toltecs #if PLUGIN_ENABLED_DYNAMIC(TOLTECS) REGISTER_PLUGIN_DYNAMIC(TOLTECS, PLUGIN_TYPE_ENGINE, ToltecsMetaEngine); diff --git a/engines/toltecs/menu.cpp b/engines/toltecs/menu.cpp index 6e23ff988f..b52d7dad82 100644 --- a/engines/toltecs/menu.cpp +++ b/engines/toltecs/menu.cpp @@ -22,9 +22,12 @@ */ #include "audio/mixer.h" -#include "common/savefile.h" +#include "common/savefile.h" #include "common/config-manager.h" +#include "common/translation.h" + +#include "gui/saveload.h" #include "toltecs/toltecs.h" #include "toltecs/menu.h" @@ -41,9 +44,6 @@ MenuSystem::~MenuSystem() { } int MenuSystem::run(MenuID menuId) { - - //debug("MenuSystem::run()"); - _background = new Graphics::Surface(); _background->create(640, 400, Graphics::PixelFormat::createFormatCLUT8()); @@ -62,13 +62,12 @@ int MenuSystem::run(MenuID menuId) { _needRedraw = false; - // TODO: buildColorTransTable2 _vm->_palette->buildColorTransTable(0, 16, 7); _vm->_screen->_renderQueue->clear(); // Draw the menu background and frame _vm->_screen->blastSprite(0x140 + _vm->_cameraX, 0x175 + _vm->_cameraY, 0, 1, 0x4000); - shadeRect(60, 39, 520, 246, 30, 94); + shadeRect(60, 39, 520, 247, 225, 229); memcpy(_background->pixels, _vm->_screen->_frontScreen, 640 * 400); @@ -91,7 +90,6 @@ int MenuSystem::run(MenuID menuId) { } void MenuSystem::update() { - if (_currMenuID != _newMenuID) { _currMenuID = _newMenuID; //debug("_currMenuID = %d", _currMenuID); @@ -103,16 +101,13 @@ void MenuSystem::update() { if (_needRedraw) { //_vm->_system->copyRectToScreen(_vm->_screen->_frontScreen + 39 * 640 + 60, 640, 60, 39, 520, 247); _vm->_system->copyRectToScreen(_vm->_screen->_frontScreen, 640, 0, _top, 640, 400 - _top); - //debug("redraw"); _needRedraw = false; } _vm->_system->delayMillis(5); - } void MenuSystem::handleEvents() { - Common::Event event; Common::EventManager *eventMan = _vm->_system->getEventManager(); while (eventMan->pollEvent(event)) { @@ -126,18 +121,18 @@ void MenuSystem::handleEvents() { case Common::EVENT_MOUSEMOVE: handleMouseMove(event.mouse.x, event.mouse.y); break; - case Common::EVENT_LBUTTONDOWN: + case Common::EVENT_LBUTTONUP: handleMouseClick(event.mouse.x, event.mouse.y); break; default: break; } } - } void MenuSystem::addClickTextItem(ItemID id, int x, int y, int w, uint fontNum, const char *caption, byte defaultColor, byte activeColor) { Item item; + item.enabled = true; item.id = id; item.defaultColor = defaultColor; item.activeColor = activeColor; @@ -202,7 +197,7 @@ void MenuSystem::handleKeyDown(const Common::KeyState& kbd) { ItemID MenuSystem::findItemAt(int x, int y) { for (Common::Array<Item>::iterator iter = _items.begin(); iter != _items.end(); iter++) { - if ((*iter).rect.contains(x, y - _top)) + if ((*iter).enabled && (*iter).rect.contains(x, y - _top)) return (*iter).id; } return kItemIdNone; @@ -220,6 +215,8 @@ void MenuSystem::setItemCaption(Item *item, const char *caption) { Font font(_vm->_res->load(_vm->_screen->getFontResIndex(item->fontNum))->data); int width = font.getTextWidth((const byte*)caption); int height = font.getHeight(); + if (width & 1) + width++; item->rect = Common::Rect(item->x, item->y - height, item->x + width, item->y); if (item->w) { item->rect.translate(item->w - width / 2, 0); @@ -236,59 +233,87 @@ void MenuSystem::initMenu(MenuID menuID) { switch (menuID) { case kMenuIdMain: - drawString(0, 74, 320, 1, 229, _vm->getSysString(kStrWhatCanIDoForYou)); - addClickTextItem(kItemIdLoad, 0, 115, 320, 0, _vm->getSysString(kStrLoad), 229, 255); - addClickTextItem(kItemIdSave, 0, 135, 320, 0, _vm->getSysString(kStrSave), 229, 255); - addClickTextItem(kItemIdToggleText, 0, 165, 320, 0, _vm->getSysString(_vm->_cfgText ? kStrTextOn : kStrTextOff), 229, 255); - addClickTextItem(kItemIdToggleVoices, 0, 185, 320, 0, _vm->getSysString(_vm->_cfgVoices ? kStrVoicesOn : kStrVoicesOff), 229, 255); - addClickTextItem(kItemIdVolumesMenu, 0, 215, 320, 0, _vm->getSysString(kStrVolume), 229, 255); - addClickTextItem(kItemIdPlay, 0, 245, 320, 0, _vm->getSysString(kStrPlay), 229, 255); - addClickTextItem(kItemIdQuit, 0, 275, 320, 0, _vm->getSysString(kStrQuit), 229, 255); + drawString(0, 75, 320, 1, 229, _vm->getSysString(kStrWhatCanIDoForYou)); + addClickTextItem(kItemIdLoad, 0, 116, 320, 0, _vm->getSysString(kStrLoad), 253, 255); + addClickTextItem(kItemIdSave, 0, 136, 320, 0, _vm->getSysString(kStrSave), 253, 255); + addClickTextItem(kItemIdToggleText, 0, 166, 320, 0, _vm->getSysString(_vm->_cfgText ? kStrTextOn : kStrTextOff), 253, 255); + addClickTextItem(kItemIdToggleVoices, 0, 186, 320, 0, _vm->getSysString(_vm->_cfgVoices ? kStrVoicesOn : kStrVoicesOff), 253, 255); + addClickTextItem(kItemIdVolumesMenu, 0, 216, 320, 0, _vm->getSysString(kStrVolume), 253, 255); + addClickTextItem(kItemIdPlay, 0, 246, 320, 0, _vm->getSysString(kStrPlay), 253, 255); + addClickTextItem(kItemIdQuit, 0, 276, 320, 0, _vm->getSysString(kStrQuit), 253, 255); break; case kMenuIdLoad: - drawString(0, 74, 320, 1, 229, _vm->getSysString(kStrLoadGame)); - addClickTextItem(kItemIdSavegameUp, 0, 155, 545, 1, "^", 255, 253); - addClickTextItem(kItemIdSavegameDown, 0, 195, 545, 1, "\\", 255, 253); - addClickTextItem(kItemIdCancel, 0, 275, 320, 0, _vm->getSysString(kStrCancel), 255, 253); - for (int i = 1; i <= 7; i++) { - Common::String saveDesc = Common::String::format("SAVEGAME %d", i); - addClickTextItem((ItemID)(kItemIdSavegame1 + i - 1), 0, 115 + 20 * (i - 1), 300, 0, saveDesc.c_str(), 231, 234); + if (ConfMan.getBool("originalsaveload")) { + shadeRect(80, 92, 440, 141, 226, 225); + drawString(0, 75, 320, 1, 229, _vm->getSysString(kStrLoadGame)); + addClickTextItem(kItemIdSavegameUp, 0, 156, 545, 1, "^", 253, 255); + addClickTextItem(kItemIdSavegameDown, 0, 196, 545, 1, "\\", 253, 255); + addClickTextItem(kItemIdCancel, 0, 276, 320, 0, _vm->getSysString(kStrCancel), 253, 255); + for (int i = 1; i <= 7; i++) { + Common::String saveDesc = Common::String::format("SAVEGAME %d", i); + addClickTextItem((ItemID)(kItemIdSavegame1 + i - 1), 0, 116 + 20 * (i - 1), 300, 0, saveDesc.c_str(), 231, 234); + } + loadSavegamesList(); + setSavegameCaptions(true); + } else { + GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser(_("Restore game:"), _("Restore"), false); + int slot = dialog->runModalWithCurrentTarget(); + delete dialog; + + if (slot >= 0) + _vm->requestLoadgame(slot); + + _running = false; } - loadSavegamesList(); - setSavegameCaptions(); break; case kMenuIdSave: - drawString(0, 74, 320, 1, 229, _vm->getSysString(kStrSaveGame)); - addClickTextItem(kItemIdSavegameUp, 0, 155, 545, 1, "^", 255, 253); - addClickTextItem(kItemIdSavegameDown, 0, 195, 545, 1, "\\", 255, 253); - addClickTextItem(kItemIdCancel, 0, 275, 320, 0, _vm->getSysString(kStrCancel), 255, 253); - for (int i = 1; i <= 7; i++) { - Common::String saveDesc = Common::String::format("SAVEGAME %d", i); - addClickTextItem((ItemID)(kItemIdSavegame1 + i - 1), 0, 115 + 20 * (i - 1), 300, 0, saveDesc.c_str(), 231, 234); + if (ConfMan.getBool("originalsaveload")) { + shadeRect(80, 92, 440, 141, 226, 225); + drawString(0, 75, 320, 1, 229, _vm->getSysString(kStrSaveGame)); + addClickTextItem(kItemIdSavegameUp, 0, 156, 545, 1, "^", 253, 255); + addClickTextItem(kItemIdSavegameDown, 0, 196, 545, 1, "\\", 253, 255); + addClickTextItem(kItemIdCancel, 0, 276, 320, 0, _vm->getSysString(kStrCancel), 253, 255); + for (int i = 1; i <= 7; i++) { + Common::String saveDesc = Common::String::format("SAVEGAME %d", i); + addClickTextItem((ItemID)(kItemIdSavegame1 + i - 1), 0, 116 + 20 * (i - 1), 300, 0, saveDesc.c_str(), 231, 234); + } + newSlotNum = loadSavegamesList() + 1; + _savegames.push_back(SavegameItem(newSlotNum, Common::String::format("GAME %04d", _savegames.size()))); + setSavegameCaptions(true); + } else { + GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser(_("Save game:"), _("Save"), true); + int slot = dialog->runModalWithCurrentTarget(); + Common::String desc = dialog->getResultString(); + if (desc.empty()) { + // Create our own description for the saved game, the user didn't enter one + desc = dialog->createDefaultSaveDescription(slot); + } + + if (slot >= 0) + _vm->requestSavegame(slot, desc); + + _running = false; } - newSlotNum = loadSavegamesList() + 1; - _savegames.push_back(SavegameItem(newSlotNum, Common::String::format("GAME %03d", _savegames.size() + 1))); - setSavegameCaptions(); break; case kMenuIdVolumes: - drawString(0, 74, 320, 1, 229, _vm->getSysString(kStrAdjustVolume)); - drawString(0, 130, 200, 0, 246, _vm->getSysString(kStrMaster)); - drawString(0, 155, 200, 0, 244, _vm->getSysString(kStrVoices)); - drawString(0, 180, 200, 0, 244, _vm->getSysString(kStrMusic)); - drawString(0, 205, 200, 0, 244, _vm->getSysString(kStrSoundFx)); - drawString(0, 230, 200, 0, 244, _vm->getSysString(kStrBackground)); - addClickTextItem(kItemIdDone, 0, 275, 200, 0, _vm->getSysString(kStrDone), 229, 253); - addClickTextItem(kItemIdCancel, 0, 275, 440, 0, _vm->getSysString(kStrCancel), 229, 253); - addClickTextItem(kItemIdMasterDown, 0, 130 + 25 * 0, 348, 1, "[", 229, 253); - addClickTextItem(kItemIdVoicesDown, 0, 130 + 25 * 1, 348, 1, "[", 229, 253); - addClickTextItem(kItemIdMusicDown, 0, 130 + 25 * 2, 348, 1, "[", 229, 253); - addClickTextItem(kItemIdSoundFXDown, 0, 130 + 25 * 3, 348, 1, "[", 229, 253); - addClickTextItem(kItemIdBackgroundDown, 0, 130 + 25 * 4, 348, 1, "[", 229, 253); - addClickTextItem(kItemIdMasterUp, 0, 130 + 25 * 0, 372, 1, "]", 229, 253); - addClickTextItem(kItemIdVoicesUp, 0, 130 + 25 * 1, 372, 1, "]", 229, 253); - addClickTextItem(kItemIdMusicUp, 0, 130 + 25 * 2, 372, 1, "]", 229, 253); - addClickTextItem(kItemIdSoundFXUp, 0, 130 + 25 * 3, 372, 1, "]", 229, 253); - addClickTextItem(kItemIdBackgroundUp, 0, 130 + 25 * 4, 372, 1, "]", 229, 253); + drawString(0, 75, 320, 1, 229, _vm->getSysString(kStrAdjustVolume)); + drawString(0, 131, 200, 0, 246, _vm->getSysString(kStrMaster)); + drawString(0, 156, 200, 0, 244, _vm->getSysString(kStrVoices)); + drawString(0, 181, 200, 0, 244, _vm->getSysString(kStrMusic)); + drawString(0, 206, 200, 0, 244, _vm->getSysString(kStrSoundFx)); + drawString(0, 231, 200, 0, 244, _vm->getSysString(kStrBackground)); + addClickTextItem(kItemIdDone, 0, 276, 200, 0, _vm->getSysString(kStrDone), 253, 255); + addClickTextItem(kItemIdCancel, 0, 276, 440, 0, _vm->getSysString(kStrCancel), 253, 255); + addClickTextItem(kItemIdMasterDown, 0, 131 + 25 * 0, 348, 1, "[", 243, 246); + addClickTextItem(kItemIdVoicesDown, 0, 131 + 25 * 1, 348, 1, "[", 243, 246); + addClickTextItem(kItemIdMusicDown, 0, 131 + 25 * 2, 348, 1, "[", 243, 246); + addClickTextItem(kItemIdSoundFXDown, 0, 131 + 25 * 3, 348, 1, "[", 243, 246); + addClickTextItem(kItemIdBackgroundDown, 0, 131 + 25 * 4, 348, 1, "[", 243, 246); + addClickTextItem(kItemIdMasterUp, 0, 131 + 25 * 0, 372, 1, "]", 243, 246); + addClickTextItem(kItemIdVoicesUp, 0, 131 + 25 * 1, 372, 1, "]", 243, 246); + addClickTextItem(kItemIdMusicUp, 0, 131 + 25 * 2, 372, 1, "]", 243, 246); + addClickTextItem(kItemIdSoundFXUp, 0, 131 + 25 * 3, 372, 1, "]", 243, 246); + addClickTextItem(kItemIdBackgroundUp, 0, 131 + 25 * 4, 372, 1, "]", 243, 246); drawVolumeBar(kItemIdMaster); drawVolumeBar(kItemIdVoices); drawVolumeBar(kItemIdMusic); @@ -300,9 +325,36 @@ void MenuSystem::initMenu(MenuID menuID) { } for (Common::Array<Item>::iterator iter = _items.begin(); iter != _items.end(); iter++) { - drawItem((*iter).id, false); + if ((*iter).enabled) + drawItem((*iter).id, false); } + // Check if the mouse is already over an item + _currItemID = kItemIdNone; + Common::Point mousePos = _vm->_system->getEventManager()->getMousePos(); + handleMouseMove(mousePos.x, mousePos.y); +} + +void MenuSystem::enableItem(ItemID id) { + Item *item = getItem(id); + if (item) { + item->enabled = true; + drawItem(id, false); + _currItemID = kItemIdNone; + Common::Point mousePos = _vm->_system->getEventManager()->getMousePos(); + handleMouseMove(mousePos.x, mousePos.y); + } +} + +void MenuSystem::disableItem(ItemID id) { + Item *item = getItem(id); + if (item) { + item->enabled = false; + restoreRect(item->rect.left, item->rect.top, item->rect.width(), item->rect.height()); + if (_currItemID == id) { + _currItemID = kItemIdNone; + } + } } void MenuSystem::enterItem(ItemID id) { @@ -433,14 +485,16 @@ void MenuSystem::drawString(int16 x, int16 y, int w, uint fontNum, byte color, c fontNum = _vm->_screen->getFontResIndex(fontNum); Font font(_vm->_res->load(fontNum)->data); if (w) { - x = x + w - font.getTextWidth((const byte*)text) / 2; + int width = font.getTextWidth((const byte*)text); + if (width & 1) + width++; + x = x + w - width / 2; } _vm->_screen->drawString(x, y - font.getHeight(), color, fontNum, (const byte*)text, -1, NULL, true); _needRedraw = true; } int MenuSystem::loadSavegamesList() { - int maxSlotNum = -1; _savegameListTopIndex = 0; @@ -483,17 +537,32 @@ MenuSystem::SavegameItem *MenuSystem::getSavegameItemByID(ItemID id) { return NULL; } -void MenuSystem::setSavegameCaptions() { - uint index = _savegameListTopIndex; +void MenuSystem::setSavegameCaptions(bool scrollToBottom) { + int size = _savegames.size(); + if (scrollToBottom && size > 0) { + while (_savegameListTopIndex + 7 <= size) + _savegameListTopIndex += 6; + } + int index = _savegameListTopIndex; for (int i = 1; i <= 7; i++) - setItemCaption(getItem((ItemID)(kItemIdSavegame1 + i - 1)), index < _savegames.size() ? _savegames[index++]._description.c_str() : ""); + setItemCaption(getItem((ItemID)(kItemIdSavegame1 + i - 1)), index < size ? _savegames[index++]._description.c_str() : ""); + if (_savegameListTopIndex == 0) { + disableItem(kItemIdSavegameUp); + } else { + enableItem(kItemIdSavegameUp); + } + if (_savegameListTopIndex + 7 > size) { + disableItem(kItemIdSavegameDown); + } else { + enableItem(kItemIdSavegameDown); + } } void MenuSystem::scrollSavegames(int delta) { int newPos = CLIP<int>(_savegameListTopIndex + delta, 0, _savegames.size() - 1); _savegameListTopIndex = newPos; restoreRect(80, 92, 440, 140); - setSavegameCaptions(); + setSavegameCaptions(false); for (int i = 1; i <= 7; i++) drawItem((ItemID)(kItemIdSavegame1 + i - 1), false); } @@ -574,7 +643,6 @@ void MenuSystem::drawVolumeBar(ItemID itemID) { text[volume] = 0; drawString(0, y, w, 0, 246, text); - } void MenuSystem::changeVolumeBar(ItemID itemID, int delta) { diff --git a/engines/toltecs/menu.h b/engines/toltecs/menu.h index a72205c2e5..a5eca7c8ff 100644 --- a/engines/toltecs/menu.h +++ b/engines/toltecs/menu.h @@ -84,6 +84,7 @@ public: protected: struct Item { + bool enabled; Common::Rect rect; ItemID id; Common::String caption; @@ -130,6 +131,9 @@ protected: void initMenu(MenuID menuID); + void enableItem(ItemID id); + void disableItem(ItemID id); + void enterItem(ItemID id); void leaveItem(ItemID id); void clickItem(ItemID id); @@ -141,7 +145,7 @@ protected: SavegameItem *getSavegameItemByID(ItemID id); int loadSavegamesList(); - void setSavegameCaptions(); + void setSavegameCaptions(bool scrollToBottom); void scrollSavegames(int delta); void clickSavegameItem(ItemID id); void setCfgText(bool value, bool active); diff --git a/engines/toltecs/microtiles.cpp b/engines/toltecs/microtiles.cpp index 60e65bdaf3..9181480351 100644 --- a/engines/toltecs/microtiles.cpp +++ b/engines/toltecs/microtiles.cpp @@ -119,8 +119,6 @@ Common::Rect * MicroTileArray::getRectangles(int *num_rects, int min_x, int min_ for (y = 0; y < _tilesH; ++y) { for (x = 0; x < _tilesW; ++x) { - - int start; int finish = 0; BoundingBox boundingBox; @@ -141,8 +139,6 @@ Common::Rect * MicroTileArray::getRectangles(int *num_rects, int min_x, int min_ // FIXME: Why is the following code in an #if block? #if 1 - start = i; - if (TileX1(boundingBox) == TileSize - 1 && x != _tilesW - 1) { // check if the tile continues while (!finish) { ++x; diff --git a/engines/toltecs/module.mk b/engines/toltecs/module.mk index aa4a6f376b..0de1eef733 100644 --- a/engines/toltecs/module.mk +++ b/engines/toltecs/module.mk @@ -2,6 +2,7 @@ MODULE := engines/toltecs MODULE_OBJS = \ animation.o \ + console.o \ detection.o \ menu.o \ microtiles.o \ diff --git a/engines/toltecs/movie.cpp b/engines/toltecs/movie.cpp index 35accb5d93..8bc00511e9 100644 --- a/engines/toltecs/movie.cpp +++ b/engines/toltecs/movie.cpp @@ -45,14 +45,13 @@ enum ChunkTypes { kChunkStopSubtitles = 8 }; -MoviePlayer::MoviePlayer(ToltecsEngine *vm) : _vm(vm) { +MoviePlayer::MoviePlayer(ToltecsEngine *vm) : _vm(vm), _isPlaying(false) { } MoviePlayer::~MoviePlayer() { } void MoviePlayer::playMovie(uint resIndex) { - const uint32 subtitleSlot = kMaxScriptSlots - 1; int16 savedSceneWidth = _vm->_sceneWidth; int16 savedSceneHeight = _vm->_sceneHeight; @@ -62,6 +61,7 @@ void MoviePlayer::playMovie(uint resIndex) { int16 savedGuiHeight = _vm->_guiHeight; byte moviePalette[768]; + _isPlaying = true; _vm->_isSaveAllowed = false; memset(moviePalette, 0, sizeof(moviePalette)); @@ -99,15 +99,16 @@ void MoviePlayer::playMovie(uint resIndex) { byte *chunkBuffer = NULL; uint32 chunkBufferSize = 0; uint32 frame = 0; + bool abortMovie = false; - while (_chunkCount--) { + while (_chunkCount-- && !abortMovie) { byte chunkType = _vm->_arc->readByte(); uint32 chunkSize = _vm->_arc->readUint32LE(); debug(0, "chunkType = %d; chunkSize = %d", chunkType, chunkSize); // Skip audio chunks - we've already queued them in - // fetchAudioChunks() above + // fetchAudioChunks() if (chunkType == kChunkAudio) { _vm->_arc->skip(chunkSize); } else { @@ -136,7 +137,8 @@ void MoviePlayer::playMovie(uint resIndex) { if (_vm->_screen->_shakeActive && _vm->_screen->updateShakeScreen()) { _vm->_screen->_fullRefresh = true; } - _vm->updateInput(); + if (!handleInput()) + abortMovie = true; _vm->drawScreen(); // Note: drawScreen() calls delayMillis() } @@ -153,10 +155,11 @@ void MoviePlayer::playMovie(uint resIndex) { // Already processed break; case kChunkShowSubtitle: - if (_vm->_cfgText) { - memcpy(_vm->_script->getSlotData(subtitleSlot), chunkBuffer, chunkSize); - _vm->_screen->updateTalkText(subtitleSlot, 0); - } + memcpy(_vm->_script->getSlotData(subtitleSlot), chunkBuffer, chunkSize); + // The last character of the subtitle determines if it should + // always be displayed or not. If it's 0xFF, it should always be + // displayed, otherwise, if it's 0xFE, it can be toggled. + _vm->_screen->updateTalkText(subtitleSlot, 0, (chunkBuffer[chunkSize - 1] == 0xFF)); break; case kChunkShakeScreen: // start/stop shakescreen effect if (chunkBuffer[0] == 0xFF) @@ -180,7 +183,7 @@ void MoviePlayer::playMovie(uint resIndex) { } if (!handleInput()) - break; + abortMovie = true; } delete[] chunkBuffer; @@ -200,10 +203,10 @@ void MoviePlayer::playMovie(uint resIndex) { _vm->_guiHeight = savedGuiHeight; _vm->_isSaveAllowed = true; + _isPlaying = false; } void MoviePlayer::fetchAudioChunks() { - uint32 startOfs = _vm->_arc->pos(); uint32 chunkCount = _chunkCount; uint prefetchChunkCount = 0; @@ -214,7 +217,7 @@ void MoviePlayer::fetchAudioChunks() { while (chunkCount-- && prefetchChunkCount < _framesPerSoundChunk / 2) { byte chunkType = _vm->_arc->readByte(); uint32 chunkSize = _vm->_arc->readUint32LE(); - if (chunkType == 4) { + if (chunkType == kChunkAudio) { byte *chunkBuffer = (byte *)malloc(chunkSize); _vm->_arc->read(chunkBuffer, chunkSize); _audioStream->queueBuffer(chunkBuffer, chunkSize, DisposeAfterUse::YES, Audio::FLAG_UNSIGNED); @@ -229,7 +232,6 @@ void MoviePlayer::fetchAudioChunks() { _lastPrefetchOfs = _vm->_arc->pos(); _vm->_arc->seek(startOfs, SEEK_SET); - } void MoviePlayer::unpackPalette(byte *source, byte *dest, int elemCount, int elemSize) { @@ -249,10 +251,12 @@ void MoviePlayer::unpackPalette(byte *source, byte *dest, int elemCount, int ele } void MoviePlayer::unpackRle(byte *source, byte *dest) { - int size = 256000; + int size = 256000; // 640x400 + //int packedSize = 0; while (size > 0) { byte a = *source++; byte b = *source++; + //packedSize += 2; if (a == 0) { dest += b; size -= b; @@ -262,6 +266,7 @@ void MoviePlayer::unpackRle(byte *source, byte *dest) { size -= a; } } + //debug("Packed RLE size: %d", packedSize); } bool MoviePlayer::handleInput() { @@ -272,12 +277,15 @@ bool MoviePlayer::handleInput() { case Common::EVENT_KEYDOWN: if (event.kbd.keycode == Common::KEYCODE_ESCAPE) return false; + if (event.kbd.keycode == Common::KEYCODE_F10) { + // TODO: The original would bring up a stripped down + // main menu dialog, without the save/restore options. + } break; case Common::EVENT_LBUTTONDOWN: case Common::EVENT_RBUTTONDOWN: return false; case Common::EVENT_QUIT: - _vm->quitGame(); return false; default: break; diff --git a/engines/toltecs/movie.h b/engines/toltecs/movie.h index 8fa48975d7..c1ed6d7ba0 100644 --- a/engines/toltecs/movie.h +++ b/engines/toltecs/movie.h @@ -37,11 +37,15 @@ public: void playMovie(uint resIndex); + bool isPlaying() { return _isPlaying; } + protected: ToltecsEngine *_vm; Audio::QueuingAudioStream *_audioStream; Audio::SoundHandle _audioStreamHandle; + bool _isPlaying; + uint32 _chunkCount, _frameCount, _lastPrefetchOfs; uint32 _soundChunkFramesLeft, _framesPerSoundChunk; diff --git a/engines/toltecs/palette.cpp b/engines/toltecs/palette.cpp index 74683c6d7a..b93bb8b510 100644 --- a/engines/toltecs/palette.cpp +++ b/engines/toltecs/palette.cpp @@ -32,6 +32,8 @@ namespace Toltecs { Palette::Palette(ToltecsEngine *vm) : _vm(vm) { clearFragments(); + memset(_mainPalette, 0, sizeof(_mainPalette)); + memset(_animPalette, 0, sizeof(_animPalette)); memset(_colorTransTable, 0, sizeof(_colorTransTable)); } @@ -138,52 +140,48 @@ void Palette::clearFragments() { _fragments.clear(); } +byte Palette::getMatchingColor(byte r, byte g, byte b) { + int bestIndex = 0; + uint16 bestMatch = 0xFFFF; + + for (int j = 0; j < 256; j++) { + byte distance = ABS(_mainPalette[j * 3 + 0] - r) + ABS(_mainPalette[j * 3 + 1] - g) + ABS(_mainPalette[j * 3 + 2] - b); + byte maxColor = MAX(_mainPalette[j * 3 + 0], MAX(_mainPalette[j * 3 + 1], _mainPalette[j * 3 + 2])); + uint16 match = (distance << 8) | maxColor; + if (match < bestMatch) { + bestMatch = match; + bestIndex = j; + } + } + + return bestIndex; +} + void Palette::buildColorTransTable(byte limit, int8 deltaValue, byte mask) { byte r = 0, g = 0, b = 0; mask &= 7; - for (int i = 0; i < 256; i++) { - - if (deltaValue < 0) { - // TODO (probably unused) - warning("Palette::buildColorTransTable(%d, %d, %02X) not yet implemented!", limit, deltaValue, mask); - } else { - r = _mainPalette[i * 3 + 0]; - g = _mainPalette[i * 3 + 1]; - b = _mainPalette[i * 3 + 2]; - if (MAX(r, MAX(b, g)) >= limit) { - if ((mask & 1) && r >= deltaValue) - r -= deltaValue; - if ((mask & 2) && g >= deltaValue) - g -= deltaValue; - if ((mask & 4) && b >= deltaValue) - b -= deltaValue; - } - } + if (deltaValue < 0) // unused + error("buildColorTransTable called with a negative delta value(limit %d, delta %d, mask %02X)", limit, deltaValue, mask); - int bestIndex = 0; - uint16 bestMatch = 0xFFFF; - - for (int j = 0; j < 256; j++) { - byte distance = ABS(_mainPalette[j * 3 + 0] - r) + ABS(_mainPalette[j * 3 + 1] - g) + ABS(_mainPalette[j * 3 + 2] - b); - byte maxColor = MAX(_mainPalette[j * 3 + 0], MAX(_mainPalette[j * 3 + 1], _mainPalette[j * 3 + 2])); - uint16 match = (distance << 8) | maxColor; - if (match < bestMatch) { - bestMatch = match; - bestIndex = j; - } + for (int i = 0; i < 256; i++) { + r = _mainPalette[i * 3 + 0]; + g = _mainPalette[i * 3 + 1]; + b = _mainPalette[i * 3 + 2]; + if (MAX(r, MAX(b, g)) >= limit) { + if ((mask & 1) && r >= deltaValue) + r -= deltaValue; + if ((mask & 2) && g >= deltaValue) + g -= deltaValue; + if ((mask & 4) && b >= deltaValue) + b -= deltaValue; } - _colorTransTable[i] = bestIndex; - + _colorTransTable[i] = getMatchingColor(r, g, b); } } -void Palette::buildColorTransTable2(byte limit, int8 deltaValue, byte mask) { - // TODO -} - void Palette::saveState(Common::WriteStream *out) { // Save currently active palette byte palette[768]; diff --git a/engines/toltecs/palette.h b/engines/toltecs/palette.h index 570f51777e..4777a82699 100644 --- a/engines/toltecs/palette.h +++ b/engines/toltecs/palette.h @@ -50,8 +50,8 @@ public: uint16 findFragment(int16 id); void clearFragments(); + byte getMatchingColor(byte r, byte g, byte b); void buildColorTransTable(byte limit, int8 deltaValue, byte mask); - void buildColorTransTable2(byte limit, int8 deltaValue, byte mask); byte getColorTransPixel(byte pixel) const { return _colorTransTable[pixel]; } byte *getMainPalette() { return _mainPalette; } diff --git a/engines/toltecs/resource.cpp b/engines/toltecs/resource.cpp index 0b9f7c8fcd..d66075004b 100644 --- a/engines/toltecs/resource.cpp +++ b/engines/toltecs/resource.cpp @@ -61,16 +61,11 @@ uint32 ArchiveReader::getResourceSize(uint resIndex) { return _offsets[resIndex + 1] - _offsets[resIndex]; } -void ArchiveReader::dump(uint resIndex, const char *prefix) { +void ArchiveReader::dump(uint resIndex) { int32 resourceSize = getResourceSize(resIndex); byte *data = new byte[resourceSize]; - Common::String fn; - - if (prefix) - fn = Common::String::format("%s_%04X.0", prefix, resIndex); - else - fn = Common::String::format("%04X.0", resIndex); + Common::String fn = Common::String::format("toltecs_res.%03d", resIndex); openResource(resIndex); read(data, resourceSize); @@ -112,11 +107,13 @@ Resource *ResourceCache::load(uint resIndex) { } else { debug(1, "ResourceCache::load(%d) From disk", resIndex); + int32 curPos = _vm->_arc->pos(); Resource *resItem = new Resource(); resItem->size = _vm->_arc->openResource(resIndex); resItem->data = new byte[resItem->size]; _vm->_arc->read(resItem->data, resItem->size); _vm->_arc->closeResource(); + _vm->_arc->seek(curPos); _cache[resIndex] = resItem; diff --git a/engines/toltecs/resource.h b/engines/toltecs/resource.h index 3fed2e11ca..3d45d9fb1b 100644 --- a/engines/toltecs/resource.h +++ b/engines/toltecs/resource.h @@ -50,7 +50,7 @@ public: // Returns the size of the resource uint32 getResourceSize(uint resIndex); - void dump(uint resIndex, const char *prefix = NULL); + void dump(uint resIndex); protected: uint32 *_offsets; diff --git a/engines/toltecs/screen.cpp b/engines/toltecs/screen.cpp index c8d6740b02..be91130c0a 100644 --- a/engines/toltecs/screen.cpp +++ b/engines/toltecs/screen.cpp @@ -33,7 +33,6 @@ namespace Toltecs { Screen::Screen(ToltecsEngine *vm) : _vm(vm) { - _frontScreen = new byte[268800]; _backScreen = new byte[870400]; @@ -68,16 +67,13 @@ Screen::Screen(ToltecsEngine *vm) : _vm(vm) { _renderQueue = new RenderQueue(_vm); _fullRefresh = false; _guiRefresh = false; - } Screen::~Screen() { - delete[] _frontScreen; delete[] _backScreen; delete _renderQueue; - } void Screen::unpackRle(byte *source, byte *dest, uint16 width, uint16 height) { @@ -120,7 +116,6 @@ void Screen::loadMouseCursor(uint resIndex) { } void Screen::drawGuiImage(int16 x, int16 y, uint resIndex) { - byte *imageData = _vm->_res->load(resIndex)->data; int16 headerSize = READ_LE_UINT16(imageData); int16 width = imageData[2]; @@ -153,7 +148,6 @@ void Screen::drawGuiImage(int16 x, int16 y, uint resIndex) { } _guiRefresh = true; - } void Screen::startShakeScreen(int16 shakeCounter) { @@ -185,7 +179,6 @@ bool Screen::updateShakeScreen() { } void Screen::addStaticSprite(byte *spriteItem) { - DrawRequest drawRequest; memset(&drawRequest, 0, sizeof(drawRequest)); @@ -200,11 +193,9 @@ void Screen::addStaticSprite(byte *spriteItem) { debug(0, "Screen::addStaticSprite() x = %d; y = %d; baseColor = %d; resIndex = %d; flags = %04X", drawRequest.x, drawRequest.y, drawRequest.baseColor, drawRequest.resIndex, drawRequest.flags); addDrawRequest(drawRequest); - } void Screen::addAnimatedSprite(int16 x, int16 y, int16 fragmentId, byte *data, int16 *spriteArray, bool loop, int mode) { - //debug(0, "Screen::addAnimatedSprite(%d, %d, %d)", x, y, fragmentId); DrawRequest drawRequest; @@ -257,9 +248,7 @@ void Screen::addAnimatedSprite(int16 x, int16 y, int16 fragmentId, byte *data, i WRITE_LE_UINT16(spriteItem + 0, loopNum); WRITE_LE_UINT16(spriteItem + 4, frameNum); - } - } void Screen::clearSprites() { @@ -267,7 +256,6 @@ void Screen::clearSprites() { } void Screen::blastSprite(int16 x, int16 y, int16 fragmentId, int16 resIndex, uint16 flags) { - DrawRequest drawRequest; SpriteDrawItem sprite; @@ -283,11 +271,9 @@ void Screen::blastSprite(int16 x, int16 y, int16 fragmentId, int16 resIndex, uin sprite.y -= _vm->_cameraY; drawSprite(sprite); } - } void Screen::updateVerbLine(int16 slotIndex, int16 slotOffset) { - debug(0, "Screen::updateVerbLine() _verbLineNum = %d; _verbLineX = %d; _verbLineY = %d; _verbLineWidth = %d; _verbLineCount = %d", _verbLineNum, _verbLineX, _verbLineY, _verbLineWidth, _verbLineCount); @@ -339,7 +325,7 @@ void Screen::updateVerbLine(int16 slotIndex, int16 slotOffset) { wrapState.len1 -= len; wrapState.len2 = len + 1; - drawGuiText(_verbLineX - 1 - (wrapState.width / 2), y, 0xF9, 0xFF, _fontResIndexArray[0], wrapState); + drawGuiText(_verbLineX - 1 - (wrapState.width / 2), y - 1, 0xF9, 0xFF, _fontResIndexArray[0], wrapState); wrapState.destString = wrapState.textBuffer; wrapState.width = 0; @@ -354,14 +340,12 @@ void Screen::updateVerbLine(int16 slotIndex, int16 slotOffset) { wrapState.len1 -= len; wrapState.len2 = len; - drawGuiText(_verbLineX - 1 - (wrapState.width / 2), y, 0xF9, 0xFF, _fontResIndexArray[0], wrapState); + drawGuiText(_verbLineX - 1 - (wrapState.width / 2), y - 1, 0xF9, 0xFF, _fontResIndexArray[0], wrapState); _guiRefresh = true; - } -void Screen::updateTalkText(int16 slotIndex, int16 slotOffset) { - +void Screen::updateTalkText(int16 slotIndex, int16 slotOffset, bool alwaysDisplayed) { int16 x, y, maxWidth, width, length; byte durationModifier = 1; byte *textData = _vm->_script->getSlotData(slotIndex) + slotOffset; @@ -370,6 +354,7 @@ void Screen::updateTalkText(int16 slotIndex, int16 slotOffset) { item->fontNum = 0; item->color = _talkTextFontColor; + item->alwaysDisplayed = alwaysDisplayed; x = CLIP<int16>(_talkTextX - _vm->_cameraX, 120, _talkTextMaxWidth); y = CLIP<int16>(_talkTextY - _vm->_cameraY, 4, _vm->_cameraHeight - 16); @@ -455,11 +440,9 @@ void Screen::updateTalkText(int16 slotIndex, int16 slotOffset) { textDurationMultiplier += 100; } item->duration = 4 * textDurationMultiplier * durationModifier; - } void Screen::addTalkTextRect(Font &font, int16 x, int16 &y, int16 length, int16 width, TalkTextItem *item) { - if (width > 0) { TextRect *textRect = &item->lines[item->lineCount]; width = width + 1 - font.getSpacing(); @@ -472,7 +455,6 @@ void Screen::addTalkTextRect(Font &font, int16 x, int16 &y, int16 length, int16 } y += font.getHeight() - 1; - } void Screen::addTalkTextItemsToRenderQueue() { @@ -488,7 +470,7 @@ void Screen::addTalkTextItemsToRenderQueue() { if (item->duration < 0) item->duration = 0; - if (!_vm->_cfgText) + if (!_vm->_cfgText && !item->alwaysDisplayed) return; for (byte j = 0; j < item->lineCount; j++) { @@ -499,6 +481,15 @@ void Screen::addTalkTextItemsToRenderQueue() { } } +bool Screen::isTalkTextActive(int16 slotIndex) { + for (int16 i = 0; i <= _talkTextItemNum; i++) { + if (_talkTextItems[i].slotIndex == slotIndex && _talkTextItems[i].duration > 0) + return true; + } + + return false; +} + int16 Screen::getTalkTextDuration() { return _talkTextItems[_talkTextItemNum].duration; } @@ -524,7 +515,6 @@ void Screen::registerFont(uint fontIndex, uint resIndex) { } void Screen::drawGuiTextMulti(byte *textData) { - int16 x = 0, y = 0; // Really strange stuff. @@ -554,12 +544,11 @@ void Screen::drawGuiTextMulti(byte *textData) { wrapState.width = 0; wrapState.len1 = 0; wrapState.len2 = wrapGuiText(_fontResIndexArray[1], 640, wrapState); - drawGuiText(x - wrapState.width / 2, y, _fontColor1, _fontColor2, _fontResIndexArray[1], wrapState); + drawGuiText(x - wrapState.width / 2, y - 1, _fontColor1, _fontColor2, _fontResIndexArray[1], wrapState); } } while (*wrapState.sourceString != 0xFF); _guiRefresh = true; - } int16 Screen::wrapGuiText(uint fontResIndex, int maxWidth, GuiTextWrapState &wrapState) { @@ -582,7 +571,6 @@ int16 Screen::wrapGuiText(uint fontResIndex, int maxWidth, GuiTextWrapState &wra } return len; - } void Screen::drawGuiText(int16 x, int16 y, byte fontColor1, byte fontColor2, uint fontResIndex, GuiTextWrapState &wrapState) { @@ -593,11 +581,9 @@ void Screen::drawGuiText(int16 x, int16 y, byte fontColor1, byte fontColor2, uin x = drawString(x + 1, y + _vm->_cameraHeight, fontColor1, fontResIndex, wrapState.textBuffer, wrapState.len1, &ywobble, false); x = drawString(x, y + _vm->_cameraHeight, fontColor2, fontResIndex, wrapState.textBuffer + wrapState.len1, wrapState.len2, &ywobble, false); - } int16 Screen::drawString(int16 x, int16 y, byte color, uint fontResIndex, const byte *text, int len, int16 *ywobble, bool outline) { - //debug(0, "Screen::drawString(%d, %d, %d, %d)", x, y, color, fontResIndex); Font font(_vm->_res->load(fontResIndex)->data); @@ -614,7 +600,7 @@ int16 Screen::drawString(int16 x, int16 y, byte color, uint fontResIndex, const if (ch <= 0x20) { x += font.getWidth(); } else { - drawChar(font, _frontScreen, x, y - yadd, ch, color, outline); + drawChar(font, _frontScreen, x, y + yadd, ch, color, outline); x += font.getCharWidth(ch) + font.getSpacing() - 1; yadd = -yadd; } @@ -624,11 +610,9 @@ int16 Screen::drawString(int16 x, int16 y, byte color, uint fontResIndex, const *ywobble = yadd; return x; - } void Screen::drawChar(const Font &font, byte *dest, int16 x, int16 y, byte ch, byte color, bool outline) { - int16 charWidth, charHeight; byte *charData; @@ -657,11 +641,9 @@ void Screen::drawChar(const Font &font, byte *dest, int16 x, int16 y, byte ch, b } dest += 640 - charWidth; } - } void Screen::drawSurface(int16 x, int16 y, Graphics::Surface *surface) { - int16 skipX = 0; int16 width = surface->w; int16 height = surface->h; @@ -706,11 +688,9 @@ void Screen::drawSurface(int16 x, int16 y, Graphics::Surface *surface) { frontScreen += 640 - width; surfacePixels += surface->w - width - skipX; } - } void Screen::saveState(Common::WriteStream *out) { - // Save verb line out->writeUint16LE(_verbLineNum); out->writeUint16LE(_verbLineX); @@ -757,11 +737,9 @@ void Screen::saveState(Common::WriteStream *out) { out->writeUint32LE(_fontResIndexArray[i]); out->writeByte(_fontColor1); out->writeByte(_fontColor2); - } void Screen::loadState(Common::ReadStream *in) { - // Load verb line _verbLineNum = in->readUint16LE(); _verbLineX = in->readUint16LE(); @@ -786,6 +764,7 @@ void Screen::loadState(Common::ReadStream *in) { _talkTextItems[i].fontNum = in->readUint16LE(); _talkTextItems[i].color = in->readByte(); _talkTextItems[i].lineCount = in->readByte(); + _talkTextItems[i].alwaysDisplayed = false; for (int j = 0; j < _talkTextItems[i].lineCount; j++) { _talkTextItems[i].lines[j].x = in->readUint16LE(); _talkTextItems[i].lines[j].y = in->readUint16LE(); @@ -809,7 +788,6 @@ void Screen::loadState(Common::ReadStream *in) { _fontResIndexArray[i] = in->readUint32LE(); _fontColor1 = in->readByte(); _fontColor2 = in->readByte(); - } } // End of namespace Toltecs diff --git a/engines/toltecs/screen.h b/engines/toltecs/screen.h index 788cde50c6..ee565e1882 100644 --- a/engines/toltecs/screen.h +++ b/engines/toltecs/screen.h @@ -136,6 +136,7 @@ struct TalkTextItem { byte color; byte lineCount; TextRect lines[15]; + bool alwaysDisplayed; }; struct GuiTextWrapState { @@ -177,10 +178,11 @@ public: void updateVerbLine(int16 slotIndex, int16 slotOffset); // Talk text - void updateTalkText(int16 slotIndex, int16 slotOffset); + void updateTalkText(int16 slotIndex, int16 slotOffset, bool alwaysDisplayed); void addTalkTextRect(Font &font, int16 x, int16 &y, int16 length, int16 width, TalkTextItem *item); void addTalkTextItemsToRenderQueue(); int16 getTalkTextDuration(); + bool isTalkTextActive(int16 slotIndex); void finishTalkTextItems(); void keepTalkTextItemsAlive(); diff --git a/engines/toltecs/script.cpp b/engines/toltecs/script.cpp index 5e8617bc43..9ea95a2cd1 100644 --- a/engines/toltecs/script.cpp +++ b/engines/toltecs/script.cpp @@ -40,6 +40,22 @@ namespace Toltecs { +static const VarType varTypes[] = { + vtByte, vtWord, vtWord, vtByte, vtWord, // 0 - 4 + vtWord, vtWord, vtWord, vtWord, vtWord, // 5 - 9 + vtWord, vtWord, vtByte, vtWord, vtWord, // 10 - 14 + vtWord, vtWord, vtWord, vtWord, vtWord, // 15 - 19 + vtWord, vtWord // 20 - 21 +}; + +static const char *varNames[] = { + "mouseDisabled", "mouseY", "mouseX", "mouseButton", "verbLineY", // 0 - 4 + "verbLineX", "verbLineWidth", "verbLineCount", "verbLineNum", "talkTextItemNum", // 5 - 9 + "talkTextY", "talkTextX", "talkTextFontColor", "cameraY", "cameraX", // 10 - 14 + "walkSpeedY", "walkSpeedX", "flag01", "sceneResIndex", "guiHeight", // 15 - 19 + "sceneHeight", "sceneWidth" // 20 - 21 +}; + ScriptInterpreter::ScriptInterpreter(ToltecsEngine *vm) : _vm(vm) { _stack = new byte[kScriptStackSize]; @@ -154,7 +170,6 @@ void ScriptInterpreter::setupScriptFunctions() { } void ScriptInterpreter::loadScript(uint resIndex, uint slotIndex) { - delete[] _slots[slotIndex].data; _slots[slotIndex].resIndex = resIndex; @@ -162,7 +177,6 @@ void ScriptInterpreter::loadScript(uint resIndex, uint slotIndex) { _slots[slotIndex].size = scriptResource->size; _slots[slotIndex].data = new byte[_slots[slotIndex].size]; memcpy(_slots[slotIndex].data, scriptResource->data, _slots[slotIndex].size); - } void ScriptInterpreter::setMainScript(uint slotIndex) { @@ -228,10 +242,9 @@ int16 ScriptInterpreter::readInt16() { } void ScriptInterpreter::execOpcode(byte opcode) { - int16 ofs; - debug(1, "opcode = %d", opcode); + debug(2, "opcode = %d", opcode); switch (opcode) { case 0: @@ -239,35 +252,32 @@ void ScriptInterpreter::execOpcode(byte opcode) { // ok _subCode = _code; byte length = readByte(); - debug(1, "length = %d", length); + if (length == 0) { + warning("Possible script bug detected - opcode length is 0 when calling script function"); + return; + } + debug(2, "length = %d", length); uint16 index = readInt16(); - debug(1, "callScriptFunction %d", index); execScriptFunction(index); _code += length - 2; break; } case 1: - // ok _regs.reg0 = readInt16(); break; case 2: - // ok _regs.reg1 = readInt16(); break; case 3: - // ok _regs.reg3 = readInt16(); break; case 4: - // ok _regs.reg5 = _regs.reg0; break; case 5: - // ok _regs.reg3 = _regs.reg0; break; case 6: - // ok _regs.reg1 = _regs.reg0; break; case 7: @@ -468,72 +478,14 @@ void ScriptInterpreter::execOpcode(byte opcode) { } void ScriptInterpreter::execScriptFunction(uint16 index) { - debug(4, "execScriptFunction(%d)", index); if (index >= _scriptFuncs.size()) error("ScriptInterpreter::execScriptFunction() Invalid script function index %d", index); - debug(4, "%s", _scriptFuncNames[index]); + debug(1, "execScriptFunction %s (%d)", _scriptFuncNames[index], index); (*_scriptFuncs[index])(); } -VarType ScriptInterpreter::getGameVarType(uint variable) { - switch (variable) { - case 0: return vtByte; - case 1: return vtWord; - case 2: return vtWord; - case 3: return vtByte; - case 4: return vtWord; - case 5: return vtWord; - case 6: return vtWord; - case 7: return vtWord; - case 8: return vtWord; - case 9: return vtWord; - case 10: return vtWord; - case 11: return vtWord; - case 12: return vtByte; - case 13: return vtWord; - case 14: return vtWord; - case 15: return vtWord; - case 16: return vtWord; - case 17: return vtWord; - case 18: return vtWord; - case 19: return vtWord; - case 20: return vtWord; - case 21: return vtWord; - default: - error("Invalid game variable"); - } -} - -const char *getVarName(uint variable) { - switch (variable) { - case 0: return "mouseDisabled"; - case 1: return "mouseY"; - case 2: return "mouseX"; - case 3: return "mouseButton"; - case 4: return "verbLineY"; - case 5: return "verbLineX"; - case 6: return "verbLineWidth"; - case 7: return "verbLineCount"; - case 8: return "verbLineNum"; - case 9: return "talkTextItemNum"; - case 10: return "talkTextY"; - case 11: return "talkTextX"; - case 12: return "talkTextFontColor"; - case 13: return "cameraY"; - case 14: return "cameraX"; - case 15: return "walkSpeedY"; - case 16: return "walkSpeedX"; - case 17: return "flag01"; - case 18: return "sceneResIndex"; - case 19: return "guiHeight"; - case 20: return "sceneHeight"; - case 21: return "sceneWidth"; - } - return "(invalid)"; -} - int16 ScriptInterpreter::getGameVar(uint variable) { - debug(0, "ScriptInterpreter::getGameVar(%d{%s})", variable, getVarName(variable)); + debug(2, "ScriptInterpreter::getGameVar(%d{%s})", variable, varNames[variable]); switch (variable) { case 0: return _vm->_mouseDisabled; @@ -559,13 +511,13 @@ int16 ScriptInterpreter::getGameVar(uint variable) { case 20: return _vm->_sceneHeight; case 21: return _vm->_sceneWidth; default: - warning("Getting unimplemented game variable %s (%d)", getVarName(variable), variable); + warning("Getting unimplemented game variable %s (%d)", varNames[variable], variable); return 0; } } void ScriptInterpreter::setGameVar(uint variable, int16 value) { - debug(0, "ScriptInterpreter::setGameVar(%d{%s}, %d)", variable, getVarName(variable), value); + debug(2, "ScriptInterpreter::setGameVar(%d{%s}, %d)", variable, varNames[variable], value); switch (variable) { case 0: @@ -632,10 +584,9 @@ void ScriptInterpreter::setGameVar(uint variable, int16 value) { case 1: case 2: default: - warning("Setting unimplemented game variable %s (%d) to %d", getVarName(variable), variable, value); + warning("Setting unimplemented game variable %s (%d) to %d", varNames[variable], variable, value); break; } - } byte ScriptInterpreter::arg8(int16 offset) { @@ -657,32 +608,31 @@ int16 ScriptInterpreter::popInt16() { } void ScriptInterpreter::localWrite8(int16 offset, byte value) { - //debug(1, "localWrite8(%d, %d)", offset, value); + //debug(2, "localWrite8(%d, %d)", offset, value); _localData[offset] = value; } byte ScriptInterpreter::localRead8(int16 offset) { - //debug(1, "localRead8(%d) -> %d", offset, _localData[offset]); + //debug(2, "localRead8(%d) -> %d", offset, _localData[offset]); return _localData[offset]; } void ScriptInterpreter::localWrite16(int16 offset, int16 value) { - //debug(1, "localWrite16(%d, %d)", offset, value); + //debug(2, "localWrite16(%d, %d)", offset, value); WRITE_LE_UINT16(&_localData[offset], value); } int16 ScriptInterpreter::localRead16(int16 offset) { - //debug(1, "localRead16(%d) -> %d", offset, (int16)READ_LE_UINT16(&_localData[offset])); + //debug(2, "localRead16(%d) -> %d", offset, (int16)READ_LE_UINT16(&_localData[offset])); return (int16)READ_LE_UINT16(&_localData[offset]); } byte *ScriptInterpreter::localPtr(int16 offset) { - //debug(1, "localPtr(%d)", offset); + //debug(2, "localPtr(%d)", offset); return &_localData[offset]; } void ScriptInterpreter::saveState(Common::WriteStream *out) { - // Save registers out->writeUint16LE(_regs.reg0); out->writeUint16LE(_regs.reg1); @@ -708,11 +658,9 @@ void ScriptInterpreter::saveState(Common::WriteStream *out) { // Save IP out->writeUint16LE((int16)(_code - getSlotData(_regs.reg4))); - } void ScriptInterpreter::loadState(Common::ReadStream *in) { - // Load registers _regs.reg0 = in->readUint16LE(); _regs.reg1 = in->readUint16LE(); @@ -741,7 +689,6 @@ void ScriptInterpreter::loadState(Common::ReadStream *in) { // Load IP _code = getSlotData(_regs.reg4) + in->readUint16LE(); - } void ScriptInterpreter::sfNop() { @@ -755,7 +702,9 @@ void ScriptInterpreter::sfGetGameVar() { void ScriptInterpreter::sfSetGameVar() { int16 varIndex = arg16(3); - VarType varType = getGameVarType(varIndex); + assert(varIndex <= 21); + + VarType varType = varTypes[varIndex]; int16 value = 0; if (varType == vtByte) value = arg8(5); @@ -810,8 +759,7 @@ void ScriptInterpreter::sfSetDeltaAnimPalette() { } void ScriptInterpreter::sfSetUnkPaletteEffect() { - // TODO - debug("ScriptInterpreter::sfSetUnkPaletteEffect"); + error("ScriptInterpreter::sfSetUnkPaletteEffect called"); // unused } void ScriptInterpreter::sfBuildColorTransTable() { @@ -992,7 +940,8 @@ void ScriptInterpreter::sfStopShakeScreen() { void ScriptInterpreter::sfStartSequence() { int16 sequenceResIndex = arg16(3); - //debug("ScriptInterpreter::sfStartSequence(%d)", sequenceResIndex); + debug(1, "ScriptInterpreter::sfStartSequence(%d)", sequenceResIndex); + if (sequenceResIndex >= 0) { //_vm->_arc->dump(sequenceResIndex, "music"); // DEBUG: Dump music so we know what's in there @@ -1001,7 +950,6 @@ void ScriptInterpreter::sfStartSequence() { } void ScriptInterpreter::sfEndSequence() { - //debug("ScriptInterpreter::sfEndSequence"); _vm->_music->stopSequence(); } @@ -1029,9 +977,8 @@ void ScriptInterpreter::sfHandleInput() { if (_vm->_rightButtonDown) { keyCode = 1; } else { - /* Convert keyboard scancode to IBM PC scancode - Only scancodes known to be used (so far) are converted - */ + // Convert keyboard scancode to IBM PC scancode. + // Only scancodes known to be used (so far) are converted. switch (_vm->_keyState.keycode) { case Common::KEYCODE_ESCAPE: keyCode = 1; @@ -1050,11 +997,13 @@ void ScriptInterpreter::sfRunOptionsScreen() { _vm->showMenu(kMenuIdMain); } -/* NOTE: The opcodes sfPrecacheSprites, sfPrecacheSounds1, sfPrecacheSounds2 and - sfDeletePrecachedFiles were used by the original engine to handle precaching - of data so the game doesn't stall while playing (due to the slow speed of - CD-Drives back then). This is not needed in ScummVM since all supported - systems are fast enough to load data in-game. */ +/** + * NOTE: The opcodes sfPrecacheSprites, sfPrecacheSounds1, sfPrecacheSounds2 and + * sfDeletePrecachedFiles were used by the original engine to handle precaching + * of data so the game doesn't stall while playing (due to the slow speed of + * CD-Drives back then). This is not needed in ScummVM since all supported + * systems are fast enough to load data in-game. + */ void ScriptInterpreter::sfPrecacheSprites() { // See note above diff --git a/engines/toltecs/script.h b/engines/toltecs/script.h index 89dca4598f..4c880dfef5 100644 --- a/engines/toltecs/script.h +++ b/engines/toltecs/script.h @@ -49,7 +49,6 @@ public: byte *getSlotData(int slotIndex) const { return _slots[slotIndex].data; } - VarType getGameVarType(uint variable); int16 getGameVar(uint variable); void setGameVar(uint variable, int16 value); diff --git a/engines/toltecs/sound.cpp b/engines/toltecs/sound.cpp index 4b281392e5..8afc0e7890 100644 --- a/engines/toltecs/sound.cpp +++ b/engines/toltecs/sound.cpp @@ -103,8 +103,7 @@ void Sound::internalPlaySound(int16 resIndex, int16 type, int16 volume, int16 pa } } } else { - - if (type == -3) { + if (type == kChannelTypeSpeech) { // Stop speech and play new sound stopSpeech(); } @@ -137,10 +136,8 @@ void Sound::internalPlaySound(int16 resIndex, int16 type, int16 volume, int16 pa _vm->_mixer->playStream(soundType, &channels[freeChannel].handle, stream, -1, volume, panning); - } - - } - + } // if (freeChannel >= 0) + } // resIndex } void Sound::updateSpeech() { diff --git a/engines/toltecs/toltecs.cpp b/engines/toltecs/toltecs.cpp index 9f3a10a03b..1a399dacc0 100644 --- a/engines/toltecs/toltecs.cpp +++ b/engines/toltecs/toltecs.cpp @@ -39,6 +39,7 @@ #include "toltecs/toltecs.h" #include "toltecs/animation.h" +#include "toltecs/console.h" #include "toltecs/menu.h" #include "toltecs/movie.h" #include "toltecs/music.h" @@ -62,6 +63,9 @@ struct GameSettings { }; ToltecsEngine::ToltecsEngine(OSystem *syst, const ToltecsGameDescription *gameDesc) : Engine(syst), _gameDescription(gameDesc) { + // Assign default values to the config manager, in case settings are missing + ConfMan.registerDefault("originalsaveload", "false"); + _rnd = new Common::RandomSource("toltecs"); } @@ -123,6 +127,7 @@ Common::Error ToltecsEngine::run() { _menuSystem = new MenuSystem(this); _sound = new Sound(this); + _console = new Console(this); _cfgText = ConfMan.getBool("subtitles"); _cfgVoices = !ConfMan.getBool("speech_mute"); @@ -176,6 +181,7 @@ Common::Error ToltecsEngine::run() { _music->stopSequence(); _sound->stopAll(); + delete _console; delete _arc; delete _res; delete _screen; @@ -215,7 +221,6 @@ void ToltecsEngine::requestLoadgame(int slotNum) { } void ToltecsEngine::loadScene(uint resIndex) { - Resource *sceneResource = _res->load(resIndex); byte *scene = sceneResource->data; @@ -250,13 +255,10 @@ void ToltecsEngine::loadScene(uint resIndex) { _screen->_fullRefresh = true; _screen->_renderQueue->clear(); - } void ToltecsEngine::updateScreen() { - _sound->updateSpeech(); - _screen->updateShakeScreen(); // TODO: Set quit flag @@ -289,7 +291,6 @@ void ToltecsEngine::updateScreen() { _counter02 = (currUpdateTime - prevUpdateTime) / 13; } while (_counter02 == 0); prevUpdateTime = currUpdateTime; - } void ToltecsEngine::drawScreen() { @@ -310,6 +311,7 @@ void ToltecsEngine::drawScreen() { _screen->_guiRefresh = false; } + _console->onFrame(); _system->updateScreen(); _system->delayMillis(10); @@ -317,7 +319,6 @@ void ToltecsEngine::drawScreen() { } void ToltecsEngine::updateInput() { - Common::Event event; Common::EventManager *eventMan = _system->getEventManager(); while (eventMan->pollEvent(event)) { @@ -327,6 +328,9 @@ void ToltecsEngine::updateInput() { //debug("key: flags = %02X; keycode = %d", _keyState.flags, _keyState.keycode); + if (event.kbd.hasFlags(Common::KBD_CTRL) && event.kbd.keycode == Common::KEYCODE_d) + _console->attach(); + switch (event.kbd.keycode) { case Common::KEYCODE_F5: showMenu(kMenuIdSave); @@ -350,9 +354,6 @@ void ToltecsEngine::updateInput() { case Common::EVENT_KEYUP: _keyState.reset(); break; - case Common::EVENT_QUIT: - quitGame(); - break; case Common::EVENT_MOUSEMOVE: _mouseX = event.mouse.x; _mouseY = event.mouse.y; @@ -408,9 +409,7 @@ void ToltecsEngine::updateInput() { _mouseWaitForRelease = false; _mouseButton = 0; } - } - } void ToltecsEngine::setGuiHeight(int16 guiHeight) { @@ -478,7 +477,6 @@ void ToltecsEngine::scrollCameraRight(int16 delta) { } void ToltecsEngine::updateCamera() { - if (_cameraX != _newCameraX) { _cameraX = _newCameraX; _screen->_fullRefresh = true; @@ -492,13 +490,16 @@ void ToltecsEngine::updateCamera() { } //debug(0, "ToltecsEngine::updateCamera() _cameraX = %d; _cameraY = %d", _cameraX, _cameraY); - } void ToltecsEngine::talk(int16 slotIndex, int16 slotOffset) { - byte *scanData = _script->getSlotData(slotIndex) + slotOffset; + // If there's another talk text at the requested slot and it's still + // active, don't overwrite it. Fixes bug #3600166. + if (_screen->isTalkTextActive(slotIndex)) + return; + while (*scanData < 0xF0) { if (*scanData == 0x19) { scanData++; @@ -518,19 +519,18 @@ void ToltecsEngine::talk(int16 slotIndex, int16 slotOffset) { debug(0, "ToltecsEngine::talk() playSound(resIndex: %d)", resIndex); _sound->playSpeech(resIndex); } + if (_doText) { - _screen->updateTalkText(slotIndex, slotOffset); + _screen->updateTalkText(slotIndex, slotOffset, false); } else { _screen->keepTalkTextItemsAlive(); } } else { - _screen->updateTalkText(slotIndex, slotOffset); + _screen->updateTalkText(slotIndex, slotOffset, true); } - } void ToltecsEngine::walk(byte *walkData) { - int16 xdelta, ydelta, v8, v10, v11; int16 xstep, ystep; ScriptWalk walkInfo; @@ -613,7 +613,6 @@ void ToltecsEngine::walk(byte *walkData) { WRITE_LE_UINT16(walkData + 14, walkInfo.xerror); WRITE_LE_UINT16(walkData + 16, walkInfo.mulValue); WRITE_LE_UINT16(walkData + 18, walkInfo.scaling); - } int16 ToltecsEngine::findRectAtPoint(byte *rectData, int16 x, int16 y, int16 index, int16 itemSize, diff --git a/engines/toltecs/toltecs.h b/engines/toltecs/toltecs.h index b95a4f77cb..0be2d2a646 100644 --- a/engines/toltecs/toltecs.h +++ b/engines/toltecs/toltecs.h @@ -42,6 +42,7 @@ struct ToltecsGameDescription; class AnimationPlayer; class ArchiveReader; +class Console; class Input; class MenuSystem; class MoviePlayer; @@ -144,6 +145,7 @@ public: AnimationPlayer *_anim; ArchiveReader *_arc; + Console *_console; Input *_input; MenuSystem *_menuSystem; MoviePlayer *_moviePlayer; diff --git a/engines/tony/custom.cpp b/engines/tony/custom.cpp index 23c655e35a..f5c580c8c5 100644 --- a/engines/tony/custom.cpp +++ b/engines/tony/custom.cpp @@ -154,7 +154,6 @@ void rightToMe(CORO_PARAM, uint32, uint32, uint32, uint32) { GLOBALS._tony->setPattern(GLOBALS._tony->PAT_STANDRIGHT); } - void tonySetPerorate(CORO_PARAM, uint32 bStatus, uint32, uint32, uint32) { g_vm->getEngine()->setPerorate(bStatus); } @@ -176,7 +175,6 @@ void setAlwaysDisplay(CORO_PARAM, uint32 val, uint32, uint32, uint32) { GLOBALS._bAlwaysDisplay = (val != 0); } - void setPointer(CORO_PARAM, uint32 dwPointer, uint32, uint32, uint32) { switch (dwPointer) { case 1: @@ -215,7 +213,6 @@ VoiceHeader *searchVoiceHeader(uint32 codehi, uint32 codelo) { return NULL; } - void sendTonyMessage(CORO_PARAM, uint32 dwMessage, uint32 nX, uint32 nY, uint32) { CORO_BEGIN_CONTEXT; RMMessage msg; @@ -337,7 +334,6 @@ void changeBoxStatus(CORO_PARAM, uint32 nLoc, uint32 nBox, uint32 nStatus, uint3 GLOBALS._boxes->changeBoxStatus(nLoc, nBox, nStatus); } - void custLoadLocation(CORO_PARAM, uint32 nLoc, uint32 tX, uint32 tY, uint32 bUseStartPos) { CORO_BEGIN_CONTEXT; uint32 h; @@ -360,7 +356,6 @@ void custLoadLocation(CORO_PARAM, uint32 nLoc, uint32 tX, uint32 tY, uint32 bUse CORO_END_CODE; } - void sendFullscreenMsgStart(CORO_PARAM, uint32 nMsg, uint32 nFont, uint32, uint32) { CORO_BEGIN_CONTEXT; RMMessage *msg; @@ -485,7 +480,6 @@ void closeLocation(CORO_PARAM, uint32, uint32, uint32, uint32) { CORO_END_CODE; } - void changeLocation(CORO_PARAM, uint32 nLoc, uint32 tX, uint32 tY, uint32 bUseStartPos) { CORO_BEGIN_CONTEXT; uint32 h; @@ -639,12 +633,10 @@ void tonyGenericPut2(CORO_PARAM, uint32 nDirection) { CORO_END_CODE; } - void tonyTakeUp1(CORO_PARAM, uint32, uint32, uint32, uint32) { tonyGenericTake1(coroParam, 0); } - void tonyTakeMid1(CORO_PARAM, uint32, uint32, uint32, uint32) { tonyGenericTake1(coroParam, 1); } @@ -657,7 +649,6 @@ void tonyTakeUp2(CORO_PARAM, uint32, uint32, uint32, uint32) { tonyGenericTake2(coroParam, 0); } - void tonyTakeMid2(CORO_PARAM, uint32, uint32, uint32, uint32) { tonyGenericTake2(coroParam, 1); } @@ -690,7 +681,6 @@ void tonyPutDown2(CORO_PARAM, uint32, uint32, uint32, uint32) { tonyGenericPut2(coroParam, 2); } - void tonyOnTheFloor(CORO_PARAM, uint32 dwParte, uint32, uint32, uint32) { if (dwParte == 0) GLOBALS._tony->setPattern(GLOBALS._tony->PAT_ONTHEFLOORLEFT); @@ -1032,7 +1022,6 @@ void tonyScaredEnd(CORO_PARAM, uint32, uint32, uint32, uint32) { CORO_END_CODE; } - void tonyDisgusted(CORO_PARAM, uint32 dwText, uint32, uint32, uint32) { tonySetNumTexts(dwText); GLOBALS._nTonyNextTalkType = GLOBALS._tony->TALK_DISGUSTED; @@ -1101,7 +1090,6 @@ void tonyMacbeth(CORO_PARAM, uint32 nPos, uint32, uint32, uint32) { } } - void enableTony(CORO_PARAM, uint32, uint32, uint32, uint32) { GLOBALS._tony->show(); } @@ -1125,7 +1113,6 @@ void waitForPatternEnd(CORO_PARAM, uint32 nItem, uint32, uint32, uint32) { CORO_END_CODE; } - void setTonyPosition(CORO_PARAM, uint32 nX, uint32 nY, uint32 nLoc, uint32) { GLOBALS._tony->setPosition(RMPoint(nX, nY), nLoc); } @@ -1252,17 +1239,14 @@ void syncScrollLocation(CORO_PARAM, uint32 nX, uint32 nY, uint32 sX, uint32 sY) _ctx->pt._y += (_ctx->dimy * _ctx->dwCurTime) / _ctx->dwTotalTime; else _ctx->pt._y -= (_ctx->dimy * _ctx->dwCurTime) / _ctx->dwTotalTime; - } CORO_INVOKE_2(CoroScheduler.waitForSingleObject, g_vm->_hEndOfFrame, CORO_INFINITE); GLOBALS._loc->setScrollPosition(_ctx->pt); GLOBALS._tony->setScrollPosition(_ctx->pt); - } - // Set the position finale if (sX) { if (_ctx->lx > 0) @@ -1282,7 +1266,6 @@ void syncScrollLocation(CORO_PARAM, uint32 nX, uint32 nY, uint32 sX, uint32 sY) CORO_END_CODE; } - void changeHotspot(CORO_PARAM, uint32 dwCode, uint32 nX, uint32 nY, uint32) { int i; @@ -1304,13 +1287,13 @@ void changeHotspot(CORO_PARAM, uint32 dwCode, uint32 nX, uint32 nY, uint32) { GLOBALS._loc->getItemFromCode(dwCode)->changeHotspot(RMPoint(nX, nY)); } - void autoSave(CORO_PARAM, uint32, uint32, uint32, uint32) { g_vm->autoSave(coroParam); } void abortGame(CORO_PARAM, uint32, uint32, uint32, uint32) { - error("script called abortGame"); + debug(1, "script called abortGame"); + g_vm->quitGame(); } void shakeScreen(CORO_PARAM, uint32 nScosse, uint32, uint32, uint32) { @@ -1476,7 +1459,6 @@ void charSendMessage(CORO_PARAM, uint32 nChar, uint32 dwMessage, uint32 bIsBack, _ctx->voice = NULL; } - GLOBALS._curBackText = NULL; delete _ctx->text; } @@ -1504,7 +1486,6 @@ void changeInventoryStatus(CORO_PARAM, uint32 dwCode, uint32 dwStatus, uint32, u GLOBALS._inventory->changeItemStatus(dwCode, dwStatus); } - /* * Master Characters */ @@ -1535,7 +1516,6 @@ void mCharResetCode(CORO_PARAM, uint32 nChar, uint32, uint32, uint32) { GLOBALS._mCharacter[nChar]._item = GLOBALS._loc->getItemFromCode(GLOBALS._mCharacter[nChar]._code); } - void mCharSetPosition(CORO_PARAM, uint32 nChar, uint32 nX, uint32 nY, uint32) { assert(nChar < 10); GLOBALS._mCharacter[nChar]._x = nX; @@ -1879,7 +1859,6 @@ void sendDialogMessage(CORO_PARAM, uint32 nPers, uint32 nMsg, uint32, uint32) { CORO_END_CODE; } - // @@@@ This cannot be skipped!!!!!!!!!!!!!!!!!!! void startDialog(CORO_PARAM, uint32 nDialog, uint32 nStartGroup, uint32, uint32) { @@ -1960,7 +1939,6 @@ void startDialog(CORO_PARAM, uint32 nDialog, uint32 nStartGroup, uint32, uint32) CORO_END_CODE; } - /* * Sync between idle and mpal */ @@ -2270,7 +2248,6 @@ void doCredits(CORO_PARAM, uint32 nMsg, uint32 dwTime, uint32, uint32) { _ctx->text[_ctx->i].setPosition(RMPoint(260, 70 + _ctx->i * 26)); } - // Set the position _ctx->text[_ctx->i].setAlwaysDisplay(); _ctx->text[_ctx->i].setForcedTime(dwTime * 1000); @@ -2521,8 +2498,6 @@ void setupGlobalVars(RMTony *tony, RMPointer *ptr, RMGameBoxes *box, RMLocation GLOBALS._ambiance[58] = AMBIANCE_WIND; GLOBALS._ambiance[60] = AMBIANCE_WIND; - - // Create an event for the idle skipping GLOBALS._hSkipIdle = CoroScheduler.createEvent(true, false); } diff --git a/engines/tony/debugger.cpp b/engines/tony/debugger.cpp index 85d9469519..84f05b0d25 100644 --- a/engines/tony/debugger.cpp +++ b/engines/tony/debugger.cpp @@ -77,7 +77,6 @@ void DebugChangeScene(CORO_PARAM, const void *param) { CORO_END_CODE; } - /** * This command loads up the specified new scene number */ diff --git a/engines/tony/detection.cpp b/engines/tony/detection.cpp index 8e6d5a64c3..1094950e2c 100644 --- a/engines/tony/detection.cpp +++ b/engines/tony/detection.cpp @@ -90,7 +90,7 @@ public: bool TonyMetaEngine::hasFeature(MetaEngineFeature f) const { return - (f == kSupportsListSaves) || + (f == kSupportsListSaves) || (f == kSupportsLoadingDuringStartup) || (f == kSupportsDeleteSave) || (f == kSavesSupportMetaInfo) || @@ -186,7 +186,6 @@ SaveStateDescriptor TonyMetaEngine::querySaveMetaInfos(const char *target, int s return SaveStateDescriptor(); } - #if PLUGIN_ENABLED_DYNAMIC(TONY) REGISTER_PLUGIN_DYNAMIC(TONY, PLUGIN_TYPE_ENGINE, TonyMetaEngine); #else diff --git a/engines/tony/detection_tables.h b/engines/tony/detection_tables.h index ce3ab01a9f..ee137927dc 100644 --- a/engines/tony/detection_tables.h +++ b/engines/tony/detection_tables.h @@ -75,6 +75,7 @@ static const TonyGameDescription gameDescriptions[] = { GUIO1(GUIO_NONE) }, }, + { // Tony Tough French "Collection Aventure" provided by Strangerke { @@ -91,6 +92,7 @@ static const TonyGameDescription gameDescriptions[] = { GUIO1(GUIO_NONE) }, }, + { // Tony Tough German "Shoe Box" provided by Strangerke { @@ -107,6 +109,7 @@ static const TonyGameDescription gameDescriptions[] = { GUIO1(GUIO_NONE) }, }, + { // Tony Tough Italian provided by Fabio Barzagli { @@ -123,6 +126,7 @@ static const TonyGameDescription gameDescriptions[] = { GUIO1(GUIO_NONE) }, }, + { // Tony Tough Italian provided by Giovanni Bajo { @@ -139,6 +143,7 @@ static const TonyGameDescription gameDescriptions[] = { GUIO1(GUIO_NONE) }, }, + { // Tony Tough Polish provided by Fabio Barzagli { @@ -155,6 +160,7 @@ static const TonyGameDescription gameDescriptions[] = { GUIO1(GUIO_NONE) }, }, + { // Tony Tough German "Gamestar" provided in bug #3566035 { @@ -171,6 +177,7 @@ static const TonyGameDescription gameDescriptions[] = { GUIO1(GUIO_NONE) }, }, + { // Tony Tough Czech provided in bug #3565765 { @@ -188,6 +195,7 @@ static const TonyGameDescription gameDescriptions[] = { GUIO1(GUIO_NONE) }, }, + { AD_TABLE_END_MARKER } }; diff --git a/engines/tony/font.cpp b/engines/tony/font.cpp index fa018b4464..1729052d42 100644 --- a/engines/tony/font.cpp +++ b/engines/tony/font.cpp @@ -81,7 +81,6 @@ void RMFont::unload() { } } - RMGfxPrimitive *RMFont::makeLetterPrimitive(byte bChar, int &nLength) { RMFontPrimitive *prim; @@ -223,7 +222,6 @@ void RMFontDialog::init() { } } - /***************************************************************************\ * RMFontMacc Methods \****************************************************************************/ @@ -278,8 +276,6 @@ void RMFontCredits::init() { } } - - /***************************************************************************\ * RMFontObj Methods \****************************************************************************/ @@ -544,7 +540,6 @@ void RMText::draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim) { else if (_aHorType == HRIGHT) prim->getDst().topLeft() -= RMPoint(_dimx, 0); - // Vertically if (_aVerType == VTOP) { @@ -627,7 +622,6 @@ void RMTextDialog::writeText(const Common::String &text, RMFontColor *font, int *time = _time; } - void RMTextDialog::setSkipStatus(bool bEnabled) { _bSkipStatus = bEnabled; } @@ -685,6 +679,7 @@ void RMTextDialog::removeThis(CORO_PARAM, bool &result) { } } } + // Erase the background else if (!(GLOBALS._bCfgDubbing && _hCustomSkip2 != CORO_INVALID_PID_VALUE)) { if (!_bForceNoTime) { @@ -805,7 +800,6 @@ void RMTextDialogScrolling::clipOnScreen(RMGfxPrimitive *prim) { // We must not do anything! } - /****************************************************************************\ * RMTextItemName Methods \****************************************************************************/ @@ -866,7 +860,6 @@ void RMTextItemName::doFrame(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMLocation & CORO_END_CODE; } - void RMTextItemName::draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim) { CORO_BEGIN_CONTEXT; CORO_END_CONTEXT(_ctx); @@ -952,7 +945,6 @@ void RMDialogChoice::init() { setPriority(140); } - void RMDialogChoice::close() { if (_drawedStrings != NULL) { delete[] _drawedStrings; @@ -1116,7 +1108,6 @@ void RMDialogChoice::draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive CORO_END_CODE; } - void RMDialogChoice::hide(CORO_PARAM) { CORO_BEGIN_CONTEXT; int deltay; @@ -1145,7 +1136,6 @@ void RMDialogChoice::hide(CORO_PARAM) { CORO_END_CODE; } - void RMDialogChoice::removeThis(CORO_PARAM, bool &result) { result = _bRemoveFromOT; } diff --git a/engines/tony/font.h b/engines/tony/font.h index 13c1ddf268..9ef50b99ec 100644 --- a/engines/tony/font.h +++ b/engines/tony/font.h @@ -104,7 +104,6 @@ public: int stringLen(char bChar, char bNext = 0); }; - class RMFontColor : public virtual RMFont { private: byte _fontR, _fontG, _fontB; @@ -115,7 +114,6 @@ public: virtual void setBaseColor(byte r, byte g, byte b); }; - class RMFontWithTables : public virtual RMFont { protected: int _cTable[256]; @@ -136,7 +134,6 @@ public: virtual ~RMFontWithTables() {} }; - class RMFontDialog : public RMFontColor, public RMFontWithTables { public: void init(); @@ -175,16 +172,16 @@ private: public: enum HorAlign { - HLEFT, - HLEFTPAR, - HCENTER, - HRIGHT + HLEFT, + HLEFTPAR, + HCENTER, + HRIGHT }; enum VerAlign { - VTOP, - VCENTER, - VBOTTOM + VTOP, + VCENTER, + VBOTTOM }; private: @@ -293,7 +290,6 @@ public: virtual void draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim); }; - /** * Manages the name of a selected item on the screen */ @@ -319,7 +315,6 @@ public: virtual void removeThis(CORO_PARAM, bool &result); }; - /** * Manages the selection of screen items in a box */ diff --git a/engines/tony/game.cpp b/engines/tony/game.cpp index 42ace987b4..501a588ff5 100644 --- a/engines/tony/game.cpp +++ b/engines/tony/game.cpp @@ -164,7 +164,6 @@ RMOptionSlide::RMOptionSlide(const RMPoint &pt, int nRange, int nStartValue, int _pushRight = new RMOptionButton(RMRect(pt._x + _nSlideSize, pt._y, pt._x + _nSlideSize + 5 + 22, pt._y + 26)); } - RMOptionSlide::~RMOptionSlide() { delete _sliderCenter; _sliderCenter = NULL; @@ -973,7 +972,6 @@ void RMOptionScreen::doFrame(CORO_PARAM, RMInput *input) { CORO_BEGIN_CODE(_ctx); - // If it is not fully open, do nothing if (_fadeStep != 6) return; @@ -1043,8 +1041,8 @@ void RMOptionScreen::doFrame(CORO_PARAM, RMInput *input) { } } -#define KEYPRESS(c) (g_vm->getEngine()->getInput().getAsyncKeyState(c)) -#define PROCESS_CHAR(cod, c) if (KEYPRESS(cod)) { \ +#define KEYPRESS(c) (g_vm->getEngine()->getInput().getAsyncKeyState(c)) +#define PROCESS_CHAR(cod, c) if (KEYPRESS(cod)) { \ _editName[strlen(_editName) + 1] = '\0'; _editName[strlen(_editName)] = c; _ctx->bRefresh = true; } // State Buttons @@ -1058,7 +1056,7 @@ void RMOptionScreen::doFrame(CORO_PARAM, RMInput *input) { for (_ctx->i = 0; _ctx->i < 26 && strlen(_editName) < 12; _ctx->i++) { if (KEYPRESS(Common::KEYCODE_LSHIFT) || - KEYPRESS(Common::KEYCODE_RSHIFT)) { + KEYPRESS(Common::KEYCODE_RSHIFT)) { PROCESS_CHAR((Common::KeyCode)((int)'a' + _ctx->i), _ctx->i + 'A'); } else { PROCESS_CHAR((Common::KeyCode)((int)'a' + _ctx->i), _ctx->i + 'a'); @@ -1222,7 +1220,6 @@ void RMOptionScreen::doFrame(CORO_PARAM, RMInput *input) { CORO_END_CODE; } - void RMOptionScreen::draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim) { CORO_BEGIN_CONTEXT; int curTime; @@ -1233,7 +1230,7 @@ void RMOptionScreen::draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive _ctx->curTime = g_vm->getTime(); #define FADE_SPEED 20 -#define SYNC (_ctx->curTime - _fadeTime) / 25 +#define SYNC (_ctx->curTime - _fadeTime) / 25 if (_bExit) return; @@ -1334,7 +1331,6 @@ void RMOptionScreen::removeThis(CORO_PARAM, bool &result) { result = false; } - bool RMOptionScreen::loadThumbnailFromSaveState(int nState, byte *lpDestBuf, Common::String &name, byte &diff) { char namebuf[256]; Common::InSaveFile *f; diff --git a/engines/tony/game.h b/engines/tony/game.h index 83a1ddaea1..fdf62a2a5d 100644 --- a/engines/tony/game.h +++ b/engines/tony/game.h @@ -324,7 +324,6 @@ public: static bool loadThumbnailFromSaveState(int numState, byte *lpDestBuf, Common::String &name, byte &diff); protected: - // Initialization and state change void initState(CORO_PARAM); void closeState(); diff --git a/engines/tony/gfxcore.cpp b/engines/tony/gfxcore.cpp index 04ce01b0ed..dc82c78ee5 100644 --- a/engines/tony/gfxcore.cpp +++ b/engines/tony/gfxcore.cpp @@ -69,7 +69,6 @@ void RMGfxTaskSetPrior::setPriority(int nPrior) { _nPrior = nPrior; } - /****************************************************************************\ * RMGfxBuffer Methods \****************************************************************************/ @@ -109,7 +108,6 @@ void RMGfxBuffer::offsetY(int nLines, int nBpp) { _buf += nLines * getDimx() * nBpp / 8; } - RMGfxBuffer::operator byte *() { return _buf; } @@ -130,7 +128,6 @@ int RMGfxBuffer::getDimy() { return _dimy; } - /****************************************************************************\ * RMGfxSourceBuffer Methods \****************************************************************************/ @@ -223,7 +220,6 @@ void RMGfxSourceBuffer::offsetY(int nLines) { \****************************************************************************/ RMGfxWoodyBuffer::~RMGfxWoodyBuffer() { - } void RMGfxWoodyBuffer::draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim) { @@ -242,7 +238,6 @@ void RMGfxWoodyBuffer::draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitiv } RMGfxWoodyBuffer::RMGfxWoodyBuffer() { - } RMGfxWoodyBuffer::RMGfxWoodyBuffer(int dimx, int dimy) @@ -487,7 +482,6 @@ bool RMGfxTargetBuffer::getTrackDirtyRects() const { \****************************************************************************/ RMGfxSourceBufferPal::~RMGfxSourceBufferPal() { - } int RMGfxSourceBufferPal::loadPaletteWA(const byte *buf, bool bSwapped) { @@ -567,7 +561,6 @@ RMGfxSourceBuffer4::RMGfxSourceBuffer4(int dimx, int dimy) setPriority(0); } - /** * Returns the number of bits per pixel of the surface * @@ -586,11 +579,10 @@ void RMGfxSourceBuffer4::create(int dimx, int dimy) { \****************************************************************************/ RMGfxSourceBuffer8::~RMGfxSourceBuffer8() { - } void RMGfxSourceBuffer8::draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim) { - int width, height, u, v; + int width = 0, height = 0, u = 0, v = 0; int bufx = bigBuf.getDimx(); uint16 *buf = bigBuf; byte *raw = _buf; @@ -659,7 +651,6 @@ RMGfxSourceBuffer8::RMGfxSourceBuffer8(bool bTrasp0) { _bTrasp0 = bTrasp0; } - /** * Returns the number of bits per pixel of the surface * @@ -677,13 +668,11 @@ void RMGfxSourceBuffer8::create(int dimx, int dimy) { #define GETGREEN(x) (((x) >> 5) & 0x1F) #define GETBLUE(x) ((x) & 0x1F) - /****************************************************************************\ * RMGfxSourceBuffer8AB Methods \****************************************************************************/ RMGfxSourceBuffer8AB::~RMGfxSourceBuffer8AB() { - } int RMGfxSourceBuffer8AB::calcTrasp(int fore, int back) { @@ -703,9 +692,8 @@ int RMGfxSourceBuffer8AB::calcTrasp(int fore, int back) { return (r << 10) | (g << 5) | b; } - void RMGfxSourceBuffer8AB::draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim) { - int width, height, u, v; + int width = 0, height = 0, u = 0, v = 0; int bufx = bigBuf.getDimx(); uint16 *buf = bigBuf; byte *raw = _buf; @@ -765,8 +753,6 @@ void RMGfxSourceBuffer8AB::draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrim bigBuf.addDirtyRect(Common::Rect(dst._x1, dst._y1, dst._x1 + width, dst._y1 + height)); } - - /****************************************************************************\ * RMGfxSourceBuffer8RLE Methods \****************************************************************************/ @@ -792,7 +778,6 @@ RMGfxSourceBuffer8RLE::~RMGfxSourceBuffer8RLE() { } } - int RMGfxSourceBuffer8RLE::init(const byte *buf, int dimx, int dimy, bool bLoadPalette) { return RMGfxSourceBufferPal::init(buf, dimx, dimy, bLoadPalette); } @@ -967,7 +952,6 @@ void RMGfxSourceBuffer8RLE::draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPri } } - /****************************************************************************\ * RMGfxSourceBuffer8RLEByte Methods \****************************************************************************/ @@ -1050,7 +1034,6 @@ void RMGfxSourceBuffer8RLEByte::rleDecompressLine(uint16 *dst, byte *src, int nS src += n; } - while (1) { RLEByteDoTrasp: // Get the trasp of s**t @@ -1155,7 +1138,6 @@ void RMGfxSourceBuffer8RLEByte::rleDecompressLineFlipped(uint16 *dst, byte *src, src += n; } - while (1) { RLEByteFlippedDoTrasp: // Get the trasp of s**t @@ -1212,13 +1194,11 @@ RLEByteFlippedDoCopy2: } } - /****************************************************************************\ * RMGfxSourceBuffer8RLEWord Methods \****************************************************************************/ RMGfxSourceBuffer8RLEWord::~RMGfxSourceBuffer8RLEWord() { - } void RMGfxSourceBuffer8RLEWord::rleWriteTrasp(byte *&cur, int rep) { @@ -1299,7 +1279,6 @@ void RMGfxSourceBuffer8RLEWord::rleDecompressLine(uint16 *dst, byte *src, int nS src += n; } - while (1) { RLEWordDoTrasp: // Get the trasp of s**t @@ -1321,7 +1300,6 @@ RLEWordDoAlpha: src += 2; RLEWordDoAlpha2: - if (n > nLength) n = nLength; @@ -1360,7 +1338,6 @@ RLEWordDoCopy2: return; assert(nLength > 0); - } } @@ -1416,7 +1393,6 @@ void RMGfxSourceBuffer8RLEWord::rleDecompressLineFlipped(uint16 *dst, byte *src, src += n; } - while (1) { RLEWordFlippedDoTrasp: // Get the trasp of s**t @@ -1438,7 +1414,6 @@ RLEWordFlippedDoAlpha: src += 2; RLEWordFlippedDoAlpha2: - if (n > nLength) n = nLength; @@ -1485,7 +1460,6 @@ RLEWordFlippedDoCopy2: \****************************************************************************/ RMGfxSourceBuffer8RLEWordAB::~RMGfxSourceBuffer8RLEWordAB() { - } void RMGfxSourceBuffer8RLEWordAB::rleDecompressLine(uint16 *dst, byte *src, int nStartSkip, int nLength) { @@ -1545,7 +1519,6 @@ void RMGfxSourceBuffer8RLEWordAB::rleDecompressLine(uint16 *dst, byte *src, int src += n; } - while (1) { RLEWordDoTrasp: // Get the trasp of s**t @@ -1567,7 +1540,6 @@ RLEWordDoAlpha: src += 2; RLEWordDoAlpha2: - if (n > nLength) n = nLength; @@ -1651,9 +1623,9 @@ void RMGfxSourceBuffer8AA::calculateAA() { for (int x = 0; x < _dimx; x++) { if (*src == 0) { if ((y > 0 && src[-_dimx] != 0) || - (y < _dimy - 1 && src[_dimx] != 0) || - (x > 0 && src[-1] != 0) || - (x < _dimx - 1 && src[1] != 0)) + (y < _dimy - 1 && src[_dimx] != 0) || + (x > 0 && src[-1] != 0) || + (x < _dimx - 1 && src[1] != 0)) *srcaa = 1; } @@ -1668,9 +1640,9 @@ void RMGfxSourceBuffer8AA::calculateAA() { for (int x = 0; x < _dimx; x++) { if (*src != 0) { if ((y > 0 && srcaa[-_dimx] == 1) || - (y < _dimy - 1 && srcaa[_dimx] == 1) || - (x > 0 && srcaa[-1] == 1) || - (x < _dimx - 1 && srcaa[1] == 1)) + (y < _dimy - 1 && srcaa[_dimx] == 1) || + (x > 0 && srcaa[-1] == 1) || + (x < _dimx - 1 && srcaa[1] == 1)) *srcaa = 2; } @@ -1713,7 +1685,6 @@ void RMGfxSourceBuffer8AA::drawAA(RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *pri src += READ_LE_UINT16(src); // Eliminate horizontal clipping - if (prim->isFlipped()) { u = _dimx - (width + u); x1 = (prim->getDst()._x1 + _dimx - 1) - u; @@ -1728,9 +1699,8 @@ void RMGfxSourceBuffer8AA::drawAA(RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *pri bigBuf.addDirtyRect(Common::Rect(x1, y1, x1 + width, y1 + height)); } -// width = _dimx; -// x1 = prim->Dst().x1; - + //width = _dimx; + //x1 = prim->Dst().x1; // Position into the destination buffer buf = bigBuf; @@ -1821,8 +1791,6 @@ void RMGfxSourceBuffer8AA::drawAA(RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *pri } } - - void RMGfxSourceBuffer8AA::draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim) { CORO_BEGIN_CONTEXT; CORO_END_CONTEXT(_ctx); @@ -1911,7 +1879,6 @@ void RMGfxSourceBuffer8RLEWordAA::init(Common::ReadStream &ds, int dimx, int dim } } - /****************************************************************************\ * RMGfxSourceBuffer16 Methods \****************************************************************************/ @@ -1984,7 +1951,7 @@ void RMGfxSourceBuffer16::prepareImage() { uint16 *buf = (uint16 *)_buf; for (int i = 0; i < _dimx * _dimy; i++) - WRITE_LE_UINT16(&buf[i], FROM_LE_16(buf[i]) & 0x7FFF); + buf[i] = FROM_LE_16(buf[i]) & 0x7FFF; } RMGfxSourceBuffer16::RMGfxSourceBuffer16(int dimx, int dimy) @@ -2041,7 +2008,6 @@ void RMGfxBox::draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim) bigBuf.addDirtyRect(rcDst); } - /****************************************************************************\ * RMGfxClearTask Methods \****************************************************************************/ diff --git a/engines/tony/gfxcore.h b/engines/tony/gfxcore.h index f0deed83ee..1bacf7e5a9 100644 --- a/engines/tony/gfxcore.h +++ b/engines/tony/gfxcore.h @@ -52,7 +52,6 @@ class RMGfxSourceBuffer16; // Source class RMGfxWoodyBuffer; // Source16+Target class RMGfxClearTask; // Task - /** * Graphics buffer */ @@ -126,7 +125,6 @@ public: virtual RMGfxPrimitive *duplicate(); }; - /** * Graphic drawing task */ @@ -149,7 +147,6 @@ public: virtual void unregister(); }; - /** * Graphic drawing with priority */ @@ -159,7 +156,6 @@ public: void setPriority(int nPrior); }; - /** * Task that cleans the destination buffer */ @@ -172,7 +168,6 @@ public: virtual void removeThis(CORO_PARAM, bool &result); }; - /** * Task that draws a colored box */ @@ -188,7 +183,6 @@ public: virtual void removeThis(CORO_PARAM, bool &result); }; - /** * Buffer source for the design, which is a task. This is an abstract base. */ @@ -210,7 +204,6 @@ public: virtual int getBpp() = 0; }; - /** * 16-bit color source */ @@ -231,7 +224,6 @@ public: virtual void draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim); }; - /** * Buffer source with palette */ @@ -256,7 +248,6 @@ public: int loadPalette(const byte *buf); }; - /** * Buffer source with a 256 color palette */ @@ -276,7 +267,6 @@ public: virtual void draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim); }; - /** * Buffer source with a 256 color palette, and alpha blending */ @@ -289,7 +279,6 @@ public: virtual void draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim); }; - /** * Buffer source with a 256 color palette, RLE compressed */ @@ -370,7 +359,6 @@ public: virtual ~RMGfxSourceBuffer8RLEWordAB(); }; - /** * Buffer source with a 256 color palette, with anti-aliasing */ @@ -397,7 +385,6 @@ public: virtual void draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim); }; - class RMGfxSourceBuffer8RLEByteAA : public RMGfxSourceBuffer8RLEByte, public RMGfxSourceBuffer8AA { protected: void prepareImage(); @@ -426,7 +413,6 @@ public: virtual ~RMGfxSourceBuffer8RLEWordAA(); }; - /** * Source buffer with 16 colors */ @@ -442,7 +428,6 @@ public: virtual void draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim); }; - /** * Destination buffer which manages its own internal list of tasks */ @@ -464,7 +449,7 @@ private: void mergeDirtyRects(); private: -// OSystem::MutexRef csModifyingOT; + //OSystem::MutexRef csModifyingOT; protected: OTList *_otlist; @@ -498,7 +483,6 @@ public: bool getTrackDirtyRects() const; }; - /** * Ring buffer, which is both source and by destination */ diff --git a/engines/tony/gfxengine.cpp b/engines/tony/gfxengine.cpp index c81e553770..cb27e20ab1 100644 --- a/engines/tony/gfxengine.cpp +++ b/engines/tony/gfxengine.cpp @@ -35,7 +35,6 @@ namespace Tony { - /****************************************************************************\ * RMGfxEngine Methods \****************************************************************************/ @@ -261,7 +260,6 @@ SKIPCLICKSINISTRO: } } - // Right Release // ************* if (_input.mouseRightReleased()) { diff --git a/engines/tony/globals.h b/engines/tony/globals.h index d8d8d3eba5..0ff243b374 100644 --- a/engines/tony/globals.h +++ b/engines/tony/globals.h @@ -63,6 +63,7 @@ struct CharacterStruct { f->writeUint32LE(_endTalkPattern); f->writeUint32LE(_numTexts); } + void load(Common::InSaveFile *f) { _code = f->readUint32LE(); f->readUint32LE(); @@ -106,6 +107,7 @@ struct MCharacterStruct { f->writeUint32LE(_curTalk); f->writeByte(_bAlwaysBack); } + void load(Common::InSaveFile *f) { _code = f->readUint32LE(); f->readUint32LE(); @@ -134,6 +136,7 @@ struct ChangedHotspotStruct { f->writeUint32LE(_nX); f->writeUint32LE(_nY); } + void load(Common::InSaveFile *f) { _dwCode = f->readUint32LE(); _nX = f->readUint32LE(); @@ -141,7 +144,6 @@ struct ChangedHotspotStruct { } }; - /** * Description of a call to a custom function. */ @@ -150,7 +152,7 @@ typedef struct { int _arg1, _arg2, _arg3, _arg4; } CfCall; -typedef CfCall *LpCfCall; +typedef CfCall *LpCfCall; struct CoroutineMutex { CoroutineMutex() : _eventId(0), _ownerPid(0), _lockCount(0) { } @@ -173,20 +175,20 @@ public: Common::String _nextMusic; bool _nextLoop; - int _nextChannel; - int _nextSync; - int _curChannel; - int _flipflop; + int _nextChannel; + int _nextSync; + int _curChannel; + int _flipflop; CharacterStruct _character[16]; MCharacterStruct _mCharacter[10]; ChangedHotspotStruct _changedHotspot[256]; bool _isMChar[16]; bool _bAlwaysDisplay; RMPoint _saveTonyPos; - int _saveTonyLoc; + int _saveTonyLoc; RMTextDialog *_curBackText; bool _bTonyIsSpeaking; - int _curChangedHotspot; + int _curChangedHotspot; bool _bCfgInvLocked; bool _bCfgInvNoScroll; bool _bCfgTimerizedText; @@ -199,16 +201,16 @@ public: bool _bCfgDubbing; bool _bCfgMusic; bool _bCfgSFX; - int _nCfgTonySpeed; - int _nCfgTextSpeed; - int _nCfgDubbingVolume; - int _nCfgMusicVolume; - int _nCfgSFXVolume; + int _nCfgTonySpeed; + int _nCfgTextSpeed; + int _nCfgDubbingVolume; + int _nCfgMusicVolume; + int _nCfgSFXVolume; bool _bSkipSfxNoLoop; bool _bIdleExited; bool _bNoBullsEye; - int _curDialog; - int _curSoundEffect; + int _curDialog; + int _curSoundEffect; bool _bFadeOutStop; RMTony *_tony; diff --git a/engines/tony/input.cpp b/engines/tony/input.cpp index b96ccaf842..e84da04d97 100644 --- a/engines/tony/input.cpp +++ b/engines/tony/input.cpp @@ -32,20 +32,8 @@ namespace Tony { RMInput::RMInput() { - // Setup mouse fields - _clampMouse = false; - _mousePos.set(0, 0); - _leftButton = _rightButton = false; _leftClickMouse = _leftReleaseMouse = false; _rightClickMouse = _rightReleaseMouse = false; - - Common::fill((byte *)&_event, (byte *)&_event + sizeof(Common::Event), 0); - - // Setup keyboard fields - Common::fill(&_keyDown[0], &_keyDown[350], 0); -} - -RMInput::~RMInput() { } void RMInput::poll() { @@ -59,19 +47,15 @@ void RMInput::poll() { case Common::EVENT_LBUTTONUP: case Common::EVENT_RBUTTONDOWN: case Common::EVENT_RBUTTONUP: - _mousePos.set(_event.mouse.x, _event.mouse.y); + _mousePos = _event.mouse; if (_event.type == Common::EVENT_LBUTTONDOWN) { - _leftButton = true; _leftClickMouse = true; } else if (_event.type == Common::EVENT_LBUTTONUP) { - _leftButton = false; _leftReleaseMouse = true; } else if (_event.type == Common::EVENT_RBUTTONDOWN) { - _rightButton = true; _rightClickMouse = true; } else if (_event.type == Common::EVENT_RBUTTONUP) { - _rightButton = false; _rightReleaseMouse = true; } else continue; @@ -87,12 +71,17 @@ void RMInput::poll() { g_vm->_debugger->onFrame(); } else { // Flag the given key as being down - _keyDown[(int)_event.kbd.keycode] = true; + _keyDown.push_back(_event.kbd.keycode); } return; case Common::EVENT_KEYUP: - _keyDown[(int)_event.kbd.keycode] = false; + for (uint i = 0; i < _keyDown.size(); i++) { + if (_keyDown[i] == _event.kbd.keycode) { + _keyDown.remove_at(i); + break; + } + } return; default: @@ -101,30 +90,27 @@ void RMInput::poll() { } } -bool RMInput::mouseLeft() { - return _leftButton; -} - -bool RMInput::mouseRight() { - return _rightButton; -} - /** * Return true if a key has been pressed */ bool RMInput::getAsyncKeyState(Common::KeyCode kc) { // The act of testing for a particular key automatically clears the state, to prevent // the same key being registered in multiple different frames - bool result = _keyDown[(int)kc]; - _keyDown[(int)kc] = false; - return result; + for (uint i = 0; i < _keyDown.size(); i++) { + if (_keyDown[i] == kc) { + _keyDown.remove_at(i); + return true; + } + } + return false; } /** * Reading of the mouse */ RMPoint RMInput::mousePos() { - return _mousePos; + RMPoint p(_mousePos.x, _mousePos.y); + return p; } /** @@ -138,10 +124,6 @@ bool RMInput::mouseRightClicked() { return _rightClickMouse; } -bool RMInput::mouseBothClicked() { - return _leftClickMouse && _rightClickMouse; -} - bool RMInput::mouseLeftReleased() { return _leftReleaseMouse; } @@ -150,8 +132,4 @@ bool RMInput::mouseRightReleased() { return _rightReleaseMouse; } -bool RMInput::mouseBothReleased() { - return _leftReleaseMouse && _rightReleaseMouse; -} - } // End of namespace Tony diff --git a/engines/tony/input.h b/engines/tony/input.h index d07eaefe34..274aa8c491 100644 --- a/engines/tony/input.h +++ b/engines/tony/input.h @@ -30,6 +30,9 @@ #define TONY_INPUT_H #include "common/events.h" +#include "common/rect.h" +#include "common/array.h" +#include "common/keyboard.h" #include "tony/utils.h" namespace Tony { @@ -39,17 +42,14 @@ private: Common::Event _event; // Mouse related fields - RMPoint _mousePos; - bool _clampMouse; - bool _leftButton, _rightButton; + Common::Point _mousePos; bool _leftClickMouse, _leftReleaseMouse, _rightClickMouse, _rightReleaseMouse; // Keyboard related fields - bool _keyDown[350]; + Common::Array<Common::KeyCode> _keyDown; public: RMInput(); - ~RMInput(); /** * Polling (must be performed once per frame) @@ -62,20 +62,12 @@ public: RMPoint mousePos(); /** - * Current status of the mouse buttons - */ - bool mouseLeft(); - bool mouseRight(); - - /** * Events of mouse clicks */ bool mouseLeftClicked(); bool mouseRightClicked(); - bool mouseBothClicked(); bool mouseLeftReleased(); bool mouseRightReleased(); - bool mouseBothReleased(); /** * Returns true if the given key is pressed diff --git a/engines/tony/inventory.cpp b/engines/tony/inventory.cpp index 12540e5b7f..6b023d5990 100644 --- a/engines/tony/inventory.cpp +++ b/engines/tony/inventory.cpp @@ -34,7 +34,6 @@ namespace Tony { - /****************************************************************************\ * RMInventory Methods \****************************************************************************/ @@ -71,7 +70,6 @@ bool RMInventory::checkPointInside(const RMPoint &pt) { return pt._y < 70; } - void RMInventory::init() { // Create the main buffer create(RM_SX, 68); @@ -143,10 +141,9 @@ void RMInventory::init() { RMMessage msg2(13); RMMessage msg3(14); - _hints[0].writeText(msg1[0], 1); // Examine - _hints[1].writeText(msg2[0], 1); // Take - _hints[2].writeText(msg3[0], 1); // Use - + _hints[0].writeText(msg1[0], 1); // Examine + _hints[1].writeText(msg2[0], 1); // Take + _hints[2].writeText(msg3[0], 1); // Use // Prepare initial inventory prepare(); @@ -280,7 +277,6 @@ void RMInventory::changeItemStatus(uint32 code, uint32 dwStatus) { } } - void RMInventory::prepare() { for (int i = 1; i < RM_SX / 64 - 1; i++) { if (i - 1 + _curPos < _nInv) @@ -353,6 +349,7 @@ bool RMInventory::leftClick(const RMPoint &mpos, int &nCombineObj) { clearOT(); g_system->unlockMutex(_csModifyInterface); } + // Click the left arrow else if ((_state == OPENED) && _bBlinkingLeft) { assert(_curPos > 0); @@ -375,7 +372,6 @@ bool RMInventory::leftClick(const RMPoint &mpos, int &nCombineObj) { g_system->unlockMutex(_csModifyInterface); } - return false; } @@ -458,7 +454,7 @@ bool RMInventory::rightRelease(const RMPoint &mpos, RMTonyAction &curAction) { return false; } -#define INVSPEED 20 +#define INVSPEED 20 void RMInventory::doFrame(RMGfxTargetBuffer &bigBuf, RMPointer &ptr, RMPoint mpos, bool bCanOpen) { bool bNeedRedraw = false; @@ -517,7 +513,7 @@ void RMInventory::doFrame(RMGfxTargetBuffer &bigBuf, RMPointer &ptr, RMPoint mpo GLOBALS._bCfgInvLocked = !GLOBALS._bCfgInvLocked; } - if (_bCombining) {//m_state == COMBINING) + if (_bCombining) { // m_state == COMBINING) ptr.setCustomPointer(&_items[_nCombine]._pointer[_items[_nCombine]._status - 1]); ptr.setSpecialPointer(RMPointer::PTR_CUSTOM); } @@ -677,8 +673,10 @@ int RMInventory::getSaveStateSize() { void RMInventory::saveState(byte *state) { WRITE_LE_UINT32(state, _nInv); state += 4; - Common::copy(_inv, _inv + 256, (uint32 *)state); - state += 256 * 4; + for (int i = 0; i < 256; ++i) { + WRITE_LE_UINT32(state, _inv[i]); + state += 4; + } int x; for (int i = 0; i < 256; i++) { @@ -695,8 +693,10 @@ void RMInventory::saveState(byte *state) { int RMInventory::loadState(byte *state) { _nInv = READ_LE_UINT32(state); state += 4; - Common::copy((uint32 *)state, (uint32 *)state + 256, _inv); - state += 256 * 4; + for (int i = 0; i < 256; ++i) { + _inv[i] = READ_LE_UINT32(state); + state += 4; + } int x; for (int i = 0; i < 256; i++) { @@ -863,7 +863,7 @@ bool RMInterface::released(const RMPoint &mousepos, RMTonyAction &action) { action = TA_PERORATE; break; - default: // No verb + default: // No verb return false; } @@ -898,8 +898,8 @@ void RMInterface::init() { _hotzone[i].loadPaletteWA(pal); } - _hotbbox[0].setRect(126, 123, 159, 208); // Take - _hotbbox[1].setRect(90, 130, 125, 186); // About + _hotbbox[0].setRect(126, 123, 159, 208); // Take + _hotbbox[1].setRect(90, 130, 125, 186); // About _hotbbox[2].setRect(110, 60, 152, 125); _hotbbox[3].setRect(56, 51, 93, 99); _hotbbox[4].setRect(51, 105, 82, 172); @@ -917,11 +917,11 @@ void RMInterface::init() { RMMessage msg3(15); RMMessage msg4(16); - _hints[0].writeText(msg0[0], 1); // Take - _hints[1].writeText(msg1[0], 1); // Talk - _hints[2].writeText(msg2[0], 1); // Use - _hints[3].writeText(msg3[0], 1); // Examine - _hints[4].writeText(msg4[0], 1); // Show Yourself + _hints[0].writeText(msg0[0], 1); // Take + _hints[1].writeText(msg1[0], 1); // Talk + _hints[2].writeText(msg2[0], 1); // Use + _hints[3].writeText(msg3[0], 1); // Examine + _hints[4].writeText(msg4[0], 1); // Show Yourself _bActive = false; _bPerorate = false; diff --git a/engines/tony/inventory.h b/engines/tony/inventory.h index ce94c86c1b..1d660d51cd 100644 --- a/engines/tony/inventory.h +++ b/engines/tony/inventory.h @@ -174,7 +174,6 @@ public: int loadState(byte *state); }; - class RMInterface : public RMGfxSourceBuffer8RLEByte { private: bool _bActive; diff --git a/engines/tony/loc.cpp b/engines/tony/loc.cpp index 18470aa6fc..5beac842f9 100644 --- a/engines/tony/loc.cpp +++ b/engines/tony/loc.cpp @@ -37,7 +37,6 @@ namespace Tony { using namespace ::Tony::MPAL; - /****************************************************************************\ * RMPalette Methods \****************************************************************************/ @@ -65,7 +64,6 @@ void RMPattern::RMSlot::readFromStream(Common::ReadStream &ds, bool bLOX) { _flag = ds.readByte(); } - /****************************************************************************\ * RMPattern Methods \****************************************************************************/ @@ -329,7 +327,6 @@ RMSprite::~RMSprite() { } } - /****************************************************************************\ * RMSfx Methods \****************************************************************************/ @@ -391,8 +388,6 @@ void RMSfx::stop() { } } - - /****************************************************************************\ * RMItem Methods \****************************************************************************/ @@ -553,7 +548,6 @@ void RMItem::readFromStream(Common::SeekableReadStream &ds, bool bLOX) { _bIsActive = mpalQueryItemIsActive(_mpalCode); } - RMGfxPrimitive *RMItem::newItemPrimitive() { return new RMGfxPrimitive(this); } @@ -648,7 +642,6 @@ void RMItem::removeThis(CORO_PARAM, bool &result) { result = (_nCurSprite == -1); } - void RMItem::setStatus(int nStatus) { _bIsActive = (nStatus > 0); } @@ -745,7 +738,6 @@ RMItem::~RMItem() { CoroScheduler.closeEvent(_hEndPattern); } - void RMItem::waitForEndPattern(CORO_PARAM, uint32 hCustomSkip) { CORO_BEGIN_CONTEXT; uint32 h[2]; @@ -784,12 +776,10 @@ void RMItem::pauseSound(bool bPause) { _sfx[i].pause(bPause); } - /****************************************************************************\ * RMWipe Methods \****************************************************************************/ - RMWipe::RMWipe() { _hUnregistered = CoroScheduler.createEvent(false, false); _hEndOfFade = CoroScheduler.createEvent(false, false); @@ -799,7 +789,6 @@ RMWipe::RMWipe() { _bEndFade = false; _bFading = false; _nFadeStep = 0; - } RMWipe::~RMWipe() { @@ -904,10 +893,10 @@ void RMWipe::draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim) { /****************************************************************************/ short RMCharacter::findPath(short source, short destination) { - static RMBox box[MAXBOXES]; // Matrix of adjacent boxes - static short nodeCost[MAXBOXES]; // Cost per node - static short valid[MAXBOXES]; // 0:Invalid 1:Valid 2:Saturated - static short nextNode[MAXBOXES]; // Next node + static RMBox box[MAXBOXES]; // Matrix of adjacent boxes + static short nodeCost[MAXBOXES]; // Cost per node + static short valid[MAXBOXES]; // 0:Invalid 1:Valid 2:Saturated + static short nextNode[MAXBOXES]; // Next node short minCost, error = 0; RMBoxLoc *cur; @@ -936,19 +925,19 @@ short RMCharacter::findPath(short source, short destination) { // Find the shortest path while (!finish) { - minCost = 32000; // Reset the minimum cost - error = 1; // Possible error + minCost = 32000; // Reset the minimum cost + error = 1; // Possible error // 1st cycle: explore possible new nodes for (int i = 0; i < cur->_numbBox; i++) { if (valid[i] == 1) { - error = 0; // Failure de-bunked + error = 0; // Failure de-bunked int j = 0; while (((box[i]._adj[j]) != 1) && (j < cur->_numbBox)) j++; if (j >= cur->_numbBox) - valid[i] = 2; // nodo saturated? + valid[i] = 2; // nodo saturated? else { nextNode[i] = j; if (nodeCost[i] + 1 < minCost) @@ -958,7 +947,7 @@ short RMCharacter::findPath(short source, short destination) { } if (error) - finish = true; // All nodes saturated + finish = true; // All nodes saturated // 2nd cycle: adding new nodes that were found, saturate old nodes for (int i = 0; i < cur->_numbBox; i++) { @@ -998,7 +987,6 @@ short RMCharacter::findPath(short source, short destination) { return !error; } - void RMCharacter::goTo(CORO_PARAM, RMPoint destcoord, bool bReversed) { CORO_BEGIN_CONTEXT; CORO_END_CONTEXT(_ctx); @@ -1068,7 +1056,6 @@ void RMCharacter::goTo(CORO_PARAM, RMPoint destcoord, bool bReversed) { CORO_END_CODE; } - RMPoint RMCharacter::searching(char UP, char DOWN, char RIGHT, char LEFT, RMPoint point) { short steps; RMPoint newPt, foundPt; @@ -1082,9 +1069,9 @@ RMPoint RMCharacter::searching(char UP, char DOWN, char RIGHT, char LEFT, RMPoin steps++; } if ((inWhichBox(newPt) != -1) && (steps < minStep) && - findPath(inWhichBox(_pos), inWhichBox(newPt))) { + findPath(inWhichBox(_pos), inWhichBox(newPt))) { minStep = steps; - newPt._y--; // to avoid error? + newPt._y--; // to avoid error? foundPt = newPt; } } @@ -1097,9 +1084,9 @@ RMPoint RMCharacter::searching(char UP, char DOWN, char RIGHT, char LEFT, RMPoin steps++; } if ((inWhichBox(newPt) != -1) && (steps < minStep) && - findPath(inWhichBox(_pos), inWhichBox(newPt))) { + findPath(inWhichBox(_pos), inWhichBox(newPt))) { minStep = steps; - newPt._y++; // to avoid error? + newPt._y++; // to avoid error? foundPt = newPt; } } @@ -1112,9 +1099,9 @@ RMPoint RMCharacter::searching(char UP, char DOWN, char RIGHT, char LEFT, RMPoin steps++; } if ((inWhichBox(newPt) != -1) && (steps < minStep) && - findPath(inWhichBox(_pos), inWhichBox(newPt))) { + findPath(inWhichBox(_pos), inWhichBox(newPt))) { minStep = steps; - newPt._x++; // to avoid error? + newPt._x++; // to avoid error? foundPt = newPt; } } @@ -1127,9 +1114,9 @@ RMPoint RMCharacter::searching(char UP, char DOWN, char RIGHT, char LEFT, RMPoin steps++; } if ((inWhichBox(newPt) != -1) && (steps < minStep) && - findPath(inWhichBox(_pos), inWhichBox(newPt))) { + findPath(inWhichBox(_pos), inWhichBox(newPt))) { minStep = steps; - newPt._x--; // to avoid error? + newPt._x--; // to avoid error? foundPt = newPt; } } @@ -1140,12 +1127,10 @@ RMPoint RMCharacter::searching(char UP, char DOWN, char RIGHT, char LEFT, RMPoin return foundPt; } - RMPoint RMCharacter::nearestPoint(const RMPoint &point) { return searching(1, 1, 1, 1, point); } - short RMCharacter::scanLine(const RMPoint &point) { int Ldx, Ldy, Lcount; float Lfx, Lfy, Lslope; @@ -1175,7 +1160,7 @@ short RMCharacter::scanLine(const RMPoint &point) { Lstatus = 0; } - Lscan = Lstart; // Start scanning + Lscan = Lstart; // Start scanning while (inWhichBox(Lscan) != -1) { Lcount++; if (Lstatus) { @@ -1200,8 +1185,8 @@ short RMCharacter::scanLine(const RMPoint &point) { * Calculates intersections between the straight line and the closest BBOX */ RMPoint RMCharacter::invScanLine(const RMPoint &point) { - RMPoint lStart = point; // Exchange! - RMPoint lEnd = _pos; // :-) + RMPoint lStart = point; // Exchange! + RMPoint lEnd = _pos; // :-) int lDx = lStart._x - lEnd._x; int lDy = lStart._y - lEnd._y; float lFx = lDx; @@ -1256,7 +1241,6 @@ RMPoint RMCharacter::invScanLine(const RMPoint &point) { } } - /** * Returns the HotSpot coordinate closest to the player */ @@ -1510,7 +1494,6 @@ inline int RMCharacter::inWhichBox(const RMPoint &pt) { return _theBoxes->whichBox(_curLocation, pt); } - void RMCharacter::move(CORO_PARAM, RMPoint pt, bool *result) { CORO_BEGIN_CONTEXT; RMPoint dest; @@ -1807,7 +1790,7 @@ bool RMGameBoxes::isInBox(int nLoc, int nBox, const RMPoint &pt) { RMBoxLoc *cur = getBoxes(nLoc); if ((pt._x >= cur->_boxes[nBox]._left) && (pt._x <= cur->_boxes[nBox]._right) && - (pt._y >= cur->_boxes[nBox]._top) && (pt._y <= cur->_boxes[nBox]._bottom)) + (pt._y >= cur->_boxes[nBox]._top) && (pt._y <= cur->_boxes[nBox]._bottom)) return true; else return false; @@ -1822,7 +1805,7 @@ int RMGameBoxes::whichBox(int nLoc, const RMPoint &punto) { for (int i = 0; i < cur->_numbBox; i++) { if (cur->_boxes[i]._bActive) { if ((punto._x >= cur->_boxes[i]._left) && (punto._x <= cur->_boxes[i]._right) && - (punto._y >= cur->_boxes[i]._top) && (punto._y <= cur->_boxes[i]._bottom)) + (punto._y >= cur->_boxes[i]._top) && (punto._y <= cur->_boxes[i]._bottom)) return i; } } @@ -1976,7 +1959,7 @@ bool RMLocation::load(Common::SeekableReadStream &ds) { _buf->init(ds, dimx, dimy, true); // Check the size of the location -// assert(dimy!=512); + //assert(dimy!=512); // Number of objects _nItems = ds.readSint32LE(); @@ -1994,7 +1977,6 @@ bool RMLocation::load(Common::SeekableReadStream &ds) { return ds.err(); } - bool RMLocation::loadLOX(Common::SeekableReadStream &ds) { // Version byte ver = ds.readByte(); @@ -2033,7 +2015,6 @@ bool RMLocation::loadLOX(Common::SeekableReadStream &ds) { return ds.err(); } - /** * Draw method overloaded from RMGfxSourceBUffer8 */ @@ -2070,7 +2051,6 @@ void RMLocation::draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *pri CORO_END_CODE; } - /** * Prepare a frame, adding the location to the OT list, and all the items that have changed animation frame. */ @@ -2084,7 +2064,6 @@ void RMLocation::doFrame(RMGfxTargetBuffer *bigBuf) { _items[i].doFrame(bigBuf); } - RMItem *RMLocation::getItemFromCode(uint32 dwCode) { for (int i = 0; i < _nItems; i++) { if (_items[i].mpalCode() == (int)dwCode) diff --git a/engines/tony/loc.h b/engines/tony/loc.h index 04ba772458..1306316136 100644 --- a/engines/tony/loc.h +++ b/engines/tony/loc.h @@ -49,7 +49,6 @@ typedef enum { CM_65K } RMColorMode; - /****************************************************************************\ * Class declarations \****************************************************************************/ @@ -65,7 +64,6 @@ public: void readFromStream(Common::ReadStream &ds); }; - /** * Sound effect of an object */ @@ -87,7 +85,6 @@ public: void readFromStream(Common::ReadStream &ds, bool bLOX = false); }; - /** * Object pattern */ @@ -126,8 +123,8 @@ public: private: int _speed; - RMPoint _pos; // Parent coordinates - RMPoint _curPos; // Parent + child coordinates + RMPoint _pos; // Parent coordinates + RMPoint _curPos; // Parent + child coordinates int _bLoop; int _nSlots; int _nCurSlot; @@ -160,7 +157,6 @@ private: void updateCoord(); }; - /** * Sprite (frame) animation of an item */ @@ -185,7 +181,6 @@ public: void readFromStream(Common::SeekableReadStream &ds, bool bLOX = false); }; - /** * Data on an item */ @@ -195,7 +190,7 @@ public: protected: int _z; - RMPoint _pos; // Coordinate ancestor + RMPoint _pos; // Coordinate ancestor RMColorMode _cm; RMPoint _curScroll; @@ -285,15 +280,14 @@ protected: virtual RMGfxSourceBuffer *newItemSpriteBuffer(int dimx, int dimy, bool bPreRLE); }; - -#define MAXBOXES 50 // Maximum number of allowed boxes -#define MAXHOTSPOT 20 // Maximum nimber of allowed hotspots +#define MAXBOXES 50 // Maximum number of allowed boxes +#define MAXHOTSPOT 20 // Maximum nimber of allowed hotspots class RMBox { public: struct Hotspot { - int _hotx, _hoty; // Hotspot coordinates - int _destination; // Hotspot destination + int _hotx, _hoty; // Hotspot coordinates + int _destination; // Hotspot destination }; public: @@ -309,7 +303,6 @@ public: void readFromStream(Common::ReadStream &ds); }; - class RMBoxLoc { public: int _numbBox; @@ -454,7 +447,6 @@ public: void setSpeed(int speed); }; - class RMWipe : public RMGfxTask { private: bool _bFading; @@ -483,25 +475,24 @@ public: virtual int priority(); }; - /** * Location */ class RMLocation : public RMGfxTaskSetPrior { public: - Common::String _name; // Name + Common::String _name; // Name private: - RMColorMode _cmode; // Color mode - RMGfxSourceBuffer *_buf; // Location picture + RMColorMode _cmode; // Color mode + RMGfxSourceBuffer *_buf; // Location picture - int _nItems; // Number of objects - RMItem *_items; // Objects + int _nItems; // Number of objects + RMItem *_items; // Objects - RMPoint _curScroll; // Current scroll position + RMPoint _curScroll; // Current scroll position RMPoint _fixedScroll; - RMPoint _prevScroll; // Previous scroll position + RMPoint _prevScroll; // Previous scroll position RMPoint _prevFixedScroll; public: @@ -552,7 +543,6 @@ public: void pauseSound(bool bPause); }; - /** * MPAL message, composed of more ASCIIZ */ diff --git a/engines/tony/mpal/expr.cpp b/engines/tony/mpal/expr.cpp index 824cd91651..7dc640ba7c 100644 --- a/engines/tony/mpal/expr.cpp +++ b/engines/tony/mpal/expr.cpp @@ -35,7 +35,6 @@ namespace Tony { namespace MPAL { - /** * Duplicate a mathematical expression. * @@ -140,7 +139,6 @@ static void solve(LpExpression one, int num) { } } - /** * Calculates the result of a mathematical expression, replacing the current * value of any variable. @@ -178,7 +176,6 @@ static int evaluateAndFreeExpression(byte *expr) { return val; } - /** * Parses a mathematical expression from the MPC file * @@ -249,7 +246,6 @@ const byte *parseExpression(const byte *lpBuf, MpalHandle *h) { return lpBuf; } - /** * Calculate the value of a mathamatical expression * diff --git a/engines/tony/mpal/expr.h b/engines/tony/mpal/expr.h index 405624b4fe..256d09bb9b 100644 --- a/engines/tony/mpal/expr.h +++ b/engines/tony/mpal/expr.h @@ -70,16 +70,16 @@ namespace MPAL { * Mathamatical framework to manage operations */ typedef struct { - byte _type; // Object Type (see enum ExprListTypes) + byte _type; // Object Type (see enum ExprListTypes) union { - int _num; // Identifier (if type == ELT_NUMBER) - char *_name; // Variable name (if type == ELT_VAR) - MpalHandle _son; // Handle expressions (if type == ELT_PARENTH) - byte *_pson; // Handle lockato (if type == ELT_PARENTH2) + int _num; // Identifier (if type == ELT_NUMBER) + char *_name; // Variable name (if type == ELT_VAR) + MpalHandle _son; // Handle expressions (if type == ELT_PARENTH) + byte *_pson; // Handle lockato (if type == ELT_PARENTH2) } _val; - byte _symbol; // Mathematic symbols (see #define OP_*) + byte _symbol; // Mathematic symbols (see #define OP_*) } Expression; typedef Expression *LpExpression; diff --git a/engines/tony/mpal/loadmpc.cpp b/engines/tony/mpal/loadmpc.cpp index 9c45cdf982..4eb84d1406 100644 --- a/engines/tony/mpal/loadmpc.cpp +++ b/engines/tony/mpal/loadmpc.cpp @@ -90,7 +90,7 @@ static const byte *ParseScript(const byte *lpBuf, LpMpalScript lpmsScript) { lpBuf += 4; break; - case 2: { // Variable assign + case 2: { // Variable assign int len = *lpBuf; lpBuf++; lpmsScript->_command[curCmd]._lpszVarName = (char *)globalAlloc(GMEM_FIXED | GMEM_ZEROINIT, len + 1); @@ -216,6 +216,7 @@ static const byte *parseDialog(const byte *lpBuf, LpMpalDialog lpmdDialog) { return NULL; break; } + // Do Choice case 3: lpmdDialog->_command[curCmd]._nChoice = READ_LE_UINT16(lpBuf); @@ -317,7 +318,6 @@ static const byte *parseDialog(const byte *lpBuf, LpMpalDialog lpmdDialog) { return lpBuf; } - /** * Parses an item from the MPC file, and inserts its data into a structure * @@ -384,7 +384,7 @@ static const byte *parseItem(const byte *lpBuf, LpMpalItem lpmiItem) { lpmiItem->_command[curCmd]._type = *lpBuf; lpBuf++; switch (lpmiItem->_command[curCmd]._type) { - case 1: // Call custom function + case 1: // Call custom function lpmiItem->_command[curCmd]._nCf = READ_LE_UINT16(lpBuf); lpBuf += 2; lpmiItem->_command[curCmd]._arg1 = (int32)READ_LE_UINT32(lpBuf); @@ -397,7 +397,7 @@ static const byte *parseItem(const byte *lpBuf, LpMpalItem lpmiItem) { lpBuf += 4; break; - case 2: // Variable assign + case 2: // Variable assign len = *lpBuf; lpBuf++; lpmiItem->_command[curCmd]._lpszVarName = (char *)globalAlloc(GMEM_FIXED | GMEM_ZEROINIT, len + 1); @@ -498,7 +498,6 @@ static const byte *ParseLocation(const byte *lpBuf, LpMpalLocation lpmlLocation) return lpBuf; } - /****************************************************************************\ * Exported functions \****************************************************************************/ @@ -539,7 +538,7 @@ bool parseMpc(const byte *lpBuf) { GLOBALS._lpmvVars->_dwVal = READ_LE_UINT32(lpBuf); lpBuf += 4; - lpBuf++; // Skip 'ext' + lpBuf++; // Skip 'ext' GLOBALS._lpmvVars++; } diff --git a/engines/tony/mpal/lzo.cpp b/engines/tony/mpal/lzo.cpp index 3d0751a5ca..a04a769528 100644 --- a/engines/tony/mpal/lzo.cpp +++ b/engines/tony/mpal/lzo.cpp @@ -69,440 +69,440 @@ namespace Tony { namespace MPAL { -#define pd(a, b) ((uint32) ((a) - (b))) +#define pd(a, b) ((uint32) ((a) - (b))) -#define TEST_IP (ip < ip_end) -#define TEST_OP 1 -#define NEED_IP(x) ((void) 0) -#define NEED_OP(x) ((void) 0) -#define TEST_LB(m_pos) ((void) 0) +#define TEST_IP (ip < ip_end) +#define TEST_OP 1 +#define NEED_IP(x) ((void) 0) +#define NEED_OP(x) ((void) 0) +#define TEST_LB(m_pos) ((void) 0) -#define M2_MAX_OFFSET 0x0800 +#define M2_MAX_OFFSET 0x0800 #define LZO1X /** * Decompresses an LZO compressed resource */ int lzo1x_decompress(const byte *in, uint32 in_len, byte *out, uint32 *out_len) { - register byte *op; - register const byte *ip; - register uint32 t = 0; + register byte *op; + register const byte *ip; + register uint32 t = 0; #if defined(COPY_DICT) - uint32 m_off; - const byte *dict_end; + uint32 m_off; + const byte *dict_end; #else - register const byte *m_pos; + register const byte *m_pos; #endif - const byte * const ip_end = in + in_len; + const byte * const ip_end = in + in_len; #if defined(HAVE_ANY_OP) - byte * const op_end = out + *out_len; + byte * const op_end = out + *out_len; #endif #if defined(LZO1Z) - uint32 last_m_off = 0; + uint32 last_m_off = 0; #endif #if defined(COPY_DICT) - if (dict) - { - if (dict_len > M4_MAX_OFFSET) - { - dict += dict_len - M4_MAX_OFFSET; - dict_len = M4_MAX_OFFSET; - } - dict_end = dict + dict_len; - } - else - { - dict_len = 0; - dict_end = NULL; - } -#endif - - *out_len = 0; - - op = out; - ip = in; - - if (*ip > 17) - { - t = *ip++ - 17; - if (t < 4) - goto match_next; - assert(t > 0); NEED_OP(t); NEED_IP(t+1); - do *op++ = *ip++; while (--t > 0); - goto first_literal_run; - } - - while (TEST_IP && TEST_OP) - { - t = *ip++; - if (t >= 16) - goto match; - if (t == 0) - { - NEED_IP(1); - while (*ip == 0) - { - t += 255; - ip++; - NEED_IP(1); - } - t += 15 + *ip++; - } - assert(t > 0); NEED_OP(t+3); NEED_IP(t+4); + if (dict) + { + if (dict_len > M4_MAX_OFFSET) + { + dict += dict_len - M4_MAX_OFFSET; + dict_len = M4_MAX_OFFSET; + } + dict_end = dict + dict_len; + } + else + { + dict_len = 0; + dict_end = NULL; + } +#endif + + *out_len = 0; + + op = out; + ip = in; + + if (*ip > 17) + { + t = *ip++ - 17; + if (t < 4) + goto match_next; + assert(t > 0); NEED_OP(t); NEED_IP(t+1); + do *op++ = *ip++; while (--t > 0); + goto first_literal_run; + } + + while (TEST_IP && TEST_OP) + { + t = *ip++; + if (t >= 16) + goto match; + if (t == 0) + { + NEED_IP(1); + while (*ip == 0) + { + t += 255; + ip++; + NEED_IP(1); + } + t += 15 + *ip++; + } + assert(t > 0); NEED_OP(t+3); NEED_IP(t+4); #if defined(LZO_UNALIGNED_OK_8) && defined(LZO_UNALIGNED_OK_4) - t += 3; - if (t >= 8) do - { - UA_COPY64(op, ip); - op += 8; ip += 8; t -= 8; - } while (t >= 8); - if (t >= 4) - { - UA_COPY32(op, ip); - op += 4; ip += 4; t -= 4; - } - if (t > 0) - { - *op++ = *ip++; - if (t > 1) { *op++ = *ip++; if (t > 2) { *op++ = *ip++; } } - } + t += 3; + if (t >= 8) do + { + UA_COPY64(op, ip); + op += 8; ip += 8; t -= 8; + } while (t >= 8); + if (t >= 4) + { + UA_COPY32(op, ip); + op += 4; ip += 4; t -= 4; + } + if (t > 0) + { + *op++ = *ip++; + if (t > 1) { *op++ = *ip++; if (t > 2) { *op++ = *ip++; } } + } #elif defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4) #if !defined(LZO_UNALIGNED_OK_4) - if (PTR_ALIGNED2_4(op, ip)) - { -#endif - UA_COPY32(op, ip); - op += 4; ip += 4; - if (--t > 0) - { - if (t >= 4) - { - do { - UA_COPY32(op, ip); - op += 4; ip += 4; t -= 4; - } while (t >= 4); - if (t > 0) do *op++ = *ip++; while (--t > 0); - } - else - do *op++ = *ip++; while (--t > 0); - } + if (PTR_ALIGNED2_4(op, ip)) + { +#endif + UA_COPY32(op, ip); + op += 4; ip += 4; + if (--t > 0) + { + if (t >= 4) + { + do { + UA_COPY32(op, ip); + op += 4; ip += 4; t -= 4; + } while (t >= 4); + if (t > 0) do *op++ = *ip++; while (--t > 0); + } + else + do *op++ = *ip++; while (--t > 0); + } #if !defined(LZO_UNALIGNED_OK_4) - } - else + } + else #endif #endif #if !defined(LZO_UNALIGNED_OK_4) && !defined(LZO_UNALIGNED_OK_8) - { - *op++ = *ip++; *op++ = *ip++; *op++ = *ip++; - do *op++ = *ip++; while (--t > 0); - } + { + *op++ = *ip++; *op++ = *ip++; *op++ = *ip++; + do *op++ = *ip++; while (--t > 0); + } #endif first_literal_run: - t = *ip++; - if (t >= 16) - goto match; + t = *ip++; + if (t >= 16) + goto match; #if defined(COPY_DICT) #if defined(LZO1Z) - m_off = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2); - last_m_off = m_off; + m_off = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2); + last_m_off = m_off; #else - m_off = (1 + M2_MAX_OFFSET) + (t >> 2) + (*ip++ << 2); + m_off = (1 + M2_MAX_OFFSET) + (t >> 2) + (*ip++ << 2); #endif - NEED_OP(3); - t = 3; COPY_DICT(t, m_off) + NEED_OP(3); + t = 3; COPY_DICT(t, m_off) #else #if defined(LZO1Z) - t = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2); - m_pos = op - t; - last_m_off = t; + t = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2); + m_pos = op - t; + last_m_off = t; #else - m_pos = op - (1 + M2_MAX_OFFSET); - m_pos -= t >> 2; - m_pos -= *ip++ << 2; + m_pos = op - (1 + M2_MAX_OFFSET); + m_pos -= t >> 2; + m_pos -= *ip++ << 2; #endif - TEST_LB(m_pos); NEED_OP(3); - *op++ = *m_pos++; *op++ = *m_pos++; *op++ = *m_pos; + TEST_LB(m_pos); NEED_OP(3); + *op++ = *m_pos++; *op++ = *m_pos++; *op++ = *m_pos; #endif - goto match_done; + goto match_done; - do { + do { match: - if (t >= 64) - { + if (t >= 64) + { #if defined(COPY_DICT) #if defined(LZO1X) - m_off = 1 + ((t >> 2) & 7) + (*ip++ << 3); - t = (t >> 5) - 1; + m_off = 1 + ((t >> 2) & 7) + (*ip++ << 3); + t = (t >> 5) - 1; #elif defined(LZO1Y) - m_off = 1 + ((t >> 2) & 3) + (*ip++ << 2); - t = (t >> 4) - 3; + m_off = 1 + ((t >> 2) & 3) + (*ip++ << 2); + t = (t >> 4) - 3; #elif defined(LZO1Z) - m_off = t & 0x1f; - if (m_off >= 0x1c) - m_off = last_m_off; - else - { - m_off = 1 + (m_off << 6) + (*ip++ >> 2); - last_m_off = m_off; - } - t = (t >> 5) - 1; + m_off = t & 0x1f; + if (m_off >= 0x1c) + m_off = last_m_off; + else + { + m_off = 1 + (m_off << 6) + (*ip++ >> 2); + last_m_off = m_off; + } + t = (t >> 5) - 1; #endif #else #if defined(LZO1X) - m_pos = op - 1; - m_pos -= (t >> 2) & 7; - m_pos -= *ip++ << 3; - t = (t >> 5) - 1; + m_pos = op - 1; + m_pos -= (t >> 2) & 7; + m_pos -= *ip++ << 3; + t = (t >> 5) - 1; #elif defined(LZO1Y) - m_pos = op - 1; - m_pos -= (t >> 2) & 3; - m_pos -= *ip++ << 2; - t = (t >> 4) - 3; + m_pos = op - 1; + m_pos -= (t >> 2) & 3; + m_pos -= *ip++ << 2; + t = (t >> 4) - 3; #elif defined(LZO1Z) - { - uint32 off = t & 0x1f; - m_pos = op; - if (off >= 0x1c) - { - assert(last_m_off > 0); - m_pos -= last_m_off; - } - else - { - off = 1 + (off << 6) + (*ip++ >> 2); - m_pos -= off; - last_m_off = off; - } - } - t = (t >> 5) - 1; -#endif - TEST_LB(m_pos); assert(t > 0); NEED_OP(t+3-1); - goto copy_match; -#endif - } - else if (t >= 32) - { - t &= 31; - if (t == 0) - { - NEED_IP(1); - while (*ip == 0) - { - t += 255; - ip++; - NEED_IP(1); - } - t += 31 + *ip++; - } + { + uint32 off = t & 0x1f; + m_pos = op; + if (off >= 0x1c) + { + assert(last_m_off > 0); + m_pos -= last_m_off; + } + else + { + off = 1 + (off << 6) + (*ip++ >> 2); + m_pos -= off; + last_m_off = off; + } + } + t = (t >> 5) - 1; +#endif + TEST_LB(m_pos); assert(t > 0); NEED_OP(t+3-1); + goto copy_match; +#endif + } + else if (t >= 32) + { + t &= 31; + if (t == 0) + { + NEED_IP(1); + while (*ip == 0) + { + t += 255; + ip++; + NEED_IP(1); + } + t += 31 + *ip++; + } #if defined(COPY_DICT) #if defined(LZO1Z) - m_off = 1 + (ip[0] << 6) + (ip[1] >> 2); - last_m_off = m_off; + m_off = 1 + (ip[0] << 6) + (ip[1] >> 2); + last_m_off = m_off; #else - m_off = 1 + (ip[0] >> 2) + (ip[1] << 6); + m_off = 1 + (ip[0] >> 2) + (ip[1] << 6); #endif #else #if defined(LZO1Z) - { - uint32 off = 1 + (ip[0] << 6) + (ip[1] >> 2); - m_pos = op - off; - last_m_off = off; - } + { + uint32 off = 1 + (ip[0] << 6) + (ip[1] >> 2); + m_pos = op - off; + last_m_off = off; + } #elif defined(LZO_UNALIGNED_OK_2) && defined(LZO_ABI_LITTLE_ENDIAN) - m_pos = op - 1; - m_pos -= UA_GET16(ip) >> 2; + m_pos = op - 1; + m_pos -= UA_GET16(ip) >> 2; #else - m_pos = op - 1; - m_pos -= (ip[0] >> 2) + (ip[1] << 6); + m_pos = op - 1; + m_pos -= (ip[0] >> 2) + (ip[1] << 6); #endif #endif - ip += 2; - } - else if (t >= 16) - { + ip += 2; + } + else if (t >= 16) + { #if defined(COPY_DICT) - m_off = (t & 8) << 11; + m_off = (t & 8) << 11; #else - m_pos = op; - m_pos -= (t & 8) << 11; -#endif - t &= 7; - if (t == 0) - { - NEED_IP(1); - while (*ip == 0) - { - t += 255; - ip++; - NEED_IP(1); - } - t += 7 + *ip++; - } + m_pos = op; + m_pos -= (t & 8) << 11; +#endif + t &= 7; + if (t == 0) + { + NEED_IP(1); + while (*ip == 0) + { + t += 255; + ip++; + NEED_IP(1); + } + t += 7 + *ip++; + } #if defined(COPY_DICT) #if defined(LZO1Z) - m_off += (ip[0] << 6) + (ip[1] >> 2); + m_off += (ip[0] << 6) + (ip[1] >> 2); #else - m_off += (ip[0] >> 2) + (ip[1] << 6); + m_off += (ip[0] >> 2) + (ip[1] << 6); #endif - ip += 2; - if (m_off == 0) - goto eof_found; - m_off += 0x4000; + ip += 2; + if (m_off == 0) + goto eof_found; + m_off += 0x4000; #if defined(LZO1Z) - last_m_off = m_off; + last_m_off = m_off; #endif #else #if defined(LZO1Z) - m_pos -= (ip[0] << 6) + (ip[1] >> 2); + m_pos -= (ip[0] << 6) + (ip[1] >> 2); #elif defined(LZO_UNALIGNED_OK_2) && defined(LZO_ABI_LITTLE_ENDIAN) - m_pos -= UA_GET16(ip) >> 2; + m_pos -= UA_GET16(ip) >> 2; #else - m_pos -= (ip[0] >> 2) + (ip[1] << 6); + m_pos -= (ip[0] >> 2) + (ip[1] << 6); #endif - ip += 2; - if (m_pos == op) - goto eof_found; - m_pos -= 0x4000; + ip += 2; + if (m_pos == op) + goto eof_found; + m_pos -= 0x4000; #if defined(LZO1Z) - last_m_off = pd((const byte *)op, m_pos); + last_m_off = pd((const byte *)op, m_pos); #endif #endif - } - else - { + } + else + { #if defined(COPY_DICT) #if defined(LZO1Z) - m_off = 1 + (t << 6) + (*ip++ >> 2); - last_m_off = m_off; + m_off = 1 + (t << 6) + (*ip++ >> 2); + last_m_off = m_off; #else - m_off = 1 + (t >> 2) + (*ip++ << 2); + m_off = 1 + (t >> 2) + (*ip++ << 2); #endif - NEED_OP(2); - t = 2; COPY_DICT(t, m_off) + NEED_OP(2); + t = 2; COPY_DICT(t, m_off) #else #if defined(LZO1Z) - t = 1 + (t << 6) + (*ip++ >> 2); - m_pos = op - t; - last_m_off = t; + t = 1 + (t << 6) + (*ip++ >> 2); + m_pos = op - t; + last_m_off = t; #else - m_pos = op - 1; - m_pos -= t >> 2; - m_pos -= *ip++ << 2; + m_pos = op - 1; + m_pos -= t >> 2; + m_pos -= *ip++ << 2; #endif - TEST_LB(m_pos); NEED_OP(2); - *op++ = *m_pos++; *op++ = *m_pos; + TEST_LB(m_pos); NEED_OP(2); + *op++ = *m_pos++; *op++ = *m_pos; #endif - goto match_done; - } + goto match_done; + } #if defined(COPY_DICT) - NEED_OP(t+3-1); - t += 3-1; COPY_DICT(t, m_off) + NEED_OP(t+3-1); + t += 3-1; COPY_DICT(t, m_off) #else - TEST_LB(m_pos); assert(t > 0); NEED_OP(t+3-1); + TEST_LB(m_pos); assert(t > 0); NEED_OP(t+3-1); #if defined(LZO_UNALIGNED_OK_8) && defined(LZO_UNALIGNED_OK_4) - if (op - m_pos >= 8) - { - t += (3 - 1); - if (t >= 8) do - { - UA_COPY64(op, m_pos); - op += 8; m_pos += 8; t -= 8; - } while (t >= 8); - if (t >= 4) - { - UA_COPY32(op, m_pos); - op += 4; m_pos += 4; t -= 4; - } - if (t > 0) - { - *op++ = m_pos[0]; - if (t > 1) { *op++ = m_pos[1]; if (t > 2) { *op++ = m_pos[2]; } } - } - } - else + if (op - m_pos >= 8) + { + t += (3 - 1); + if (t >= 8) do + { + UA_COPY64(op, m_pos); + op += 8; m_pos += 8; t -= 8; + } while (t >= 8); + if (t >= 4) + { + UA_COPY32(op, m_pos); + op += 4; m_pos += 4; t -= 4; + } + if (t > 0) + { + *op++ = m_pos[0]; + if (t > 1) { *op++ = m_pos[1]; if (t > 2) { *op++ = m_pos[2]; } } + } + } + else #elif defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4) #if !defined(LZO_UNALIGNED_OK_4) - if (t >= 2 * 4 - (3 - 1) && PTR_ALIGNED2_4(op, m_pos)) - { - assert((op - m_pos) >= 4); + if (t >= 2 * 4 - (3 - 1) && PTR_ALIGNED2_4(op, m_pos)) + { + assert((op - m_pos) >= 4); #else - if (t >= 2 * 4 - (3 - 1) && (op - m_pos) >= 4) - { -#endif - UA_COPY32(op, m_pos); - op += 4; m_pos += 4; t -= 4 - (3 - 1); - do { - UA_COPY32(op, m_pos); - op += 4; m_pos += 4; t -= 4; - } while (t >= 4); - if (t > 0) do *op++ = *m_pos++; while (--t > 0); - } - else -#endif - { + if (t >= 2 * 4 - (3 - 1) && (op - m_pos) >= 4) + { +#endif + UA_COPY32(op, m_pos); + op += 4; m_pos += 4; t -= 4 - (3 - 1); + do { + UA_COPY32(op, m_pos); + op += 4; m_pos += 4; t -= 4; + } while (t >= 4); + if (t > 0) do *op++ = *m_pos++; while (--t > 0); + } + else +#endif + { copy_match: - *op++ = *m_pos++; *op++ = *m_pos++; - do *op++ = *m_pos++; while (--t > 0); - } + *op++ = *m_pos++; *op++ = *m_pos++; + do *op++ = *m_pos++; while (--t > 0); + } #endif match_done: #if defined(LZO1Z) - t = ip[-1] & 3; + t = ip[-1] & 3; #else - t = ip[-2] & 3; + t = ip[-2] & 3; #endif - if (t == 0) - break; + if (t == 0) + break; match_next: - assert(t > 0); assert(t < 4); NEED_OP(t); NEED_IP(t+1); + assert(t > 0); assert(t < 4); NEED_OP(t); NEED_IP(t+1); #if 0 - do *op++ = *ip++; while (--t > 0); + do *op++ = *ip++; while (--t > 0); #else - *op++ = *ip++; - if (t > 1) { *op++ = *ip++; if (t > 2) { *op++ = *ip++; } } + *op++ = *ip++; + if (t > 1) { *op++ = *ip++; if (t > 2) { *op++ = *ip++; } } #endif - t = *ip++; - } while (TEST_IP && TEST_OP); - } + t = *ip++; + } while (TEST_IP && TEST_OP); + } #if defined(HAVE_TEST_IP) || defined(HAVE_TEST_OP) - *out_len = pd(op, out); - return LZO_E_EOF_NOT_FOUND; + *out_len = pd(op, out); + return LZO_E_EOF_NOT_FOUND; #endif eof_found: - assert(t == 1); - *out_len = pd(op, out); - return (ip == ip_end ? LZO_E_OK : - (ip < ip_end ? LZO_E_INPUT_NOT_CONSUMED : LZO_E_INPUT_OVERRUN)); + assert(t == 1); + *out_len = pd(op, out); + return (ip == ip_end ? LZO_E_OK : + (ip < ip_end ? LZO_E_INPUT_NOT_CONSUMED : LZO_E_INPUT_OVERRUN)); #if defined(HAVE_NEED_IP) input_overrun: - *out_len = pd(op, out); - return LZO_E_INPUT_OVERRUN; + *out_len = pd(op, out); + return LZO_E_INPUT_OVERRUN; #endif #if defined(HAVE_NEED_OP) output_overrun: - *out_len = pd(op, out); - return LZO_E_OUTPUT_OVERRUN; + *out_len = pd(op, out); + return LZO_E_OUTPUT_OVERRUN; #endif #if defined(LZO_TEST_OVERRUN_LOOKBEHIND) lookbehind_overrun: - *out_len = pd(op, out); - return LZO_E_LOOKBEHIND_OVERRUN; + *out_len = pd(op, out); + return LZO_E_LOOKBEHIND_OVERRUN; #endif } diff --git a/engines/tony/mpal/memory.cpp b/engines/tony/mpal/memory.cpp index dfbf16e789..9737fe0abf 100644 --- a/engines/tony/mpal/memory.cpp +++ b/engines/tony/mpal/memory.cpp @@ -121,7 +121,6 @@ void MemoryManager::unlockItem(MpalHandle handle) { --item->_lockCount; } - } // end of namespace MPAL } // end of namespace Tony diff --git a/engines/tony/mpal/mpal.cpp b/engines/tony/mpal/mpal.cpp index 8d83363c24..1a24c5a576 100644 --- a/engines/tony/mpal/mpal.cpp +++ b/engines/tony/mpal/mpal.cpp @@ -196,7 +196,6 @@ static int locGetOrderFromNum(uint32 nLoc) { return -1; } - /** * Find the index of a message within the messages array * @param nMsg Message number to search for @@ -233,7 +232,6 @@ static int itemGetOrderFromNum(uint32 nItem) { return -1; } - /** * Find the index of a script within the scripts array * @param nScript Script number to search for @@ -252,7 +250,6 @@ static int scriptGetOrderFromNum(uint32 nScript) { return -1; } - /** * Find the index of a dialog within the dialogs array * @param nDialog Dialog number to search for @@ -271,7 +268,6 @@ static int dialogGetOrderFromNum(uint32 nDialog) { return -1; } - /** * Duplicates a message * @param nMsgOrd Index of the message inside the messages array @@ -302,7 +298,6 @@ static char *DuplicateMessage(uint32 nMsgOrd) { return clonemsg; } - /** * Duplicate a sentence of a dialog * @param nDlgOrd Index of the dialog in the dialogs array @@ -340,7 +335,6 @@ static char *duplicateDialogPeriod(uint32 nPeriod) { return NULL; } - /** * Load a resource from the MPR file * @@ -461,16 +455,16 @@ static LpItem getItemData(uint32 nOrdItem) { dat = (char *)globalLock(hDat); if (dat[0] == 'D' && dat[1] == 'A' && dat[2] == 'T') { - int i = dat[3]; // For version 1.0!! + int i = dat[3]; // For version 1.0!! dat += 4; - if (i >= 0x10) { // From 1.0, there's a destination point for each object + if (i >= 0x10) { // From 1.0, there's a destination point for each object ret->_destX = (int16)READ_LE_UINT16(dat); ret->_destY = (int16)READ_LE_UINT16(dat + 2); dat += 4; } - if (i >= 0x11) { // From 1.1, there's animation speed + if (i >= 0x11) { // From 1.1, there's animation speed ret->_speed = READ_LE_UINT16(dat); dat += 2; } else @@ -511,7 +505,7 @@ static LpItem getItemData(uint32 nOrdItem) { for (int i = 1; i < ret->_numpattern; i++) { for (int j = 0; j < patlength[i]; j++) ret->_pattern[i][j] = dat[j]; - ret->_pattern[i][(int)patlength[i]] = 255; // Terminate pattern + ret->_pattern[i][(int)patlength[i]] = 255; // Terminate pattern dat += patlength[i]; } @@ -538,7 +532,6 @@ static LpItem getItemData(uint32 nOrdItem) { return ret; } - /** * Thread that calls a custom function. It is used in scripts, so that each script * function is executed without delaying the others. @@ -562,7 +555,6 @@ void CustomThread(CORO_PARAM, const void *param) { CORO_END_CODE; } - /** * Main process for running a script. * @@ -587,7 +579,7 @@ void ScriptThread(CORO_PARAM, const void *param) { _ctx->dwStartTime = g_vm->getTime(); _ctx->numHandles = 0; -// debugC(DEBUG_BASIC, kTonyDebugMPAL, "PlayScript(): Moments: %u\n", s->_nMoments); + //debugC(DEBUG_BASIC, kTonyDebugMPAL, "PlayScript(): Moments: %u\n", s->_nMoments); for (_ctx->i = 0; _ctx->i < s->_nMoments; _ctx->i++) { // Sleep for the required time if (s->_moment[_ctx->i]._dwTime == -1) { @@ -596,7 +588,7 @@ void ScriptThread(CORO_PARAM, const void *param) { } else { _ctx->dwCurTime = g_vm->getTime(); if (_ctx->dwCurTime < _ctx->dwStartTime + (s->_moment[_ctx->i]._dwTime * 100)) { - // debugC(DEBUG_BASIC, kTonyDebugMPAL, "PlayScript(): Sleeping %lums\n",_ctx->dwStartTime + (s->_moment[_ctx->i]._dwTime*100) - _ctx->dwCurTime); + //debugC(DEBUG_BASIC, kTonyDebugMPAL, "PlayScript(): Sleeping %lums\n",_ctx->dwStartTime + (s->_moment[_ctx->i]._dwTime*100) - _ctx->dwCurTime); CORO_INVOKE_1(CoroScheduler.sleep, _ctx->dwStartTime + (s->_moment[_ctx->i]._dwTime * 100) - _ctx->dwCurTime); } } @@ -655,7 +647,6 @@ void ScriptThread(CORO_PARAM, const void *param) { CORO_END_CODE; } - /** * Thread that performs an action on an item. the thread always executes the action, * so it should create a new item in which the action is the one required. @@ -752,11 +743,9 @@ void ShutUpActionThread(CORO_PARAM, const void *param) { CORO_INVOKE_1(g_vm->loadState, _ctx->slotNumber); } - CORO_END_CODE; } - /** * Polls one location (starting point of a process) * @@ -764,14 +753,14 @@ void ShutUpActionThread(CORO_PARAM, const void *param) { */ void LocationPollThread(CORO_PARAM, const void *param) { typedef struct { - uint32 _nItem, _nAction; + uint32 _nItem, _nAction; - uint16 _wTime; - byte _perc; + uint16 _wTime; + byte _perc; MpalHandle _when; - byte _nCmds; - uint16 _cmdNum[MAX_COMMANDS_PER_ACTION]; - uint32 _dwLastTime; + byte _nCmds; + uint16 _cmdNum[MAX_COMMANDS_PER_ACTION]; + uint32 _dwLastTime; } MYACTION; typedef struct { @@ -862,7 +851,6 @@ void LocationPollThread(CORO_PARAM, const void *param) { return; } - // We have established that there is at least one item that contains idle actions. // Now we created the mirrored copies of the idle actions. _ctx->myActions = (MYACTION *)globalAlloc(GMEM_FIXED | GMEM_ZEROINIT, _ctx->nIdleActions * sizeof(MYACTION)); @@ -905,7 +893,6 @@ void LocationPollThread(CORO_PARAM, const void *param) { // We don't need the item list anymore globalDestroy(_ctx->il); - // Here's the main loop while (1) { // Searching for idle actions requiring time to execute @@ -944,7 +931,7 @@ void LocationPollThread(CORO_PARAM, const void *param) { if (_ctx->curTime >= _ctx->myActions[_ctx->k]._dwLastTime + _ctx->myActions[_ctx->k]._wTime) { _ctx->myActions[_ctx->k]._dwLastTime += _ctx->myActions[_ctx->k]._wTime; - // It's time to check to see if fortune is on the side of the idle action + // It's time to check to see if fortune is on the side of the idle action byte randomVal = (byte)g_vm->_randomSource.getRandomNumber(99); if (randomVal < _ctx->myActions[_ctx->k]._perc) { // Check if there is an action running on the item @@ -1016,7 +1003,6 @@ void LocationPollThread(CORO_PARAM, const void *param) { } } - // Set idle skip on CORO_INVOKE_4(GLOBALS._lplpFunctions[200], 0, 0, 0, 0); @@ -1038,7 +1024,6 @@ void LocationPollThread(CORO_PARAM, const void *param) { CORO_END_CODE; } - /** * Wait for the end of the dialog execution thread, and then restore global * variables indicating that the dialogue has finished. @@ -1071,7 +1056,6 @@ void ShutUpDialogThread(CORO_PARAM, const void *param) { void doChoice(CORO_PARAM, uint32 nChoice); - /** * Executes a group of the current dialog. Can 'be the Starting point of a process. * @parm nGroup Number of the group to perform @@ -1149,7 +1133,6 @@ void GroupThread(CORO_PARAM, const void *param) { CORO_END_CODE; } - /** * Make a choice in the current dialog. * @@ -1247,7 +1230,6 @@ void doChoice(CORO_PARAM, uint32 nChoice) { CORO_END_CODE; } - /** * Perform an action on a certain item. * @@ -1353,7 +1335,6 @@ static uint32 doDialog(uint32 nDlgOrd, uint32 nGroup) { return h; } - /** * Takes note of the selection chosen by the user, and warns the process that was running * the box that it can continue. @@ -1379,7 +1360,6 @@ bool doSelection(uint32 i, uint32 dwData) { return true; } - /** * @defgroup Exported functions */ @@ -1502,6 +1482,8 @@ bool mpalInit(const char *lpszMpcFileName, const char *lpszMprFileName, lzo1x_decompress((const byte *)cmpbuf, dwSizeComp, (byte *)GLOBALS._lpResources, (uint32 *)&nBytesRead); if (nBytesRead != (uint32)GLOBALS._nResources * 8) return false; + for (int i = 0; i < 2*GLOBALS._nResources; ++i) + GLOBALS._lpResources[i] = FROM_LE_32(GLOBALS._lpResources[i]); globalDestroy(cmpbuf); @@ -1884,7 +1866,6 @@ MpalHandle mpalQueryHANDLE(uint16 wQueryType, ...) { return hRet; } - /** * This is a general function to communicate with the library, to request information * about what is in the .MPC file @@ -2005,7 +1986,6 @@ bool mpalStartIdlePoll(int nLoc) { return false; } - /** * Stop processing the idle actions of the items on one location. * @@ -2063,7 +2043,6 @@ void mpalSaveState(byte *buf) { unlockVar(); } - /** * Load a save state from a buffer. * diff --git a/engines/tony/mpal/mpal.h b/engines/tony/mpal/mpal.h index 5e1b02b3fc..779bdd6188 100644 --- a/engines/tony/mpal/mpal.h +++ b/engines/tony/mpal/mpal.h @@ -26,7 +26,6 @@ * Copyright (c) 1997-2003 Nayma Software */ - /****************************************************************************\ * General Introduction \****************************************************************************/ @@ -56,7 +55,6 @@ * */ - /****************************************************************************\ * Custom Functions \****************************************************************************/ @@ -96,11 +94,11 @@ namespace MPAL { \****************************************************************************/ // OK value for the error codes -#define OK 0 +#define OK 0 -#define MAXFRAMES 400 // frame animation of an object -#define MAXPATTERN 40 // pattern of animation of an object -#define MAXPOLLINGLOCATIONS 64 +#define MAXFRAMES 400 // frame animation of an object +#define MAXPATTERN 40 // pattern of animation of an object +#define MAXPOLLINGLOCATIONS 64 #define GETARG(type) va_arg(v, type) @@ -108,8 +106,8 @@ namespace MPAL { * Macro for use with queries that may refer to X and Y co-ordinates */ enum QueryCoordinates { - MPQ_X, - MPQ_Y + MPQ_X, + MPQ_Y }; /** @@ -117,55 +115,54 @@ enum QueryCoordinates { * that can do at the library */ enum QueryTypes { - // General Query - MPQ_VERSION = 10, - - MPQ_GLOBAL_VAR = 50, - MPQ_RESOURCE, - MPQ_MESSAGE, - - // Query on leases - MPQ_LOCATION_IMAGE = 100, - MPQ_LOCATION_SIZE, - - // Queries about items - MPQ_ITEM_LIST = 200, - MPQ_ITEM_DATA, - MPQ_ITEM_PATTERN, - MPQ_ITEM_NAME, + // General Query + MPQ_VERSION = 10, + + MPQ_GLOBAL_VAR = 50, + MPQ_RESOURCE, + MPQ_MESSAGE, + + // Query on leases + MPQ_LOCATION_IMAGE = 100, + MPQ_LOCATION_SIZE, + + // Queries about items + MPQ_ITEM_LIST = 200, + MPQ_ITEM_DATA, + MPQ_ITEM_PATTERN, + MPQ_ITEM_NAME, MPQ_ITEM_IS_ACTIVE, - // Query dialog - MPQ_DIALOG_PERIOD = 300, - MPQ_DIALOG_WAITFORCHOICE, - MPQ_DIALOG_SELECTLIST, - MPQ_DIALOG_SELECTION, + // Query dialog + MPQ_DIALOG_PERIOD = 300, + MPQ_DIALOG_WAITFORCHOICE, + MPQ_DIALOG_SELECTLIST, + MPQ_DIALOG_SELECTION, - // Query execution - MPQ_DO_ACTION = 400, - MPQ_DO_DIALOG + // Query execution + MPQ_DO_ACTION = 400, + MPQ_DO_DIALOG }; /** * Framework to manage the animation of an item */ typedef struct { - char *_frames[MAXFRAMES]; - Common::Rect _frameslocations[MAXFRAMES]; - Common::Rect _bbox[MAXFRAMES]; - short _pattern[MAXPATTERN][MAXFRAMES]; - short _speed; - char _numframe; - char _numpattern; - char _curframe; - char _curpattern; - short _destX, _destY; - signed char _destZ; - short _objectID; + char *_frames[MAXFRAMES]; + Common::Rect _frameslocations[MAXFRAMES]; + Common::Rect _bbox[MAXFRAMES]; + short _pattern[MAXPATTERN][MAXFRAMES]; + short _speed; + char _numframe; + char _numpattern; + char _curframe; + char _curpattern; + short _destX, _destY; + signed char _destZ; + short _objectID; } Item; typedef Item *LpItem; - /** * Define a custom function, to use the language MPAL to perform various controls as a result of an action */ @@ -206,7 +203,6 @@ typedef LPITEMIRQFUNCTION* LPLPITEMIRQFUNCTION; #define mpalQueryGlobalVar(lpszVarName) \ mpalQueryDWORD(MPQ_GLOBAL_VAR, (const char *)(lpszVarName)) - /** * Provides access to a resource inside the .MPC file * @@ -216,7 +212,6 @@ typedef LPITEMIRQFUNCTION* LPLPITEMIRQFUNCTION; #define mpalQueryResource(dwResId) \ mpalQueryHANDLE(MPQ_RESOURCE, (uint32)(dwResId)) - /** * Returns a message. * @@ -228,7 +223,6 @@ typedef LPITEMIRQFUNCTION* LPLPITEMIRQFUNCTION; #define mpalQueryMessage(nMsg) \ (char *)mpalQueryHANDLE(MPQ_MESSAGE, (uint32)(nMsg)) - /** * Provides a location image * @return Returns a picture handle @@ -236,7 +230,6 @@ typedef LPITEMIRQFUNCTION* LPLPITEMIRQFUNCTION; #define mpalQueryLocationImage(nLoc) \ mpalQueryHANDLE(MPQ_LOCATION_IMAGE, (uint32)(nLoc)) - /** * Request the x or y size of a location in pixels * @@ -247,7 +240,6 @@ typedef LPITEMIRQFUNCTION* LPLPITEMIRQFUNCTION; #define mpalQueryLocationSize(nLoc, dwCoord) \ mpalQueryDWORD(MPQ_LOCATION_SIZE, (uint32)(nLoc), (uint32)(dwCoord)) - /** * Provides the list of objects in a location. * @@ -258,7 +250,6 @@ typedef LPITEMIRQFUNCTION* LPLPITEMIRQFUNCTION; #define mpalQueryItemList(nLoc) \ (uint32 *)mpalQueryHANDLE(MPQ_ITEM_LIST, (uint32)(nLoc)) - /** * Provides information on an item * @@ -268,7 +259,6 @@ typedef LPITEMIRQFUNCTION* LPLPITEMIRQFUNCTION; #define mpalQueryItemData(nItem) \ (LpItem)mpalQueryHANDLE(MPQ_ITEM_DATA, (uint32)(nItem)) - /** * Provides the current pattern of an item * @@ -279,7 +269,6 @@ typedef LPITEMIRQFUNCTION* LPLPITEMIRQFUNCTION; #define mpalQueryItemPattern(nItem) \ mpalQueryDWORD(MPQ_ITEM_PATTERN, (uint32)(nItem)) - /** * Returns true if an item is active * @@ -289,7 +278,6 @@ typedef LPITEMIRQFUNCTION* LPLPITEMIRQFUNCTION; #define mpalQueryItemIsActive(nItem) \ (bool)mpalQueryDWORD(MPQ_ITEM_IS_ACTIVE, (uint32)(nItem)) - /** * Returns the name of an item * @@ -302,7 +290,6 @@ typedef LPITEMIRQFUNCTION* LPLPITEMIRQFUNCTION; #define mpalQueryItemName(nItem, lpszName) \ mpalQueryHANDLE(MPQ_ITEM_NAME, (uint32)(nItem), (char *)(lpszName)) - /** * Returns a sentence of dialog. * @@ -316,7 +303,6 @@ typedef LPITEMIRQFUNCTION* LPLPITEMIRQFUNCTION; #define mpalQueryDialogPeriod(nPeriod) \ (char *)mpalQueryHANDLE(MPQ_DIALOG_PERIOD, (uint32)(nPeriod)) - /** * Wait until the moment in which the need is signaled to make a choice by the user. * @returns Number of choice to be made, or -1 if the dialogue is finished. @@ -393,7 +379,7 @@ typedef LPITEMIRQFUNCTION* LPLPITEMIRQFUNCTION; * @returns TRUE if all OK, FALSE on failure */ bool mpalInit(const char *lpszFileName, const char *lpszMprFileName, - LPLPCUSTOMFUNCTION lplpcfArray, Common::String *lpcfStrings); + LPLPCUSTOMFUNCTION lplpcfArray, Common::String *lpcfStrings); /** * Frees resources allocated by the MPAL subsystem @@ -476,7 +462,6 @@ bool mpalStartIdlePoll(int nLoc); */ void mpalEndIdlePoll(CORO_PARAM, int nLoc, bool *result); - /** * Load a save state from a buffer. * diff --git a/engines/tony/mpal/mpaldll.h b/engines/tony/mpal/mpaldll.h index 8897096f51..92ddf8fc5a 100644 --- a/engines/tony/mpal/mpaldll.h +++ b/engines/tony/mpal/mpaldll.h @@ -73,7 +73,7 @@ namespace MPAL { * MPAL global variables */ struct MpalVar { - uint32 _dwVal; // Variable value + uint32 _dwVal; // Variable value char _lpszVarName[33]; // Variable name } PACKED_STRUCT; typedef MpalVar *LpMpalVar; @@ -82,8 +82,8 @@ typedef MpalVar *LpMpalVar; * MPAL Messages */ struct MpalMsg { - MpalHandle _hText; // Handle to the message text - uint16 _wNum; // Message number + MpalHandle _hText; // Handle to the message text + uint16 _wNum; // Message number } PACKED_STRUCT; typedef MpalMsg *LpMpalMsg; @@ -91,9 +91,9 @@ typedef MpalMsg *LpMpalMsg; * MPAL Locations */ struct MpalLocation { - uint32 _nObj; // Location number - uint32 _dwXlen, _dwYlen; // Dimensions - uint32 _dwPicRes; // Resource that contains the image + uint32 _nObj; // Location number + uint32 _dwXlen, _dwYlen; // Dimensions + uint32 _dwPicRes; // Resource that contains the image } PACKED_STRUCT; typedef MpalLocation *LpMpalLocation; @@ -110,34 +110,33 @@ struct Command { * #3 -> Making a choice (DIALOG) * */ - byte _type; // Type of control + byte _type; // Type of control union { - int32 _nCf; // Custom function call [#1] - char *_lpszVarName; // Variable name [#2] - int32 _nChoice; // Number of choice you make [#3] + int32 _nCf; // Custom function call [#1] + char *_lpszVarName; // Variable name [#2] + int32 _nChoice; // Number of choice you make [#3] }; union { - int32 _arg1; // Argument for custom function [#1] - MpalHandle _expr; // Expression to assign to a variable [#2] + int32 _arg1; // Argument for custom function [#1] + MpalHandle _expr; // Expression to assign to a variable [#2] }; - int32 _arg2, _arg3, _arg4; // Arguments for custom function [#1] + int32 _arg2, _arg3, _arg4; // Arguments for custom function [#1] } PACKED_STRUCT; - /** * MPAL dialog */ struct MpalDialog { - uint32 _nObj; // Dialog number + uint32 _nObj; // Dialog number struct Command _command[MAX_COMMANDS_PER_DIALOG]; struct { uint16 _num; - byte _nCmds; + byte _nCmds; uint16 _cmdNum[MAX_COMMANDS_PER_GROUP]; } _group[MAX_GROUPS_PER_DIALOG]; @@ -152,7 +151,7 @@ struct MpalDialog { uint32 _dwData; uint16 _wPlayGroup[MAX_PLAYGROUPS_PER_SELECT]; - // Bit 0=endchoice Bit 1=enddialog + // Bit 0=endchoice Bit 1=enddialog byte _attr; // Modified at run-time: 0 if the select is currently disabled, @@ -172,23 +171,22 @@ typedef MpalDialog *LpMpalDialog; * MPAL Item */ struct ItemAction { - byte _num; // Action number - uint16 _wTime; // If idle, the time which must pass - byte _perc; // Percentage of the idle run - MpalHandle _when; // Expression to compute. If != 0, then - // action can be done - uint16 _wParm; // Parameter for action - - byte _nCmds; // Number of commands to be executed - uint32 _cmdNum[MAX_COMMANDS_PER_ACTION]; // Commands to execute + byte _num; // Action number + uint16 _wTime; // If idle, the time which must pass + byte _perc; // Percentage of the idle run + MpalHandle _when; // Expression to compute. If != 0, then action can be done + uint16 _wParm; // Parameter for action + + byte _nCmds; // Number of commands to be executed + uint32 _cmdNum[MAX_COMMANDS_PER_ACTION]; // Commands to execute } PACKED_STRUCT; struct MpalItem { - uint32 _nObj; // Item number + uint32 _nObj; // Item number byte _lpszDescribe[MAX_DESCRIBE_SIZE]; // Name - byte _nActions; // Number of managed actions - uint32 _dwRes; // Resource that contains frames and patterns + byte _nActions; // Number of managed actions + uint32 _dwRes; // Resource that contains frames and patterns struct Command _command[MAX_COMMANDS_PER_ITEM]; @@ -209,14 +207,14 @@ struct MpalScript { struct Command _command[MAX_COMMANDS_PER_SCRIPT]; struct { - int32 _dwTime; - byte _nCmds; + int32 _dwTime; + byte _nCmds; uint32 _cmdNum[MAX_COMMANDS_PER_MOMENT]; } _moment[MAX_MOMENTS_PER_SCRIPT]; } PACKED_STRUCT; -typedef MpalScript *LpMpalScript; +typedef MpalScript *LpMpalScript; #include "common/pack-end.h" @@ -235,7 +233,6 @@ typedef MpalScript *LpMpalScript; */ extern int32 varGetValue(const char *lpszVarName); - /** * Sets the value of a MPAL global variable * @param lpszVarName Name of the variable diff --git a/engines/tony/mpal/mpalutils.h b/engines/tony/mpal/mpalutils.h index d92bb6f9a2..f351f22196 100644 --- a/engines/tony/mpal/mpalutils.h +++ b/engines/tony/mpal/mpalutils.h @@ -38,19 +38,19 @@ namespace MPAL { class RMRes { protected: MpalHandle _h; - byte *_buf; + byte *_buf; public: RMRes(uint32 resID); - virtual ~RMRes(); + virtual ~RMRes(); - // Attributes + // Attributes unsigned int size(); - const byte *dataPointer(); + const byte *dataPointer(); bool isValid(); - // Casting for access to data - operator const byte*(); + // Casting for access to data + operator const byte*(); Common::SeekableReadStream *getReadStream(); }; diff --git a/engines/tony/resid.h b/engines/tony/resid.h index f4d2c9a4fa..0d601b7dd6 100644 --- a/engines/tony/resid.h +++ b/engines/tony/resid.h @@ -30,7 +30,6 @@ #ifndef TONY_RESID_H #define TONY_RESID_H - #define RES_I_INTERFACE 10300 #define RES_I_INTERPAL 10301 #define RES_I_INTERPPAL 10302 @@ -40,16 +39,16 @@ #define RES_I_INTERP4 10306 #define RES_I_INTERP5 10307 -#define RES_I_DLGTEXT 10350 +#define RES_I_DLGTEXT 10350 #define RES_I_DLGTEXTLINE 10351 -#define RES_I_DLGTEXTPAL 10352 +#define RES_I_DLGTEXTPAL 10352 #define RES_I_MINIINTER 10360 -#define RES_P_PAL 10410 -#define RES_P_GO 10400 +#define RES_P_PAL 10410 +#define RES_P_GO 10400 #define RES_P_TAKE 10401 -#define RES_P_USE 10402 +#define RES_P_USE 10402 #define RES_P_EXAM 10403 #define RES_P_TALK 10404 diff --git a/engines/tony/sound.cpp b/engines/tony/sound.cpp index 20386d6353..90ae241db0 100644 --- a/engines/tony/sound.cpp +++ b/engines/tony/sound.cpp @@ -36,6 +36,19 @@ namespace Tony { +/* + * Tony uses a [0,63] volume scale (where 0 is silent and 63 is loudest). + * The original game engine linearly mapped this scale into DirectSound's + * [-10000, 0] scale (where -10000 is silent), which is a logarithmic scale. + * + * This means that Tony's scale is logarithmic as well, and must be converted + * to the linear scale used by the mixer. + */ +static int remapVolume(int volume) { + double dsvol = (double)(63 - volume) * -10000.0 / 63.0; + return (int)((double)Audio::Mixer::kMaxChannelVolume * pow(10.0, dsvol / 2000.0) + 0.5); +} + /****************************************************************************\ * FPSOUND Methods \****************************************************************************/ @@ -62,7 +75,6 @@ bool FPSound::init() { * Destroy the object and free the memory * */ - FPSound::~FPSound() { } @@ -73,7 +85,6 @@ FPSound::~FPSound() { * * @returns True is everything is OK, False otherwise */ - bool FPSound::createStream(FPStream **streamPtr) { (*streamPtr) = new FPStream(_soundSupported); @@ -87,7 +98,6 @@ bool FPSound::createStream(FPStream **streamPtr) { * * @returns True is everything is OK, False otherwise */ - bool FPSound::createSfx(FPSfx **sfxPtr) { (*sfxPtr) = new FPSfx(_soundSupported); @@ -99,11 +109,13 @@ bool FPSound::createSfx(FPSfx **sfxPtr) { * * @param volume Volume to set (0-63) */ - void FPSound::setMasterVolume(int volume) { if (!_soundSupported) return; + // WORKAROUND: We don't use remapVolume() here, so that the main option screen exposes + // a linear scale to the user. This is an improvement over the original game + // where the user had to deal with a logarithmic volume scale. g_system->getMixer()->setVolumeForSoundType(Audio::Mixer::kPlainSoundType, CLIP<int>(volume, 0, 63) * Audio::Mixer::kMaxChannelVolume / 63); } @@ -112,7 +124,6 @@ void FPSound::setMasterVolume(int volume) { * * @param volumePtr Variable that will contain the volume (0-63) */ - void FPSound::getMasterVolume(int *volumePtr) { if (!_soundSupported) return; @@ -127,7 +138,6 @@ void FPSound::getMasterVolume(int *volumePtr) { * create it using FPSound::CreateSfx() * */ - FPSfx::FPSfx(bool soundOn) { _soundSupported = soundOn; _fileLoaded = false; @@ -148,7 +158,6 @@ FPSfx::FPSfx(bool soundOn) { * currently played, and free the memory it uses. * */ - FPSfx::~FPSfx() { if (!_soundSupported) return; @@ -173,7 +182,6 @@ FPSfx::~FPSfx() { * FPSound::CreateStream(). * Object pointers are no longer valid after this call. */ - void FPSfx::release() { delete this; } @@ -215,7 +223,6 @@ bool FPSfx::loadVoiceFromVDB(Common::File &vdbFP) { * * @returns True is everything is OK, False otherwise */ - bool FPSfx::loadFile(const char *fileName, uint32 codec) { if (!_soundSupported) return true; @@ -256,7 +263,6 @@ bool FPSfx::loadFile(const char *fileName, uint32 codec) { * * @returns True is everything is OK, False otherwise */ - bool FPSfx::play() { stop(); // sanity check @@ -291,7 +297,6 @@ bool FPSfx::play() { * * @returns True is everything is OK, False otherwise */ - bool FPSfx::stop() { if (_fileLoaded) { g_system->getMixer()->stopHandle(_handle); @@ -310,7 +315,6 @@ bool FPSfx::stop() { * playing. Any changes made during the play will have * no effect until the sfx is stopped then played again. */ - void FPSfx::setLoop(bool loop) { _loop = loop; } @@ -319,7 +323,6 @@ void FPSfx::setLoop(bool loop) { * Pauses a Sfx. * */ - void FPSfx::setPause(bool pause) { if (_fileLoaded) { if (g_system->getMixer()->isSoundHandleActive(_handle) && (pause ^ _paused)) @@ -335,7 +338,6 @@ void FPSfx::setPause(bool pause) { * @param volume Volume to be set (0-63) * */ - void FPSfx::setVolume(int volume) { if (volume > 63) volume = 63; @@ -364,7 +366,7 @@ void FPSfx::setVolume(int volume) { } if (g_system->getMixer()->isSoundHandleActive(_handle)) - g_system->getMixer()->setChannelVolume(_handle, volume * Audio::Mixer::kMaxChannelVolume / 63); + g_system->getMixer()->setChannelVolume(_handle, remapVolume(volume)); } /** @@ -373,10 +375,9 @@ void FPSfx::setVolume(int volume) { * @param volumePtr Will contain the current Sfx volume * */ - void FPSfx::getVolume(int *volumePtr) { if (g_system->getMixer()->isSoundHandleActive(_handle)) - *volumePtr = g_system->getMixer()->getChannelVolume(_handle) * 63 / Audio::Mixer::kMaxChannelVolume; + *volumePtr = _lastVolume; else *volumePtr = 0; } @@ -384,7 +385,6 @@ void FPSfx::getVolume(int *volumePtr) { /** * Returns true if the underlying sound has ended */ - bool FPSfx::endOfBuffer() const { return !g_system->getMixer()->isSoundHandleActive(_handle) && (!_rewindableStream || _rewindableStream->endOfData()); } @@ -440,7 +440,6 @@ FPStream::FPStream(bool soundOn) { * * @remarks It calls CloseFile() if needed. */ - FPStream::~FPStream() { if (!_soundSupported) return; @@ -583,7 +582,6 @@ bool FPStream::play() { * @returns True is everything is OK, False otherwise * */ - bool FPStream::stop() { if (!_soundSupported) return true; @@ -650,7 +648,6 @@ void FPStream::setPause(bool pause) { * @param volume Volume to be set (0-63) * */ - void FPStream::setVolume(int volume) { if (volume > 63) volume = 63; @@ -669,7 +666,7 @@ void FPStream::setVolume(int volume) { } if (g_system->getMixer()->isSoundHandleActive(_handle)) - g_system->getMixer()->setChannelVolume(_handle, volume * Audio::Mixer::kMaxChannelVolume / 63); + g_system->getMixer()->setChannelVolume(_handle, remapVolume(volume)); } /** @@ -678,10 +675,9 @@ void FPStream::setVolume(int volume) { * @param volumePtr Variable that will contain the current volume * */ - void FPStream::getVolume(int *volumePtr) { if (g_system->getMixer()->isSoundHandleActive(_handle)) - *volumePtr = g_system->getMixer()->getChannelVolume(_handle) * 63 / Audio::Mixer::kMaxChannelVolume; + *volumePtr = _lastVolume; else *volumePtr = 0; } diff --git a/engines/tony/tony.cpp b/engines/tony/tony.cpp index 86740c6fe5..43a2f639d9 100644 --- a/engines/tony/tony.cpp +++ b/engines/tony/tony.cpp @@ -732,6 +732,7 @@ uint32 TonyEngine::getTime() { bool TonyEngine::canLoadGameStateCurrently() { return GLOBALS._gfxEngine != NULL && GLOBALS._gfxEngine->canLoadSave(); } + bool TonyEngine::canSaveGameStateCurrently() { return GLOBALS._gfxEngine != NULL && GLOBALS._gfxEngine->canLoadSave(); } diff --git a/engines/tony/tony.h b/engines/tony/tony.h index 332b122923..750673061d 100644 --- a/engines/tony/tony.h +++ b/engines/tony/tony.h @@ -69,7 +69,7 @@ enum { struct TonyGameDescription; -#define MAX_SFX_CHANNELS 32 +#define MAX_SFX_CHANNELS 32 #define TONY_DAT_VER_MAJ 0 #define TONY_DAT_VER_MIN 3 diff --git a/engines/tony/tonychar.cpp b/engines/tony/tonychar.cpp index c7fa1e4a7b..46c018728e 100644 --- a/engines/tony/tonychar.cpp +++ b/engines/tony/tonychar.cpp @@ -120,7 +120,7 @@ void RMTony::init() { void RMTony::close() { // Deallocation of missing item -// _shadow.destroy(); + //_shadow.destroy(); } void RMTony::doFrame(CORO_PARAM, RMGfxTargetBuffer *bigBuf, int curLoc) { @@ -165,7 +165,6 @@ void RMTony::hide(bool bShowShadow) { _bShowShadow = bShowShadow; } - void RMTony::draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim) { CORO_BEGIN_CONTEXT; CORO_END_CONTEXT(_ctx); @@ -231,7 +230,6 @@ void RMTony::moveAndDoAction(CORO_PARAM, RMPoint dst, RMItem *item, int nAction, CORO_END_CODE; } - void RMTony::executeAction(int nAction, int nActionItem, int nParm) { uint32 pid; @@ -281,7 +279,6 @@ void RMTony::executeAction(int nAction, int nActionItem, int nParm) { } } - void RMTony::stopNoAction(CORO_PARAM) { CORO_BEGIN_CONTEXT; CORO_END_CONTEXT(_ctx); @@ -332,7 +329,6 @@ void RMTony::stop(CORO_PARAM) { CORO_END_CODE; } - int RMTony::getCurPattern() { int nPatt = RMCharacter::getCurPattern(); @@ -394,7 +390,6 @@ void RMTony::setPattern(int nPatt, bool bPlayP0) { RMCharacter::setPattern(nPatt, bPlayP0); } - void RMTony::take(int nWhere, int nPart) { if (nPart == 0) { switch (getCurPattern()) { @@ -469,7 +464,6 @@ void RMTony::take(int nWhere, int nPart) { } } - void RMTony::put(int nWhere, int nPart) { if (nPart == 0) { switch (getCurPattern()) { @@ -543,7 +537,6 @@ void RMTony::put(int nWhere, int nPart) { } } - bool RMTony::startTalkCalculate(CharacterTalkType nTalkType, int &headStartPat, int &bodyStartPat, int &headLoopPat, int &bodyLoopPat) { assert(!_bIsTalking); @@ -1132,7 +1125,6 @@ void RMTony::startTalk(CORO_PARAM, CharacterTalkType nTalkType) { CORO_END_CODE; } - bool RMTony::endTalkCalculate(int &headStandPat, int &headEndPat, int &bodyEndPat, int &finalPat, bool &bStatic) { bodyEndPat = 0; headEndPat = 0; diff --git a/engines/tony/window.cpp b/engines/tony/window.cpp index c9c450424f..61497a8066 100644 --- a/engines/tony/window.cpp +++ b/engines/tony/window.cpp @@ -35,7 +35,6 @@ namespace Tony { - /****************************************************************************\ * RMWindow Methods \****************************************************************************/ @@ -111,7 +110,7 @@ void RMWindow::repaint() { */ void RMWindow::wipeEffect(Common::Rect &rcBoundEllipse) { if ((rcBoundEllipse.left == 0) && (rcBoundEllipse.top == 0) && - (rcBoundEllipse.right == RM_SX) && (rcBoundEllipse.bottom == RM_SY)) { + (rcBoundEllipse.right == RM_SX) && (rcBoundEllipse.bottom == RM_SY)) { // Full screen clear wanted, so use shortcut method g_system->fillScreen(0); } else { diff --git a/engines/tony/window.h b/engines/tony/window.h index 2e8769707f..3874652f64 100644 --- a/engines/tony/window.h +++ b/engines/tony/window.h @@ -46,7 +46,6 @@ public: void grabScreenshot(byte *lpBuf, int dezoom = 1, uint16 *lpDestBuf = NULL); }; - class RMWindow { private: void plotSplices(const byte *lpBuf, const Common::Point ¢er, int x, int y); diff --git a/engines/toon/toon.h b/engines/toon/toon.h index d40c489011..0ff351804f 100644 --- a/engines/toon/toon.h +++ b/engines/toon/toon.h @@ -316,12 +316,11 @@ public: } Common::Error saveGameState(int slot, const Common::String &desc) { - - return (saveGame(slot, desc) ? Common::kWritingFailed : Common::kNoError); + return (saveGame(slot, desc) ? Common::kNoError : Common::kWritingFailed); } Common::Error loadGameState(int slot) { - return (loadGame(slot) ? Common::kReadingFailed : Common::kNoError); + return (loadGame(slot) ? Common::kNoError : Common::kReadingFailed); } bool hasFeature(EngineFeature f) const { diff --git a/engines/touche/console.cpp b/engines/touche/console.cpp index 51ef5fc639..2c4c6a0da1 100644 --- a/engines/touche/console.cpp +++ b/engines/touche/console.cpp @@ -26,9 +26,28 @@ namespace Touche { ToucheConsole::ToucheConsole(ToucheEngine *vm) : GUI::Debugger(), _vm(vm) { + DCmd_Register("startMusic", WRAP_METHOD(ToucheConsole, Cmd_StartMusic)); + DCmd_Register("stopMusic", WRAP_METHOD(ToucheConsole, Cmd_StopMusic)); } ToucheConsole::~ToucheConsole() { } +bool ToucheConsole::Cmd_StartMusic(int argc, const char **argv) { + if (argc != 2) { + DebugPrintf("Usage: startMusic <num>\n"); + return true; + } + + int num = atoi(argv[1]); + + _vm->startMusic(num); + return false; +} + +bool ToucheConsole::Cmd_StopMusic(int argc, const char **argv) { + _vm->stopMusic(); + return false; +} + } // End of namespace Touche diff --git a/engines/touche/console.h b/engines/touche/console.h index e3cdc9d48b..43a303ad77 100644 --- a/engines/touche/console.h +++ b/engines/touche/console.h @@ -36,6 +36,9 @@ public: private: ToucheEngine *_vm; + + bool Cmd_StartMusic(int argc, const char **argv); + bool Cmd_StopMusic(int argc, const char **argv); }; } // End of namespace Touche diff --git a/engines/touche/menu.cpp b/engines/touche/menu.cpp index c58e2f1a33..85ca519f05 100644 --- a/engines/touche/menu.cpp +++ b/engines/touche/menu.cpp @@ -103,7 +103,7 @@ struct MenuData { void addCharToDescription(int slot, char chr) { char *description = saveLoadDescriptionsTable[slot]; int descriptionLen = strlen(description); - if (descriptionLen < 32 && isprint(static_cast<unsigned char>(chr))) { + if (descriptionLen < 32 && Common::isPrint(chr)) { description[descriptionLen] = chr; description[descriptionLen + 1] = 0; } @@ -260,7 +260,7 @@ void ToucheEngine::redrawMenu(void *menu) { Graphics::drawRect(_offscreenBuffer, kScreenWidth, 106, 118, 340, 164, 0xF9, 0xF7); switch (menuData->mode) { case kMenuSettingsMode: - drawVolumeSlideBar(_offscreenBuffer, kScreenWidth, _midiPlayer->getVolume()); + drawVolumeSlideBar(_offscreenBuffer, kScreenWidth, getMusicVolume()); menuData->buttonsTable[5].data = 0; menuData->buttonsTable[6].data = 0; menuData->buttonsTable[7].data = 0; @@ -307,10 +307,10 @@ void ToucheEngine::handleMenuAction(void *menu, int actionId) { _talkTextMode = kTalkModeVoiceAndText; break; case kActionLowerVolume: - _midiPlayer->adjustVolume(-16); + adjustMusicVolume(-16); break; case kActionUpperVolume: - _midiPlayer->adjustVolume(+16); + adjustMusicVolume(+16); break; case kActionScrollUpSaves: --_saveLoadCurrentPage; diff --git a/engines/touche/resource.cpp b/engines/touche/resource.cpp index 0790d726b7..9625224316 100644 --- a/engines/touche/resource.cpp +++ b/engines/touche/resource.cpp @@ -610,10 +610,7 @@ void ToucheEngine::res_stopSound() { void ToucheEngine::res_loadMusic(int num) { debugC(9, kDebugResource, "ToucheEngine::res_loadMusic() num=%d", num); - uint32 size; - const uint32 offs = res_getDataOffset(kResourceTypeMusic, num, &size); - _fData.seek(offs); - _midiPlayer->play(_fData, size, true); + startMusic(num); } void ToucheEngine::res_loadSpeech(int num) { diff --git a/engines/touche/touche.cpp b/engines/touche/touche.cpp index 4b989963f6..5c133ccbc6 100644 --- a/engines/touche/touche.cpp +++ b/engines/touche/touche.cpp @@ -32,6 +32,8 @@ #include "common/keyboard.h" #include "common/textconsole.h" +#include "audio/mixer.h" + #include "engines/util.h" #include "graphics/cursorman.h" #include "graphics/palette.h" @@ -58,6 +60,8 @@ ToucheEngine::ToucheEngine(OSystem *system, Common::Language language) _playSoundCounter = 0; + _musicVolume = 0; + _processRandomPaletteCounter = 0; _fastWalkMode = false; @@ -90,6 +94,7 @@ ToucheEngine::~ToucheEngine() { DebugMan.clearAllDebugChannels(); delete _console; + stopMusic(); delete _midiPlayer; } @@ -100,7 +105,7 @@ Common::Error ToucheEngine::run() { setupOpcodes(); - _midiPlayer = new MidiPlayer; + initMusic(); // Setup mixer syncSoundSettings(); @@ -120,7 +125,7 @@ Common::Error ToucheEngine::run() { } void ToucheEngine::restart() { - _midiPlayer->stop(); + stopMusic(); _gameState = kGameStateGameLoop; _displayQuitDialog = false; @@ -216,7 +221,7 @@ void ToucheEngine::readConfigurationSettings() { _talkTextMode = kTalkModeVoiceOnly; } } - _midiPlayer->setVolume(ConfMan.getInt("music_volume")); + setMusicVolume(ConfMan.getInt("music_volume")); } void ToucheEngine::writeConfigurationSettings() { @@ -234,7 +239,7 @@ void ToucheEngine::writeConfigurationSettings() { ConfMan.setBool("subtitles", true); break; } - ConfMan.setInt("music_volume", _midiPlayer->getVolume()); + ConfMan.setInt("music_volume", getMusicVolume()); ConfMan.flushToDisk(); } @@ -3307,4 +3312,80 @@ bool ToucheEngine::canSaveGameStateCurrently() { return _gameState == kGameStateGameLoop && _flagsTable[618] == 0 && !_hideInventoryTexts; } +void ToucheEngine::initMusic() { + // Detect External Music Files + bool extMusic = true; + for (int num = 0; num < 26 && extMusic; num++) { + Common::String extMusicFilename = Common::String::format("track%02d", num+1); + Audio::SeekableAudioStream *musicStream = Audio::SeekableAudioStream::openStreamFile(extMusicFilename); + if (!musicStream) + extMusic = false; + delete musicStream; + } + + if (!extMusic) { + _midiPlayer = new MidiPlayer; + debug(1, "initMusic(): Using midi music!"); + } else + debug(1, "initMusic(): Using external digital music!"); +} + +void ToucheEngine::startMusic(int num) { + debug(1, "startMusic(%d)", num); + uint32 size; + + stopMusic(); + + if (_midiPlayer) { + const uint32 offs = res_getDataOffset(kResourceTypeMusic, num, &size); + _fData.seek(offs); + _midiPlayer->play(_fData, size, true); + } else { + Common::String extMusicFilename = Common::String::format("track%02d", num); + Audio::SeekableAudioStream *extMusicFileStream = Audio::SeekableAudioStream::openStreamFile(extMusicFilename); + if (!extMusicFileStream) { + error("Unable to open %s for reading", extMusicFilename.c_str()); + } + Audio::LoopingAudioStream *loopStream = new Audio::LoopingAudioStream(extMusicFileStream, 0); + _mixer->playStream(Audio::Mixer::kMusicSoundType, &_musicHandle, loopStream, -1, _musicVolume); + } +} + +void ToucheEngine::stopMusic() { + debug(1, "stopMusic()"); + if (_midiPlayer) + _midiPlayer->stop(); + else { + _mixer->stopHandle(_musicHandle); + } +} + +int ToucheEngine::getMusicVolume() { + if (_midiPlayer) + _musicVolume = _midiPlayer->getVolume(); + return _musicVolume; +} + +void ToucheEngine::setMusicVolume(int volume) { + debug(1, "setMusicVolume(%d)", volume); + _musicVolume = CLIP(volume, 0, 255); + + if (_midiPlayer) + _midiPlayer->setVolume(_musicVolume); + else { + _mixer->setChannelVolume(_musicHandle, _musicVolume); + } +} + +void ToucheEngine::adjustMusicVolume(int diff) { + debug(1, "adjustMusicVolume(%d)", diff); + _musicVolume = CLIP(_musicVolume + diff, 0, 255); + + if (_midiPlayer) + _midiPlayer->adjustVolume(diff); + else { + _mixer->setChannelVolume(_musicHandle, _musicVolume); + } +} + } // namespace Touche diff --git a/engines/touche/touche.h b/engines/touche/touche.h index 949727b665..6ac43e7dfe 100644 --- a/engines/touche/touche.h +++ b/engines/touche/touche.h @@ -31,6 +31,7 @@ #include "common/util.h" #include "audio/mixer.h" +#include "audio/audiostream.h" #include "engines/engine.h" @@ -646,6 +647,18 @@ protected: MidiPlayer *_midiPlayer; + int _musicVolume; + Audio::SoundHandle _musicHandle; + + void initMusic(); +public: // To allow access from console + void startMusic(int num); + void stopMusic(); +protected: + int getMusicVolume(); + void setMusicVolume(int volume); + void adjustMusicVolume(int diff); + Common::Language _language; Common::RandomSource _rnd; diff --git a/engines/tsage/events.h b/engines/tsage/events.h index 475db47315..a1e9da3477 100644 --- a/engines/tsage/events.h +++ b/engines/tsage/events.h @@ -32,7 +32,7 @@ namespace TsAGE { enum EventType {EVENT_NONE = 0, EVENT_BUTTON_DOWN = 1, EVENT_BUTTON_UP = 2, EVENT_KEYPRESS = 4, - EVENT_MOUSE_MOVE = 8}; + EVENT_MOUSE_MOVE = 8, EVENT_UNK27 = 27}; enum ButtonShiftFlags {BTNSHIFT_LEFT = 0, BTNSHIFT_RIGHT = 3, BTNSHIFT_MIDDLE = 4}; diff --git a/engines/tsage/ringworld2/ringworld2_scenes0.cpp b/engines/tsage/ringworld2/ringworld2_scenes0.cpp index 4c98fcf00a..3b7d283e44 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes0.cpp +++ b/engines/tsage/ringworld2/ringworld2_scenes0.cpp @@ -61,14 +61,10 @@ void Scene50::postInit(SceneObjectList *OwnerList) { } void Scene50::process(Event &event) { - if ((event.eventType != EVENT_BUTTON_DOWN) && (event.eventType != EVENT_KEYPRESS) && (event.eventType == 27)) { + if ((event.eventType != EVENT_BUTTON_DOWN) && (event.eventType != EVENT_KEYPRESS) && (event.eventType == EVENT_UNK27)) { event.handled = true; - warning("TODO: incomplete Scene50::process()"); - // CursorType _oldCursorId = _cursorId; g_globals->_events.setCursor(CURSOR_ARROW); - // _cursorManager.sub_1D474(2, 0); - // sub_5566A(1); - // _cursorManager._fieldE = _oldCursorId; + HelpDialog::show(); R2_GLOBALS._sceneManager.changeScene(100); } } diff --git a/engines/wintermute/ad/ad_actor.cpp b/engines/wintermute/ad/ad_actor.cpp index d175855d1e..1346a090f6 100644 --- a/engines/wintermute/ad/ad_actor.cpp +++ b/engines/wintermute/ad/ad_actor.cpp @@ -57,15 +57,15 @@ AdActor::AdActor(BaseGame *inGame) : AdTalkHolder(inGame) { _type = OBJECT_ACTOR; _dir = DI_LEFT; - _walkSprite = NULL; - _standSprite = NULL; - _turnLeftSprite = NULL; - _turnRightSprite = NULL; + _walkSprite = nullptr; + _standSprite = nullptr; + _turnLeftSprite = nullptr; + _turnRightSprite = nullptr; _targetPoint = new BasePoint; _afterWalkDir = DI_NONE; - _animSprite2 = NULL; + _animSprite2 = nullptr; setDefaultAnimNames(); } @@ -84,19 +84,19 @@ bool AdActor::setDefaultAnimNames() { AdActor::~AdActor() { delete _path; delete _targetPoint; - _path = NULL; - _targetPoint = NULL; + _path = nullptr; + _targetPoint = nullptr; delete _walkSprite; delete _standSprite; delete _turnLeftSprite; delete _turnRightSprite; - _walkSprite = NULL; - _standSprite = NULL; - _turnLeftSprite = NULL; - _turnRightSprite = NULL; + _walkSprite = nullptr; + _standSprite = nullptr; + _turnLeftSprite = nullptr; + _turnRightSprite = nullptr; - _animSprite2 = NULL; // ref only + _animSprite2 = nullptr; // ref only for (uint32 i = 0; i < _talkSprites.size(); i++) { delete _talkSprites[i]; @@ -110,7 +110,7 @@ AdActor::~AdActor() { for (uint32 i = 0; i < _anims.size(); i++) { delete _anims[i]; - _anims[i] = NULL; + _anims[i] = nullptr; } _anims.clear(); @@ -120,7 +120,7 @@ AdActor::~AdActor() { ////////////////////////////////////////////////////////////////////////// bool AdActor::loadFile(const char *filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "AdActor::LoadFile failed for file '%s'", filename); return STATUS_FAILED; } @@ -232,7 +232,7 @@ bool AdActor::loadBuffer(byte *buffer, bool complete) { } AdGame *adGame = (AdGame *)_gameRef; - AdSpriteSet *spr = NULL; + AdSpriteSet *spr = nullptr; int ar = 0, ag = 0, ab = 0, alpha = 0; while ((cmd = parser.getCommand((char **)&buffer, commands, (char **)¶ms)) > 0) { switch (cmd) { @@ -287,7 +287,7 @@ bool AdActor::loadBuffer(byte *buffer, bool complete) { case TOKEN_WALK: delete _walkSprite; - _walkSprite = NULL; + _walkSprite = nullptr; spr = new AdSpriteSet(_gameRef, this); if (!spr || DID_FAIL(spr->loadBuffer(params, true, adGame->_texWalkLifeTime, CACHE_HALF))) { cmd = PARSERR_GENERIC; @@ -316,7 +316,7 @@ bool AdActor::loadBuffer(byte *buffer, bool complete) { case TOKEN_STAND: delete _standSprite; - _standSprite = NULL; + _standSprite = nullptr; spr = new AdSpriteSet(_gameRef, this); if (!spr || DID_FAIL(spr->loadBuffer(params, true, adGame->_texStandLifeTime))) { cmd = PARSERR_GENERIC; @@ -327,7 +327,7 @@ bool AdActor::loadBuffer(byte *buffer, bool complete) { case TOKEN_TURN_LEFT: delete _turnLeftSprite; - _turnLeftSprite = NULL; + _turnLeftSprite = nullptr; spr = new AdSpriteSet(_gameRef, this); if (!spr || DID_FAIL(spr->loadBuffer(params, true))) { cmd = PARSERR_GENERIC; @@ -338,7 +338,7 @@ bool AdActor::loadBuffer(byte *buffer, bool complete) { case TOKEN_TURN_RIGHT: delete _turnRightSprite; - _turnRightSprite = NULL; + _turnRightSprite = nullptr; spr = new AdSpriteSet(_gameRef, this); if (!spr || DID_FAIL(spr->loadBuffer(params, true))) { cmd = PARSERR_GENERIC; @@ -356,7 +356,7 @@ bool AdActor::loadBuffer(byte *buffer, bool complete) { _cursor = new BaseSprite(_gameRef); if (!_cursor || DID_FAIL(_cursor->loadFile((char *)params))) { delete _cursor; - _cursor = NULL; + _cursor = nullptr; cmd = PARSERR_GENERIC; } break; @@ -392,15 +392,15 @@ bool AdActor::loadBuffer(byte *buffer, bool complete) { case TOKEN_BLOCKED_REGION: { delete _blockRegion; delete _currentBlockRegion; - _blockRegion = NULL; - _currentBlockRegion = NULL; + _blockRegion = nullptr; + _currentBlockRegion = nullptr; BaseRegion *rgn = new BaseRegion(_gameRef); BaseRegion *crgn = new BaseRegion(_gameRef); if (!rgn || !crgn || DID_FAIL(rgn->loadBuffer(params, false))) { delete _blockRegion; delete _currentBlockRegion; - _blockRegion = NULL; - _currentBlockRegion = NULL; + _blockRegion = nullptr; + _currentBlockRegion = nullptr; cmd = PARSERR_GENERIC; } else { _blockRegion = rgn; @@ -413,15 +413,15 @@ bool AdActor::loadBuffer(byte *buffer, bool complete) { case TOKEN_WAYPOINTS: { delete _wptGroup; delete _currentWptGroup; - _wptGroup = NULL; - _currentWptGroup = NULL; + _wptGroup = nullptr; + _currentWptGroup = nullptr; AdWaypointGroup *wpt = new AdWaypointGroup(_gameRef); AdWaypointGroup *cwpt = new AdWaypointGroup(_gameRef); if (!wpt || !cwpt || DID_FAIL(wpt->loadBuffer(params, false))) { delete _wptGroup; delete _currentWptGroup; - _wptGroup = NULL; - _currentWptGroup = NULL; + _wptGroup = nullptr; + _currentWptGroup = nullptr; cmd = PARSERR_GENERIC; } else { _wptGroup = wpt; @@ -502,7 +502,7 @@ void AdActor::turnTo(TDirection dir) { _targetDir = dir; _state = delta < 0 ? STATE_TURNING_LEFT : STATE_TURNING_RIGHT; - _tempSprite2 = NULL; + _tempSprite2 = nullptr; } @@ -566,7 +566,7 @@ bool AdActor::display() { _currentSprite->display(_posX, _posY, - reg ? _registerAlias : NULL, + reg ? _registerAlias : nullptr, scaleX, scaleY, alpha, @@ -589,26 +589,26 @@ bool AdActor::display() { ////////////////////////////////////////////////////////////////////////// bool AdActor::update() { - _currentSprite = NULL; + _currentSprite = nullptr; if (_state == STATE_READY) { if (_animSprite) { delete _animSprite; - _animSprite = NULL; + _animSprite = nullptr; } if (_animSprite2) { - _animSprite2 = NULL; + _animSprite2 = nullptr; } } // finished playing animation? - if (_state == STATE_PLAYING_ANIM && _animSprite != NULL && _animSprite->isFinished()) { + if (_state == STATE_PLAYING_ANIM && _animSprite != nullptr && _animSprite->isFinished()) { _state = _nextState; _nextState = STATE_READY; _currentSprite = _animSprite; } - if (_state == STATE_PLAYING_ANIM_SET && _animSprite2 != NULL && _animSprite2->isFinished()) { + if (_state == STATE_PLAYING_ANIM_SET && _animSprite2 != nullptr && _animSprite2->isFinished()) { _state = _nextState; _nextState = STATE_READY; _currentSprite = _animSprite2; @@ -649,7 +649,7 @@ bool AdActor::update() { ////////////////////////////////////////////////////////////////////////// case STATE_TURNING_LEFT: - if (_tempSprite2 == NULL || _tempSprite2->isFinished()) { + if (_tempSprite2 == nullptr || _tempSprite2->isFinished()) { if (_dir > 0) { _dir = (TDirection)(_dir - 1); } else { @@ -657,7 +657,7 @@ bool AdActor::update() { } if (_dir == _targetDir) { - _tempSprite2 = NULL; + _tempSprite2 = nullptr; _state = _nextState; _nextState = STATE_READY; } else { @@ -686,7 +686,7 @@ bool AdActor::update() { ////////////////////////////////////////////////////////////////////////// case STATE_TURNING_RIGHT: - if (_tempSprite2 == NULL || _tempSprite2->isFinished()) { + if (_tempSprite2 == nullptr || _tempSprite2->isFinished()) { _dir = (TDirection)(_dir + 1); if ((int)_dir >= (int)NUM_DIRECTIONS) { @@ -694,7 +694,7 @@ bool AdActor::update() { } if (_dir == _targetDir) { - _tempSprite2 = NULL; + _tempSprite2 = nullptr; _state = _nextState; _nextState = STATE_READY; } else { @@ -753,10 +753,10 @@ bool AdActor::update() { } bool timeIsUp = (_sentence->_sound && _sentence->_soundStarted && (!_sentence->_sound->isPlaying() && !_sentence->_sound->isPaused())) || (!_sentence->_sound && _sentence->_duration <= _gameRef->_timer - _sentence->_startTime); - if (_tempSprite2 == NULL || _tempSprite2->isFinished() || (/*_tempSprite2->_looping &&*/ timeIsUp)) { + if (_tempSprite2 == nullptr || _tempSprite2->isFinished() || (/*_tempSprite2->_looping &&*/ timeIsUp)) { if (timeIsUp) { _sentence->finish(); - _tempSprite2 = NULL; + _tempSprite2 = nullptr; _state = _nextState; _nextState = STATE_READY; } else { @@ -821,7 +821,7 @@ bool AdActor::update() { void AdActor::followPath() { // skip current position _path->getFirst(); - while (_path->getCurrent() != NULL) { + while (_path->getCurrent() != nullptr) { if (_path->getCurrent()->x != _posX || _path->getCurrent()->y != _posY) { break; } @@ -829,7 +829,7 @@ void AdActor::followPath() { } // are there points to follow? - if (_path->getCurrent() != NULL) { + if (_path->getCurrent() != nullptr) { _state = STATE_FOLLOWING_PATH; initLine(BasePoint(_posX, _posY), *_path->getCurrent()); } else { @@ -896,7 +896,7 @@ void AdActor::getNextStep() { if (_pFCount == 0) { - if (_path->getNext() == NULL) { + if (_path->getNext() == nullptr) { _posX = _targetPoint->x; _posY = _targetPoint->y; @@ -963,16 +963,16 @@ bool AdActor::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, return STATUS_OK; } AdObject *obj = (AdObject *)val->getNative(); - if (!obj || obj->_type != OBJECT_ENTITY) { + if (!obj || obj->getType() != OBJECT_ENTITY) { script->runtimeError("actor.%s method accepts an entity refrence only", name); stack->pushNULL(); return STATUS_OK; } AdEntity *ent = (AdEntity *)obj; - if (ent->_walkToX == 0 && ent->_walkToY == 0) { + if (ent->getWalkToX() == 0 && ent->getWalkToY() == 0) { goTo(ent->_posX, ent->_posY); } else { - goTo(ent->_walkToX, ent->_walkToY, ent->_walkToDir); + goTo(ent->getWalkToX(), ent->getWalkToY(), ent->getWalkToDir()); } if (strcmp(name, "GoToObjectAsync") != 0) { script->waitForExclusive(this); @@ -1040,17 +1040,17 @@ bool AdActor::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, if (scumm_stricmp(_anims[i]->getName(), animName) == 0) { // invalidate sprites in use if (_anims[i]->containsSprite(_tempSprite2)) { - _tempSprite2 = NULL; + _tempSprite2 = nullptr; } if (_anims[i]->containsSprite(_currentSprite)) { - _currentSprite = NULL; + _currentSprite = nullptr; } if (_anims[i]->containsSprite(_animSprite2)) { - _animSprite2 = NULL; + _animSprite2 = nullptr; } delete _anims[i]; - _anims[i] = NULL; + _anims[i] = nullptr; _anims.remove_at(i); i--; found = true; @@ -1066,7 +1066,7 @@ bool AdActor::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, else if (strcmp(name, "HasAnim") == 0) { stack->correctParams(1); const char *animName = stack->pop()->getString(); - stack->pushBool(getAnimByName(animName) != NULL); + stack->pushBool(getAnimByName(animName) != nullptr); return STATUS_OK; } else { return AdTalkHolder::scCallMethod(script, stack, thisStack, name); @@ -1231,7 +1231,7 @@ BaseSprite *AdActor::getTalkStance(const char *stance) { if (DID_FAIL(res)) { _gameRef->LOG(res, "AdActor::GetTalkStance: error loading talk sprite (object:\"%s\" sprite:\"%s\")", getName(), _forcedTalkAnimName); delete _animSprite; - _animSprite = NULL; + _animSprite = nullptr; } else { return _animSprite; } @@ -1244,7 +1244,7 @@ BaseSprite *AdActor::getTalkStance(const char *stance) { } // new way - BaseSprite *ret = NULL; + BaseSprite *ret = nullptr; // do we have an animation with this name? AdSpriteSet *anim = getAnimByName(stance); @@ -1280,9 +1280,9 @@ BaseSprite *AdActor::getTalkStance(const char *stance) { ////////////////////////////////////////////////////////////////////////// BaseSprite *AdActor::getTalkStanceOld(const char *stance) { - BaseSprite *ret = NULL; + BaseSprite *ret = nullptr; - if (stance != NULL) { + if (stance != nullptr) { // search special stances for (uint32 i = 0; i < _talkSpritesEx.size(); i++) { if (scumm_stricmp(_talkSpritesEx[i]->getName(), stance) == 0) { @@ -1290,7 +1290,7 @@ BaseSprite *AdActor::getTalkStanceOld(const char *stance) { break; } } - if (ret == NULL) { + if (ret == nullptr) { // search generic stances for (uint32 i = 0; i < _talkSprites.size(); i++) { if (scumm_stricmp(_talkSprites[i]->getName(), stance) == 0) { @@ -1302,7 +1302,7 @@ BaseSprite *AdActor::getTalkStanceOld(const char *stance) { } // not a valid stance? get a random one - if (ret == NULL) { + if (ret == nullptr) { if (_talkSprites.size() < 1) { ret = _standSprite->getSprite(_dir); } else { @@ -1378,7 +1378,7 @@ TDirection AdActor::angleToDirection(int angle) { ////////////////////////////////////////////////////////////////////////// int AdActor::getHeight() { // if no current sprite is set, set some - if (_currentSprite == NULL) { + if (_currentSprite == nullptr) { if (_standSprite) { _currentSprite = _standSprite->getSprite(_dir); } else { @@ -1400,7 +1400,7 @@ AdSpriteSet *AdActor::getAnimByName(const Common::String &animName) { return _anims[i]; } } - return NULL; + return nullptr; } ////////////////////////////////////////////////////////////////////////// @@ -1411,7 +1411,7 @@ bool AdActor::mergeAnims(const char *animsFilename) { byte *fileBuffer = BaseFileManager::getEngineInstance()->readWholeFile(animsFilename); - if (fileBuffer == NULL) { + if (fileBuffer == nullptr) { _gameRef->LOG(0, "AdActor::MergeAnims failed for file '%s'", animsFilename); return STATUS_FAILED; } diff --git a/engines/wintermute/ad/ad_actor.h b/engines/wintermute/ad/ad_actor.h index 543c9d063a..bcec9db319 100644 --- a/engines/wintermute/ad/ad_actor.h +++ b/engines/wintermute/ad/ad_actor.h @@ -54,7 +54,7 @@ public: virtual bool update(); virtual bool display(); virtual void turnTo(TDirection dir); - AdActor(BaseGame *inGame/*=NULL*/); + AdActor(BaseGame *inGame/*=nullptr*/); virtual ~AdActor(); bool loadFile(const char *filename); bool loadBuffer(byte *buffer, bool complete = true); diff --git a/engines/wintermute/ad/ad_entity.cpp b/engines/wintermute/ad/ad_entity.cpp index 9af7e034ca..259b68f291 100644 --- a/engines/wintermute/ad/ad_entity.cpp +++ b/engines/wintermute/ad/ad_entity.cpp @@ -61,13 +61,13 @@ IMPLEMENT_PERSISTENT(AdEntity, false) AdEntity::AdEntity(BaseGame *inGame) : AdTalkHolder(inGame) { _type = OBJECT_ENTITY; _subtype = ENTITY_NORMAL; - _region = NULL; - _item = NULL; + _region = nullptr; + _item = nullptr; _walkToX = _walkToY = 0; _walkToDir = DI_NONE; - _theora = NULL; + _theora = nullptr; } @@ -76,17 +76,32 @@ AdEntity::~AdEntity() { _gameRef->unregisterObject(_region); delete _theora; - _theora = NULL; + _theora = nullptr; delete[] _item; - _item = NULL; + _item = nullptr; } +int32 AdEntity::getWalkToX() const { + return _walkToX; +} + +int32 AdEntity::getWalkToY() const { + return _walkToY; +} + +TDirection AdEntity::getWalkToDir() const { + return _walkToDir; +} + +const char *AdEntity::getItemName() const { + return _item; +} ////////////////////////////////////////////////////////////////////////// bool AdEntity::loadFile(const char *filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "AdEntity::LoadFile failed for file '%s'", filename); return STATUS_FAILED; } @@ -210,7 +225,7 @@ bool AdEntity::loadBuffer(byte *buffer, bool complete) { } AdGame *adGame = (AdGame *)_gameRef; - BaseSprite *spr = NULL; + BaseSprite *spr = nullptr; int ar = 0, ag = 0, ab = 0, alpha = 0; while ((cmd = parser.getCommand((char **)&buffer, commands, (char **)¶ms)) > 0) { switch (cmd) { @@ -230,7 +245,7 @@ bool AdEntity::loadBuffer(byte *buffer, bool complete) { case TOKEN_SPRITE: { delete _sprite; - _sprite = NULL; + _sprite = nullptr; spr = new BaseSprite(_gameRef, this); if (!spr || DID_FAIL(spr->loadFile((char *)params))) { cmd = PARSERR_GENERIC; @@ -320,7 +335,7 @@ bool AdEntity::loadBuffer(byte *buffer, bool complete) { _cursor = new BaseSprite(_gameRef); if (!_cursor || DID_FAIL(_cursor->loadFile((char *)params))) { delete _cursor; - _cursor = NULL; + _cursor = nullptr; cmd = PARSERR_GENERIC; } break; @@ -333,7 +348,7 @@ bool AdEntity::loadBuffer(byte *buffer, bool complete) { if (_region) { _gameRef->unregisterObject(_region); } - _region = NULL; + _region = nullptr; BaseRegion *rgn = new BaseRegion(_gameRef); if (!rgn || DID_FAIL(rgn->loadBuffer(params, false))) { cmd = PARSERR_GENERIC; @@ -346,16 +361,16 @@ bool AdEntity::loadBuffer(byte *buffer, bool complete) { case TOKEN_BLOCKED_REGION: { delete _blockRegion; - _blockRegion = NULL; + _blockRegion = nullptr; delete _currentBlockRegion; - _currentBlockRegion = NULL; + _currentBlockRegion = nullptr; BaseRegion *rgn = new BaseRegion(_gameRef); BaseRegion *crgn = new BaseRegion(_gameRef); if (!rgn || !crgn || DID_FAIL(rgn->loadBuffer(params, false))) { delete _blockRegion; - _blockRegion = NULL; + _blockRegion = nullptr; delete _currentBlockRegion; - _currentBlockRegion = NULL; + _currentBlockRegion = nullptr; cmd = PARSERR_GENERIC; } else { _blockRegion = rgn; @@ -367,16 +382,16 @@ bool AdEntity::loadBuffer(byte *buffer, bool complete) { case TOKEN_WAYPOINTS: { delete _wptGroup; - _wptGroup = NULL; + _wptGroup = nullptr; delete _currentWptGroup; - _currentWptGroup = NULL; + _currentWptGroup = nullptr; AdWaypointGroup *wpt = new AdWaypointGroup(_gameRef); AdWaypointGroup *cwpt = new AdWaypointGroup(_gameRef); if (!wpt || !cwpt || DID_FAIL(wpt->loadBuffer(params, false))) { delete _wptGroup; - _wptGroup = NULL; + _wptGroup = nullptr; delete _currentWptGroup; - _currentWptGroup = NULL; + _currentWptGroup = nullptr; cmd = PARSERR_GENERIC; } else { _wptGroup = wpt; @@ -393,7 +408,7 @@ bool AdEntity::loadBuffer(byte *buffer, bool complete) { case TOKEN_SUBTYPE: { if (scumm_stricmp((char *)params, "sound") == 0) { delete _sprite; - _sprite = NULL; + _sprite = nullptr; if (_gameRef->_editorMode) { spr = new BaseSprite(_gameRef, this); if (!spr || DID_FAIL(spr->loadFile("entity_sound.sprite"))) { @@ -550,7 +565,7 @@ bool AdEntity::display() { } else if (_currentSprite) { _currentSprite->display(_posX, _posY, - (reg || _editorAlwaysRegister) ? _registerAlias : NULL, + (reg || _editorAlwaysRegister) ? _registerAlias : nullptr, scaleX, scaleY, alpha, @@ -570,15 +585,15 @@ bool AdEntity::display() { ////////////////////////////////////////////////////////////////////////// bool AdEntity::update() { - _currentSprite = NULL; + _currentSprite = nullptr; if (_state == STATE_READY && _animSprite) { delete _animSprite; - _animSprite = NULL; + _animSprite = nullptr; } // finished playing animation? - if (_state == STATE_PLAYING_ANIM && _animSprite != NULL && _animSprite->isFinished()) { + if (_state == STATE_PLAYING_ANIM && _animSprite != nullptr && _animSprite->isFinished()) { _state = STATE_READY; _currentSprite = _animSprite; } @@ -613,10 +628,10 @@ bool AdEntity::update() { } bool timeIsUp = (_sentence->_sound && _sentence->_soundStarted && (!_sentence->_sound->isPlaying() && !_sentence->_sound->isPaused())) || (!_sentence->_sound && _sentence->_duration <= _gameRef->_timer - _sentence->_startTime); - if (_tempSprite2 == NULL || _tempSprite2->isFinished() || (/*_tempSprite2->_looping &&*/ timeIsUp)) { + if (_tempSprite2 == nullptr || _tempSprite2->isFinished() || (/*_tempSprite2->_looping &&*/ timeIsUp)) { if (timeIsUp) { _sentence->finish(); - _tempSprite2 = NULL; + _tempSprite2 = nullptr; _state = STATE_READY; } else { _tempSprite2 = getTalkStance(_sentence->getNextStance()); @@ -658,7 +673,7 @@ bool AdEntity::update() { if (_theora->isFinished()) { _theora->stop(); delete _theora; - _theora = NULL; + _theora = nullptr; } } @@ -722,7 +737,7 @@ bool AdEntity::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack if (_theora) { _theora->stop(); delete _theora; - _theora = NULL; + _theora = nullptr; stack->pushBool(true); } else { stack->pushBool(false); @@ -815,7 +830,7 @@ bool AdEntity::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack stack->correctParams(0); if (_region) { _gameRef->unregisterObject(_region); - _region = NULL; + _region = nullptr; stack->pushBool(true); } else { stack->pushBool(false); @@ -1056,7 +1071,7 @@ int AdEntity::getHeight() { if (_region && !_sprite) { return _region->_rect.bottom - _region->_rect.top; } else { - if (_currentSprite == NULL) { + if (_currentSprite == nullptr) { _currentSprite = _sprite; } return AdObject::getHeight(); @@ -1102,15 +1117,15 @@ void AdEntity::setItem(const char *itemName) { ////////////////////////////////////////////////////////////////////////// bool AdEntity::setSprite(const char *filename) { if (_currentSprite == _sprite) { - _currentSprite = NULL; + _currentSprite = nullptr; } delete _sprite; - _sprite = NULL; + _sprite = nullptr; BaseSprite *spr = new BaseSprite(_gameRef, this); if (!spr || DID_FAIL(spr->loadFile(filename))) { delete _sprite; - _sprite = NULL; + _sprite = nullptr; return STATUS_FAILED; } else { _sprite = spr; diff --git a/engines/wintermute/ad/ad_entity.h b/engines/wintermute/ad/ad_entity.h index 415987e50a..94921aaa27 100644 --- a/engines/wintermute/ad/ad_entity.h +++ b/engines/wintermute/ad/ad_entity.h @@ -37,11 +37,7 @@ class AdEntity : public AdTalkHolder { public: VideoTheoraPlayer *_theora; bool setSprite(const char *filename); - int _walkToX; - int _walkToY; - TDirection _walkToDir; void setItem(const char *itemName); - char *_item; DECLARE_PERSISTENT(AdEntity, AdTalkHolder) void updatePosition(); virtual int getHeight(); @@ -53,14 +49,23 @@ public: virtual ~AdEntity(); bool loadFile(const char *filename); bool loadBuffer(byte *buffer, bool complete = true); - TEntityType _subtype; + + int32 getWalkToX() const; + int32 getWalkToY() const; + TDirection getWalkToDir() const; + const char* getItemName() const; // scripting interface virtual ScValue *scGetProperty(const Common::String &name); virtual bool scSetProperty(const char *name, ScValue *value); virtual bool scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, const char *name); virtual const char *scToString(); - +private: + int32 _walkToX; + int32 _walkToY; + TDirection _walkToDir; + char *_item; + TEntityType _subtype; }; } // end of namespace Wintermute diff --git a/engines/wintermute/ad/ad_game.cpp b/engines/wintermute/ad/ad_game.cpp index 4481b774c1..b9775ba7d1 100644 --- a/engines/wintermute/ad/ad_game.cpp +++ b/engines/wintermute/ad/ad_game.cpp @@ -69,22 +69,22 @@ IMPLEMENT_PERSISTENT(AdGame, true) ////////////////////////////////////////////////////////////////////////// AdGame::AdGame(const Common::String &gameId) : BaseGame(gameId) { - _responseBox = NULL; - _inventoryBox = NULL; + _responseBox = nullptr; + _inventoryBox = nullptr; _scene = new AdScene(_gameRef); _scene->setName(""); registerObject(_scene); - _prevSceneName = NULL; - _prevSceneFilename = NULL; - _scheduledScene = NULL; + _prevSceneName = nullptr; + _prevSceneFilename = nullptr; + _scheduledScene = nullptr; _scheduledFadeIn = false; _stateEx = GAME_NORMAL; - _selectedItem = NULL; + _selectedItem = nullptr; _texItemLifeTime = 10000; @@ -94,17 +94,17 @@ AdGame::AdGame(const Common::String &gameId) : BaseGame(gameId) { _talkSkipButton = TALK_SKIP_LEFT; - _sceneViewport = NULL; + _sceneViewport = nullptr; _initialScene = true; - _debugStartupScene = NULL; - _startupScene = NULL; + _debugStartupScene = nullptr; + _startupScene = nullptr; _invObject = new AdObject(this); _inventoryOwner = _invObject; _tempDisableSaveState = false; - _itemsFile = NULL; + _itemsFile = nullptr; _smartItemCursor = false; @@ -122,7 +122,7 @@ AdGame::~AdGame() { bool AdGame::cleanup() { for (uint32 i = 0; i < _objects.size(); i++) { unregisterObject(_objects[i]); - _objects[i] = NULL; + _objects[i] = nullptr; } _objects.clear(); @@ -139,7 +139,7 @@ bool AdGame::cleanup() { unregisterObject(_scene); - _scene = NULL; + _scene = nullptr; // remove items for (uint32 i = 0; i < _items.size(); i++) { @@ -150,7 +150,7 @@ bool AdGame::cleanup() { // clear remaining inventories delete _invObject; - _invObject = NULL; + _invObject = nullptr; for (uint32 i = 0; i < _inventories.size(); i++) { delete _inventories[i]; @@ -160,12 +160,12 @@ bool AdGame::cleanup() { if (_responseBox) { _gameRef->unregisterObject(_responseBox); - _responseBox = NULL; + _responseBox = nullptr; } if (_inventoryBox) { _gameRef->unregisterObject(_inventoryBox); - _inventoryBox = NULL; + _inventoryBox = nullptr; } delete[] _prevSceneName; @@ -173,15 +173,15 @@ bool AdGame::cleanup() { delete[] _scheduledScene; delete[] _debugStartupScene; delete[] _itemsFile; - _prevSceneName = NULL; - _prevSceneFilename = NULL; - _scheduledScene = NULL; - _debugStartupScene = NULL; - _startupScene = NULL; - _itemsFile = NULL; + _prevSceneName = nullptr; + _prevSceneFilename = nullptr; + _scheduledScene = nullptr; + _debugStartupScene = nullptr; + _startupScene = nullptr; + _itemsFile = nullptr; delete _sceneViewport; - _sceneViewport = NULL; + _sceneViewport = nullptr; for (uint32 i = 0; i < _sceneStates.size(); i++) { delete _sceneStates[i]; @@ -207,9 +207,9 @@ bool AdGame::initLoop() { if (_scheduledScene && _transMgr->isReady()) { changeScene(_scheduledScene, _scheduledFadeIn); delete[] _scheduledScene; - _scheduledScene = NULL; + _scheduledScene = nullptr; - _gameRef->_activeObject = NULL; + _gameRef->_activeObject = nullptr; } @@ -258,7 +258,7 @@ bool AdGame::removeObject(AdObject *object) { ////////////////////////////////////////////////////////////////////////// bool AdGame::changeScene(const char *filename, bool fadeIn) { - if (_scene == NULL) { + if (_scene == nullptr) { _scene = new AdScene(_gameRef); registerObject(_scene); } else { @@ -297,7 +297,7 @@ bool AdGame::changeScene(const char *filename, bool fadeIn) { // invalidate references to the original scene for (uint32 i = 0; i < _objects.size(); i++) { _objects[i]->invalidateCurrRegions(); - _objects[i]->_stickRegion = NULL; + _objects[i]->_stickRegion = nullptr; } _scene->loadState(); @@ -385,7 +385,7 @@ bool AdGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, stack->pushNative(act, true); } else { delete act; - act = NULL; + act = nullptr; stack->pushNULL(); } return STATUS_OK; @@ -402,7 +402,7 @@ bool AdGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, stack->pushNative(ent, true); } else { delete ent; - ent = NULL; + ent = nullptr; stack->pushNULL(); } return STATUS_OK; @@ -463,7 +463,7 @@ bool AdGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, stack->correctParams(1); ScValue *val = stack->pop(); - AdItem *item = NULL; + AdItem *item = nullptr; if (val->isNative()) { item = (AdItem *)val->getNative(); } else { @@ -485,7 +485,7 @@ bool AdGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, stack->correctParams(1); ScValue *val = stack->pop(); - AdItem *item = NULL; + AdItem *item = nullptr; if (val->isInt()) { int index = val->getInt(); if (index >= 0 && index < (int32)_items.size()) { @@ -542,7 +542,7 @@ bool AdGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, res->_responseType = RESPONSE_ONCE_GAME; } - _responseBox->_responses.add(res); + _responseBox->addResponse(res); } } else { script->runtimeError("Game.AddResponse: response box is not defined"); @@ -584,15 +584,15 @@ bool AdGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, if (_responseBox) { _responseBox->weedResponses(); - if (_responseBox->_responses.size() == 0) { + if (_responseBox->getNumResponses() == 0) { stack->pushNULL(); return STATUS_OK; } - if (_responseBox->_responses.size() == 1 && autoSelectLast) { - stack->pushInt(_responseBox->_responses[0]->_iD); - _responseBox->handleResponse(_responseBox->_responses[0]); + if (_responseBox->getNumResponses() == 1 && autoSelectLast) { + stack->pushInt(_responseBox->getIdForResponseNum(0)); + _responseBox->handleResponseNum(0); _responseBox->clearResponses(); return STATUS_OK; } @@ -617,7 +617,7 @@ bool AdGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, stack->correctParams(0); if (_responseBox) { _responseBox->weedResponses(); - stack->pushInt(_responseBox->_responses.size()); + stack->pushInt(_responseBox->getNumResponses()); } else { script->runtimeError("Game.GetNumResponses: response box is not defined"); stack->pushNULL(); @@ -639,7 +639,7 @@ bool AdGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, branchName = val->getString(); } - startDlgBranch(branchName.c_str(), script->_filename == NULL ? "" : script->_filename, script->_threadEvent == NULL ? "" : script->_threadEvent); + startDlgBranch(branchName.c_str(), script->_filename == nullptr ? "" : script->_filename, script->_threadEvent == nullptr ? "" : script->_threadEvent); stack->pushNULL(); return STATUS_OK; @@ -651,12 +651,12 @@ bool AdGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, else if (strcmp(name, "EndDlgBranch") == 0) { stack->correctParams(1); - const char *branchName = NULL; + const char *branchName = nullptr; ScValue *val = stack->pop(); if (!val->isNULL()) { branchName = val->getString(); } - endDlgBranch(branchName, script->_filename == NULL ? "" : script->_filename, script->_threadEvent == NULL ? "" : script->_threadEvent); + endDlgBranch(branchName, script->_filename == nullptr ? "" : script->_filename, script->_threadEvent == nullptr ? "" : script->_threadEvent); stack->pushNULL(); @@ -754,8 +754,8 @@ bool AdGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, ////////////////////////////////////////////////////////////////////////// else if (strcmp(name, "GetResponsesWindow") == 0 || strcmp(name, "GetResponseWindow") == 0) { stack->correctParams(0); - if (_responseBox && _responseBox->_window) { - stack->pushNative(_responseBox->_window, true); + if (_responseBox && _responseBox->getResponseWindow()) { + stack->pushNative(_responseBox->getResponseWindow(), true); } else { stack->pushNULL(); } @@ -777,7 +777,7 @@ bool AdGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, stack->pushBool(true); } else { delete _responseBox; - _responseBox = NULL; + _responseBox = nullptr; stack->pushBool(false); } return STATUS_OK; @@ -797,7 +797,7 @@ bool AdGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, stack->pushBool(true); } else { delete _inventoryBox; - _inventoryBox = NULL; + _inventoryBox = nullptr; stack->pushBool(false); } return STATUS_OK; @@ -983,10 +983,10 @@ ScValue *AdGame::scGetProperty(const Common::String &name) { // LastResponse (RO) ////////////////////////////////////////////////////////////////////////// else if (name == "LastResponse") { - if (!_responseBox || !_responseBox->_lastResponseText) { + if (!_responseBox || !_responseBox->getLastResponseText()) { _scValue->setString(""); } else { - _scValue->setString(_responseBox->_lastResponseText); + _scValue->setString(_responseBox->getLastResponseText()); } return _scValue; } @@ -995,10 +995,10 @@ ScValue *AdGame::scGetProperty(const Common::String &name) { // LastResponseOrig (RO) ////////////////////////////////////////////////////////////////////////// else if (name == "LastResponseOrig") { - if (!_responseBox || !_responseBox->_lastResponseTextOrig) { + if (!_responseBox || !_responseBox->getLastResponseTextOrig()) { _scValue->setString(""); } else { - _scValue->setString(_responseBox->_lastResponseTextOrig); + _scValue->setString(_responseBox->getLastResponseTextOrig()); } return _scValue; } @@ -1036,7 +1036,7 @@ ScValue *AdGame::scGetProperty(const Common::String &name) { // ChangingScene ////////////////////////////////////////////////////////////////////////// else if (name == "ChangingScene") { - _scValue->setBool(_scheduledScene != NULL); + _scValue->setBool(_scheduledScene != nullptr); return _scValue; } @@ -1066,10 +1066,10 @@ bool AdGame::scSetProperty(const char *name, ScValue *value) { ////////////////////////////////////////////////////////////////////////// if (strcmp(name, "SelectedItem") == 0) { if (value->isNULL()) { - _selectedItem = NULL; + _selectedItem = nullptr; } else { if (value->isNative()) { - _selectedItem = NULL; + _selectedItem = nullptr; for (uint32 i = 0; i < _items.size(); i++) { if (_items[i] == value->getNative()) { _selectedItem = (AdItem *)value->getNative(); @@ -1158,9 +1158,9 @@ bool AdGame::scSetProperty(const char *name, ScValue *value) { // StartupScene ////////////////////////////////////////////////////////////////////////// else if (strcmp(name, "StartupScene") == 0) { - if (value == NULL) { + if (value == nullptr) { delete[] _startupScene; - _startupScene = NULL; + _startupScene = nullptr; } else { BaseUtils::setString(&_startupScene, value->getString()); } @@ -1242,7 +1242,7 @@ bool AdGame::showCursor() { ////////////////////////////////////////////////////////////////////////// bool AdGame::loadFile(const char *filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "AdGame::LoadFile failed for file '%s'", filename); return STATUS_FAILED; } @@ -1316,7 +1316,7 @@ bool AdGame::loadBuffer(byte *buffer, bool complete) { registerObject(_responseBox); } else { delete _responseBox; - _responseBox = NULL; + _responseBox = nullptr; cmd = PARSERR_GENERIC; } break; @@ -1328,7 +1328,7 @@ bool AdGame::loadBuffer(byte *buffer, bool complete) { registerObject(_inventoryBox); } else { delete _inventoryBox; - _inventoryBox = NULL; + _inventoryBox = nullptr; cmd = PARSERR_GENERIC; } break; @@ -1338,7 +1338,7 @@ bool AdGame::loadBuffer(byte *buffer, bool complete) { BaseUtils::setString(&_itemsFile, (char *)params2); if (DID_FAIL(loadItemsFile(_itemsFile))) { delete[] _itemsFile; - _itemsFile = NULL; + _itemsFile = nullptr; cmd = PARSERR_GENERIC; } break; @@ -1456,7 +1456,7 @@ bool AdGame::persist(BasePersistenceManager *persistMgr) { ////////////////////////////////////////////////////////////////////////// void AdGame::setPrevSceneName(const char *name) { delete[] _prevSceneName; - _prevSceneName = NULL; + _prevSceneName = nullptr; if (name) { _prevSceneName = new char[strlen(name) + 1]; if (_prevSceneName) { @@ -1469,7 +1469,7 @@ void AdGame::setPrevSceneName(const char *name) { ////////////////////////////////////////////////////////////////////////// void AdGame::setPrevSceneFilename(const char *name) { delete[] _prevSceneFilename; - _prevSceneFilename = NULL; + _prevSceneFilename = nullptr; if (name) { _prevSceneFilename = new char[strlen(name) + 1]; if (_prevSceneFilename) { @@ -1482,7 +1482,7 @@ void AdGame::setPrevSceneFilename(const char *name) { ////////////////////////////////////////////////////////////////////////// bool AdGame::scheduleChangeScene(const char *filename, bool fadeIn) { delete[] _scheduledScene; - _scheduledScene = NULL; + _scheduledScene = nullptr; if (_scene && !_scene->_initialized) { return changeScene(filename, fadeIn); @@ -1499,7 +1499,7 @@ bool AdGame::scheduleChangeScene(const char *filename, bool fadeIn) { ////////////////////////////////////////////////////////////////////////// bool AdGame::getVersion(byte *verMajor, byte *verMinor, byte *extMajor, byte *extMinor) { - BaseGame::getVersion(verMajor, verMinor, NULL, NULL); + BaseGame::getVersion(verMajor, verMinor, nullptr, nullptr); if (extMajor) { *extMajor = 0; @@ -1515,7 +1515,7 @@ bool AdGame::getVersion(byte *verMajor, byte *verMinor, byte *extMajor, byte *ex ////////////////////////////////////////////////////////////////////////// bool AdGame::loadItemsFile(const char *filename, bool merge) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "AdGame::LoadItemsFile failed for file '%s'", filename); return STATUS_FAILED; } @@ -1567,7 +1567,7 @@ bool AdGame::loadItemsBuffer(byte *buffer, bool merge) { addItem(item); } else { delete item; - item = NULL; + item = nullptr; cmd = PARSERR_GENERIC; } } @@ -1599,7 +1599,7 @@ AdSceneState *AdGame::getSceneState(const char *filename, bool saving) { } for (uint32 i = 0; i < _sceneStates.size(); i++) { - if (scumm_stricmp(_sceneStates[i]->_filename, filenameCor) == 0) { + if (scumm_stricmp(_sceneStates[i]->getFilename(), filenameCor) == 0) { delete[] filenameCor; return _sceneStates[i]; } @@ -1615,7 +1615,7 @@ AdSceneState *AdGame::getSceneState(const char *filename, bool saving) { return ret; } else { delete[] filenameCor; - return NULL; + return nullptr; } } @@ -1635,7 +1635,7 @@ bool AdGame::windowLoadHook(UIWindow *win, char **buffer, char **params) { UIEntity *ent = new UIEntity(_gameRef); if (!ent || DID_FAIL(ent->loadBuffer((byte *)*params, false))) { delete ent; - ent = NULL; + ent = nullptr; cmd = PARSERR_GENERIC; } else { ent->_parent = win; @@ -1689,12 +1689,12 @@ bool AdGame::startDlgBranch(const char *branchName, const char *scriptName, cons ////////////////////////////////////////////////////////////////////////// bool AdGame::endDlgBranch(const char *branchName, const char *scriptName, const char *eventName) { - char *name = NULL; + char *name = nullptr; bool deleteName = false; - if (branchName == NULL && _dlgPendingBranches.size() > 0) { + if (branchName == nullptr && _dlgPendingBranches.size() > 0) { name = _dlgPendingBranches[_dlgPendingBranches.size() - 1]; } else { - if (branchName != NULL) { + if (branchName != nullptr) { name = new char[strlen(branchName) + 1 + strlen(scriptName) + 1 + strlen(eventName) + 1]; if (name) { sprintf(name, "%s.%s.%s", branchName, scriptName, eventName); @@ -1703,7 +1703,7 @@ bool AdGame::endDlgBranch(const char *branchName, const char *scriptName, const } } - if (name == NULL) { + if (name == nullptr) { return STATUS_OK; } @@ -1719,7 +1719,7 @@ bool AdGame::endDlgBranch(const char *branchName, const char *scriptName, const for (uint32 i = startIndex; i < _dlgPendingBranches.size(); i++) { //ClearBranchResponses(_dlgPendingBranches[i]); delete[] _dlgPendingBranches[i]; - _dlgPendingBranches[i] = NULL; + _dlgPendingBranches[i] = nullptr; } _dlgPendingBranches.remove_at(startIndex, _dlgPendingBranches.size() - startIndex); } @@ -1760,7 +1760,7 @@ bool AdGame::addBranchResponse(int id) { } AdResponseContext *r = new AdResponseContext(_gameRef); r->_id = id; - r->setContext(_dlgPendingBranches.size() > 0 ? _dlgPendingBranches[_dlgPendingBranches.size() - 1] : NULL); + r->setContext(_dlgPendingBranches.size() > 0 ? _dlgPendingBranches[_dlgPendingBranches.size() - 1] : nullptr); _responsesBranch.add(r); return STATUS_OK; } @@ -1768,10 +1768,10 @@ bool AdGame::addBranchResponse(int id) { ////////////////////////////////////////////////////////////////////////// bool AdGame::branchResponseUsed(int id) { - char *context = _dlgPendingBranches.size() > 0 ? _dlgPendingBranches[_dlgPendingBranches.size() - 1] : NULL; + char *context = _dlgPendingBranches.size() > 0 ? _dlgPendingBranches[_dlgPendingBranches.size() - 1] : nullptr; for (uint32 i = 0; i < _responsesBranch.size(); i++) { if (_responsesBranch[i]->_id == id) { - if ((context == NULL && _responsesBranch[i]->_context == NULL) || scumm_stricmp(context, _responsesBranch[i]->_context) == 0) { + if ((context == nullptr && _responsesBranch[i]->_context == nullptr) || scumm_stricmp(context, _responsesBranch[i]->_context) == 0) { return true; } } @@ -1787,7 +1787,7 @@ bool AdGame::addGameResponse(int id) { } AdResponseContext *r = new AdResponseContext(_gameRef); r->_id = id; - r->setContext(_dlgPendingBranches.size() > 0 ? _dlgPendingBranches[_dlgPendingBranches.size() - 1] : NULL); + r->setContext(_dlgPendingBranches.size() > 0 ? _dlgPendingBranches[_dlgPendingBranches.size() - 1] : nullptr); _responsesGame.add(r); return STATUS_OK; } @@ -1795,11 +1795,11 @@ bool AdGame::addGameResponse(int id) { ////////////////////////////////////////////////////////////////////////// bool AdGame::gameResponseUsed(int id) { - char *context = _dlgPendingBranches.size() > 0 ? _dlgPendingBranches[_dlgPendingBranches.size() - 1] : NULL; + char *context = _dlgPendingBranches.size() > 0 ? _dlgPendingBranches[_dlgPendingBranches.size() - 1] : nullptr; for (uint32 i = 0; i < _responsesGame.size(); i++) { AdResponseContext *respContext = _responsesGame[i]; if (respContext->_id == id) { - if ((context == NULL && respContext->_context == NULL) || ((context != NULL && respContext->_context != NULL) && scumm_stricmp(context, respContext->_context) == 0)) { + if ((context == nullptr && respContext->_context == nullptr) || ((context != nullptr && respContext->_context != nullptr) && scumm_stricmp(context, respContext->_context) == 0)) { return true; } } @@ -1810,11 +1810,11 @@ bool AdGame::gameResponseUsed(int id) { ////////////////////////////////////////////////////////////////////////// bool AdGame::resetResponse(int id) { - char *context = _dlgPendingBranches.size() > 0 ? _dlgPendingBranches[_dlgPendingBranches.size() - 1] : NULL; + char *context = _dlgPendingBranches.size() > 0 ? _dlgPendingBranches[_dlgPendingBranches.size() - 1] : nullptr; for (uint32 i = 0; i < _responsesGame.size(); i++) { if (_responsesGame[i]->_id == id) { - if ((context == NULL && _responsesGame[i]->_context == NULL) || scumm_stricmp(context, _responsesGame[i]->_context) == 0) { + if ((context == nullptr && _responsesGame[i]->_context == nullptr) || scumm_stricmp(context, _responsesGame[i]->_context) == 0) { delete _responsesGame[i]; _responsesGame.remove_at(i); break; @@ -1824,7 +1824,7 @@ bool AdGame::resetResponse(int id) { for (uint32 i = 0; i < _responsesBranch.size(); i++) { if (_responsesBranch[i]->_id == id) { - if ((context == NULL && _responsesBranch[i]->_context == NULL) || scumm_stricmp(context, _responsesBranch[i]->_context) == 0) { + if ((context == nullptr && _responsesBranch[i]->_context == nullptr) || scumm_stricmp(context, _responsesBranch[i]->_context) == 0) { delete _responsesBranch[i]; _responsesBranch.remove_at(i); break; @@ -1863,7 +1863,7 @@ bool AdGame::displayContent(bool doUpdate, bool displayAll) { } if (_theoraPlayer->isFinished()) { delete _theoraPlayer; - _theoraPlayer = NULL; + _theoraPlayer = nullptr; } } else { @@ -1912,7 +1912,7 @@ bool AdGame::displayContent(bool doUpdate, bool displayAll) { _loadingIcon->display(_loadingIconX, _loadingIconY); if (!_loadingIconPersistent) { delete _loadingIcon; - _loadingIcon = NULL; + _loadingIcon = nullptr; } } @@ -1965,7 +1965,7 @@ AdItem *AdGame::getItemByName(const char *name) { return _items[i]; } } - return NULL; + return nullptr; } @@ -2026,7 +2026,7 @@ bool AdGame::deleteItem(AdItem *item) { } if (_selectedItem == item) { - _selectedItem = NULL; + _selectedItem = nullptr; } _scene->handleItemAssociations(item->getName(), false); @@ -2115,7 +2115,7 @@ char *AdGame::findSpeechFile(char *stringID) { } } delete[] ret; - return NULL; + return nullptr; } @@ -2145,14 +2145,14 @@ bool AdGame::onMouseLeftDown() { bool handled = _state == GAME_RUNNING && DID_SUCCEED(applyEvent("LeftClick")); if (!handled) { - if (_activeObject != NULL) { + if (_activeObject != nullptr) { _activeObject->applyEvent("LeftClick"); } else if (_state == GAME_RUNNING && _scene && _scene->pointInViewport(_mousePos.x, _mousePos.y)) { _scene->applyEvent("LeftClick"); } } - if (_activeObject != NULL) { + if (_activeObject != nullptr) { _gameRef->_capturedObject = _gameRef->_activeObject; } _mouseLeftDown = true; @@ -2168,12 +2168,12 @@ bool AdGame::onMouseLeftUp() { } BasePlatform::releaseCapture(); - _capturedObject = NULL; + _capturedObject = nullptr; _mouseLeftDown = false; bool handled = /*_state==GAME_RUNNING &&*/ DID_SUCCEED(applyEvent("LeftRelease")); if (!handled) { - if (_activeObject != NULL) { + if (_activeObject != nullptr) { _activeObject->applyEvent("LeftRelease"); } else if (_state == GAME_RUNNING && _scene && _scene->pointInViewport(_mousePos.x, _mousePos.y)) { _scene->applyEvent("LeftRelease"); @@ -2198,7 +2198,7 @@ bool AdGame::onMouseLeftDblClick() { bool handled = _state == GAME_RUNNING && DID_SUCCEED(applyEvent("LeftDoubleClick")); if (!handled) { - if (_activeObject != NULL) { + if (_activeObject != nullptr) { _activeObject->applyEvent("LeftDoubleClick"); } else if (_state == GAME_RUNNING && _scene && _scene->pointInViewport(_mousePos.x, _mousePos.y)) { _scene->applyEvent("LeftDoubleClick"); @@ -2229,7 +2229,7 @@ bool AdGame::onMouseRightDown() { bool handled = _state == GAME_RUNNING && DID_SUCCEED(applyEvent("RightClick")); if (!handled) { - if (_activeObject != NULL) { + if (_activeObject != nullptr) { _activeObject->applyEvent("RightClick"); } else if (_state == GAME_RUNNING && _scene && _scene->pointInViewport(_mousePos.x, _mousePos.y)) { _scene->applyEvent("RightClick"); @@ -2246,7 +2246,7 @@ bool AdGame::onMouseRightUp() { bool handled = _state == GAME_RUNNING && DID_SUCCEED(applyEvent("RightRelease")); if (!handled) { - if (_activeObject != NULL) { + if (_activeObject != nullptr) { _activeObject->applyEvent("RightRelease"); } else if (_state == GAME_RUNNING && _scene && _scene->pointInViewport(_mousePos.x, _mousePos.y)) { _scene->applyEvent("RightRelease"); @@ -2272,7 +2272,7 @@ bool AdGame::displayDebugInfo() { ////////////////////////////////////////////////////////////////////////// bool AdGame::onScriptShutdown(ScScript *script) { if (_responseBox && _responseBox->_waitingScript == script) { - _responseBox->_waitingScript = NULL; + _responseBox->_waitingScript = nullptr; } return STATUS_OK; diff --git a/engines/wintermute/ad/ad_inventory.cpp b/engines/wintermute/ad/ad_inventory.cpp index 72f8fa0fb4..e9b6e56f16 100644 --- a/engines/wintermute/ad/ad_inventory.cpp +++ b/engines/wintermute/ad/ad_inventory.cpp @@ -50,12 +50,12 @@ AdInventory::~AdInventory() { ////////////////////////////////////////////////////////////////////////// bool AdInventory::insertItem(const char *name, const char *insertAfter) { - if (name == NULL) { + if (name == nullptr) { return STATUS_FAILED; } AdItem *item = ((AdGame *)_gameRef)->getItemByName(name); - if (item == NULL) { + if (item == nullptr) { return STATUS_FAILED; } @@ -84,14 +84,14 @@ bool AdInventory::insertItem(const char *name, const char *insertAfter) { ////////////////////////////////////////////////////////////////////////// bool AdInventory::removeItem(const char *name) { - if (name == NULL) { + if (name == nullptr) { return STATUS_FAILED; } for (uint32 i = 0; i < _takenItems.size(); i++) { if (scumm_stricmp(_takenItems[i]->getName(), name) == 0) { if (((AdGame *)_gameRef)->_selectedItem == _takenItems[i]) { - ((AdGame *)_gameRef)->_selectedItem = NULL; + ((AdGame *)_gameRef)->_selectedItem = nullptr; } _takenItems.remove_at(i); return STATUS_OK; @@ -105,14 +105,14 @@ bool AdInventory::removeItem(const char *name) { ////////////////////////////////////////////////////////////////////////// bool AdInventory::removeItem(AdItem *item) { - if (item == NULL) { + if (item == nullptr) { return STATUS_FAILED; } for (uint32 i = 0; i < _takenItems.size(); i++) { if (_takenItems[i] == item) { if (((AdGame *)_gameRef)->_selectedItem == _takenItems[i]) { - ((AdGame *)_gameRef)->_selectedItem = NULL; + ((AdGame *)_gameRef)->_selectedItem = nullptr; } _takenItems.remove_at(i); return STATUS_OK; diff --git a/engines/wintermute/ad/ad_inventory.h b/engines/wintermute/ad/ad_inventory.h index 4017d914bc..f226a65612 100644 --- a/engines/wintermute/ad/ad_inventory.h +++ b/engines/wintermute/ad/ad_inventory.h @@ -40,7 +40,7 @@ public: DECLARE_PERSISTENT(AdInventory, BaseObject) bool removeItem(const char *name); bool removeItem(AdItem *Item); - bool insertItem(const char *name, const char *insertAfter = NULL); + bool insertItem(const char *name, const char *insertAfter = nullptr); AdInventory(BaseGame *inGame); virtual ~AdInventory(); BaseArray<AdItem *> _takenItems; diff --git a/engines/wintermute/ad/ad_inventory_box.cpp b/engines/wintermute/ad/ad_inventory_box.cpp index 7ae8ff8d69..194d975155 100644 --- a/engines/wintermute/ad/ad_inventory_box.cpp +++ b/engines/wintermute/ad/ad_inventory_box.cpp @@ -54,8 +54,8 @@ AdInventoryBox::AdInventoryBox(BaseGame *inGame) : BaseObject(inGame) { _itemWidth = _itemHeight = 50; _scrollBy = 1; - _window = NULL; - _closeButton = NULL; + _window = nullptr; + _closeButton = nullptr; _hideSelected = false; @@ -67,10 +67,10 @@ AdInventoryBox::AdInventoryBox(BaseGame *inGame) : BaseObject(inGame) { ////////////////////////////////////////////////////////////////////////// AdInventoryBox::~AdInventoryBox() { _gameRef->unregisterObject(_window); - _window = NULL; + _window = nullptr; delete _closeButton; - _closeButton = NULL; + _closeButton = nullptr; } @@ -166,7 +166,7 @@ bool AdInventoryBox::display() { ////////////////////////////////////////////////////////////////////////// bool AdInventoryBox::loadFile(const char *filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "AdInventoryBox::LoadFile failed for file '%s'", filename); return STATUS_FAILED; } @@ -256,7 +256,7 @@ bool AdInventoryBox::loadBuffer(byte *buffer, bool complete) { _window = new UIWindow(_gameRef); if (!_window || DID_FAIL(_window->loadBuffer(params, false))) { delete _window; - _window = NULL; + _window = nullptr; cmd = PARSERR_GENERIC; } else { _gameRef->registerObject(_window); diff --git a/engines/wintermute/ad/ad_item.cpp b/engines/wintermute/ad/ad_item.cpp index 427b1c7db4..8534956120 100644 --- a/engines/wintermute/ad/ad_item.cpp +++ b/engines/wintermute/ad/ad_item.cpp @@ -49,8 +49,8 @@ IMPLEMENT_PERSISTENT(AdItem, false) ////////////////////////////////////////////////////////////////////////// AdItem::AdItem(BaseGame *inGame) : AdTalkHolder(inGame) { - _spriteHover = NULL; - _cursorNormal = _cursorHover = NULL; + _spriteHover = nullptr; + _cursorNormal = _cursorHover = nullptr; _cursorCombined = true; _inInventory = false; @@ -60,7 +60,7 @@ AdItem::AdItem(BaseGame *inGame) : AdTalkHolder(inGame) { _amountOffsetX = 0; _amountOffsetY = 0; _amountAlign = TAL_RIGHT; - _amountString = NULL; + _amountString = nullptr; _state = STATE_READY; @@ -73,19 +73,19 @@ AdItem::~AdItem() { delete _spriteHover; delete _cursorNormal; delete _cursorHover; - _spriteHover = NULL; - _cursorNormal = NULL; - _cursorHover = NULL; + _spriteHover = nullptr; + _cursorNormal = nullptr; + _cursorHover = nullptr; delete[] _amountString; - _amountString = NULL; + _amountString = nullptr; } ////////////////////////////////////////////////////////////////////////// bool AdItem::loadFile(const char *filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "AdItem::LoadFile failed for file '%s'", filename); return STATUS_FAILED; } @@ -272,7 +272,7 @@ bool AdItem::loadBuffer(byte *buffer, bool complete) { _cursorNormal = new BaseSprite(_gameRef); if (!_cursorNormal || DID_FAIL(_cursorNormal->loadFile((char *)params, ((AdGame *)_gameRef)->_texItemLifeTime))) { delete _cursorNormal; - _cursorNormal = NULL; + _cursorNormal = nullptr; cmd = PARSERR_GENERIC; } break; @@ -282,7 +282,7 @@ bool AdItem::loadBuffer(byte *buffer, bool complete) { _cursorHover = new BaseSprite(_gameRef); if (!_cursorHover || DID_FAIL(_cursorHover->loadFile((char *)params, ((AdGame *)_gameRef)->_texItemLifeTime))) { delete _cursorHover; - _cursorHover = NULL; + _cursorHover = nullptr; cmd = PARSERR_GENERIC; } break; @@ -332,15 +332,15 @@ bool AdItem::loadBuffer(byte *buffer, bool complete) { ////////////////////////////////////////////////////////////////////////// bool AdItem::update() { - _currentSprite = NULL; + _currentSprite = nullptr; if (_state == STATE_READY && _animSprite) { delete _animSprite; - _animSprite = NULL; + _animSprite = nullptr; } // finished playing animation? - if (_state == STATE_PLAYING_ANIM && _animSprite != NULL && _animSprite->isFinished()) { + if (_state == STATE_PLAYING_ANIM && _animSprite != nullptr && _animSprite->isFinished()) { _state = STATE_READY; _currentSprite = _animSprite; } @@ -379,10 +379,10 @@ bool AdItem::update() { } bool timeIsUp = (_sentence->_sound && _sentence->_soundStarted && (!_sentence->_sound->isPlaying() && !_sentence->_sound->isPaused())) || (!_sentence->_sound && _sentence->_duration <= _gameRef->_timer - _sentence->_startTime); - if (_tempSprite2 == NULL || _tempSprite2->isFinished() || (/*_tempSprite2->_looping &&*/ timeIsUp)) { + if (_tempSprite2 == nullptr || _tempSprite2->isFinished() || (/*_tempSprite2->_looping &&*/ timeIsUp)) { if (timeIsUp) { _sentence->finish(); - _tempSprite2 = NULL; + _tempSprite2 = nullptr; _state = STATE_READY; } else { _tempSprite2 = getTalkStance(_sentence->getNextStance()); @@ -435,7 +435,7 @@ bool AdItem::display(int x, int y) { } amountX += _amountOffsetX; - BaseFont *font = _font ? _font : _gameRef->_systemFont; + BaseFont *font = _font ? _font : _gameRef->getSystemFont(); if (font) { if (_amountString) { font->drawText((byte *)_amountString, amountX, amountY, width, _amountAlign); @@ -469,7 +469,7 @@ bool AdItem::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, const char *filename = stack->pop()->getString(); delete _spriteHover; - _spriteHover = NULL; + _spriteHover = nullptr; BaseSprite *spr = new BaseSprite(_gameRef, this); if (!spr || DID_FAIL(spr->loadFile(filename))) { stack->pushBool(false); @@ -520,7 +520,7 @@ bool AdItem::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, const char *filename = stack->pop()->getString(); delete _cursorNormal; - _cursorNormal = NULL; + _cursorNormal = nullptr; BaseSprite *spr = new BaseSprite(_gameRef); if (!spr || DID_FAIL(spr->loadFile(filename))) { stack->pushBool(false); @@ -569,7 +569,7 @@ bool AdItem::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, const char *filename = stack->pop()->getString(); delete _cursorHover; - _cursorHover = NULL; + _cursorHover = nullptr; BaseSprite *spr = new BaseSprite(_gameRef); if (!spr || DID_FAIL(spr->loadFile(filename))) { stack->pushBool(false); @@ -753,7 +753,7 @@ bool AdItem::scSetProperty(const char *name, ScValue *value) { else if (strcmp(name, "AmountString") == 0) { if (value->isNULL()) { delete[] _amountString; - _amountString = NULL; + _amountString = nullptr; } else { BaseUtils::setString(&_amountString, value->getString()); } diff --git a/engines/wintermute/ad/ad_layer.cpp b/engines/wintermute/ad/ad_layer.cpp index 209c12b7a2..7bf79e4ae5 100644 --- a/engines/wintermute/ad/ad_layer.cpp +++ b/engines/wintermute/ad/ad_layer.cpp @@ -63,7 +63,7 @@ AdLayer::~AdLayer() { ////////////////////////////////////////////////////////////////////////// bool AdLayer::loadFile(const char *filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "AdLayer::LoadFile failed for file '%s'", filename); return STATUS_FAILED; } @@ -174,8 +174,8 @@ bool AdLayer::loadBuffer(byte *buffer, bool complete) { cmd = PARSERR_GENERIC; delete region; delete node; - region = NULL; - node = NULL; + region = nullptr; + node = nullptr; } else { node->setRegion(region); _nodes.add(node); @@ -193,8 +193,8 @@ bool AdLayer::loadBuffer(byte *buffer, bool complete) { cmd = PARSERR_GENERIC; delete entity; delete node; - entity = NULL; - node = NULL; + entity = nullptr; + node = nullptr; } else { node->setEntity(entity); _nodes.add(node); @@ -339,7 +339,7 @@ bool AdLayer::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, stack->correctParams(1); ScValue *val = stack->pop(); - AdSceneNode *toDelete = NULL; + AdSceneNode *toDelete = nullptr; if (val->isNative()) { BaseScriptable *temp = val->getNative(); for (uint32 i = 0; i < _nodes.size(); i++) { @@ -354,7 +354,7 @@ bool AdLayer::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, toDelete = _nodes[index]; } } - if (toDelete == NULL) { + if (toDelete == nullptr) { stack->pushBool(false); return STATUS_OK; } @@ -362,7 +362,7 @@ bool AdLayer::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, for (uint32 i = 0; i < _nodes.size(); i++) { if (_nodes[i] == toDelete) { delete _nodes[i]; - _nodes[i] = NULL; + _nodes[i] = nullptr; _nodes.remove_at(i); break; } diff --git a/engines/wintermute/ad/ad_node_state.cpp b/engines/wintermute/ad/ad_node_state.cpp index 493156c750..34e220569f 100644 --- a/engines/wintermute/ad/ad_node_state.cpp +++ b/engines/wintermute/ad/ad_node_state.cpp @@ -42,14 +42,14 @@ IMPLEMENT_PERSISTENT(AdNodeState, false) ////////////////////////////////////////////////////////////////////////// AdNodeState::AdNodeState(BaseGame *inGame) : BaseClass(inGame) { - _name = NULL; + _name = nullptr; _active = false; for (int i = 0; i < 7; i++) { - _caption[i] = NULL; + _caption[i] = nullptr; } _alphaColor = 0; - _filename = NULL; - _cursor = NULL; + _filename = nullptr; + _cursor = nullptr; } @@ -58,12 +58,12 @@ AdNodeState::~AdNodeState() { delete[] _name; delete[] _filename; delete[] _cursor; - _name = NULL; - _filename = NULL; - _cursor = NULL; + _name = nullptr; + _filename = nullptr; + _cursor = nullptr; for (int i = 0; i < 7; i++) { delete[] _caption[i]; - _caption[i] = NULL; + _caption[i] = nullptr; } } @@ -71,7 +71,7 @@ AdNodeState::~AdNodeState() { ////////////////////////////////////////////////////////////////////////// void AdNodeState::setName(const char *name) { delete[] _name; - _name = NULL; + _name = nullptr; BaseUtils::setString(&_name, name); } @@ -79,7 +79,7 @@ void AdNodeState::setName(const char *name) { ////////////////////////////////////////////////////////////////////////// void AdNodeState::setFilename(const char *filename) { delete[] _filename; - _filename = NULL; + _filename = nullptr; BaseUtils::setString(&_filename, filename); } @@ -87,7 +87,7 @@ void AdNodeState::setFilename(const char *filename) { ////////////////////////////////////////////////////////////////////////// void AdNodeState::setCursor(const char *filename) { delete[] _cursor; - _cursor = NULL; + _cursor = nullptr; BaseUtils::setString(&_cursor, filename); } @@ -132,7 +132,7 @@ const char *AdNodeState::getCaption(int caseVal) { if (caseVal == 0) { caseVal = 1; } - if (caseVal < 1 || caseVal > 7 || _caption[caseVal - 1] == NULL) { + if (caseVal < 1 || caseVal > 7 || _caption[caseVal - 1] == nullptr) { return ""; } else { return _caption[caseVal - 1]; diff --git a/engines/wintermute/ad/ad_object.cpp b/engines/wintermute/ad/ad_object.cpp index 7b91daab2e..a41ed9fbc3 100644 --- a/engines/wintermute/ad/ad_object.cpp +++ b/engines/wintermute/ad/ad_object.cpp @@ -65,27 +65,27 @@ AdObject::AdObject(BaseGame *inGame) : BaseObject(inGame) { _active = true; _drawn = false; - _currentSprite = NULL; - _animSprite = NULL; - _tempSprite2 = NULL; + _currentSprite = nullptr; + _animSprite = nullptr; + _tempSprite2 = nullptr; - _font = NULL; + _font = nullptr; - _sentence = NULL; + _sentence = nullptr; - _forcedTalkAnimName = NULL; + _forcedTalkAnimName = nullptr; _forcedTalkAnimUsed = false; - _blockRegion = NULL; - _wptGroup = NULL; + _blockRegion = nullptr; + _wptGroup = nullptr; - _currentBlockRegion = NULL; - _currentWptGroup = NULL; + _currentBlockRegion = nullptr; + _currentWptGroup = nullptr; _ignoreItems = false; _sceneIndependent = false; - _stickRegion = NULL; + _stickRegion = nullptr; _subtitlesModRelative = true; _subtitlesModX = 0; @@ -93,13 +93,13 @@ AdObject::AdObject(BaseGame *inGame) : BaseObject(inGame) { _subtitlesWidth = 0; _subtitlesModXCenter = true; - _inventory = NULL; + _inventory = nullptr; for (int i = 0; i < MAX_NUM_REGIONS; i++) { - _currentRegions[i] = NULL; + _currentRegions[i] = nullptr; } - _partEmitter = NULL; + _partEmitter = nullptr; _partFollowParent = false; _partOffsetX = _partOffsetY = 0; @@ -109,26 +109,26 @@ AdObject::AdObject(BaseGame *inGame) : BaseObject(inGame) { ////////////////////////////////////////////////////////////////////////// AdObject::~AdObject() { - _currentSprite = NULL; // reference only, don't delete + _currentSprite = nullptr; // reference only, don't delete delete _animSprite; - _animSprite = NULL; + _animSprite = nullptr; delete _sentence; - _sentence = NULL; + _sentence = nullptr; delete[] _forcedTalkAnimName; - _forcedTalkAnimName = NULL; + _forcedTalkAnimName = nullptr; delete _blockRegion; - _blockRegion = NULL; + _blockRegion = nullptr; delete _wptGroup; - _wptGroup = NULL; + _wptGroup = nullptr; delete _currentBlockRegion; - _currentBlockRegion = NULL; + _currentBlockRegion = nullptr; delete _currentWptGroup; - _currentWptGroup = NULL; + _currentWptGroup = nullptr; - _tempSprite2 = NULL; // reference only - _stickRegion = NULL; + _tempSprite2 = nullptr; // reference only + _stickRegion = nullptr; if (_font) { _gameRef->_fontStorage->removeFont(_font); @@ -136,7 +136,7 @@ AdObject::~AdObject() { if (_inventory) { ((AdGame *)_gameRef)->unregisterInventory(_inventory); - _inventory = NULL; + _inventory = nullptr; } if (_partEmitter) { @@ -159,7 +159,7 @@ AdObject::~AdObject() { ////////////////////////////////////////////////////////////////////////// bool AdObject::playAnim(const char *filename) { delete _animSprite; - _animSprite = NULL; + _animSprite = nullptr; _animSprite = new BaseSprite(_gameRef, this); if (!_animSprite) { _gameRef->LOG(0, "AdObject::PlayAnim: error creating temp sprite (object:\"%s\" sprite:\"%s\")", getName(), filename); @@ -169,7 +169,7 @@ bool AdObject::playAnim(const char *filename) { if (DID_FAIL(res)) { _gameRef->LOG(res, "AdObject::PlayAnim: error loading temp sprite (object:\"%s\" sprite:\"%s\")", getName(), filename); delete _animSprite; - _animSprite = NULL; + _animSprite = nullptr; return res; } _state = STATE_PLAYING_ANIM; @@ -274,7 +274,7 @@ bool AdObject::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack int duration = stack->pop()->getInt(); ScValue *valStances = stack->pop(); - const char *stances = valStances->isNULL() ? NULL : valStances->getString(); + const char *stances = valStances->isNULL() ? nullptr : valStances->getString(); int align = 0; ScValue *val = stack->pop(); @@ -286,7 +286,7 @@ bool AdObject::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack align = MIN(MAX(0, align), NUM_TEXT_ALIGN - 1); - const char *sound = soundVal->isNULL() ? NULL : soundVal->getString(); + const char *sound = soundVal->isNULL() ? nullptr : soundVal->getString(); talk(text, sound, duration, stances, (TTextAlign)align); if (strcmp(name, "TalkAsync") != 0) { @@ -309,7 +309,7 @@ bool AdObject::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack uint32 i; ScValue *val = stack->pop(); if (val->isNULL() || !main) { - _stickRegion = NULL; + _stickRegion = nullptr; regFound = true; } else if (val->isString()) { const char *regionName = val->getString(); @@ -334,7 +334,7 @@ bool AdObject::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack } if (!regFound) { - _stickRegion = NULL; + _stickRegion = nullptr; } stack->pushBool(regFound); return STATUS_OK; @@ -348,7 +348,7 @@ bool AdObject::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack ScValue *val = stack->pop(); if (val->isNULL()) { - setFont(NULL); + setFont(nullptr); } else { setFont(val->getString()); } @@ -385,7 +385,7 @@ bool AdObject::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack if (!val->isNULL()) { const char *itemName = val->getString(); val = stack->pop(); - const char *insertAfter = val->isNULL() ? NULL : val->getString(); + const char *insertAfter = val->isNULL() ? nullptr : val->getString(); if (DID_FAIL(_inventory->insertItem(itemName, insertAfter))) { script->runtimeError("Cannot add item '%s' to inventory", itemName); } else { @@ -512,7 +512,7 @@ bool AdObject::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack stack->correctParams(0); if (_partEmitter) { _gameRef->unregisterObject(_partEmitter); - _partEmitter = NULL; + _partEmitter = nullptr; } stack->pushNULL(); @@ -533,7 +533,7 @@ bool AdObject::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack AdEntity *ent = new AdEntity(_gameRef); if (DID_FAIL(res = ent->loadFile(filename))) { delete ent; - ent = NULL; + ent = nullptr; script->runtimeError("AddAttachment() failed loading entity '%s'", filename); stack->pushBool(false); } else { @@ -611,7 +611,7 @@ bool AdObject::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack stack->correctParams(1); ScValue *val = stack->pop(); - AdObject *ret = NULL; + AdObject *ret = nullptr; if (val->isInt()) { int index = val->getInt(); int currIndex = 0; @@ -645,7 +645,7 @@ bool AdObject::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack } } - if (ret != NULL) { + if (ret != nullptr) { stack->pushNative(ret, true); } else { stack->pushNULL(); @@ -851,9 +851,9 @@ bool AdObject::setFont(const char *filename) { } if (filename) { _font = _gameRef->_fontStorage->addFont(filename); - return _font == NULL ? STATUS_FAILED : STATUS_OK; + return _font == nullptr ? STATUS_FAILED : STATUS_OK; } else { - _font = NULL; + _font = nullptr; return STATUS_OK; } } @@ -878,6 +878,9 @@ int AdObject::getHeight() { } } +TObjectType AdObject::getType() const { + return _type; +} ////////////////////////////////////////////////////////////////////////// void AdObject::talk(const char *text, const char *sound, uint32 duration, const char *stances, TTextAlign Align) { @@ -890,12 +893,12 @@ void AdObject::talk(const char *text, const char *sound, uint32 duration, const if (_forcedTalkAnimName && _forcedTalkAnimUsed) { delete[] _forcedTalkAnimName; - _forcedTalkAnimName = NULL; + _forcedTalkAnimName = nullptr; _forcedTalkAnimUsed = false; } delete(_sentence->_sound); - _sentence->_sound = NULL; + _sentence->_sound = nullptr; _sentence->setText(text); _gameRef->_stringTable->expand(&_sentence->_text); @@ -904,7 +907,7 @@ void AdObject::talk(const char *text, const char *sound, uint32 duration, const _sentence->_align = Align; _sentence->_startTime = _gameRef->_timer; _sentence->_currentStance = -1; - _sentence->_font = _font == NULL ? _gameRef->_systemFont : _font; + _sentence->_font = _font == nullptr ? _gameRef->getSystemFont() : _font; _sentence->_freezable = _freezable; // try to locate speech file automatically @@ -1009,9 +1012,9 @@ void AdObject::talk(const char *text, const char *sound, uint32 duration, const ////////////////////////////////////////////////////////////////////////// bool AdObject::reset() { - if (_state == STATE_PLAYING_ANIM && _animSprite != NULL) { + if (_state == STATE_PLAYING_ANIM && _animSprite != nullptr) { delete _animSprite; - _animSprite = NULL; + _animSprite = nullptr; } else if (_state == STATE_TALKING && _sentence) { _sentence->finish(); } @@ -1154,7 +1157,7 @@ bool AdObject::afterMove() { bool regFound = false; for (int j = 0; j < MAX_NUM_REGIONS; j++) { if (_currentRegions[j] == newRegions[i]) { - _currentRegions[j] = NULL; + _currentRegions[j] = nullptr; regFound = true; break; } @@ -1177,7 +1180,7 @@ bool AdObject::afterMove() { ////////////////////////////////////////////////////////////////////////// bool AdObject::invalidateCurrRegions() { for (int i = 0; i < MAX_NUM_REGIONS; i++) { - _currentRegions[i] = NULL; + _currentRegions[i] = nullptr; } return STATUS_OK; } diff --git a/engines/wintermute/ad/ad_object.h b/engines/wintermute/ad/ad_object.h index d1a20908e1..39480e3446 100644 --- a/engines/wintermute/ad/ad_object.h +++ b/engines/wintermute/ad/ad_object.h @@ -46,77 +46,81 @@ class PartEmitter; class AdObject : public BaseObject { public: - PartEmitter *_partEmitter; virtual PartEmitter *createParticleEmitter(bool followParent = false, int offsetX = 0, int offsetY = 0); virtual bool updatePartEmitter(); - bool _partFollowParent; - int _partOffsetX; - int _partOffsetY; bool invalidateCurrRegions(); - bool _subtitlesModRelative; - bool _subtitlesModXCenter; - int _subtitlesModX; - int _subtitlesModY; - int _subtitlesWidth; AdRegion *_stickRegion; bool _sceneIndependent; - bool _ignoreItems; + bool updateBlockRegion(); - bool _forcedTalkAnimUsed; - char *_forcedTalkAnimName; + virtual bool getExtendedFlag(const char *flagName); virtual bool resetSoundPan(); virtual bool updateSounds(); bool reset(); DECLARE_PERSISTENT(AdObject, BaseObject) - virtual void talk(const char *text, const char *sound = NULL, uint32 duration = 0, const char *stances = NULL, TTextAlign align = TAL_CENTER); + virtual void talk(const char *text, const char *sound = nullptr, uint32 duration = 0, const char *stances = nullptr, TTextAlign align = TAL_CENTER); virtual int getHeight(); - AdSentence *_sentence; + bool setFont(const char *filename); virtual bool update(); virtual bool display(); + bool _drawn; bool _active; virtual bool playAnim(const char *filename); - BaseSprite *_animSprite; - BaseSprite *_currentSprite; - TObjectState _state; - TObjectState _nextState; - TObjectType _type; + + TObjectType getType() const; AdObject(BaseGame *inGame); virtual ~AdObject(); - BaseFont *_font; - BaseSprite *_tempSprite2; - BaseRegion *_blockRegion; - AdWaypointGroup *_wptGroup; + BaseRegion *_currentBlockRegion; AdWaypointGroup *_currentWptGroup; AdInventory *getInventory(); virtual bool saveAsText(BaseDynamicBuffer *buffer, int indent); - virtual bool afterMove(); - AdRegion *_currentRegions[MAX_NUM_REGIONS]; // scripting interface virtual ScValue *scGetProperty(const Common::String &name); virtual bool scSetProperty(const char *name, ScValue *value); virtual bool scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, const char *name); virtual const char *scToString(); - - BaseArray<AdObject *> _attachmentsPre; - BaseArray<AdObject *> _attachmentsPost; - bool updateSpriteAttachments(); bool displaySpriteAttachments(bool preDisplay); + +protected: + PartEmitter *_partEmitter; + bool _ignoreItems; + bool _forcedTalkAnimUsed; + char *_forcedTalkAnimName; + BaseSprite *_animSprite; + BaseSprite *_currentSprite; + AdSentence *_sentence; + TObjectState _state; + TObjectState _nextState; + TObjectType _type; + BaseFont *_font; + BaseSprite *_tempSprite2; + BaseRegion *_blockRegion; + AdWaypointGroup *_wptGroup; AdObject *_registerAlias; + bool getScale(float *scaleX, float *scaleY); private: + bool _partFollowParent; + int _partOffsetX; + int _partOffsetY; + bool _subtitlesModRelative; + bool _subtitlesModXCenter; + int _subtitlesModX; + int _subtitlesModY; + int _subtitlesWidth; + AdRegion *_currentRegions[MAX_NUM_REGIONS]; + BaseArray<AdObject *> _attachmentsPre; + BaseArray<AdObject *> _attachmentsPost; bool displaySpriteAttachment(AdObject *attachment); AdInventory *_inventory; - -protected: - bool getScale(float *scaleX, float *scaleY); }; } // end of namespace Wintermute diff --git a/engines/wintermute/ad/ad_path.cpp b/engines/wintermute/ad/ad_path.cpp index c931213456..afdd29828c 100644 --- a/engines/wintermute/ad/ad_path.cpp +++ b/engines/wintermute/ad/ad_path.cpp @@ -64,7 +64,7 @@ BasePoint *AdPath::getFirst() { _currIndex = 0; return _points[_currIndex]; } else { - return NULL; + return nullptr; } } @@ -75,7 +75,7 @@ BasePoint *AdPath::getNext() { if (_currIndex < (int32)_points.size()) { return _points[_currIndex]; } else { - return NULL; + return nullptr; } } @@ -85,7 +85,7 @@ BasePoint *AdPath::getCurrent() { if (_currIndex >= 0 && _currIndex < (int32)_points.size()) { return _points[_currIndex]; } else { - return NULL; + return nullptr; } } diff --git a/engines/wintermute/ad/ad_path_point.cpp b/engines/wintermute/ad/ad_path_point.cpp index a36648eb69..f3ccd264b1 100644 --- a/engines/wintermute/ad/ad_path_point.cpp +++ b/engines/wintermute/ad/ad_path_point.cpp @@ -39,7 +39,7 @@ AdPathPoint::AdPathPoint() { _distance = 0; _marked = false; - _origin = NULL; + _origin = nullptr; } @@ -50,13 +50,13 @@ AdPathPoint::AdPathPoint(int initX, int initY, int initDistance) { _distance = initDistance; _marked = false; - _origin = NULL; + _origin = nullptr; } ////////////////////////////////////////////////////////////////////////// AdPathPoint::~AdPathPoint() { - _origin = NULL; + _origin = nullptr; } diff --git a/engines/wintermute/ad/ad_region.cpp b/engines/wintermute/ad/ad_region.cpp index c9f1553c9a..acd5f13397 100644 --- a/engines/wintermute/ad/ad_region.cpp +++ b/engines/wintermute/ad/ad_region.cpp @@ -51,11 +51,26 @@ AdRegion::AdRegion(BaseGame *inGame) : BaseRegion(inGame) { AdRegion::~AdRegion() { } +uint32 AdRegion::getAlpha() const { + return _alpha; +} + +float AdRegion::getZoom() const { + return _zoom; +} + +bool AdRegion::isBlocked() const { + return _blocked; +} + +bool AdRegion::hasDecoration() const { + return _decoration; +} ////////////////////////////////////////////////////////////////////////// bool AdRegion::loadFile(const char *filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "AdRegion::LoadFile failed for file '%s'", filename); return STATUS_FAILED; } diff --git a/engines/wintermute/ad/ad_region.h b/engines/wintermute/ad/ad_region.h index 6112900361..960dde5f15 100644 --- a/engines/wintermute/ad/ad_region.h +++ b/engines/wintermute/ad/ad_region.h @@ -36,21 +36,27 @@ namespace Wintermute { class AdRegion : public BaseRegion { public: DECLARE_PERSISTENT(AdRegion, BaseRegion) - uint32 _alpha; - float _zoom; - bool _blocked; - bool _decoration; + AdRegion(BaseGame *inGame); virtual ~AdRegion(); bool loadFile(const char *filename); bool loadBuffer(byte *buffer, bool complete = true); virtual bool saveAsText(BaseDynamicBuffer *buffer, int indent); + bool hasDecoration() const; + bool isBlocked() const; + uint32 getAlpha() const; + float getZoom() const; // scripting interface virtual ScValue *scGetProperty(const Common::String &name); virtual bool scSetProperty(const char *name, ScValue *value); virtual bool scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, const char *name); virtual const char *scToString(); +private: + uint32 _alpha; + float _zoom; + bool _blocked; + bool _decoration; }; } // end of namespace Wintermute diff --git a/engines/wintermute/ad/ad_response.cpp b/engines/wintermute/ad/ad_response.cpp index a2225f2632..e4993b9ad4 100644 --- a/engines/wintermute/ad/ad_response.cpp +++ b/engines/wintermute/ad/ad_response.cpp @@ -38,10 +38,10 @@ IMPLEMENT_PERSISTENT(AdResponse, false) ////////////////////////////////////////////////////////////////////////// AdResponse::AdResponse(BaseGame *inGame) : BaseObject(inGame) { - _text = NULL; - _textOrig = NULL; - _icon = _iconHover = _iconPressed = NULL; - _font = NULL; + _text = nullptr; + _textOrig = nullptr; + _icon = _iconHover = _iconPressed = nullptr; + _font = nullptr; _iD = 0; _responseType = RESPONSE_ALWAYS; } @@ -54,11 +54,11 @@ AdResponse::~AdResponse() { delete _icon; delete _iconHover; delete _iconPressed; - _text = NULL; - _textOrig = NULL; - _icon = NULL; - _iconHover = NULL; - _iconPressed = NULL; + _text = nullptr; + _textOrig = nullptr; + _icon = nullptr; + _iconHover = nullptr; + _iconPressed = nullptr; if (_font) { _gameRef->_fontStorage->removeFont(_font); } @@ -79,7 +79,7 @@ bool AdResponse::setIcon(const char *filename) { if (!_icon || DID_FAIL(_icon->loadFile(filename))) { _gameRef->LOG(0, "AdResponse::setIcon failed for file '%s'", filename); delete _icon; - _icon = NULL; + _icon = nullptr; return STATUS_FAILED; } return STATUS_OK; @@ -105,7 +105,7 @@ bool AdResponse::setIconHover(const char *filename) { if (!_iconHover || DID_FAIL(_iconHover->loadFile(filename))) { _gameRef->LOG(0, "AdResponse::setIconHover failed for file '%s'", filename); delete _iconHover; - _iconHover = NULL; + _iconHover = nullptr; return STATUS_FAILED; } return STATUS_OK; @@ -119,7 +119,7 @@ bool AdResponse::setIconPressed(const char *filename) { if (!_iconPressed || DID_FAIL(_iconPressed->loadFile(filename))) { _gameRef->LOG(0, "AdResponse::setIconPressed failed for file '%s'", filename); delete _iconPressed; - _iconPressed = NULL; + _iconPressed = nullptr; return STATUS_FAILED; } return STATUS_OK; diff --git a/engines/wintermute/ad/ad_response.h b/engines/wintermute/ad/ad_response.h index 0ba88cf2e8..2119067d3e 100644 --- a/engines/wintermute/ad/ad_response.h +++ b/engines/wintermute/ad/ad_response.h @@ -43,7 +43,7 @@ public: bool setIconHover(const char *filename); bool setIconPressed(const char *filename); void setText(const char *text); - int _iD; + int32 _iD; BaseSprite *_icon; BaseSprite *_iconHover; BaseSprite *_iconPressed; diff --git a/engines/wintermute/ad/ad_response_box.cpp b/engines/wintermute/ad/ad_response_box.cpp index fb31aa0bb8..c891d2a019 100644 --- a/engines/wintermute/ad/ad_response_box.cpp +++ b/engines/wintermute/ad/ad_response_box.cpp @@ -52,9 +52,9 @@ IMPLEMENT_PERSISTENT(AdResponseBox, false) ////////////////////////////////////////////////////////////////////////// AdResponseBox::AdResponseBox(BaseGame *inGame) : BaseObject(inGame) { - _font = _fontHover = NULL; + _font = _fontHover = nullptr; - _window = NULL; + _window = nullptr; _shieldWindow = new UIWindow(_gameRef); _horizontal = false; @@ -62,9 +62,9 @@ AdResponseBox::AdResponseBox(BaseGame *inGame) : BaseObject(inGame) { _scrollOffset = 0; _spacing = 0; - _waitingScript = NULL; - _lastResponseText = NULL; - _lastResponseTextOrig = NULL; + _waitingScript = nullptr; + _lastResponseText = nullptr; + _lastResponseTextOrig = nullptr; _verticalAlign = VAL_BOTTOM; _align = TAL_LEFT; @@ -75,13 +75,13 @@ AdResponseBox::AdResponseBox(BaseGame *inGame) : BaseObject(inGame) { AdResponseBox::~AdResponseBox() { delete _window; - _window = NULL; + _window = nullptr; delete _shieldWindow; - _shieldWindow = NULL; + _shieldWindow = nullptr; delete[] _lastResponseText; - _lastResponseText = NULL; + _lastResponseText = nullptr; delete[] _lastResponseTextOrig; - _lastResponseTextOrig = NULL; + _lastResponseTextOrig = nullptr; if (_font) { _gameRef->_fontStorage->removeFont(_font); @@ -93,9 +93,12 @@ AdResponseBox::~AdResponseBox() { clearResponses(); clearButtons(); - _waitingScript = NULL; + _waitingScript = nullptr; } +uint32 AdResponseBox::getNumResponses() const { + return _responses.size(); +} ////////////////////////////////////////////////////////////////////////// void AdResponseBox::clearResponses() { @@ -118,11 +121,11 @@ void AdResponseBox::clearButtons() { ////////////////////////////////////////////////////////////////////////// bool AdResponseBox::invalidateButtons() { for (uint32 i = 0; i < _respButtons.size(); i++) { - _respButtons[i]->_image = NULL; - _respButtons[i]->_cursor = NULL; - _respButtons[i]->_font = NULL; - _respButtons[i]->_fontHover = NULL; - _respButtons[i]->_fontPress = NULL; + _respButtons[i]->_image = nullptr; + _respButtons[i]->_cursor = nullptr; + _respButtons[i]->_font = nullptr; + _respButtons[i]->_fontHover = nullptr; + _respButtons[i]->_fontPress = nullptr; _respButtons[i]->setText(""); } return STATUS_OK; @@ -160,8 +163,8 @@ bool AdResponseBox::createButtons() { // textual else { btn->setText(_responses[i]->_text); - btn->_font = (_font == NULL) ? _gameRef->_systemFont : _font; - btn->_fontHover = (_fontHover == NULL) ? _gameRef->_systemFont : _fontHover; + btn->_font = (_font == nullptr) ? _gameRef->getSystemFont() : _font; + btn->_fontHover = (_fontHover == nullptr) ? _gameRef->getSystemFont() : _fontHover; btn->_fontPress = btn->_fontHover; btn->_align = _align; @@ -207,7 +210,7 @@ bool AdResponseBox::createButtons() { ////////////////////////////////////////////////////////////////////////// bool AdResponseBox::loadFile(const char *filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "AdResponseBox::LoadFile failed for file '%s'", filename); return STATUS_FAILED; } @@ -284,7 +287,7 @@ bool AdResponseBox::loadBuffer(byte *buffer, bool complete) { _window = new UIWindow(_gameRef); if (!_window || DID_FAIL(_window->loadBuffer(params, false))) { delete _window; - _window = NULL; + _window = nullptr; cmd = PARSERR_GENERIC; } else if (_shieldWindow) { _shieldWindow->_parent = _window; @@ -352,7 +355,7 @@ bool AdResponseBox::loadBuffer(byte *buffer, bool complete) { _cursor = new BaseSprite(_gameRef); if (!_cursor || DID_FAIL(_cursor->loadFile((char *)params))) { delete _cursor; - _cursor = NULL; + _cursor = nullptr; cmd = PARSERR_GENERIC; } break; @@ -548,7 +551,7 @@ bool AdResponseBox::listen(BaseScriptHolder *param1, uint32 param2) { _waitingScript->_stack->pushInt(_responses[param2]->_iD); } handleResponse(_responses[param2]); - _waitingScript = NULL; + _waitingScript = nullptr; _gameRef->_state = GAME_RUNNING; ((AdGame *)_gameRef)->_stateEx = GAME_NORMAL; _ready = true; @@ -627,6 +630,30 @@ void AdResponseBox::setLastResponseText(const char *text, const char *textOrig) BaseUtils::setString(&_lastResponseTextOrig, textOrig); } +const char *AdResponseBox::getLastResponseText() const { + return _lastResponseText; +} + +const char *AdResponseBox::getLastResponseTextOrig() const { + return _lastResponseTextOrig; +} + +UIWindow *AdResponseBox::getResponseWindow() { + return _window; +} + +void AdResponseBox::addResponse(AdResponse *response) { + _responses.add(response); +} + +int32 AdResponseBox::getIdForResponseNum(uint32 num) const { + assert(num < _responses.size()); + return _responses[num]->_iD; +} + +bool AdResponseBox::handleResponseNum(uint32 num) { + return handleResponse(_responses[num]); +} ////////////////////////////////////////////////////////////////////////// bool AdResponseBox::handleResponse(AdResponse *response) { @@ -656,9 +683,9 @@ BaseObject *AdResponseBox::getNextAccessObject(BaseObject *currObject) { getObjects(objects, true); if (objects.size() == 0) { - return NULL; + return nullptr; } else { - if (currObject != NULL) { + if (currObject != nullptr) { for (uint32 i = 0; i < objects.size(); i++) { if (objects[i] == currObject) { if (i < objects.size() - 1) { @@ -671,7 +698,7 @@ BaseObject *AdResponseBox::getNextAccessObject(BaseObject *currObject) { } return objects[0]; } - return NULL; + return nullptr; } ////////////////////////////////////////////////////////////////////////// @@ -680,9 +707,9 @@ BaseObject *AdResponseBox::getPrevAccessObject(BaseObject *currObject) { getObjects(objects, true); if (objects.size() == 0) { - return NULL; + return nullptr; } else { - if (currObject != NULL) { + if (currObject != nullptr) { for (int i = objects.size() - 1; i >= 0; i--) { if (objects[i] == currObject) { if (i > 0) { @@ -695,7 +722,7 @@ BaseObject *AdResponseBox::getPrevAccessObject(BaseObject *currObject) { } return objects[objects.size() - 1]; } - return NULL; + return nullptr; } ////////////////////////////////////////////////////////////////////////// diff --git a/engines/wintermute/ad/ad_response_box.h b/engines/wintermute/ad/ad_response_box.h index 35f8cb6347..3b180062b6 100644 --- a/engines/wintermute/ad/ad_response_box.h +++ b/engines/wintermute/ad/ad_response_box.h @@ -44,10 +44,14 @@ public: BaseObject *getPrevAccessObject(BaseObject *CurrObject); bool getObjects(BaseArray<UIObject *> &objects, bool interactiveOnly); + void addResponse(AdResponse* response); bool handleResponse(AdResponse *response); + bool handleResponseNum(uint32 num); + int32 getIdForResponseNum(uint32 num) const; void setLastResponseText(const char *text, const char *textOrig); - char *_lastResponseText; - char *_lastResponseTextOrig; + const char *getLastResponseText() const; + const char *getLastResponseTextOrig() const; + DECLARE_PERSISTENT(AdResponseBox, BaseObject) ScScript *_waitingScript; virtual bool listen(BaseScriptHolder *param1, uint32 param2); @@ -59,27 +63,35 @@ public: bool weedResponses(); bool display(); - int _spacing; - int _scrollOffset; - BaseFont *_fontHover; - BaseFont *_font; + bool createButtons(); bool invalidateButtons(); void clearButtons(); void clearResponses(); AdResponseBox(BaseGame *inGame); virtual ~AdResponseBox(); - BaseArray<AdResponse *> _responses; - BaseArray<UIButton *> _respButtons; - UIWindow *_window; - UIWindow *_shieldWindow; + + bool loadFile(const char *filename); + bool loadBuffer(byte *buffer, bool complete = true); + virtual bool saveAsText(BaseDynamicBuffer *buffer, int indent); + + UIWindow *getResponseWindow(); + uint32 getNumResponses() const; +private: + int _spacing; + int _scrollOffset; + BaseFont *_fontHover; + BaseFont *_font; bool _horizontal; Rect32 _responseArea; int _verticalAlign; TTextAlign _align; - bool loadFile(const char *filename); - bool loadBuffer(byte *buffer, bool complete = true); - virtual bool saveAsText(BaseDynamicBuffer *buffer, int indent); + BaseArray<UIButton *> _respButtons; + BaseArray<AdResponse *> _responses; + UIWindow *_shieldWindow; + char *_lastResponseText; + char *_lastResponseTextOrig; + UIWindow *_window; }; } // end of namespace Wintermute diff --git a/engines/wintermute/ad/ad_response_context.cpp b/engines/wintermute/ad/ad_response_context.cpp index ebfa03feea..d87651c178 100644 --- a/engines/wintermute/ad/ad_response_context.cpp +++ b/engines/wintermute/ad/ad_response_context.cpp @@ -36,14 +36,14 @@ IMPLEMENT_PERSISTENT(AdResponseContext, false) ////////////////////////////////////////////////////////////////////////// AdResponseContext::AdResponseContext(BaseGame *inGame) : BaseClass(inGame) { _id = 0; - _context = NULL; + _context = nullptr; } ////////////////////////////////////////////////////////////////////////// AdResponseContext::~AdResponseContext() { delete[] _context; - _context = NULL; + _context = nullptr; } @@ -59,7 +59,7 @@ bool AdResponseContext::persist(BasePersistenceManager *persistMgr) { ////////////////////////////////////////////////////////////////////////// void AdResponseContext::setContext(const char *context) { delete[] _context; - _context = NULL; + _context = nullptr; if (context) { _context = new char [strlen(context) + 1]; if (_context) { diff --git a/engines/wintermute/ad/ad_rot_level.cpp b/engines/wintermute/ad/ad_rot_level.cpp index fb9a4a47b9..4d7f27aec7 100644 --- a/engines/wintermute/ad/ad_rot_level.cpp +++ b/engines/wintermute/ad/ad_rot_level.cpp @@ -54,7 +54,7 @@ AdRotLevel::~AdRotLevel() { ////////////////////////////////////////////////////////////////////////// bool AdRotLevel::loadFile(const char *filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "AdRotLevel::LoadFile failed for file '%s'", filename); return STATUS_FAILED; } diff --git a/engines/wintermute/ad/ad_scale_level.cpp b/engines/wintermute/ad/ad_scale_level.cpp index 4e9293d875..e80f38bd0f 100644 --- a/engines/wintermute/ad/ad_scale_level.cpp +++ b/engines/wintermute/ad/ad_scale_level.cpp @@ -48,11 +48,14 @@ AdScaleLevel::~AdScaleLevel() { } +float AdScaleLevel::getScale() const { + return _scale; +} ////////////////////////////////////////////////////////////////////////// bool AdScaleLevel::loadFile(const char *filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "AdScaleLevel::LoadFile failed for file '%s'", filename); return STATUS_FAILED; } diff --git a/engines/wintermute/ad/ad_scale_level.h b/engines/wintermute/ad/ad_scale_level.h index 628a385eb4..5c206423cf 100644 --- a/engines/wintermute/ad/ad_scale_level.h +++ b/engines/wintermute/ad/ad_scale_level.h @@ -37,12 +37,14 @@ namespace Wintermute { class AdScaleLevel : public BaseObject { public: DECLARE_PERSISTENT(AdScaleLevel, BaseObject) - float _scale; AdScaleLevel(BaseGame *inGame); virtual ~AdScaleLevel(); virtual bool saveAsText(BaseDynamicBuffer *buffer, int indent); bool loadFile(const char *filename); bool loadBuffer(byte *buffer, bool complete = true); + float getScale() const; +private: + float _scale; }; } // end of namespace Wintermute diff --git a/engines/wintermute/ad/ad_scene.cpp b/engines/wintermute/ad/ad_scene.cpp index 8e9beca0c0..f305c2f60e 100644 --- a/engines/wintermute/ad/ad_scene.cpp +++ b/engines/wintermute/ad/ad_scene.cpp @@ -77,7 +77,7 @@ AdScene::~AdScene() { cleanup(); _gameRef->unregisterObject(_fader); delete _pfTarget; - _pfTarget = NULL; + _pfTarget = nullptr; } @@ -85,9 +85,9 @@ AdScene::~AdScene() { void AdScene::setDefaults() { _initialized = false; _pfReady = true; - _pfTargetPath = NULL; - _pfRequester = NULL; - _mainLayer = NULL; + _pfTargetPath = nullptr; + _pfRequester = nullptr; + _mainLayer = nullptr; _pfPointsNum = 0; _persistentState = false; @@ -127,12 +127,12 @@ void AdScene::setDefaults() { _editorShowEntities = true; _editorShowScale = true; - _shieldWindow = NULL; + _shieldWindow = nullptr; _fader = new BaseFader(_gameRef); _gameRef->registerObject(_fader); - _viewport = NULL; + _viewport = nullptr; } @@ -140,13 +140,13 @@ void AdScene::setDefaults() { void AdScene::cleanup() { BaseObject::cleanup(); - _mainLayer = NULL; // reference only + _mainLayer = nullptr; // reference only delete _shieldWindow; - _shieldWindow = NULL; + _shieldWindow = nullptr; _gameRef->unregisterObject(_fader); - _fader = NULL; + _fader = nullptr; for (uint32 i = 0; i < _layers.size(); i++) { _gameRef->unregisterObject(_layers[i]); @@ -182,7 +182,7 @@ void AdScene::cleanup() { _objects.clear(); delete _viewport; - _viewport = NULL; + _viewport = nullptr; setDefaults(); } @@ -287,9 +287,9 @@ float AdScene::getZoomAt(int x, int y) { if (_mainLayer) { for (int i = _mainLayer->_nodes.size() - 1; i >= 0; i--) { AdSceneNode *node = _mainLayer->_nodes[i]; - if (node->_type == OBJECT_REGION && node->_region->_active && !node->_region->_blocked && node->_region->pointInRegion(x, y)) { - if (node->_region->_zoom != 0) { - ret = node->_region->_zoom; + if (node->_type == OBJECT_REGION && node->_region->_active && !node->_region->isBlocked() && node->_region->pointInRegion(x, y)) { + if (node->_region->getZoom() != 0) { + ret = node->_region->getZoom(); found = true; break; } @@ -320,9 +320,9 @@ uint32 AdScene::getAlphaAt(int x, int y, bool colorCheck) { if (_mainLayer) { for (int i = _mainLayer->_nodes.size() - 1; i >= 0; i--) { AdSceneNode *node = _mainLayer->_nodes[i]; - if (node->_type == OBJECT_REGION && node->_region->_active && (colorCheck || !node->_region->_blocked) && node->_region->pointInRegion(x, y)) { - if (!node->_region->_blocked) { - ret = node->_region->_alpha; + if (node->_type == OBJECT_REGION && node->_region->_active && (colorCheck || !node->_region->isBlocked()) && node->_region->pointInRegion(x, y)) { + if (!node->_region->isBlocked()) { + ret = node->_region->getAlpha(); } break; } @@ -365,8 +365,8 @@ bool AdScene::isBlockedAt(int x, int y, bool checkFreeObjects, BaseObject *reque break; } */ - if (node->_type == OBJECT_REGION && node->_region->_active && !node->_region->_decoration && node->_region->pointInRegion(x, y)) { - if (node->_region->_blocked) { + if (node->_type == OBJECT_REGION && node->_region->_active && !node->_region->hasDecoration() && node->_region->pointInRegion(x, y)) { + if (node->_region->isBlocked()) { ret = true; break; } else { @@ -405,8 +405,8 @@ bool AdScene::isWalkableAt(int x, int y, bool checkFreeObjects, BaseObject *requ if (_mainLayer) { for (uint32 i = 0; i < _mainLayer->_nodes.size(); i++) { AdSceneNode *node = _mainLayer->_nodes[i]; - if (node->_type == OBJECT_REGION && node->_region->_active && !node->_region->_decoration && node->_region->pointInRegion(x, y)) { - if (node->_region->_blocked) { + if (node->_type == OBJECT_REGION && node->_region->_active && !node->_region->hasDecoration() && node->_region->pointInRegion(x, y)) { + if (node->_region->isBlocked()) { ret = false; break; } else { @@ -473,7 +473,7 @@ void AdScene::pathFinderStep() { int i; // get lowest unmarked int lowestDist = INT_MAX; - AdPathPoint *lowestPt = NULL; + AdPathPoint *lowestPt = nullptr; for (i = 0; i < _pfPointsNum; i++) if (!_pfPath[i]->_marked && _pfPath[i]->_distance < lowestDist) { @@ -481,7 +481,7 @@ void AdScene::pathFinderStep() { lowestPt = _pfPath[i]; } - if (lowestPt == NULL) { // no path -> terminate PathFinder + if (lowestPt == nullptr) { // no path -> terminate PathFinder _pfReady = true; _pfTargetPath->setReady(true); return; @@ -491,7 +491,7 @@ void AdScene::pathFinderStep() { // target point marked, generate path and terminate if (lowestPt->x == _pfTarget->x && lowestPt->y == _pfTarget->y) { - while (lowestPt != NULL) { + while (lowestPt != nullptr) { _pfTargetPath->_points.insert_at(0, new BasePoint(lowestPt->x, lowestPt->y)); lowestPt = lowestPt->_origin; } @@ -539,7 +539,7 @@ bool AdScene::initLoop() { ////////////////////////////////////////////////////////////////////////// bool AdScene::loadFile(const char *filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "AdScene::LoadFile failed for file '%s'", filename); return STATUS_FAILED; } @@ -680,7 +680,7 @@ bool AdScene::loadBuffer(byte *buffer, bool complete) { if (!layer || DID_FAIL(layer->loadBuffer(params, false))) { cmd = PARSERR_GENERIC; delete layer; - layer = NULL; + layer = nullptr; } else { _gameRef->registerObject(layer); _layers.add(layer); @@ -698,7 +698,7 @@ bool AdScene::loadBuffer(byte *buffer, bool complete) { if (!wpt || DID_FAIL(wpt->loadBuffer(params, false))) { cmd = PARSERR_GENERIC; delete wpt; - wpt = NULL; + wpt = nullptr; } else { _gameRef->registerObject(wpt); _waypointGroups.add(wpt); @@ -711,7 +711,7 @@ bool AdScene::loadBuffer(byte *buffer, bool complete) { if (!sl || DID_FAIL(sl->loadBuffer(params, false))) { cmd = PARSERR_GENERIC; delete sl; - sl = NULL; + sl = nullptr; } else { _gameRef->registerObject(sl); _scaleLevels.add(sl); @@ -724,7 +724,7 @@ bool AdScene::loadBuffer(byte *buffer, bool complete) { if (!rl || DID_FAIL(rl->loadBuffer(params, false))) { cmd = PARSERR_GENERIC; delete rl; - rl = NULL; + rl = nullptr; } else { _gameRef->registerObject(rl); _rotLevels.add(rl); @@ -737,7 +737,7 @@ bool AdScene::loadBuffer(byte *buffer, bool complete) { if (!entity || DID_FAIL(entity->loadBuffer(params, false))) { cmd = PARSERR_GENERIC; delete entity; - entity = NULL; + entity = nullptr; } else { addObject(entity); } @@ -749,7 +749,7 @@ bool AdScene::loadBuffer(byte *buffer, bool complete) { _cursor = new BaseSprite(_gameRef); if (!_cursor || DID_FAIL(_cursor->loadFile((char *)params))) { delete _cursor; - _cursor = NULL; + _cursor = nullptr; cmd = PARSERR_GENERIC; } break; @@ -884,7 +884,7 @@ bool AdScene::loadBuffer(byte *buffer, bool complete) { return STATUS_FAILED; } - if (_mainLayer == NULL) { + if (_mainLayer == nullptr) { _gameRef->LOG(0, "Warning: scene '%s' has no main layer.", getFilename()); } @@ -923,7 +923,7 @@ bool AdScene::traverseNodes(bool doUpdate) { // *** adjust scroll offset if (doUpdate) { /* - if (_autoScroll && _gameRef->_mainObject != NULL) + if (_autoScroll && _gameRef->_mainObject != nullptr) { ScrollToObject(_gameRef->_mainObject); } @@ -932,24 +932,34 @@ bool AdScene::traverseNodes(bool doUpdate) { if (_autoScroll) { // adjust horizontal scroll if (_gameRef->_timer - _lastTimeH >= _scrollTimeH) { + int timesMissed = (_gameRef->_timer - _lastTimeH) / _scrollTimeH; + // Cap the amount of catch-up to avoid jittery characters. + if (timesMissed > 2) { + timesMissed = 2; + } _lastTimeH = _gameRef->_timer; if (_offsetLeft < _targetOffsetLeft) { - _offsetLeft += _scrollPixelsH; + _offsetLeft += _scrollPixelsH * timesMissed; _offsetLeft = MIN(_offsetLeft, _targetOffsetLeft); } else if (_offsetLeft > _targetOffsetLeft) { - _offsetLeft -= _scrollPixelsH; + _offsetLeft -= _scrollPixelsH * timesMissed; _offsetLeft = MAX(_offsetLeft, _targetOffsetLeft); } } // adjust vertical scroll if (_gameRef->_timer - _lastTimeV >= _scrollTimeV) { + int timesMissed = (_gameRef->_timer - _lastTimeV) / _scrollTimeV; + // Cap the amount of catch-up to avoid jittery characters. + if (timesMissed > 2) { + timesMissed = 2; + } _lastTimeV = _gameRef->_timer; if (_offsetTop < _targetOffsetTop) { - _offsetTop += _scrollPixelsV; + _offsetTop += _scrollPixelsV * timesMissed; _offsetTop = MIN(_offsetTop, _targetOffsetTop); } else if (_offsetTop > _targetOffsetTop) { - _offsetTop -= _scrollPixelsV; + _offsetTop -= _scrollPixelsV * timesMissed; _offsetTop = MAX(_offsetTop, _targetOffsetTop); } } @@ -1045,10 +1055,10 @@ bool AdScene::traverseNodes(bool doUpdate) { break; case OBJECT_REGION: { - if (node->_region->_blocked) { + if (node->_region->isBlocked()) { break; } - if (node->_region->_decoration) { + if (node->_region->hasDecoration()) { break; } @@ -1068,7 +1078,7 @@ bool AdScene::traverseNodes(bool doUpdate) { if (doUpdate) { updateFreeObjects(); } else { - displayRegionContent(NULL); + displayRegionContent(nullptr); } } } // each layer @@ -1128,8 +1138,8 @@ bool AdScene::updateFreeObjects() { } - if (_autoScroll && _gameRef->_mainObject != NULL) { - scrollToObject(_gameRef->_mainObject); + if (_autoScroll && _gameRef->getMainObject() != nullptr) { + scrollToObject(_gameRef->getMainObject()); } @@ -1140,22 +1150,22 @@ bool AdScene::updateFreeObjects() { ////////////////////////////////////////////////////////////////////////// bool AdScene::displayRegionContent(AdRegion *region, bool display3DOnly) { AdGame *adGame = (AdGame *)_gameRef; - BaseArray<AdObject *> objects; + Common::Array<AdObject *> objects; AdObject *obj; // global objects for (uint32 i = 0; i < adGame->_objects.size(); i++) { obj = adGame->_objects[i]; - if (obj->_active && !obj->_drawn && (obj->_stickRegion == region || region == NULL || (obj->_stickRegion == NULL && region->pointInRegion(obj->_posX, obj->_posY)))) { - objects.add(obj); + if (obj->_active && !obj->_drawn && (obj->_stickRegion == region || region == nullptr || (obj->_stickRegion == nullptr && region->pointInRegion(obj->_posX, obj->_posY)))) { + objects.push_back(obj); } } // scene objects for (uint32 i = 0; i < _objects.size(); i++) { obj = _objects[i]; - if (obj->_active && !obj->_editorOnly && !obj->_drawn && (obj->_stickRegion == region || region == NULL || (obj->_stickRegion == NULL && region->pointInRegion(obj->_posX, obj->_posY)))) { - objects.add(obj); + if (obj->_active && !obj->_editorOnly && !obj->_drawn && (obj->_stickRegion == region || region == nullptr || (obj->_stickRegion == nullptr && region->pointInRegion(obj->_posX, obj->_posY)))) { + objects.push_back(obj); } } @@ -1181,7 +1191,7 @@ bool AdScene::displayRegionContent(AdRegion *region, bool display3DOnly) { // display design only objects if (!display3DOnly) { - if (_gameRef->_editorMode && region == NULL) { + if (_gameRef->_editorMode && region == nullptr) { for (uint32 i = 0; i < _objects.size(); i++) { if (_objects[i]->_active && _objects[i]->_editorOnly) { _objects[i]->display(); @@ -1195,16 +1205,11 @@ bool AdScene::displayRegionContent(AdRegion *region, bool display3DOnly) { } ////////////////////////////////////////////////////////////////////////// -int AdScene::compareObjs(const void *obj1, const void *obj2) { - const AdObject *object1 = *(const AdObject *const *)obj1; - const AdObject *object2 = *(const AdObject *const *)obj2; - - if (object1->_posY < object2->_posY) { - return -1; - } else if (object1->_posY > object2->_posY) { - return 1; +bool AdScene::compareObjs(const AdObject *obj1, const AdObject *obj2) { + if (obj1->_posY < obj2->_posY) { + return true; } else { - return 0; + return false; } } @@ -1215,12 +1220,12 @@ bool AdScene::displayRegionContentOld(AdRegion *region) { // display all objects in region sorted by _posY do { - obj = NULL; + obj = nullptr; int minY = INT_MAX; // global objects for (uint32 i = 0; i < adGame->_objects.size(); i++) { - if (adGame->_objects[i]->_active && !adGame->_objects[i]->_drawn && adGame->_objects[i]->_posY < minY && (adGame->_objects[i]->_stickRegion == region || region == NULL || (adGame->_objects[i]->_stickRegion == NULL && region->pointInRegion(adGame->_objects[i]->_posX, adGame->_objects[i]->_posY)))) { + if (adGame->_objects[i]->_active && !adGame->_objects[i]->_drawn && adGame->_objects[i]->_posY < minY && (adGame->_objects[i]->_stickRegion == region || region == nullptr || (adGame->_objects[i]->_stickRegion == nullptr && region->pointInRegion(adGame->_objects[i]->_posX, adGame->_objects[i]->_posY)))) { obj = adGame->_objects[i]; minY = adGame->_objects[i]->_posY; } @@ -1228,14 +1233,14 @@ bool AdScene::displayRegionContentOld(AdRegion *region) { // scene objects for (uint32 i = 0; i < _objects.size(); i++) { - if (_objects[i]->_active && !_objects[i]->_editorOnly && !_objects[i]->_drawn && _objects[i]->_posY < minY && (_objects[i]->_stickRegion == region || region == NULL || (_objects[i]->_stickRegion == NULL && region->pointInRegion(_objects[i]->_posX, _objects[i]->_posY)))) { + if (_objects[i]->_active && !_objects[i]->_editorOnly && !_objects[i]->_drawn && _objects[i]->_posY < minY && (_objects[i]->_stickRegion == region || region == nullptr || (_objects[i]->_stickRegion == nullptr && region->pointInRegion(_objects[i]->_posX, _objects[i]->_posY)))) { obj = _objects[i]; minY = _objects[i]->_posY; } } - if (obj != NULL) { + if (obj != nullptr) { _gameRef->_renderer->setup2D(); if (_gameRef->_editorMode || !obj->_editorOnly) { @@ -1243,11 +1248,11 @@ bool AdScene::displayRegionContentOld(AdRegion *region) { } obj->_drawn = true; } - } while (obj != NULL); + } while (obj != nullptr); // design only objects - if (_gameRef->_editorMode && region == NULL) { + if (_gameRef->_editorMode && region == nullptr) { for (uint32 i = 0; i < _objects.size(); i++) { if (_objects[i]->_active && _objects[i]->_editorOnly) { _objects[i]->display(); @@ -1280,7 +1285,7 @@ void AdScene::scrollTo(int offsetX, int offsetY) { _targetOffsetTop = MIN(_targetOffsetTop, _height - viewportHeight); - if (_gameRef->_mainObject && _gameRef->_mainObject->_is3D) { + if (_gameRef->getMainObject() && _gameRef->getMainObject()->_is3D) { if (abs(origOffsetLeft - _targetOffsetLeft) < 5) { _targetOffsetLeft = origOffsetLeft; } @@ -1341,7 +1346,7 @@ bool AdScene::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, stack->pushNative(act, true); } else { delete act; - act = NULL; + act = nullptr; stack->pushNULL(); } return STATUS_OK; @@ -1358,7 +1363,7 @@ bool AdScene::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, stack->pushNative(ent, true); } else { delete ent; - ent = NULL; + ent = nullptr; stack->pushNULL(); } return STATUS_OK; @@ -1499,7 +1504,7 @@ bool AdScene::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, stack->correctParams(1); ScValue *val = stack->pop(); - AdObject *ret = NULL; + AdObject *ret = nullptr; if (val->isInt()) { int index = val->getInt(); if (index >= 0 && index < (int32)_objects.size()) { @@ -1541,7 +1546,7 @@ bool AdScene::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, for (int i = _mainLayer->_nodes.size() - 1; i >= 0; i--) { AdSceneNode *node = _mainLayer->_nodes[i]; if (node->_type == OBJECT_REGION && node->_region->_active && node->_region->pointInRegion(x, y)) { - if (node->_region->_decoration && !includeDecors) { + if (node->_region->hasDecoration() && !includeDecors) { continue; } @@ -1767,7 +1772,7 @@ bool AdScene::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, stack->correctParams(1); ScValue *val = stack->pop(); - AdLayer *toDelete = NULL; + AdLayer *toDelete = nullptr; if (val->isNative()) { BaseScriptable *temp = val->getNative(); for (uint32 i = 0; i < _layers.size(); i++) { @@ -1782,7 +1787,7 @@ bool AdScene::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, toDelete = _layers[index]; } } - if (toDelete == NULL) { + if (toDelete == nullptr) { stack->pushBool(false); return STATUS_OK; } @@ -1873,7 +1878,7 @@ ScValue *AdScene::scGetProperty(const Common::String &name) { ////////////////////////////////////////////////////////////////////////// else if (name == "MouseY") { int viewportY; - getViewportOffset(NULL, &viewportY); + getViewportOffset(nullptr, &viewportY); _scValue->setInt(_gameRef->_mousePos.y + _offsetTop - viewportY); return _scValue; @@ -2202,7 +2207,7 @@ bool AdScene::saveAsText(BaseDynamicBuffer *buffer, int indent) { // free entities buffer->putTextIndent(indent + 2, "; ----- free entities\n"); for (uint32 i = 0; i < _objects.size(); i++) { - if (_objects[i]->_type == OBJECT_ENTITY) { + if (_objects[i]->getType() == OBJECT_ENTITY) { _objects[i]->saveAsText(buffer, indent + 2); } @@ -2263,8 +2268,8 @@ bool AdScene::sortRotLevels() { ////////////////////////////////////////////////////////////////////////// float AdScene::getScaleAt(int Y) { - AdScaleLevel *prev = NULL; - AdScaleLevel *next = NULL; + AdScaleLevel *prev = nullptr; + AdScaleLevel *next = nullptr; for (uint32 i = 0; i < _scaleLevels.size(); i++) { /* AdScaleLevel *xxx = _scaleLevels[i];*/ @@ -2277,16 +2282,16 @@ float AdScene::getScaleAt(int Y) { } } - if (prev == NULL || next == NULL) { + if (prev == nullptr || next == nullptr) { return 100; } int delta_y = next->_posY - prev->_posY; - float delta_scale = next->_scale - prev->_scale; + float delta_scale = next->getScale() - prev->getScale(); Y -= prev->_posY; float percent = (float)Y / ((float)delta_y / 100.0f); - return prev->_scale + delta_scale / 100 * percent; + return prev->getScale() + delta_scale / 100 * percent; } @@ -2509,7 +2514,7 @@ void AdScene::pfPointsAdd(int x, int y, int distance) { _pfPath[_pfPointsNum]->y = y; _pfPath[_pfPointsNum]->_distance = distance; _pfPath[_pfPointsNum]->_marked = false; - _pfPath[_pfPointsNum]->_origin = NULL; + _pfPath[_pfPointsNum]->_origin = nullptr; } _pfPointsNum++; @@ -2586,7 +2591,7 @@ int AdScene::getOffsetLeft() { ////////////////////////////////////////////////////////////////////////// int AdScene::getOffsetTop() { int viewportY; - getViewportOffset(NULL, &viewportY); + getViewportOffset(nullptr, &viewportY); return _offsetTop - viewportY; } @@ -2612,7 +2617,7 @@ void AdScene::setOffset(int offsetLeft, int offsetTop) { ////////////////////////////////////////////////////////////////////////// BaseObject *AdScene::getNodeByName(const char *name) { - BaseObject *ret = NULL; + BaseObject *ret = nullptr; // dependent objects for (uint32 i = 0; i < _layers.size(); i++) { @@ -2629,7 +2634,7 @@ BaseObject *AdScene::getNodeByName(const char *name) { ret = node->_region; break; default: - ret = NULL; + ret = nullptr; } return ret; } @@ -2638,7 +2643,7 @@ BaseObject *AdScene::getNodeByName(const char *name) { // free entities for (uint32 i = 0; i < _objects.size(); i++) { - if (_objects[i]->_type == OBJECT_ENTITY && !scumm_stricmp(name, _objects[i]->getName())) { + if (_objects[i]->getType() == OBJECT_ENTITY && !scumm_stricmp(name, _objects[i]->getName())) { return _objects[i]; } } @@ -2650,7 +2655,7 @@ BaseObject *AdScene::getNodeByName(const char *name) { } } - return NULL; + return nullptr; } @@ -2722,7 +2727,7 @@ bool AdScene::persistState(bool saving) { if (!_objects[i]->_saveState) { continue; } - if (_objects[i]->_type == OBJECT_ENTITY) { + if (_objects[i]->getType() == OBJECT_ENTITY) { nodeState = state->getNodeState(_objects[i]->getName(), saving); if (nodeState) { nodeState->transferEntity((AdEntity *)_objects[i], _persistentStateSprites, saving); @@ -2750,8 +2755,8 @@ bool AdScene::persistState(bool saving) { ////////////////////////////////////////////////////////////////////////// float AdScene::getRotationAt(int x, int y) { - AdRotLevel *prev = NULL; - AdRotLevel *next = NULL; + AdRotLevel *prev = nullptr; + AdRotLevel *next = nullptr; for (uint32 i = 0; i < _rotLevels.size(); i++) { /* AdRotLevel *xxx = _rotLevels[i]; @@ -2764,7 +2769,7 @@ float AdScene::getRotationAt(int x, int y) { } } - if (prev == NULL || next == NULL) { + if (prev == nullptr || next == nullptr) { return 0; } @@ -2785,7 +2790,7 @@ bool AdScene::handleItemAssociations(const char *itemName, bool show) { if (layer->_nodes[j]->_type == OBJECT_ENTITY) { AdEntity *ent = layer->_nodes[j]->_entity; - if (ent->_item && strcmp(ent->_item, itemName) == 0) { + if (ent->getItemName() && strcmp(ent->getItemName(), itemName) == 0) { ent->_active = show; } } @@ -2793,9 +2798,9 @@ bool AdScene::handleItemAssociations(const char *itemName, bool show) { } for (uint32 i = 0; i < _objects.size(); i++) { - if (_objects[i]->_type == OBJECT_ENTITY) { + if (_objects[i]->getType() == OBJECT_ENTITY) { AdEntity *ent = (AdEntity *)_objects[i]; - if (ent->_item && strcmp(ent->_item, itemName) == 0) { + if (ent->getItemName() && strcmp(ent->getItemName(), itemName) == 0) { ent->_active = show; } } @@ -2822,7 +2827,7 @@ bool AdScene::getRegionsAt(int x, int y, AdRegion **regionList, int numRegions) } } for (int i = numUsed; i < numRegions; i++) { - regionList[i] = NULL; + regionList[i] = nullptr; } return STATUS_OK; @@ -2840,9 +2845,9 @@ BaseObject *AdScene::getNextAccessObject(BaseObject *currObject) { getSceneObjects(objects, true); if (objects.size() == 0) { - return NULL; + return nullptr; } else { - if (currObject != NULL) { + if (currObject != nullptr) { for (uint32 i = 0; i < objects.size(); i++) { if (objects[i] == currObject) { if (i < objects.size() - 1) { @@ -2855,7 +2860,7 @@ BaseObject *AdScene::getNextAccessObject(BaseObject *currObject) { } return objects[0]; } - return NULL; + return nullptr; } ////////////////////////////////////////////////////////////////////////// @@ -2864,9 +2869,9 @@ BaseObject *AdScene::getPrevAccessObject(BaseObject *currObject) { getSceneObjects(objects, true); if (objects.size() == 0) { - return NULL; + return nullptr; } else { - if (currObject != NULL) { + if (currObject != nullptr) { for (int i = objects.size() - 1; i >= 0; i--) { if (objects[i] == currObject) { if (i > 0) { @@ -2879,7 +2884,7 @@ BaseObject *AdScene::getPrevAccessObject(BaseObject *currObject) { } return objects[objects.size() - 1]; } - return NULL; + return nullptr; } @@ -2957,7 +2962,7 @@ bool AdScene::getRegionObjects(AdRegion *region, BaseArray<AdObject *> &objects, // global objects for (uint32 i = 0; i < adGame->_objects.size(); i++) { obj = adGame->_objects[i]; - if (obj->_active && (obj->_stickRegion == region || region == NULL || (obj->_stickRegion == NULL && region->pointInRegion(obj->_posX, obj->_posY)))) { + if (obj->_active && (obj->_stickRegion == region || region == nullptr || (obj->_stickRegion == nullptr && region->pointInRegion(obj->_posX, obj->_posY)))) { if (interactiveOnly && !obj->_registrable) { continue; } @@ -2969,7 +2974,7 @@ bool AdScene::getRegionObjects(AdRegion *region, BaseArray<AdObject *> &objects, // scene objects for (uint32 i = 0; i < _objects.size(); i++) { obj = _objects[i]; - if (obj->_active && !obj->_editorOnly && (obj->_stickRegion == region || region == NULL || (obj->_stickRegion == NULL && region->pointInRegion(obj->_posX, obj->_posY)))) { + if (obj->_active && !obj->_editorOnly && (obj->_stickRegion == region || region == nullptr || (obj->_stickRegion == nullptr && region->pointInRegion(obj->_posX, obj->_posY)))) { if (interactiveOnly && !obj->_registrable) { continue; } diff --git a/engines/wintermute/ad/ad_scene.h b/engines/wintermute/ad/ad_scene.h index 3b482403b5..9cc8135889 100644 --- a/engines/wintermute/ad/ad_scene.h +++ b/engines/wintermute/ad/ad_scene.h @@ -67,20 +67,20 @@ public: bool pointInViewport(int x, int y); int getOffsetTop(); int getOffsetLeft(); - bool getViewportSize(int *width = NULL, int *height = NULL); - bool getViewportOffset(int *offsetX = NULL, int *offsetY = NULL); + bool getViewportSize(int *width = nullptr, int *height = nullptr); + bool getViewportOffset(int *offsetX = nullptr, int *offsetY = nullptr); BaseViewport *_viewport; BaseFader *_fader; int _pfPointsNum; void pfPointsAdd(int x, int y, int distance); void pfPointsStart(); bool _initialized; - bool correctTargetPoint(int startX, int startY, int *x, int *y, bool checkFreeObjects = false, BaseObject *requester = NULL); + bool correctTargetPoint(int startX, int startY, int *x, int *y, bool checkFreeObjects = false, BaseObject *requester = nullptr); bool correctTargetPoint2(int startX, int startY, int *targetX, int *targetY, bool checkFreeObjects, BaseObject *requester); DECLARE_PERSISTENT(AdScene, BaseObject) - bool displayRegionContent(AdRegion *region = NULL, bool display3DOnly = false); - bool displayRegionContentOld(AdRegion *region = NULL); - static int compareObjs(const void *obj1, const void *obj2); + bool displayRegionContent(AdRegion *region = nullptr, bool display3DOnly = false); + bool displayRegionContentOld(AdRegion *region = nullptr); + static bool compareObjs(const AdObject *obj1, const AdObject *obj2); bool updateFreeObjects(); bool traverseNodes(bool update = false); @@ -113,11 +113,11 @@ public: uint32 _pfMaxTime; bool initLoop(); void pathFinderStep(); - bool isBlockedAt(int x, int y, bool checkFreeObjects = false, BaseObject *requester = NULL); - bool isWalkableAt(int x, int y, bool checkFreeObjects = false, BaseObject *requester = NULL); + bool isBlockedAt(int x, int y, bool checkFreeObjects = false, BaseObject *requester = nullptr); + bool isWalkableAt(int x, int y, bool checkFreeObjects = false, BaseObject *requester = nullptr); AdLayer *_mainLayer; float getZoomAt(int x, int y); - bool getPath(BasePoint source, BasePoint target, AdPath *path, BaseObject *requester = NULL); + bool getPath(BasePoint source, BasePoint target, AdPath *path, BaseObject *requester = nullptr); AdScene(BaseGame *inGame); virtual ~AdScene(); BaseArray<AdLayer *> _layers; @@ -153,7 +153,7 @@ public: BaseArray<AdRotLevel *> _rotLevels; virtual bool restoreDeviceObjects(); - int getPointsDist(BasePoint p1, BasePoint p2, BaseObject *requester = NULL); + int getPointsDist(BasePoint p1, BasePoint p2, BaseObject *requester = nullptr); // scripting interface virtual ScValue *scGetProperty(const Common::String &name); @@ -164,7 +164,7 @@ public: private: bool persistState(bool saving = true); - void pfAddWaypointGroup(AdWaypointGroup *Wpt, BaseObject *requester = NULL); + void pfAddWaypointGroup(AdWaypointGroup *Wpt, BaseObject *requester = nullptr); bool _pfReady; BasePoint *_pfTarget; AdPath *_pfTargetPath; diff --git a/engines/wintermute/ad/ad_scene_node.cpp b/engines/wintermute/ad/ad_scene_node.cpp index d0202236fd..f84e9212e5 100644 --- a/engines/wintermute/ad/ad_scene_node.cpp +++ b/engines/wintermute/ad/ad_scene_node.cpp @@ -36,18 +36,18 @@ IMPLEMENT_PERSISTENT(AdSceneNode, false) ////////////////////////////////////////////////////////////////////////// AdSceneNode::AdSceneNode(BaseGame *inGame) : BaseObject(inGame) { _type = OBJECT_NONE; - _region = NULL; - _entity = NULL; + _region = nullptr; + _entity = nullptr; } ////////////////////////////////////////////////////////////////////////// AdSceneNode::~AdSceneNode() { _gameRef->unregisterObject(_region); - _region = NULL; + _region = nullptr; _gameRef->unregisterObject(_entity); - _entity = NULL; + _entity = nullptr; } diff --git a/engines/wintermute/ad/ad_scene_state.cpp b/engines/wintermute/ad/ad_scene_state.cpp index 6b34f1af53..8e022ab115 100644 --- a/engines/wintermute/ad/ad_scene_state.cpp +++ b/engines/wintermute/ad/ad_scene_state.cpp @@ -38,14 +38,14 @@ IMPLEMENT_PERSISTENT(AdSceneState, false) ////////////////////////////////////////////////////////////////////////// AdSceneState::AdSceneState(BaseGame *inGame) : BaseClass(inGame) { - _filename = NULL; + _filename = nullptr; } ////////////////////////////////////////////////////////////////////////// AdSceneState::~AdSceneState() { delete[] _filename; - _filename = NULL; + _filename = nullptr; for (uint32 i = 0; i < _nodeStates.size(); i++) { delete _nodeStates[i]; @@ -72,6 +72,9 @@ void AdSceneState::setFilename(const char *filename) { } } +const char *AdSceneState::getFilename() const { + return _filename; +} ////////////////////////////////////////////////////////////////////////// AdNodeState *AdSceneState::getNodeState(const char *name, bool saving) { @@ -88,7 +91,7 @@ AdNodeState *AdSceneState::getNodeState(const char *name, bool saving) { return ret; } else { - return NULL; + return nullptr; } } diff --git a/engines/wintermute/ad/ad_scene_state.h b/engines/wintermute/ad/ad_scene_state.h index 2b25393c5a..600aa4b581 100644 --- a/engines/wintermute/ad/ad_scene_state.h +++ b/engines/wintermute/ad/ad_scene_state.h @@ -39,9 +39,11 @@ class AdSceneState : public BaseClass { public: AdNodeState *getNodeState(const char *name, bool saving); void setFilename(const char *filename); + const char *getFilename() const; DECLARE_PERSISTENT(AdSceneState, BaseClass) AdSceneState(BaseGame *inGame); virtual ~AdSceneState(); +private: char *_filename; BaseArray<AdNodeState *> _nodeStates; }; diff --git a/engines/wintermute/ad/ad_sentence.cpp b/engines/wintermute/ad/ad_sentence.cpp index cfe4191b07..47b22a1ab3 100644 --- a/engines/wintermute/ad/ad_sentence.cpp +++ b/engines/wintermute/ad/ad_sentence.cpp @@ -45,27 +45,27 @@ IMPLEMENT_PERSISTENT(AdSentence, false) ////////////////////////////////////////////////////////////////////////// AdSentence::AdSentence(BaseGame *inGame) : BaseClass(inGame) { - _text = NULL; - _stances = NULL; - _tempStance = NULL; + _text = nullptr; + _stances = nullptr; + _tempStance = nullptr; _duration = 0; _startTime = 0; _currentStance = 0; - _font = NULL; + _font = nullptr; _pos.x = _pos.y = 0; _width = _gameRef->_renderer->_width; _align = (TTextAlign)TAL_CENTER; - _sound = NULL; + _sound = nullptr; _soundStarted = false; - _talkDef = NULL; - _currentSprite = NULL; - _currentSkelAnim = NULL; + _talkDef = nullptr; + _currentSprite = nullptr; + _currentSkelAnim = nullptr; _fixedPos = false; _freezable = true; } @@ -78,15 +78,15 @@ AdSentence::~AdSentence() { delete[] _stances; delete[] _tempStance; delete _talkDef; - _sound = NULL; - _text = NULL; - _stances = NULL; - _tempStance = NULL; - _talkDef = NULL; - - _currentSprite = NULL; // ref only - _currentSkelAnim = NULL; - _font = NULL; // ref only + _sound = nullptr; + _text = nullptr; + _stances = nullptr; + _tempStance = nullptr; + _talkDef = nullptr; + + _currentSprite = nullptr; // ref only + _currentSkelAnim = nullptr; + _font = nullptr; // ref only } @@ -113,7 +113,7 @@ void AdSentence::setStances(const char *stances) { strcpy(_stances, stances); } } else { - _stances = NULL; + _stances = nullptr; } } @@ -133,14 +133,14 @@ char *AdSentence::getNextStance() { ////////////////////////////////////////////////////////////////////////// char *AdSentence::getStance(int stance) { - if (_stances == NULL) { - return NULL; + if (_stances == nullptr) { + return nullptr; } if (_tempStance) { delete[] _tempStance; } - _tempStance = NULL; + _tempStance = nullptr; char *start; char *curr; @@ -150,7 +150,7 @@ char *AdSentence::getStance(int stance) { start = _stances; } else { pos = 0; - start = NULL; + start = nullptr; curr = _stances; while (pos < stance) { if (*curr == '\0') { @@ -166,8 +166,8 @@ char *AdSentence::getStance(int stance) { } } - if (start == NULL) { - return NULL; + if (start == nullptr) { + return nullptr; } while (*start == ' ' && *start != ',' && *start != '\0') { @@ -274,8 +274,8 @@ bool AdSentence::persist(BasePersistenceManager *persistMgr) { ////////////////////////////////////////////////////////////////////////// bool AdSentence::setupTalkFile(const char *soundFilename) { delete _talkDef; - _talkDef = NULL; - _currentSprite = NULL; + _talkDef = nullptr; + _currentSprite = nullptr; if (!soundFilename) { return STATUS_OK; @@ -294,7 +294,7 @@ bool AdSentence::setupTalkFile(const char *soundFilename) { _talkDef = new AdTalkDef(_gameRef); if (!_talkDef || DID_FAIL(_talkDef->loadFile(talkDefFileName.c_str()))) { delete _talkDef; - _talkDef = NULL; + _talkDef = nullptr; return STATUS_FAILED; } //_gameRef->LOG(0, "Using .talk file: %s", TalkDefFile); @@ -345,7 +345,7 @@ bool AdSentence::update(TDirection dir) { } _currentSprite = newSprite; } else { - _currentSprite = NULL; + _currentSprite = nullptr; } } diff --git a/engines/wintermute/ad/ad_sprite_set.cpp b/engines/wintermute/ad/ad_sprite_set.cpp index 345b483a8f..ffa7bb2530 100644 --- a/engines/wintermute/ad/ad_sprite_set.cpp +++ b/engines/wintermute/ad/ad_sprite_set.cpp @@ -42,7 +42,7 @@ AdSpriteSet::AdSpriteSet(BaseGame *inGame, BaseObject *owner) : BaseObject(inGam _owner = owner; for (int i = 0; i < NUM_DIRECTIONS; i++) { - _sprites[i] = NULL; + _sprites[i] = nullptr; } } @@ -51,17 +51,17 @@ AdSpriteSet::AdSpriteSet(BaseGame *inGame, BaseObject *owner) : BaseObject(inGam AdSpriteSet::~AdSpriteSet() { for (int i = 0; i < NUM_DIRECTIONS; i++) { delete _sprites[i]; - _sprites[i] = NULL; + _sprites[i] = nullptr; } - _owner = NULL; + _owner = nullptr; } ////////////////////////////////////////////////////////////////////////// bool AdSpriteSet::loadFile(const char *filename, int lifeTime, TSpriteCacheType cacheType) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "AdSpriteSet::LoadFile failed for file '%s'", filename); return STATUS_FAILED; } @@ -121,7 +121,7 @@ bool AdSpriteSet::loadBuffer(byte *buffer, bool complete, int lifeTime, TSpriteC buffer = params; } - BaseSprite *spr = NULL; + BaseSprite *spr = nullptr; while ((cmd = parser.getCommand((char **)&buffer, commands, (char **)¶ms)) > 0) { switch (cmd) { case TOKEN_TEMPLATE: @@ -136,7 +136,7 @@ bool AdSpriteSet::loadBuffer(byte *buffer, bool complete, int lifeTime, TSpriteC case TOKEN_LEFT: delete _sprites[DI_LEFT]; - _sprites[DI_LEFT] = NULL; + _sprites[DI_LEFT] = nullptr; spr = new BaseSprite(_gameRef, _owner); if (!spr || DID_FAIL(spr->loadFile((char *)params, lifeTime, cacheType))) { cmd = PARSERR_GENERIC; @@ -147,7 +147,7 @@ bool AdSpriteSet::loadBuffer(byte *buffer, bool complete, int lifeTime, TSpriteC case TOKEN_RIGHT: delete _sprites[DI_RIGHT]; - _sprites[DI_RIGHT] = NULL; + _sprites[DI_RIGHT] = nullptr; spr = new BaseSprite(_gameRef, _owner); if (!spr || DID_FAIL(spr->loadFile((char *)params, lifeTime, cacheType))) { cmd = PARSERR_GENERIC; @@ -158,7 +158,7 @@ bool AdSpriteSet::loadBuffer(byte *buffer, bool complete, int lifeTime, TSpriteC case TOKEN_UP: delete _sprites[DI_UP]; - _sprites[DI_UP] = NULL; + _sprites[DI_UP] = nullptr; spr = new BaseSprite(_gameRef, _owner); if (!spr || DID_FAIL(spr->loadFile((char *)params, lifeTime, cacheType))) { cmd = PARSERR_GENERIC; @@ -169,7 +169,7 @@ bool AdSpriteSet::loadBuffer(byte *buffer, bool complete, int lifeTime, TSpriteC case TOKEN_DOWN: delete _sprites[DI_DOWN]; - _sprites[DI_DOWN] = NULL; + _sprites[DI_DOWN] = nullptr; spr = new BaseSprite(_gameRef, _owner); if (!spr || DID_FAIL(spr->loadFile((char *)params, lifeTime, cacheType))) { cmd = PARSERR_GENERIC; @@ -180,7 +180,7 @@ bool AdSpriteSet::loadBuffer(byte *buffer, bool complete, int lifeTime, TSpriteC case TOKEN_UP_LEFT: delete _sprites[DI_UPLEFT]; - _sprites[DI_UPLEFT] = NULL; + _sprites[DI_UPLEFT] = nullptr; spr = new BaseSprite(_gameRef, _owner); if (!spr || DID_FAIL(spr->loadFile((char *)params, lifeTime, cacheType))) { cmd = PARSERR_GENERIC; @@ -191,7 +191,7 @@ bool AdSpriteSet::loadBuffer(byte *buffer, bool complete, int lifeTime, TSpriteC case TOKEN_UP_RIGHT: delete _sprites[DI_UPRIGHT]; - _sprites[DI_UPRIGHT] = NULL; + _sprites[DI_UPRIGHT] = nullptr; spr = new BaseSprite(_gameRef, _owner); if (!spr || DID_FAIL(spr->loadFile((char *)params, lifeTime, cacheType))) { cmd = PARSERR_GENERIC; @@ -202,7 +202,7 @@ bool AdSpriteSet::loadBuffer(byte *buffer, bool complete, int lifeTime, TSpriteC case TOKEN_DOWN_LEFT: delete _sprites[DI_DOWNLEFT]; - _sprites[DI_DOWNLEFT] = NULL; + _sprites[DI_DOWNLEFT] = nullptr; spr = new BaseSprite(_gameRef, _owner); if (!spr || DID_FAIL(spr->loadFile((char *)params, lifeTime, cacheType))) { cmd = PARSERR_GENERIC; @@ -213,7 +213,7 @@ bool AdSpriteSet::loadBuffer(byte *buffer, bool complete, int lifeTime, TSpriteC case TOKEN_DOWN_RIGHT: delete _sprites[DI_DOWNRIGHT]; - _sprites[DI_DOWNRIGHT] = NULL; + _sprites[DI_DOWNRIGHT] = nullptr; spr = new BaseSprite(_gameRef, _owner); if (!spr || DID_FAIL(spr->loadFile((char *)params, lifeTime, cacheType))) { cmd = PARSERR_GENERIC; @@ -268,12 +268,12 @@ BaseSprite *AdSpriteSet::getSprite(TDirection direction) { dir = NUM_DIRECTIONS - 1; } - BaseSprite *ret = NULL; + BaseSprite *ret = nullptr; // find nearest set sprite int numSteps = 0; for (int i = dir; i >= 0; i--) { - if (_sprites[i] != NULL) { + if (_sprites[i] != nullptr) { ret = _sprites[i]; numSteps = dir - i; break; @@ -281,8 +281,8 @@ BaseSprite *AdSpriteSet::getSprite(TDirection direction) { } for (int i = dir; i < NUM_DIRECTIONS; i++) { - if (_sprites[i] != NULL) { - if (ret == NULL || numSteps > i - dir) { + if (_sprites[i] != nullptr) { + if (ret == nullptr || numSteps > i - dir) { return _sprites[i]; } else { return ret; diff --git a/engines/wintermute/ad/ad_sprite_set.h b/engines/wintermute/ad/ad_sprite_set.h index ba5da0ff2e..3960b5dcc7 100644 --- a/engines/wintermute/ad/ad_sprite_set.h +++ b/engines/wintermute/ad/ad_sprite_set.h @@ -41,7 +41,7 @@ public: BaseSprite *getSprite(TDirection direction); DECLARE_PERSISTENT(AdSpriteSet, BaseObject) BaseObject *_owner; - AdSpriteSet(BaseGame *inGame, BaseObject *owner = NULL); + AdSpriteSet(BaseGame *inGame, BaseObject *owner = nullptr); virtual ~AdSpriteSet(); bool loadFile(const char *filename, int lifeTime = -1, TSpriteCacheType cacheType = CACHE_ALL); bool loadBuffer(byte *buffer, bool complete = true, int lifeTime = -1, TSpriteCacheType cacheType = CACHE_ALL); diff --git a/engines/wintermute/ad/ad_talk_def.cpp b/engines/wintermute/ad/ad_talk_def.cpp index a85cd7f986..4ad5d2ccc6 100644 --- a/engines/wintermute/ad/ad_talk_def.cpp +++ b/engines/wintermute/ad/ad_talk_def.cpp @@ -42,11 +42,11 @@ IMPLEMENT_PERSISTENT(AdTalkDef, false) ////////////////////////////////////////////////////////////////////////// AdTalkDef::AdTalkDef(BaseGame *inGame) : BaseObject(inGame) { - _defaultSpriteFilename = NULL; - _defaultSprite = NULL; + _defaultSpriteFilename = nullptr; + _defaultSprite = nullptr; - _defaultSpriteSetFilename = NULL; - _defaultSpriteSet = NULL; + _defaultSpriteSetFilename = nullptr; + _defaultSpriteSet = nullptr; } @@ -59,20 +59,20 @@ AdTalkDef::~AdTalkDef() { delete[] _defaultSpriteFilename; delete _defaultSprite; - _defaultSpriteFilename = NULL; - _defaultSprite = NULL; + _defaultSpriteFilename = nullptr; + _defaultSprite = nullptr; delete[] _defaultSpriteSetFilename; delete _defaultSpriteSet; - _defaultSpriteSetFilename = NULL; - _defaultSpriteSet = NULL; + _defaultSpriteSetFilename = nullptr; + _defaultSpriteSet = nullptr; } ////////////////////////////////////////////////////////////////////////// bool AdTalkDef::loadFile(const char *filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "AdTalkDef::LoadFile failed for file '%s'", filename); return STATUS_FAILED; } @@ -138,7 +138,7 @@ bool AdTalkDef::loadBuffer(byte *buffer, bool complete) { _nodes.add(node); } else { delete node; - node = NULL; + node = nullptr; cmd = PARSERR_GENERIC; } } @@ -157,7 +157,7 @@ bool AdTalkDef::loadBuffer(byte *buffer, bool complete) { _defaultSpriteSet = new AdSpriteSet(_gameRef); if (!_defaultSpriteSet || DID_FAIL(_defaultSpriteSet->loadBuffer(params, false))) { delete _defaultSpriteSet; - _defaultSpriteSet = NULL; + _defaultSpriteSet = nullptr; cmd = PARSERR_GENERIC; } } @@ -181,8 +181,8 @@ bool AdTalkDef::loadBuffer(byte *buffer, bool complete) { delete _defaultSprite; delete _defaultSpriteSet; - _defaultSprite = NULL; - _defaultSpriteSet = NULL; + _defaultSprite = nullptr; + _defaultSpriteSet = nullptr; if (_defaultSpriteFilename) { _defaultSprite = new BaseSprite(_gameRef); @@ -250,7 +250,7 @@ bool AdTalkDef::loadDefaultSprite() { _defaultSprite = new BaseSprite(_gameRef); if (!_defaultSprite || DID_FAIL(_defaultSprite->loadFile(_defaultSpriteFilename))) { delete _defaultSprite; - _defaultSprite = NULL; + _defaultSprite = nullptr; return STATUS_FAILED; } else { return STATUS_OK; @@ -259,7 +259,7 @@ bool AdTalkDef::loadDefaultSprite() { _defaultSpriteSet = new AdSpriteSet(_gameRef); if (!_defaultSpriteSet || DID_FAIL(_defaultSpriteSet->loadFile(_defaultSpriteSetFilename))) { delete _defaultSpriteSet; - _defaultSpriteSet = NULL; + _defaultSpriteSet = nullptr; return STATUS_FAILED; } else { return STATUS_OK; @@ -278,7 +278,7 @@ BaseSprite *AdTalkDef::getDefaultSprite(TDirection dir) { } else if (_defaultSpriteSet) { return _defaultSpriteSet->getSprite(dir); } else { - return NULL; + return nullptr; } } diff --git a/engines/wintermute/ad/ad_talk_holder.cpp b/engines/wintermute/ad/ad_talk_holder.cpp index cca4fdc2cb..ed2333a345 100644 --- a/engines/wintermute/ad/ad_talk_holder.cpp +++ b/engines/wintermute/ad/ad_talk_holder.cpp @@ -43,14 +43,14 @@ IMPLEMENT_PERSISTENT(AdTalkHolder, false) ////////////////////////////////////////////////////////////////////////// AdTalkHolder::AdTalkHolder(BaseGame *inGame) : AdObject(inGame) { - _sprite = NULL; + _sprite = nullptr; } ////////////////////////////////////////////////////////////////////////// AdTalkHolder::~AdTalkHolder() { delete _sprite; - _sprite = NULL; + _sprite = nullptr; for (uint32 i = 0; i < _talkSprites.size(); i++) { delete _talkSprites[i]; @@ -65,7 +65,7 @@ AdTalkHolder::~AdTalkHolder() { ////////////////////////////////////////////////////////////////////////// BaseSprite *AdTalkHolder::getTalkStance(const char *stance) { - BaseSprite *ret = NULL; + BaseSprite *ret = nullptr; // forced stance? @@ -78,7 +78,7 @@ BaseSprite *AdTalkHolder::getTalkStance(const char *stance) { if (DID_FAIL(res)) { _gameRef->LOG(res, "AdTalkHolder::GetTalkStance: error loading talk sprite (object:\"%s\" sprite:\"%s\")", getName(), _forcedTalkAnimName); delete _animSprite; - _animSprite = NULL; + _animSprite = nullptr; } else { return _animSprite; } @@ -86,7 +86,7 @@ BaseSprite *AdTalkHolder::getTalkStance(const char *stance) { } - if (stance != NULL) { + if (stance != nullptr) { // search special talk stances for (uint32 i = 0; i < _talkSpritesEx.size(); i++) { if (scumm_stricmp(_talkSpritesEx[i]->getName(), stance) == 0) { @@ -94,7 +94,7 @@ BaseSprite *AdTalkHolder::getTalkStance(const char *stance) { break; } } - if (ret == NULL) { + if (ret == nullptr) { // serach generic talk stances for (uint32 i = 0; i < _talkSprites.size(); i++) { if (scumm_stricmp(_talkSprites[i]->getName(), stance) == 0) { @@ -106,7 +106,7 @@ BaseSprite *AdTalkHolder::getTalkStance(const char *stance) { } // not a valid stance? get a random one - if (ret == NULL) { + if (ret == nullptr) { if (_talkSprites.size() < 1) { ret = _sprite; } else { @@ -138,12 +138,12 @@ bool AdTalkHolder::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisS } delete _sprite; - _sprite = NULL; + _sprite = nullptr; if (val->isNULL()) { - _sprite = NULL; + _sprite = nullptr; if (setCurrent) { - _currentSprite = NULL; + _currentSprite = nullptr; } stack->pushBool(true); } else { @@ -355,7 +355,7 @@ bool AdTalkHolder::scSetProperty(const char *name, ScValue *value) { ////////////////////////////////////////////////////////////////////////// // Item ////////////////////////////////////////////////////////////////////////// - if (strcmp(name, "Item")==0){ + if (strcmp(name, "Item")==0) { SetItem(value->getString()); return STATUS_OK; } diff --git a/engines/wintermute/ad/ad_talk_node.cpp b/engines/wintermute/ad/ad_talk_node.cpp index c909ee27ff..2e0985ed99 100644 --- a/engines/wintermute/ad/ad_talk_node.cpp +++ b/engines/wintermute/ad/ad_talk_node.cpp @@ -39,11 +39,11 @@ IMPLEMENT_PERSISTENT(AdTalkNode, false) ////////////////////////////////////////////////////////////////////////// AdTalkNode::AdTalkNode(BaseGame *inGame) : BaseClass(inGame) { - _sprite = NULL; - _spriteFilename = NULL; - _spriteSet = NULL; - _spriteSetFilename = NULL; - _comment = NULL; + _sprite = nullptr; + _spriteFilename = nullptr; + _spriteSet = nullptr; + _spriteSetFilename = nullptr; + _comment = nullptr; _startTime = _endTime = 0; _playToEnd = false; @@ -58,11 +58,11 @@ AdTalkNode::~AdTalkNode() { delete[] _spriteSetFilename; delete _spriteSet; delete _comment; - _spriteFilename = NULL; - _sprite = NULL; - _spriteSetFilename = NULL; - _spriteSet = NULL; - _comment = NULL; + _spriteFilename = nullptr; + _sprite = nullptr; + _spriteSetFilename = nullptr; + _spriteSet = nullptr; + _comment = nullptr; } @@ -123,7 +123,7 @@ bool AdTalkNode::loadBuffer(byte *buffer, bool complete) { _spriteSet = new AdSpriteSet(_gameRef); if (!_spriteSet || DID_FAIL(_spriteSet->loadBuffer(params, false))) { delete _spriteSet; - _spriteSet = NULL; + _spriteSet = nullptr; cmd = PARSERR_GENERIC; } } @@ -240,7 +240,7 @@ bool AdTalkNode::loadSprite() { _sprite = new BaseSprite(_gameRef); if (!_sprite || DID_FAIL(_sprite->loadFile(_spriteFilename))) { delete _sprite; - _sprite = NULL; + _sprite = nullptr; return STATUS_FAILED; } else { return STATUS_OK; @@ -249,7 +249,7 @@ bool AdTalkNode::loadSprite() { _spriteSet = new AdSpriteSet(_gameRef); if (!_spriteSet || DID_FAIL(_spriteSet->loadFile(_spriteSetFilename))) { delete _spriteSet; - _spriteSet = NULL; + _spriteSet = nullptr; return STATUS_FAILED; } else { return STATUS_OK; @@ -264,9 +264,9 @@ bool AdTalkNode::loadSprite() { bool AdTalkNode::isInTimeInterval(uint32 time, TDirection dir) { if (time >= _startTime) { if (_playToEnd) { - if ((_spriteFilename && _sprite == NULL) || (_sprite && _sprite->isFinished() == false)) { + if ((_spriteFilename && _sprite == nullptr) || (_sprite && _sprite->isFinished() == false)) { return true; - } else if ((_spriteSetFilename && _spriteSet == NULL) || (_spriteSet && _spriteSet->getSprite(dir) && _spriteSet->getSprite(dir)->isFinished() == false)) { + } else if ((_spriteSetFilename && _spriteSet == nullptr) || (_spriteSet && _spriteSet->getSprite(dir) && _spriteSet->getSprite(dir)->isFinished() == false)) { return true; } else { return false; @@ -288,7 +288,7 @@ BaseSprite *AdTalkNode::getSprite(TDirection dir) { } else if (_spriteSet) { return _spriteSet->getSprite(dir); } else { - return NULL; + return nullptr; } } diff --git a/engines/wintermute/ad/ad_waypoint_group.cpp b/engines/wintermute/ad/ad_waypoint_group.cpp index 81493ce769..96dece34b8 100644 --- a/engines/wintermute/ad/ad_waypoint_group.cpp +++ b/engines/wintermute/ad/ad_waypoint_group.cpp @@ -67,7 +67,7 @@ void AdWaypointGroup::cleanup() { ////////////////////////////////////////////////////////////////////////// bool AdWaypointGroup::loadFile(const char *filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "AdWaypointGroup::LoadFile failed for file '%s'", filename); return STATUS_FAILED; } diff --git a/engines/wintermute/ad/ad_waypoint_group.h b/engines/wintermute/ad/ad_waypoint_group.h index 13d6bbadd7..7e427313e6 100644 --- a/engines/wintermute/ad/ad_waypoint_group.h +++ b/engines/wintermute/ad/ad_waypoint_group.h @@ -35,22 +35,25 @@ namespace Wintermute { class BasePoint; class AdWaypointGroup : public BaseObject { public: - float _lastMimicScale; - int _lastMimicX; - int _lastMimicY; void cleanup(); bool mimic(AdWaypointGroup *wpt, float scale = 100.0f, int x = 0, int y = 0); DECLARE_PERSISTENT(AdWaypointGroup, BaseObject) virtual bool saveAsText(BaseDynamicBuffer *buffer, int indent); - bool _active; AdWaypointGroup(BaseGame *inGame); bool loadFile(const char *filename); bool loadBuffer(byte *buffer, bool complete = true); virtual ~AdWaypointGroup(); + + bool _active; BaseArray<BasePoint *> _points; - int _editorSelectedPoint; + virtual ScValue *scGetProperty(const Common::String &name); virtual bool scSetProperty(const char *name, ScValue *value); +private: + int _editorSelectedPoint; + float _lastMimicScale; + int _lastMimicX; + int _lastMimicY; }; } // end of namespace Wintermute diff --git a/engines/wintermute/base/base.cpp b/engines/wintermute/base/base.cpp index e351792e61..c0459b0ce5 100644 --- a/engines/wintermute/base/base.cpp +++ b/engines/wintermute/base/base.cpp @@ -42,7 +42,7 @@ BaseClass::BaseClass(BaseGame *gameOwner) { ////////////////////////////////////////////////////////////////////////// BaseClass::BaseClass() { - _gameRef = NULL; + _gameRef = nullptr; _persistable = true; } @@ -111,8 +111,8 @@ bool BaseClass::parseEditorProperty(byte *buffer, bool complete) { buffer = params; } - char *propName = NULL; - char *propValue = NULL; + char *propName = nullptr; + char *propValue = nullptr; while ((cmd = parser.getCommand((char **)&buffer, commands, (char **)¶ms)) > 0) { switch (cmd) { @@ -141,16 +141,16 @@ bool BaseClass::parseEditorProperty(byte *buffer, bool complete) { if (cmd == PARSERR_TOKENNOTFOUND) { delete[] propName; delete[] propValue; - propName = NULL; - propValue = NULL; + propName = nullptr; + propValue = nullptr; _gameRef->LOG(0, "Syntax error in EDITOR_PROPERTY definition"); return STATUS_FAILED; } - if (cmd == PARSERR_GENERIC || propName == NULL || propValue == NULL) { + if (cmd == PARSERR_GENERIC || propName == nullptr || propValue == nullptr) { delete[] propName; delete[] propValue; - propName = NULL; - propValue = NULL; + propName = nullptr; + propValue = nullptr; _gameRef->LOG(0, "Error loading EDITOR_PROPERTY definition"); return STATUS_FAILED; } @@ -160,8 +160,8 @@ bool BaseClass::parseEditorProperty(byte *buffer, bool complete) { delete[] propName; delete[] propValue; - propName = NULL; - propValue = NULL; + propName = nullptr; + propValue = nullptr; return STATUS_OK; } diff --git a/engines/wintermute/base/base.h b/engines/wintermute/base/base.h index 24820c748a..7f2796c6e0 100644 --- a/engines/wintermute/base/base.h +++ b/engines/wintermute/base/base.h @@ -44,7 +44,7 @@ class BaseClass { public: bool _persistable; bool setEditorProp(const Common::String &propName, const Common::String &propValue); - Common::String getEditorProp(const Common::String &propName, const Common::String &initVal = NULL); + Common::String getEditorProp(const Common::String &propName, const Common::String &initVal = nullptr); BaseClass(TDynamicConstructor, TDynamicConstructor) {} bool parseEditorProperty(byte *buffer, bool complete = true); virtual bool saveAsText(BaseDynamicBuffer *buffer, int indent = 0); diff --git a/engines/wintermute/base/base_active_rect.cpp b/engines/wintermute/base/base_active_rect.cpp index 4addf15be8..4c62cf9561 100644 --- a/engines/wintermute/base/base_active_rect.cpp +++ b/engines/wintermute/base/base_active_rect.cpp @@ -37,9 +37,9 @@ namespace Wintermute { ////////////////////////////////////////////////////////////////////// BaseActiveRect::BaseActiveRect(BaseGame *inGame) : BaseClass(inGame) { BasePlatform::setRectEmpty(&_rect); - _owner = NULL; - _frame = NULL; - _region = NULL; + _owner = nullptr; + _frame = nullptr; + _region = nullptr; _zoomX = 100; _zoomY = 100; _offsetX = _offsetY = 0; @@ -55,7 +55,7 @@ BaseActiveRect::BaseActiveRect(BaseGame *inGame, BaseObject *owner, BaseSubFrame _zoomX = zoomX; _zoomY = zoomY; _precise = precise; - _region = NULL; + _region = nullptr; _offsetX = _offsetY = 0; clipRect(); } @@ -69,7 +69,7 @@ BaseActiveRect::BaseActiveRect(BaseGame *inGame, BaseObject *owner, BaseRegion * _zoomX = 100; _zoomY = 100; _precise = true; - _frame = NULL; + _frame = nullptr; clipRect(); _offsetX = offsetX; _offsetY = offsetY; @@ -78,9 +78,9 @@ BaseActiveRect::BaseActiveRect(BaseGame *inGame, BaseObject *owner, BaseRegion * ////////////////////////////////////////////////////////////////////// BaseActiveRect::~BaseActiveRect() { - _owner = NULL; - _frame = NULL; - _region = NULL; + _owner = nullptr; + _frame = nullptr; + _region = nullptr; } diff --git a/engines/wintermute/base/base_active_rect.h b/engines/wintermute/base/base_active_rect.h index fcd2619b03..7ef8374814 100644 --- a/engines/wintermute/base/base_active_rect.h +++ b/engines/wintermute/base/base_active_rect.h @@ -48,7 +48,7 @@ public: int _offsetX; int _offsetY; Rect32 _rect; - BaseActiveRect(BaseGame *inGameOwner = NULL); + BaseActiveRect(BaseGame *inGameOwner = nullptr); BaseActiveRect(BaseGame *inGameOwner, BaseObject *owner, BaseSubFrame *frame, int x, int y, int width, int height, float zoomX = 100, float zoomY = 100, bool precise = true); BaseActiveRect(BaseGame *inGame, BaseObject *owner, BaseRegion *region, int offsetX, int offsetY); virtual ~BaseActiveRect(); diff --git a/engines/wintermute/base/base_dynamic_buffer.cpp b/engines/wintermute/base/base_dynamic_buffer.cpp index fc48e93c2b..f684420b1e 100644 --- a/engines/wintermute/base/base_dynamic_buffer.cpp +++ b/engines/wintermute/base/base_dynamic_buffer.cpp @@ -33,7 +33,7 @@ namespace Wintermute { ////////////////////////////////////////////////////////////////////////// BaseDynamicBuffer::BaseDynamicBuffer(BaseGame *inGame, uint32 initSize, uint32 growBy) { - _buffer = NULL; + _buffer = nullptr; _size = 0; _realSize = 0; @@ -56,7 +56,7 @@ void BaseDynamicBuffer::cleanup() { if (_buffer) { free(_buffer); } - _buffer = NULL; + _buffer = nullptr; _size = 0; _realSize = 0; _offset = 0; @@ -65,7 +65,7 @@ void BaseDynamicBuffer::cleanup() { ////////////////////////////////////////////////////////////////////////// -uint32 BaseDynamicBuffer::getSize() { +uint32 BaseDynamicBuffer::getSize() const { return _size; } @@ -164,7 +164,7 @@ char *BaseDynamicBuffer::getString() { _offset += len; if (!strcmp(ret, "(null)")) { - return NULL; + return nullptr; } else { return ret; } diff --git a/engines/wintermute/base/base_dynamic_buffer.h b/engines/wintermute/base/base_dynamic_buffer.h index 2d1a7fbe48..ad78ebad00 100644 --- a/engines/wintermute/base/base_dynamic_buffer.h +++ b/engines/wintermute/base/base_dynamic_buffer.h @@ -43,7 +43,7 @@ public: void putString(const char *val); bool getBytes(byte *buffer, uint32 size); bool putBytes(const byte *buffer, uint32 size); - uint32 getSize(); + uint32 getSize() const; bool init(uint32 initSize = 0); void cleanup(); BaseDynamicBuffer(BaseGame *inGame, uint32 initSize = 1000, uint32 growBy = 1000); diff --git a/engines/wintermute/base/base_engine.cpp b/engines/wintermute/base/base_engine.cpp index 8146d14beb..a13ca4d919 100644 --- a/engines/wintermute/base/base_engine.cpp +++ b/engines/wintermute/base/base_engine.cpp @@ -39,10 +39,10 @@ DECLARE_SINGLETON(Wintermute::BaseEngine); namespace Wintermute { BaseEngine::BaseEngine() { - _fileManager = NULL; - _gameRef = NULL; - _classReg = NULL; - _rnd = NULL; + _fileManager = nullptr; + _gameRef = nullptr; + _classReg = nullptr; + _rnd = nullptr; _gameId = ""; } diff --git a/engines/wintermute/base/base_engine.h b/engines/wintermute/base/base_engine.h index 1ed0e3ab01..f04c594699 100644 --- a/engines/wintermute/base/base_engine.h +++ b/engines/wintermute/base/base_engine.h @@ -57,7 +57,7 @@ public: Common::RandomSource *getRandomSource() { return _rnd; } uint32 randInt(int from, int to); - SystemClassRegistry *getClassRegistry(){ return _classReg; } + SystemClassRegistry *getClassRegistry() { return _classReg; } BaseGame *getGameRef() { return _gameRef; } BaseFileManager *getFileManager() { return _fileManager; } static void LOG(bool res, const char *fmt, ...); diff --git a/engines/wintermute/base/base_fader.cpp b/engines/wintermute/base/base_fader.cpp index 985718fcab..8f74d71caf 100644 --- a/engines/wintermute/base/base_fader.cpp +++ b/engines/wintermute/base/base_fader.cpp @@ -164,7 +164,7 @@ bool BaseFader::fadeOut(uint32 targetColor, uint32 duration, bool system) { ////////////////////////////////////////////////////////////////////////// -uint32 BaseFader::getCurrentColor() { +uint32 BaseFader::getCurrentColor() const { return BYTETORGBA(_red, _green, _blue, _currentAlpha); } diff --git a/engines/wintermute/base/base_fader.h b/engines/wintermute/base/base_fader.h index 116c8c963d..845ce2f244 100644 --- a/engines/wintermute/base/base_fader.h +++ b/engines/wintermute/base/base_fader.h @@ -36,7 +36,7 @@ namespace Wintermute { class BaseFader : public BaseObject { public: - uint32 getCurrentColor(); + uint32 getCurrentColor() const; bool fadeOut(uint32 targetColor, uint32 duration, bool system = false); bool fadeIn(uint32 sourceColor, uint32 duration, bool system = false); bool deactivate(); diff --git a/engines/wintermute/base/base_file_manager.cpp b/engines/wintermute/base/base_file_manager.cpp index b726c0c66f..08358f9033 100644 --- a/engines/wintermute/base/base_file_manager.cpp +++ b/engines/wintermute/base/base_file_manager.cpp @@ -31,7 +31,6 @@ #include "engines/wintermute/base/file/base_disk_file.h" #include "engines/wintermute/base/file/base_save_thumb_file.h" #include "engines/wintermute/base/file/base_package.h" -#include "engines/wintermute/base/file/base_resources.h" #include "engines/wintermute/base/base_engine.h" #include "engines/wintermute/wintermute.h" #include "common/debug.h" @@ -45,6 +44,7 @@ #include "common/file.h" #include "common/savefile.h" #include "common/fs.h" +#include "common/unzip.h" namespace Wintermute { @@ -55,6 +55,8 @@ namespace Wintermute { ////////////////////////////////////////////////////////////////////// BaseFileManager::BaseFileManager(Common::Language lang) { _language = lang; + _resources = nullptr; + initResources(); initPaths(); registerPackages(); } @@ -79,37 +81,41 @@ bool BaseFileManager::cleanup() { // delete packages _packages.clear(); + // get rid of the resources: + delete _resources; + _resources = NULL; + return STATUS_OK; } ////////////////////////////////////////////////////////////////////// byte *BaseFileManager::readWholeFile(const Common::String &filename, uint32 *size, bool mustExist) { - byte *buffer = NULL; + byte *buffer = nullptr; Common::SeekableReadStream *file = openFile(filename); if (!file) { if (mustExist) { debugC(kWintermuteDebugFileAccess | kWintermuteDebugLog, "Error opening file '%s'", filename.c_str()); } - return NULL; + return nullptr; } buffer = new byte[file->size() + 1]; - if (buffer == NULL) { + if (buffer == nullptr) { debugC(kWintermuteDebugFileAccess | kWintermuteDebugLog, "Error allocating buffer for file '%s' (%d bytes)", filename.c_str(), file->size() + 1); closeFile(file); - return NULL; + return nullptr; } if (file->read(buffer, (uint32)file->size()) != (uint32)file->size()) { debugC(kWintermuteDebugFileAccess | kWintermuteDebugLog, "Error reading file '%s'", filename.c_str()); closeFile(file); delete[] buffer; - return NULL; + return nullptr; }; buffer[file->size()] = '\0'; - if (size != NULL) { + if (size != nullptr) { *size = file->size(); } closeFile(file); @@ -224,11 +230,21 @@ bool BaseFileManager::registerPackage(Common::FSNode file, const Common::String return STATUS_OK; } +void BaseFileManager::initResources() { + _resources = Common::makeZipArchive("wintermute.zip"); + if (!_resources) { + error("Couldn't load wintermute.zip"); + } + assert(_resources->hasFile("syste_font.bmp")); + assert(_resources->hasFile("invalid.bmp")); + assert(_resources->hasFile("invalid_debug.bmp")); +} + ////////////////////////////////////////////////////////////////////////// Common::SeekableReadStream *BaseFileManager::openPkgFile(const Common::String &filename) { Common::String upcName = filename; upcName.toUppercase(); - Common::SeekableReadStream *file = NULL; + Common::SeekableReadStream *file = nullptr; char fileName[MAX_PATH_LENGTH]; strcpy(fileName, upcName.c_str()); @@ -240,7 +256,7 @@ Common::SeekableReadStream *BaseFileManager::openPkgFile(const Common::String &f } Common::ArchiveMemberPtr entry = _packages.getMember(upcName); if (!entry) { - return NULL; + return nullptr; } file = entry->createReadStream(); return file; @@ -261,7 +277,7 @@ bool BaseFileManager::hasFile(const Common::String &filename) { if (_packages.hasFile(filename)) { return true; // We don't bother checking if the file can actually be opened, something bigger is wrong if that is the case. } - if (BaseResources::hasFile(filename)) { + if (_resources->hasFile(filename)) { return true; } return false; @@ -270,7 +286,7 @@ bool BaseFileManager::hasFile(const Common::String &filename) { ////////////////////////////////////////////////////////////////////////// Common::SeekableReadStream *BaseFileManager::openFile(const Common::String &filename, bool absPathWarning, bool keepTrackOf) { if (strcmp(filename.c_str(), "") == 0) { - return NULL; + return nullptr; } debugC(kWintermuteDebugFileAccess, "Open file %s", filename.c_str()); @@ -297,7 +313,7 @@ bool BaseFileManager::closeFile(Common::SeekableReadStream *File) { ////////////////////////////////////////////////////////////////////////// Common::SeekableReadStream *BaseFileManager::openFileRaw(const Common::String &filename) { - Common::SeekableReadStream *ret = NULL; + Common::SeekableReadStream *ret = nullptr; if (scumm_strnicmp(filename.c_str(), "savegame:", 9) == 0) { if (!BaseEngine::instance().getGameRef()) { @@ -321,20 +337,20 @@ Common::SeekableReadStream *BaseFileManager::openFileRaw(const Common::String &f return ret; } - ret = BaseResources::getFile(filename); + ret = _resources->createReadStreamForMember(filename); if (ret) { return ret; } debugC(kWintermuteDebugFileAccess ,"BFileManager::OpenFileRaw - Failed to open %s", filename.c_str()); - return NULL; + return nullptr; } BaseFileManager *BaseFileManager::getEngineInstance() { if (BaseEngine::instance().getFileManager()) { return BaseEngine::instance().getFileManager(); } - return NULL; + return nullptr; } } // end of namespace Wintermute diff --git a/engines/wintermute/base/base_file_manager.h b/engines/wintermute/base/base_file_manager.h index 70aff49bbb..5fc626a314 100644 --- a/engines/wintermute/base/base_file_manager.h +++ b/engines/wintermute/base/base_file_manager.h @@ -43,7 +43,7 @@ public: bool closeFile(Common::SeekableReadStream *File); bool hasFile(const Common::String &filename); Common::SeekableReadStream *openFile(const Common::String &filename, bool absPathWarning = true, bool keepTrackOf = true); - byte *readWholeFile(const Common::String &filename, uint32 *size = NULL, bool mustExist = true); + byte *readWholeFile(const Common::String &filename, uint32 *size = nullptr, bool mustExist = true); BaseFileManager(Common::Language lang); virtual ~BaseFileManager(); @@ -59,6 +59,7 @@ private: bool initPaths(); bool addPath(TPathType type, const Common::FSNode &path); bool registerPackages(); + void initResources(); Common::SeekableReadStream *openFileRaw(const Common::String &filename); Common::SeekableReadStream *openPkgFile(const Common::String &filename); Common::FSList _packagePaths; @@ -67,6 +68,7 @@ private: Common::SearchSet _packages; Common::Array<Common::SeekableReadStream *> _openFiles; Common::Language _language; + Common::Archive *_resources; // This class is intentionally not a subclass of Base, as it needs to be used by // the detector too, without launching the entire engine: }; diff --git a/engines/wintermute/base/base_frame.cpp b/engines/wintermute/base/base_frame.cpp index 7c64144480..8a190c729b 100644 --- a/engines/wintermute/base/base_frame.cpp +++ b/engines/wintermute/base/base_frame.cpp @@ -48,7 +48,7 @@ BaseFrame::BaseFrame(BaseGame *inGame) : BaseScriptable(inGame, true) { _delay = 0; _moveX = _moveY = 0; - _sound = NULL; + _sound = nullptr; _killSound = false; _editorExpanded = false; @@ -59,7 +59,7 @@ BaseFrame::BaseFrame(BaseGame *inGame) : BaseScriptable(inGame, true) { ////////////////////////////////////////////////////////////////////// BaseFrame::~BaseFrame() { delete _sound; - _sound = NULL; + _sound = nullptr; for (uint32 i = 0; i < _subframes.size(); i++) { delete _subframes[i]; @@ -68,7 +68,7 @@ BaseFrame::~BaseFrame() { for (uint32 i = 0; i < _applyEvent.size(); i++) { delete[] _applyEvent[i]; - _applyEvent[i] = NULL; + _applyEvent[i] = nullptr; } _applyEvent.clear(); } @@ -181,7 +181,7 @@ bool BaseFrame::loadBuffer(byte *buffer, int lifeTime, bool keepLoaded) { bool mirrorX = false; bool mirrorY = false; BasePlatform::setRectEmpty(&rect); - char *surface_file = NULL; + char *surface_file = nullptr; while ((cmd = parser.getCommand((char **)&buffer, commands, ¶ms)) > 0) { switch (cmd) { @@ -260,7 +260,7 @@ bool BaseFrame::loadBuffer(byte *buffer, int lifeTime, bool keepLoaded) { case TOKEN_SOUND: { if (_sound) { delete _sound; - _sound = NULL; + _sound = nullptr; } _sound = new BaseSound(_gameRef); if (!_sound || DID_FAIL(_sound->setSound(params, Audio::Mixer::kSFXSoundType, false))) { @@ -268,7 +268,7 @@ bool BaseFrame::loadBuffer(byte *buffer, int lifeTime, bool keepLoaded) { _gameRef->LOG(0, "Error loading sound '%s'.", params); } delete _sound; - _sound = NULL; + _sound = nullptr; } } break; @@ -305,7 +305,7 @@ bool BaseFrame::loadBuffer(byte *buffer, int lifeTime, bool keepLoaded) { BaseSubFrame *sub = new BaseSubFrame(_gameRef); - if (surface_file != NULL) { + if (surface_file != nullptr) { if (custoTrans) { sub->setSurface(surface_file, false, r, g, b, lifeTime, keepLoaded); } else { @@ -452,14 +452,14 @@ bool BaseFrame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStac stack->correctParams(1); ScValue *val = stack->pop(); delete _sound; - _sound = NULL; + _sound = nullptr; if (!val->isNULL()) { _sound = new BaseSound(_gameRef); if (!_sound || DID_FAIL(_sound->setSound(val->getString(), Audio::Mixer::kSFXSoundType, false))) { stack->pushBool(false); delete _sound; - _sound = NULL; + _sound = nullptr; } else { stack->pushBool(true); } @@ -516,13 +516,13 @@ bool BaseFrame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStac else if (strcmp(name, "AddSubframe") == 0) { stack->correctParams(1); ScValue *val = stack->pop(); - const char *filename = NULL; + const char *filename = nullptr; if (!val->isNULL()) { filename = val->getString(); } BaseSubFrame *sub = new BaseSubFrame(_gameRef); - if (filename != NULL) { + if (filename != nullptr) { sub->setSurface(filename); sub->setDefaultRect(); } @@ -543,13 +543,13 @@ bool BaseFrame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStac } ScValue *val = stack->pop(); - const char *filename = NULL; + const char *filename = nullptr; if (!val->isNULL()) { filename = val->getString(); } BaseSubFrame *sub = new BaseSubFrame(_gameRef); - if (filename != NULL) { + if (filename != nullptr) { sub->setSurface(filename); } diff --git a/engines/wintermute/base/base_frame.h b/engines/wintermute/base/base_frame.h index 7c5d893e70..5ed0b92bba 100644 --- a/engines/wintermute/base/base_frame.h +++ b/engines/wintermute/base/base_frame.h @@ -51,7 +51,7 @@ public: int _moveX; uint32 _delay; BaseArray<BaseSubFrame *> _subframes; - bool draw(int x, int y, BaseObject *registerOwner = NULL, float zoomX = 100, float zoomY = 100, bool precise = true, uint32 alpha = 0xFFFFFFFF, bool allFrames = false, float rotate = 0.0f, TSpriteBlendMode blendMode = BLEND_NORMAL); + bool draw(int x, int y, BaseObject *registerOwner = nullptr, float zoomX = 100, float zoomY = 100, bool precise = true, uint32 alpha = 0xFFFFFFFF, bool allFrames = false, float rotate = 0.0f, TSpriteBlendMode blendMode = BLEND_NORMAL); bool loadBuffer(byte *buffer, int lifeTime, bool keepLoaded); BaseFrame(BaseGame *inGame); diff --git a/engines/wintermute/base/base_game.cpp b/engines/wintermute/base/base_game.cpp index b6886b7a33..0248c349e7 100644 --- a/engines/wintermute/base/base_game.cpp +++ b/engines/wintermute/base/base_game.cpp @@ -29,17 +29,15 @@ #include "engines/wintermute/dcgf.h" #include "engines/wintermute/base/base_engine.h" #include "engines/wintermute/base/base_game.h" +#include "engines/wintermute/base/base_game_music.h" #include "engines/wintermute/base/base_fader.h" #include "engines/wintermute/base/base_file_manager.h" #include "engines/wintermute/base/font/base_font.h" #include "engines/wintermute/base/font/base_font_storage.h" -#include "engines/wintermute/base/gfx/base_image.h" -#include "engines/wintermute/base/gfx/base_surface.h" #include "engines/wintermute/base/gfx/base_renderer.h" #include "engines/wintermute/base/base_keyboard_state.h" #include "engines/wintermute/base/base_parser.h" #include "engines/wintermute/base/base_quick_msg.h" -#include "engines/wintermute/base/sound/base_sound.h" #include "engines/wintermute/base/sound/base_sound_manager.h" #include "engines/wintermute/base/base_sprite.h" #include "engines/wintermute/base/base_sub_frame.h" @@ -54,7 +52,7 @@ #include "engines/wintermute/base/scriptables/script_engine.h" #include "engines/wintermute/base/scriptables/script_stack.h" #include "engines/wintermute/base/scriptables/script.h" -#include "engines/wintermute/base/scriptables/script_ext_math.h" +#include "engines/wintermute/base/sound/base_sound.h" #include "engines/wintermute/video/video_player.h" #include "engines/wintermute/video/video_theora_player.h" #include "engines/wintermute/utils/utils.h" @@ -93,30 +91,30 @@ BaseGame::BaseGame(const Common::String &gameId) : BaseObject(this), _gameId(gam _interactive = true; _origInteractive = false; - _surfaceStorage = NULL; - _fontStorage = NULL; - _renderer = NULL; - _soundMgr = NULL; - _transMgr = NULL; - _scEngine = NULL; - _keyboardState = NULL; + _surfaceStorage = nullptr; + _fontStorage = nullptr; + _renderer = nullptr; + _soundMgr = nullptr; + _transMgr = nullptr; + _scEngine = nullptr; + _keyboardState = nullptr; - _mathClass = NULL; + _mathClass = nullptr; - _debugLogFile = NULL; + _debugLogFile = nullptr; _debugDebugMode = false; _debugShowFPS = false; - _systemFont = NULL; - _videoFont = NULL; + _systemFont = nullptr; + _videoFont = nullptr; - _videoPlayer = NULL; - _theoraPlayer = NULL; + _videoPlayer = nullptr; + _theoraPlayer = nullptr; - _mainObject = NULL; - _activeObject = NULL; + _mainObject = nullptr; + _activeObject = nullptr; - _fader = NULL; + _fader = nullptr; _offsetX = _offsetY = 0; _offsetPercentX = _offsetPercentY = 0.0f; @@ -136,21 +134,18 @@ BaseGame::BaseGame(const Common::String &gameId) : BaseObject(this), _gameId(gam _mousePos.x = _mousePos.y = 0; _mouseLeftDown = _mouseRightDown = _mouseMidlleDown = false; - _capturedObject = NULL; + _capturedObject = nullptr; // FPS counters _lastTime = _fpsTime = _deltaTime = _framesRendered = _fps = 0; - _cursorNoninteractive = NULL; + _cursorNoninteractive = nullptr; _useD3D = false; _stringTable = new BaseStringTable(this); - for (int i = 0; i < NUM_MUSIC_CHANNELS; i++) { - _music[i] = NULL; - _musicStartTime[i] = 0; - } + _musicSystem = new BaseGameMusic(this); _settingsResWidth = 800; _settingsResHeight = 600; @@ -158,7 +153,7 @@ BaseGame::BaseGame(const Common::String &gameId) : BaseObject(this), _gameId(gam _settingsRequireSound = false; _settingsTLMode = 0; _settingsAllowWindowed = true; - _settingsGameFile = NULL; + _settingsGameFile = nullptr; _settingsAllowAdvanced = false; _settingsAllowAccessTab = true; _settingsAllowAboutTab = true; @@ -167,7 +162,7 @@ BaseGame::BaseGame(const Common::String &gameId) : BaseObject(this), _gameId(gam _editorForceScripts = false; _editorAlwaysRegister = false; - _focusedWindow = NULL; + _focusedWindow = nullptr; _loadInProgress = false; @@ -181,8 +176,8 @@ BaseGame::BaseGame(const Common::String &gameId) : BaseObject(this), _gameId(gam _editorMode = false; //_doNotExpandStrings = false; - _engineLogCallback = NULL; - _engineLogCallbackData = NULL; + _engineLogCallback = nullptr; + _engineLogCallbackData = nullptr; _smartCache = false; _surfaceGCCycleTime = 10000; @@ -198,21 +193,12 @@ BaseGame::BaseGame(const Common::String &gameId) : BaseObject(this), _gameId(gam _thumbnailWidth = _thumbnailHeight = 0; _richSavedGames = false; - _savedGameExt = NULL; - BaseUtils::setString(&_savedGameExt, "dsv"); - - _musicCrossfadeRunning = false; - _musicCrossfadeStartTime = 0; - _musicCrossfadeLength = 0; - _musicCrossfadeChannel1 = -1; - _musicCrossfadeChannel2 = -1; - _musicCrossfadeSwap = false; - - _localSaveDir = NULL; - BaseUtils::setString(&_localSaveDir, "saves"); + _savedGameExt = "dsv"; + _localSaveDir = "saves"; + _saveDirChecked = false; - _loadingIcon = NULL; + _loadingIcon = nullptr; _loadingIconX = _loadingIconY = 0; _loadingIconPersistent = false; @@ -222,8 +208,7 @@ BaseGame::BaseGame(const Common::String &gameId) : BaseObject(this), _gameId(gam _soundBufferSizeSec = 3; _suspendedRendering = false; - _lastCursor = NULL; - + _lastCursor = nullptr; BasePlatform::setRectEmpty(&_mouseLockRect); @@ -231,7 +216,7 @@ BaseGame::BaseGame(const Common::String &gameId) : BaseObject(this), _gameId(gam _lastMiniUpdate = 0; _miniUpdateEnabled = false; - _cachedThumbnail = NULL; + _cachedThumbnail = nullptr; _autorunDisabled = false; @@ -268,9 +253,7 @@ BaseGame::~BaseGame() { cleanup(); - delete[] _localSaveDir; delete[] _settingsGameFile; - delete[] _savedGameExt; delete _cachedThumbnail; @@ -287,25 +270,25 @@ BaseGame::~BaseGame() { delete _renderer; delete _stringTable; + delete _musicSystem; - _localSaveDir = NULL; - _settingsGameFile = NULL; - _savedGameExt = NULL; + _settingsGameFile = nullptr; - _cachedThumbnail = NULL; + _cachedThumbnail = nullptr; - _mathClass = NULL; + _mathClass = nullptr; - _transMgr = NULL; - _scEngine = NULL; - _fontStorage = NULL; - _surfaceStorage = NULL; - _videoPlayer = NULL; - _theoraPlayer = NULL; - _soundMgr = NULL; + _transMgr = nullptr; + _scEngine = nullptr; + _fontStorage = nullptr; + _surfaceStorage = nullptr; + _videoPlayer = nullptr; + _theoraPlayer = nullptr; + _soundMgr = nullptr; - _renderer = NULL; - _stringTable = NULL; + _renderer = nullptr; + _stringTable = nullptr; + _musicSystem = nullptr; DEBUG_DebugDisable(); debugC(kWintermuteDebugLog, "--- shutting down normally ---\n"); @@ -315,52 +298,48 @@ BaseGame::~BaseGame() { ////////////////////////////////////////////////////////////////////////// bool BaseGame::cleanup() { delete _loadingIcon; - _loadingIcon = NULL; + _loadingIcon = nullptr; - _engineLogCallback = NULL; - _engineLogCallbackData = NULL; + _engineLogCallback = nullptr; + _engineLogCallbackData = nullptr; - for (int i = 0; i < NUM_MUSIC_CHANNELS; i++) { - delete _music[i]; - _music[i] = NULL; - _musicStartTime[i] = 0; - } + _musicSystem->cleanup(); unregisterObject(_fader); - _fader = NULL; + _fader = nullptr; for (uint32 i = 0; i < _regObjects.size(); i++) { delete _regObjects[i]; - _regObjects[i] = NULL; + _regObjects[i] = nullptr; } _regObjects.clear(); _windows.clear(); // refs only - _focusedWindow = NULL; // ref only + _focusedWindow = nullptr; // ref only delete _cursorNoninteractive; delete _cursor; delete _activeCursor; - _cursorNoninteractive = NULL; - _cursor = NULL; - _activeCursor = NULL; + _cursorNoninteractive = nullptr; + _cursor = nullptr; + _activeCursor = nullptr; delete _scValue; delete _sFX; - _scValue = NULL; - _sFX = NULL; + _scValue = nullptr; + _sFX = nullptr; for (uint32 i = 0; i < _scripts.size(); i++) { - _scripts[i]->_owner = NULL; + _scripts[i]->_owner = nullptr; _scripts[i]->finish(); } _scripts.clear(); _fontStorage->removeFont(_systemFont); - _systemFont = NULL; + _systemFont = nullptr; _fontStorage->removeFont(_videoFont); - _videoFont = NULL; + _videoFont = nullptr; for (uint32 i = 0; i < _quickMessages.size(); i++) { delete _quickMessages[i]; @@ -370,17 +349,17 @@ bool BaseGame::cleanup() { _viewportStack.clear(); _viewportSP = -1; - setName(NULL); - setFilename(NULL); + setName(nullptr); + setFilename(nullptr); for (int i = 0; i < 7; i++) { delete[] _caption[i]; - _caption[i] = NULL; + _caption[i] = nullptr; } - _lastCursor = NULL; + _lastCursor = nullptr; delete _keyboardState; - _keyboardState = NULL; + _keyboardState = nullptr; return STATUS_OK; } @@ -391,47 +370,47 @@ bool BaseGame::initialize1() { bool loaded = false; // Not really a loop, but a goto-replacement. while (!loaded) { _surfaceStorage = new BaseSurfaceStorage(this); - if (_surfaceStorage == NULL) { + if (_surfaceStorage == nullptr) { break; } _fontStorage = new BaseFontStorage(this); - if (_fontStorage == NULL) { + if (_fontStorage == nullptr) { break; } _soundMgr = new BaseSoundMgr(this); - if (_soundMgr == NULL) { + if (_soundMgr == nullptr) { break; } - _mathClass = new SXMath(this); - if (_mathClass == NULL) { + _mathClass = makeSXMath(this); + if (_mathClass == nullptr) { break; } _scEngine = new ScEngine(this); - if (_scEngine == NULL) { + if (_scEngine == nullptr) { break; } _videoPlayer = new VideoPlayer(this); - if (_videoPlayer == NULL) { + if (_videoPlayer == nullptr) { break; } _transMgr = new BaseTransitionMgr(this); - if (_transMgr == NULL) { + if (_transMgr == nullptr) { break; } _keyboardState = new BaseKeyboardState(this); - if (_keyboardState == NULL) { + if (_keyboardState == nullptr) { break; } _fader = new BaseFader(this); - if (_fader == NULL) { + if (_fader == nullptr) { break; } registerObject(_fader); @@ -457,7 +436,7 @@ bool BaseGame::initialize1() { ////////////////////////////////////////////////////////////////////// bool BaseGame::initialize2() { // we know whether we are going to be accelerated _renderer = makeOSystemRenderer(this); - if (_renderer == NULL) { + if (_renderer == nullptr) { return STATUS_FAILED; } @@ -500,10 +479,10 @@ void BaseGame::DEBUG_DebugEnable(const char *filename) { ////////////////////////////////////////////////////////////////////// void BaseGame::DEBUG_DebugDisable() { - if (_debugLogFile != NULL) { + if (_debugLogFile != nullptr) { LOG(0, "********** DEBUG LOG CLOSED ********************************************"); //fclose((FILE *)_debugLogFile); - _debugLogFile = NULL; + _debugLogFile = nullptr; } _debugDebugMode = false; } @@ -552,13 +531,13 @@ bool BaseGame::initLoop() { _currentTime = g_system->getMillis(); _renderer->initLoop(); - updateMusicCrossfade(); + _musicSystem->updateMusicCrossfade(); _surfaceStorage->initLoop(); _fontStorage->initLoop(); - //_activeObject = NULL; + //_activeObject = nullptr; // count FPS _deltaTime = _currentTime - _lastTime; @@ -587,7 +566,7 @@ bool BaseGame::initLoop() { getMousePos(&_mousePos); - _focusedWindow = NULL; + _focusedWindow = nullptr; for (int i = _windows.size() - 1; i >= 0; i--) { if (_windows[i]->_visible) { _focusedWindow = _windows[i]; @@ -625,10 +604,10 @@ void BaseGame::setOffset(int offsetX, int offsetY) { ////////////////////////////////////////////////////////////////////////// void BaseGame::getOffset(int *offsetX, int *offsetY) { - if (offsetX != NULL) { + if (offsetX != nullptr) { *offsetX = _offsetX; } - if (offsetY != NULL) { + if (offsetY != nullptr) { *offsetY = _offsetY; } } @@ -637,7 +616,7 @@ void BaseGame::getOffset(int *offsetX, int *offsetY) { ////////////////////////////////////////////////////////////////////////// bool BaseGame::loadFile(const char *filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "BaseGame::LoadFile failed for file '%s'", filename); return STATUS_FAILED; } @@ -788,7 +767,7 @@ bool BaseGame::loadBuffer(byte *buffer, bool complete) { if (_systemFont) { _fontStorage->removeFont(_systemFont); } - _systemFont = NULL; + _systemFont = nullptr; _systemFont = _gameRef->_fontStorage->addFont((char *)params); break; @@ -797,7 +776,7 @@ bool BaseGame::loadBuffer(byte *buffer, bool complete) { if (_videoFont) { _fontStorage->removeFont(_videoFont); } - _videoFont = NULL; + _videoFont = nullptr; _videoFont = _gameRef->_fontStorage->addFont((char *)params); break; @@ -808,18 +787,18 @@ bool BaseGame::loadBuffer(byte *buffer, bool complete) { _cursor = new BaseSprite(_gameRef); if (!_cursor || DID_FAIL(_cursor->loadFile((char *)params))) { delete _cursor; - _cursor = NULL; + _cursor = nullptr; cmd = PARSERR_GENERIC; } break; case TOKEN_ACTIVE_CURSOR: delete _activeCursor; - _activeCursor = NULL; + _activeCursor = nullptr; _activeCursor = new BaseSprite(_gameRef); if (!_activeCursor || DID_FAIL(_activeCursor->loadFile((char *)params))) { delete _activeCursor; - _activeCursor = NULL; + _activeCursor = nullptr; cmd = PARSERR_GENERIC; } break; @@ -829,7 +808,7 @@ bool BaseGame::loadBuffer(byte *buffer, bool complete) { _cursorNoninteractive = new BaseSprite(_gameRef); if (!_cursorNoninteractive || DID_FAIL(_cursorNoninteractive->loadFile((char *)params))) { delete _cursorNoninteractive; - _cursorNoninteractive = NULL; + _cursorNoninteractive = nullptr; cmd = PARSERR_GENERIC; } break; @@ -918,7 +897,7 @@ bool BaseGame::loadBuffer(byte *buffer, bool complete) { break; case TOKEN_LOCAL_SAVE_DIR: - BaseUtils::setString(&_localSaveDir, (char *)params); + _localSaveDir = (char *)params; break; case TOKEN_COMPAT_KILL_METHOD_THREADS: @@ -1077,7 +1056,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack stack->pushNative(win, true); } else { delete win; - win = NULL; + win = nullptr; stack->pushNULL(); } return STATUS_OK; @@ -1097,272 +1076,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack return STATUS_OK; } - ////////////////////////////////////////////////////////////////////////// - // PlayMusic / PlayMusicChannel - ////////////////////////////////////////////////////////////////////////// - else if (strcmp(name, "PlayMusic") == 0 || strcmp(name, "PlayMusicChannel") == 0) { - int channel = 0; - if (strcmp(name, "PlayMusic") == 0) { - stack->correctParams(3); - } else { - stack->correctParams(4); - channel = stack->pop()->getInt(); - } - - const char *filename = stack->pop()->getString(); - ScValue *valLooping = stack->pop(); - bool looping = valLooping->isNULL() ? true : valLooping->getBool(); - - ScValue *valLoopStart = stack->pop(); - uint32 loopStart = (uint32)(valLoopStart->isNULL() ? 0 : valLoopStart->getInt()); - - - if (DID_FAIL(playMusic(channel, filename, looping, loopStart))) { - stack->pushBool(false); - } else { - stack->pushBool(true); - } - return STATUS_OK; - } - - ////////////////////////////////////////////////////////////////////////// - // StopMusic / StopMusicChannel - ////////////////////////////////////////////////////////////////////////// - else if (strcmp(name, "StopMusic") == 0 || strcmp(name, "StopMusicChannel") == 0) { - int channel = 0; - - if (strcmp(name, "StopMusic") == 0) { - stack->correctParams(0); - } else { - stack->correctParams(1); - channel = stack->pop()->getInt(); - } - - if (DID_FAIL(stopMusic(channel))) { - stack->pushBool(false); - } else { - stack->pushBool(true); - } - return STATUS_OK; - } - - ////////////////////////////////////////////////////////////////////////// - // PauseMusic / PauseMusicChannel - ////////////////////////////////////////////////////////////////////////// - else if (strcmp(name, "PauseMusic") == 0 || strcmp(name, "PauseMusicChannel") == 0) { - int channel = 0; - - if (strcmp(name, "PauseMusic") == 0) { - stack->correctParams(0); - } else { - stack->correctParams(1); - channel = stack->pop()->getInt(); - } - - if (DID_FAIL(pauseMusic(channel))) { - stack->pushBool(false); - } else { - stack->pushBool(true); - } - return STATUS_OK; - } - - ////////////////////////////////////////////////////////////////////////// - // ResumeMusic / ResumeMusicChannel - ////////////////////////////////////////////////////////////////////////// - else if (strcmp(name, "ResumeMusic") == 0 || strcmp(name, "ResumeMusicChannel") == 0) { - int channel = 0; - if (strcmp(name, "ResumeMusic") == 0) { - stack->correctParams(0); - } else { - stack->correctParams(1); - channel = stack->pop()->getInt(); - } - - if (DID_FAIL(resumeMusic(channel))) { - stack->pushBool(false); - } else { - stack->pushBool(true); - } - return STATUS_OK; - } - - ////////////////////////////////////////////////////////////////////////// - // GetMusic / GetMusicChannel - ////////////////////////////////////////////////////////////////////////// - else if (strcmp(name, "GetMusic") == 0 || strcmp(name, "GetMusicChannel") == 0) { - int channel = 0; - if (strcmp(name, "GetMusic") == 0) { - stack->correctParams(0); - } else { - stack->correctParams(1); - channel = stack->pop()->getInt(); - } - if (channel < 0 || channel >= NUM_MUSIC_CHANNELS) { - stack->pushNULL(); - } else { - if (!_music[channel] || !_music[channel]->getFilename()) { - stack->pushNULL(); - } else { - stack->pushString(_music[channel]->getFilename()); - } - } - return STATUS_OK; - } - - ////////////////////////////////////////////////////////////////////////// - // SetMusicPosition / SetMusicChannelPosition - ////////////////////////////////////////////////////////////////////////// - else if (strcmp(name, "SetMusicPosition") == 0 || strcmp(name, "SetMusicChannelPosition") == 0 || strcmp(name, "SetMusicPositionChannel") == 0) { - int channel = 0; - if (strcmp(name, "SetMusicPosition") == 0) { - stack->correctParams(1); - } else { - stack->correctParams(2); - channel = stack->pop()->getInt(); - } - - uint32 time = stack->pop()->getInt(); - - if (DID_FAIL(setMusicStartTime(channel, time))) { - stack->pushBool(false); - } else { - stack->pushBool(true); - } - - return STATUS_OK; - } - - ////////////////////////////////////////////////////////////////////////// - // GetMusicPosition / GetMusicChannelPosition - ////////////////////////////////////////////////////////////////////////// - else if (strcmp(name, "GetMusicPosition") == 0 || strcmp(name, "GetMusicChannelPosition") == 0) { - int channel = 0; - if (strcmp(name, "GetMusicPosition") == 0) { - stack->correctParams(0); - } else { - stack->correctParams(1); - channel = stack->pop()->getInt(); - } - - if (channel < 0 || channel >= NUM_MUSIC_CHANNELS || !_music[channel]) { - stack->pushInt(0); - } else { - stack->pushInt(_music[channel]->getPositionTime()); - } - return STATUS_OK; - } - - ////////////////////////////////////////////////////////////////////////// - // IsMusicPlaying / IsMusicChannelPlaying - ////////////////////////////////////////////////////////////////////////// - else if (strcmp(name, "IsMusicPlaying") == 0 || strcmp(name, "IsMusicChannelPlaying") == 0) { - int channel = 0; - if (strcmp(name, "IsMusicPlaying") == 0) { - stack->correctParams(0); - } else { - stack->correctParams(1); - channel = stack->pop()->getInt(); - } - - if (channel < 0 || channel >= NUM_MUSIC_CHANNELS || !_music[channel]) { - stack->pushBool(false); - } else { - stack->pushBool(_music[channel]->isPlaying()); - } - return STATUS_OK; - } - - ////////////////////////////////////////////////////////////////////////// - // SetMusicVolume / SetMusicChannelVolume - ////////////////////////////////////////////////////////////////////////// - else if (strcmp(name, "SetMusicVolume") == 0 || strcmp(name, "SetMusicChannelVolume") == 0) { - int channel = 0; - if (strcmp(name, "SetMusicVolume") == 0) { - stack->correctParams(1); - } else { - stack->correctParams(2); - channel = stack->pop()->getInt(); - } - - int volume = stack->pop()->getInt(); - if (channel < 0 || channel >= NUM_MUSIC_CHANNELS || !_music[channel]) { - stack->pushBool(false); - } else { - if (DID_FAIL(_music[channel]->setVolumePercent(volume))) { - stack->pushBool(false); - } else { - stack->pushBool(true); - } - } - return STATUS_OK; - } - - ////////////////////////////////////////////////////////////////////////// - // GetMusicVolume / GetMusicChannelVolume - ////////////////////////////////////////////////////////////////////////// - else if (strcmp(name, "GetMusicVolume") == 0 || strcmp(name, "GetMusicChannelVolume") == 0) { - int channel = 0; - if (strcmp(name, "GetMusicVolume") == 0) { - stack->correctParams(0); - } else { - stack->correctParams(1); - channel = stack->pop()->getInt(); - } - - if (channel < 0 || channel >= NUM_MUSIC_CHANNELS || !_music[channel]) { - stack->pushInt(0); - } else { - stack->pushInt(_music[channel]->getVolumePercent()); - } - - return STATUS_OK; - } - - ////////////////////////////////////////////////////////////////////////// - // MusicCrossfade - ////////////////////////////////////////////////////////////////////////// - else if (strcmp(name, "MusicCrossfade") == 0) { - stack->correctParams(4); - int channel1 = stack->pop()->getInt(0); - int channel2 = stack->pop()->getInt(0); - uint32 fadeLength = (uint32)stack->pop()->getInt(0); - bool swap = stack->pop()->getBool(true); - - if (_musicCrossfadeRunning) { - script->runtimeError("Game.MusicCrossfade: Music crossfade is already in progress."); - stack->pushBool(false); - return STATUS_OK; - } - - _musicCrossfadeStartTime = _liveTimer; - _musicCrossfadeChannel1 = channel1; - _musicCrossfadeChannel2 = channel2; - _musicCrossfadeLength = fadeLength; - _musicCrossfadeSwap = swap; - - _musicCrossfadeRunning = true; - - stack->pushBool(true); - return STATUS_OK; - } - - ////////////////////////////////////////////////////////////////////////// - // GetSoundLength - ////////////////////////////////////////////////////////////////////////// - else if (strcmp(name, "GetSoundLength") == 0) { - stack->correctParams(1); - - int length = 0; - const char *filename = stack->pop()->getString(); - - BaseSound *sound = new BaseSound(_gameRef); - if (sound && DID_SUCCEED(sound->setSound(filename, Audio::Mixer::kMusicSoundType, true))) { - length = sound->getLength(); - delete sound; - sound = NULL; - } - stack->pushInt(length); + else if (_musicSystem->scCallMethod(script, stack, thisStack, name) == STATUS_OK) { return STATUS_OK; } @@ -1432,7 +1146,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack bool freezeMusic = stack->pop()->getBool(true); ScValue *valSub = stack->pop(); - const char *subtitleFile = valSub->isNULL() ? NULL : valSub->getString(); + const char *subtitleFile = valSub->isNULL() ? nullptr : valSub->getString(); if (type < (int)VID_PLAY_POS || type > (int)VID_PLAY_CENTER) { type = (int)VID_PLAY_STRETCH; @@ -1472,7 +1186,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack bool dropFrames = stack->pop()->getBool(true); ScValue *valSub = stack->pop(); - const char *subtitleFile = valSub->isNULL() ? NULL : valSub->getString(); + const char *subtitleFile = valSub->isNULL() ? nullptr : valSub->getString(); if (type < (int)VID_PLAY_POS || type > (int)VID_PLAY_CENTER) { type = (int)VID_PLAY_STRETCH; @@ -1491,7 +1205,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack } else { stack->pushBool(false); delete _theoraPlayer; - _theoraPlayer = NULL; + _theoraPlayer = nullptr; } return STATUS_OK; @@ -1543,7 +1257,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack stack->correctParams(2); const char *key = stack->pop()->getString(); const char *val = stack->pop()->getString(); - Common::String privKey = "priv_" + StringUtil::encodeSetting(key); + Common::String privKey = "wme_" + StringUtil::encodeSetting(key); Common::String privVal = StringUtil::encodeSetting(val); ConfMan.set(privKey, privVal); stack->pushNULL(); @@ -1557,7 +1271,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack stack->correctParams(2); const char *key = stack->pop()->getString(); const char *initVal = stack->pop()->getString(); - Common::String privKey = "priv_" + StringUtil::encodeSetting(key); + Common::String privKey = "wme_" + StringUtil::encodeSetting(key); Common::String result = initVal; if (ConfMan.hasKey(privKey)) { result = StringUtil::decodeSetting(ConfMan.get(key)); @@ -1756,7 +1470,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack else if (strcmp(name, "RemoveActiveCursor") == 0) { stack->correctParams(0); delete _activeCursor; - _activeCursor = NULL; + _activeCursor = nullptr; stack->pushNULL(); return STATUS_OK; @@ -1862,14 +1576,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack fileNum++; } - bool ret = false; - BaseImage *image = _gameRef->_renderer->takeScreenshot(); - if (image) { - ret = DID_SUCCEED(image->saveBMPFile(filename)); - delete image; - } else { - ret = false; - } + bool ret = _gameRef->_renderer->saveScreenShot(filename); stack->pushBool(ret); return STATUS_OK; @@ -1884,17 +1591,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack int sizeX = stack->pop()->getInt(_renderer->_width); int sizeY = stack->pop()->getInt(_renderer->_height); - bool ret = false; - BaseImage *image = _gameRef->_renderer->takeScreenshot(); - if (image) { - ret = DID_SUCCEED(image->resize(sizeX, sizeY)); - if (ret) { - ret = DID_SUCCEED(image->saveBMPFile(filename)); - } - delete image; - } else { - ret = false; - } + bool ret = _gameRef->_renderer->saveScreenShot(filename, sizeX, sizeY); stack->pushBool(ret); return STATUS_OK; @@ -2009,7 +1706,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack else if (strcmp(name, "RemoveWaitCursor") == 0) { stack->correctParams(0); delete _cursorNoninteractive; - _cursorNoninteractive = NULL; + _cursorNoninteractive = nullptr; stack->pushNULL(); @@ -2068,7 +1765,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack _loadingIcon = new BaseSprite(this); if (!_loadingIcon || DID_FAIL(_loadingIcon->loadFile(filename))) { delete _loadingIcon; - _loadingIcon = NULL; + _loadingIcon = nullptr; } else { displayContent(false, true); _gameRef->_renderer->flip(); @@ -2085,7 +1782,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack else if (strcmp(name, "HideLoadingIcon") == 0) { stack->correctParams(0); delete _loadingIcon; - _loadingIcon = NULL; + _loadingIcon = nullptr; stack->pushNULL(); return STATUS_OK; } @@ -2125,7 +1822,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack _cachedThumbnail = new BaseSaveThumbHelper(this); if (DID_FAIL(_cachedThumbnail->storeThumbnail())) { delete _cachedThumbnail; - _cachedThumbnail = NULL; + _cachedThumbnail = nullptr; stack->pushBool(false); } else { stack->pushBool(true); @@ -2140,7 +1837,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack else if (strcmp(name, "DeleteSaveThumbnail") == 0) { stack->correctParams(0); delete _cachedThumbnail; - _cachedThumbnail = NULL; + _cachedThumbnail = nullptr; stack->pushNULL(); return STATUS_OK; @@ -2179,7 +1876,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack } BaseFileManager::getEngineInstance()->closeFile(file); - file = NULL; + file = nullptr; } else { stack->pushNULL(); } @@ -2682,7 +2379,7 @@ bool BaseGame::scSetProperty(const char *name, ScValue *value) { ////////////////////////////////////////////////////////////////////////// else if (strcmp(name, "MainObject") == 0) { BaseScriptable *obj = value->getNative(); - if (obj == NULL || validObject((BaseObject *)obj)) { + if (obj == nullptr || validObject((BaseObject *)obj)) { _mainObject = (BaseObject *)obj; } return STATUS_OK; @@ -2918,7 +2615,7 @@ bool BaseGame::unregisterObject(BaseObject *object) { // get new focused window if (_focusedWindow == object) { - _focusedWindow = NULL; + _focusedWindow = nullptr; } break; @@ -2927,12 +2624,12 @@ bool BaseGame::unregisterObject(BaseObject *object) { // is it active object? if (_activeObject == object) { - _activeObject = NULL; + _activeObject = nullptr; } // is it main object? if (_mainObject == object) { - _mainObject = NULL; + _mainObject = nullptr; } // destroy object @@ -2958,7 +2655,7 @@ void BaseGame::invalidateValues(void *value, void *data) { if (!val->_persistent && ((BaseScriptable *)data)->_refCount == 1) { ((BaseScriptable *)data)->_refCount++; } - val->setNative(NULL); + val->setNative(nullptr); val->setNULL(); } } @@ -3321,8 +3018,8 @@ bool BaseGame::displayWindows(bool inGame) { bool res; // did we lose focus? focus topmost window - if (_focusedWindow == NULL || !_focusedWindow->_visible || _focusedWindow->_disable) { - _focusedWindow = NULL; + if (_focusedWindow == nullptr || !_focusedWindow->_visible || _focusedWindow->_disable) { + _focusedWindow = nullptr; for (int i = _windows.size() - 1; i >= 0; i--) { if (_windows[i]->_visible && !_windows[i]->_disable) { _focusedWindow = _windows[i]; @@ -3345,99 +3042,6 @@ bool BaseGame::displayWindows(bool inGame) { return STATUS_OK; } - -////////////////////////////////////////////////////////////////////////// -bool BaseGame::playMusic(int channel, const char *filename, bool looping, uint32 loopStart) { - if (channel >= NUM_MUSIC_CHANNELS) { - _gameRef->LOG(0, "**Error** Attempting to use music channel %d (max num channels: %d)", channel, NUM_MUSIC_CHANNELS); - return STATUS_FAILED; - } - - delete _music[channel]; - _music[channel] = NULL; - - _music[channel] = new BaseSound(_gameRef); - if (_music[channel] && DID_SUCCEED(_music[channel]->setSound(filename, Audio::Mixer::kMusicSoundType, true))) { - if (_musicStartTime[channel]) { - _music[channel]->setPositionTime(_musicStartTime[channel]); - _musicStartTime[channel] = 0; - } - if (loopStart) { - _music[channel]->setLoopStart(loopStart); - } - return _music[channel]->play(looping); - } else { - delete _music[channel]; - _music[channel] = NULL; - return STATUS_FAILED; - } -} - - -////////////////////////////////////////////////////////////////////////// -bool BaseGame::stopMusic(int channel) { - if (channel >= NUM_MUSIC_CHANNELS) { - _gameRef->LOG(0, "**Error** Attempting to use music channel %d (max num channels: %d)", channel, NUM_MUSIC_CHANNELS); - return STATUS_FAILED; - } - - if (_music[channel]) { - _music[channel]->stop(); - delete _music[channel]; - _music[channel] = NULL; - return STATUS_OK; - } else { - return STATUS_FAILED; - } -} - - -////////////////////////////////////////////////////////////////////////// -bool BaseGame::pauseMusic(int channel) { - if (channel >= NUM_MUSIC_CHANNELS) { - _gameRef->LOG(0, "**Error** Attempting to use music channel %d (max num channels: %d)", channel, NUM_MUSIC_CHANNELS); - return STATUS_FAILED; - } - - if (_music[channel]) { - return _music[channel]->pause(); - } else { - return STATUS_FAILED; - } -} - - -////////////////////////////////////////////////////////////////////////// -bool BaseGame::resumeMusic(int channel) { - if (channel >= NUM_MUSIC_CHANNELS) { - _gameRef->LOG(0, "**Error** Attempting to use music channel %d (max num channels: %d)", channel, NUM_MUSIC_CHANNELS); - return STATUS_FAILED; - } - - if (_music[channel]) { - return _music[channel]->resume(); - } else { - return STATUS_FAILED; - } -} - - -////////////////////////////////////////////////////////////////////////// -bool BaseGame::setMusicStartTime(int channel, uint32 time) { - if (channel >= NUM_MUSIC_CHANNELS) { - _gameRef->LOG(0, "**Error** Attempting to use music channel %d (max num channels: %d)", channel, NUM_MUSIC_CHANNELS); - return STATUS_FAILED; - } - - _musicStartTime[channel] = time; - if (_music[channel] && _music[channel]->isPlaying()) { - return _music[channel]->setPositionTime(time); - } else { - return STATUS_OK; - } -} - - ////////////////////////////////////////////////////////////////////////// bool BaseGame::loadSettings(const char *filename) { TOKEN_TABLE_START(commands) @@ -3461,7 +3065,7 @@ bool BaseGame::loadSettings(const char *filename) { byte *origBuffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (origBuffer == NULL) { + if (origBuffer == nullptr) { _gameRef->LOG(0, "BaseGame::LoadSettings failed for file '%s'", filename); return STATUS_FAILED; } @@ -3539,7 +3143,7 @@ bool BaseGame::loadSettings(const char *filename) { break; case TOKEN_SAVED_GAME_EXT: - BaseUtils::setString(&_savedGameExt, (char *)params); + _savedGameExt = (char *)params; break; case TOKEN_GUID: @@ -3584,10 +3188,8 @@ bool BaseGame::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_keyboardState)); persistMgr->transfer(TMEMBER(_lastTime)); persistMgr->transfer(TMEMBER(_mainObject)); - for (int i = 0; i < NUM_MUSIC_CHANNELS; i++) { - persistMgr->transfer(TMEMBER(_music[i])); - persistMgr->transfer(TMEMBER(_musicStartTime[i])); - } + _musicSystem->persistChannels(persistMgr); + _musicSystem->persistCrossfadeSettings(persistMgr); persistMgr->transfer(TMEMBER(_offsetX)); persistMgr->transfer(TMEMBER(_offsetY)); @@ -3619,13 +3221,6 @@ bool BaseGame::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_liveTimerDelta)); persistMgr->transfer(TMEMBER(_liveTimerLast)); - persistMgr->transfer(TMEMBER(_musicCrossfadeRunning)); - persistMgr->transfer(TMEMBER(_musicCrossfadeStartTime)); - persistMgr->transfer(TMEMBER(_musicCrossfadeLength)); - persistMgr->transfer(TMEMBER(_musicCrossfadeChannel1)); - persistMgr->transfer(TMEMBER(_musicCrossfadeChannel2)); - persistMgr->transfer(TMEMBER(_musicCrossfadeSwap)); - _renderer->persistSaveLoadImages(persistMgr); persistMgr->transfer(TMEMBER_INT(_textEncoding)); @@ -3730,7 +3325,7 @@ bool BaseGame::handleKeypress(Common::Event *event, bool printable) { // TODO if (_focusedWindow) { - if (!_gameRef->_focusedWindow->handleKeypress(event, _keyboardState->_currentPrintable)) { + if (!_gameRef->_focusedWindow->handleKeypress(event, _keyboardState->isCurrentPrintable())) { /*if (event->type != SDL_TEXTINPUT) {*/ if (_gameRef->_focusedWindow->canHandleEvent("Keypress")) { _gameRef->_focusedWindow->applyEvent("Keypress"); @@ -3832,7 +3427,7 @@ void BaseGame::setWindowTitle() { bool BaseGame::setActiveObject(BaseObject *obj) { // not-active when game is frozen if (obj && !_gameRef->_interactive && !obj->_nonIntMouseEvents) { - obj = NULL; + obj = nullptr; } if (obj == _activeObject) { @@ -3887,7 +3482,7 @@ bool BaseGame::popViewport() { ////////////////////////////////////////////////////////////////////////// bool BaseGame::getCurrentViewportRect(Rect32 *rect, bool *custom) { - if (rect == NULL) { + if (rect == nullptr) { return STATUS_FAILED; } else { if (_viewportSP >= 0) { @@ -3979,69 +3574,6 @@ bool BaseGame::displayContentSimple() { } ////////////////////////////////////////////////////////////////////////// -bool BaseGame::updateMusicCrossfade() { - /* byte globMusicVol = _soundMgr->getVolumePercent(SOUND_MUSIC); */ - - if (!_musicCrossfadeRunning) { - return STATUS_OK; - } - if (_state == GAME_FROZEN) { - return STATUS_OK; - } - - if (_musicCrossfadeChannel1 < 0 || _musicCrossfadeChannel1 >= NUM_MUSIC_CHANNELS || !_music[_musicCrossfadeChannel1]) { - _musicCrossfadeRunning = false; - return STATUS_OK; - } - if (_musicCrossfadeChannel2 < 0 || _musicCrossfadeChannel2 >= NUM_MUSIC_CHANNELS || !_music[_musicCrossfadeChannel2]) { - _musicCrossfadeRunning = false; - return STATUS_OK; - } - - if (!_music[_musicCrossfadeChannel1]->isPlaying()) { - _music[_musicCrossfadeChannel1]->play(); - } - if (!_music[_musicCrossfadeChannel2]->isPlaying()) { - _music[_musicCrossfadeChannel2]->play(); - } - - uint32 currentTime = _gameRef->_liveTimer - _musicCrossfadeStartTime; - - if (currentTime >= _musicCrossfadeLength) { - _musicCrossfadeRunning = false; - //_music[_musicCrossfadeChannel2]->setVolume(GlobMusicVol); - _music[_musicCrossfadeChannel2]->setVolumePercent(100); - - _music[_musicCrossfadeChannel1]->stop(); - //_music[_musicCrossfadeChannel1]->setVolume(GlobMusicVol); - _music[_musicCrossfadeChannel1]->setVolumePercent(100); - - - if (_musicCrossfadeSwap) { - // swap channels - BaseSound *dummy = _music[_musicCrossfadeChannel1]; - int dummyInt = _musicStartTime[_musicCrossfadeChannel1]; - - _music[_musicCrossfadeChannel1] = _music[_musicCrossfadeChannel2]; - _musicStartTime[_musicCrossfadeChannel1] = _musicStartTime[_musicCrossfadeChannel2]; - - _music[_musicCrossfadeChannel2] = dummy; - _musicStartTime[_musicCrossfadeChannel2] = dummyInt; - } - } else { - //_music[_musicCrossfadeChannel1]->setVolume(GlobMusicVol - (float)CurrentTime / (float)_musicCrossfadeLength * GlobMusicVol); - //_music[_musicCrossfadeChannel2]->setVolume((float)CurrentTime / (float)_musicCrossfadeLength * GlobMusicVol); - _music[_musicCrossfadeChannel1]->setVolumePercent((int)(100.0f - (float)currentTime / (float)_musicCrossfadeLength * 100.0f)); - _music[_musicCrossfadeChannel2]->setVolumePercent((int)((float)currentTime / (float)_musicCrossfadeLength * 100.0f)); - - //_gameRef->QuickMessageForm("%d %d", _music[_musicCrossfadeChannel1]->GetVolume(), _music[_musicCrossfadeChannel2]->GetVolume()); - } - - return STATUS_OK; -} - - -////////////////////////////////////////////////////////////////////////// bool BaseGame::resetContent() { _scEngine->clearGlobals(); //_timer = 0; @@ -4084,12 +3616,12 @@ bool BaseGame::restoreDeviceObjects() { ////////////////////////////////////////////////////////////////////////// bool BaseGame::setWaitCursor(const char *filename) { delete _cursorNoninteractive; - _cursorNoninteractive = NULL; + _cursorNoninteractive = nullptr; _cursorNoninteractive = new BaseSprite(_gameRef); if (!_cursorNoninteractive || DID_FAIL(_cursorNoninteractive->loadFile(filename))) { delete _cursorNoninteractive; - _cursorNoninteractive = NULL; + _cursorNoninteractive = nullptr; return STATUS_FAILED; } else { return STATUS_OK; @@ -4115,7 +3647,7 @@ bool BaseGame::stopVideo() { if (_theoraPlayer && _theoraPlayer->isPlaying()) { _theoraPlayer->stop(); delete _theoraPlayer; - _theoraPlayer = NULL; + _theoraPlayer = nullptr; } return STATUS_OK; } @@ -4166,12 +3698,12 @@ bool BaseGame::onMouseLeftDown() { bool handled = _state == GAME_RUNNING && DID_SUCCEED(applyEvent("LeftClick")); if (!handled) { - if (_activeObject != NULL) { + if (_activeObject != nullptr) { _activeObject->applyEvent("LeftClick"); } } - if (_activeObject != NULL) { + if (_activeObject != nullptr) { _capturedObject = _activeObject; } _mouseLeftDown = true; @@ -4187,12 +3719,12 @@ bool BaseGame::onMouseLeftUp() { } BasePlatform::releaseCapture(); - _capturedObject = NULL; + _capturedObject = nullptr; _mouseLeftDown = false; bool handled = _state == GAME_RUNNING && DID_SUCCEED(applyEvent("LeftRelease")); if (!handled) { - if (_activeObject != NULL) { + if (_activeObject != nullptr) { _activeObject->applyEvent("LeftRelease"); } } @@ -4211,7 +3743,7 @@ bool BaseGame::onMouseLeftDblClick() { bool handled = _state == GAME_RUNNING && DID_SUCCEED(applyEvent("LeftDoubleClick")); if (!handled) { - if (_activeObject != NULL) { + if (_activeObject != nullptr) { _activeObject->applyEvent("LeftDoubleClick"); } } @@ -4230,7 +3762,7 @@ bool BaseGame::onMouseRightDblClick() { bool handled = _state == GAME_RUNNING && DID_SUCCEED(applyEvent("RightDoubleClick")); if (!handled) { - if (_activeObject != NULL) { + if (_activeObject != nullptr) { _activeObject->applyEvent("RightDoubleClick"); } } @@ -4245,7 +3777,7 @@ bool BaseGame::onMouseRightDown() { bool handled = _state == GAME_RUNNING && DID_SUCCEED(applyEvent("RightClick")); if (!handled) { - if (_activeObject != NULL) { + if (_activeObject != nullptr) { _activeObject->applyEvent("RightClick"); } } @@ -4260,7 +3792,7 @@ bool BaseGame::onMouseRightUp() { bool handled = _state == GAME_RUNNING && DID_SUCCEED(applyEvent("RightRelease")); if (!handled) { - if (_activeObject != NULL) { + if (_activeObject != nullptr) { _activeObject->applyEvent("RightRelease"); } } @@ -4279,7 +3811,7 @@ bool BaseGame::onMouseMiddleDown() { bool handled = _state == GAME_RUNNING && DID_SUCCEED(applyEvent("MiddleClick")); if (!handled) { - if (_activeObject != NULL) { + if (_activeObject != nullptr) { _activeObject->applyEvent("MiddleClick"); } } @@ -4294,7 +3826,7 @@ bool BaseGame::onMouseMiddleUp() { bool handled = _state == GAME_RUNNING && DID_SUCCEED(applyEvent("MiddleRelease")); if (!handled) { - if (_activeObject != NULL) { + if (_activeObject != nullptr) { _activeObject->applyEvent("MiddleRelease"); } } @@ -4356,7 +3888,7 @@ bool BaseGame::displayDebugInfo() { sprintf(str, "Timer: %d", _timer); _gameRef->_systemFont->drawText((byte *)str, 0, 130, _renderer->_width, TAL_RIGHT); - if (_activeObject != NULL) { + if (_activeObject != nullptr) { _systemFont->drawText((const byte *)_activeObject->getName(), 0, 150, _renderer->_width, TAL_RIGHT); } diff --git a/engines/wintermute/base/base_game.h b/engines/wintermute/base/base_game.h index 0f764b3d03..5666fb818c 100644 --- a/engines/wintermute/base/base_game.h +++ b/engines/wintermute/base/base_game.h @@ -46,6 +46,7 @@ class BaseFileManager; class BaseTransitionMgr; class ScEngine; class BaseFontStorage; +class BaseGameMusic; class BaseStringTable; class BaseQuickMsg; class UIWindow; @@ -59,8 +60,6 @@ class BaseKeyboardState; class VideoPlayer; class VideoTheoraPlayer; -#define NUM_MUSIC_CHANNELS 5 - class BaseGame: public BaseObject { public: DECLARE_PERSISTENT(BaseGame, BaseObject) @@ -120,14 +119,15 @@ public: int _offsetX; float _offsetPercentX; float _offsetPercentY; - BaseObject *_mainObject; + + inline BaseObject *getMainObject() { return _mainObject; } + inline BaseFont *getSystemFont() { return _systemFont; } bool initInput(); bool initLoop(); uint32 _currentTime; uint32 _deltaTime; - BaseFont *_systemFont; - BaseFont *_videoFont; + bool initialize1(); bool initialize2(); bool initialize3(); @@ -138,14 +138,14 @@ public: BaseRenderer *_renderer; BaseSoundMgr *_soundMgr; ScEngine *_scEngine; - SXMath *_mathClass; + BaseScriptable *_mathClass; BaseSurfaceStorage *_surfaceStorage; BaseFontStorage *_fontStorage; BaseGame(const Common::String &gameId); virtual ~BaseGame(); void DEBUG_DebugDisable(); - void DEBUG_DebugEnable(const char *filename = NULL); + void DEBUG_DebugEnable(const char *filename = nullptr); bool _debugDebugMode; void *_debugLogFile; @@ -237,8 +237,8 @@ public: void setInteractive(bool state); virtual bool windowLoadHook(UIWindow *win, char **buf, char **params); virtual bool windowScriptMethodHook(UIWindow *win, ScScript *script, ScStack *stack, const char *name); - bool getCurrentViewportOffset(int *offsetX = NULL, int *offsetY = NULL); - bool getCurrentViewportRect(Rect32 *rect, bool *custom = NULL); + bool getCurrentViewportOffset(int *offsetX = nullptr, int *offsetY = nullptr); + bool getCurrentViewportRect(Rect32 *rect, bool *custom = nullptr); bool popViewport(); bool pushViewport(BaseViewport *Viewport); bool setActiveObject(BaseObject *Obj); @@ -250,6 +250,9 @@ public: bool _touchInterface; bool _constrainedMemory; protected: + BaseFont *_systemFont; + BaseFont *_videoFont; + BaseSprite *_loadingIcon; int _loadingIconX; int _loadingIconY; @@ -261,6 +264,8 @@ protected: VideoPlayer *_videoPlayer; VideoTheoraPlayer *_theoraPlayer; private: + BaseObject *_mainObject; + bool _mouseRightDown; bool _mouseMidlleDown; bool _settingsRequireAcceleration; @@ -274,10 +279,11 @@ private: virtual bool invalidateDeviceObjects(); virtual bool restoreDeviceObjects(); - char *_localSaveDir; + // TODO: This can probably be removed completely: bool _saveDirChecked; bool _richSavedGames; - char *_savedGameExt; + Common::String _localSaveDir; + Common::String _savedGameExt; bool _reportTextureFormat; @@ -287,36 +293,22 @@ private: uint32 _framesRendered; Common::String _gameId; - void setEngineLogCallback(ENGINE_LOG_CALLBACK callback = NULL, void *data = NULL); + void setEngineLogCallback(ENGINE_LOG_CALLBACK callback = nullptr, void *data = nullptr); ENGINE_LOG_CALLBACK _engineLogCallback; void *_engineLogCallbackData; bool _videoSubtitles; - uint32 _musicStartTime[NUM_MUSIC_CHANNELS]; bool _compressedSavegames; bool _personalizedSave; void setWindowTitle(); - bool resumeMusic(int channel); - bool setMusicStartTime(int channel, uint32 time); - bool pauseMusic(int channel); - bool stopMusic(int channel); - bool playMusic(int channel, const char *filename, bool looping = true, uint32 loopStart = 0); - BaseSound *_music[NUM_MUSIC_CHANNELS]; - bool _musicCrossfadeRunning; - bool _musicCrossfadeSwap; - uint32 _musicCrossfadeStartTime; - uint32 _musicCrossfadeLength; - int _musicCrossfadeChannel1; - int _musicCrossfadeChannel2; - BaseSprite *_cursorNoninteractive; BaseKeyboardState *_keyboardState; uint32 _fps; - bool updateMusicCrossfade(); + BaseGameMusic *_musicSystem; bool isVideoPlaying(); bool stopVideo(); diff --git a/engines/wintermute/base/base_game_music.cpp b/engines/wintermute/base/base_game_music.cpp new file mode 100644 index 0000000000..8dff41d854 --- /dev/null +++ b/engines/wintermute/base/base_game_music.cpp @@ -0,0 +1,506 @@ +/* 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. + * + */ + +/* + * This file is based on WME Lite. + * http://dead-code.org/redir.php?target=wmelite + * Copyright (c) 2011 Jan Nedoma + */ + +#include "engines/wintermute/base/base_game_music.h" +#include "engines/wintermute/base/base_engine.h" +#include "engines/wintermute/base/base_game.h" +#include "engines/wintermute/base/base_persistence_manager.h" +#include "engines/wintermute/base/scriptables/script_stack.h" +#include "engines/wintermute/base/scriptables/script_value.h" +#include "engines/wintermute/base/scriptables/script.h" +#include "engines/wintermute/base/sound/base_sound.h" + +namespace Wintermute { + +BaseGameMusic::BaseGameMusic(BaseGame *gameRef) : _gameRef(gameRef) { + for (int i = 0; i < NUM_MUSIC_CHANNELS; i++) { + _music[i] = nullptr; + _musicStartTime[i] = 0; + } + + _musicCrossfadeRunning = false; + _musicCrossfadeStartTime = 0; + _musicCrossfadeLength = 0; + _musicCrossfadeChannel1 = -1; + _musicCrossfadeChannel2 = -1; + _musicCrossfadeSwap = false; +} + +void BaseGameMusic::cleanup() { + for (int i = 0; i < NUM_MUSIC_CHANNELS; i++) { + delete _music[i]; + _music[i] = nullptr; + _musicStartTime[i] = 0; + } +} + +////////////////////////////////////////////////////////////////////////// +bool BaseGameMusic::playMusic(int channel, const char *filename, bool looping, uint32 loopStart) { + if (channel >= NUM_MUSIC_CHANNELS) { + BaseEngine::LOG(0, "**Error** Attempting to use music channel %d (max num channels: %d)", channel, NUM_MUSIC_CHANNELS); + return STATUS_FAILED; + } + + delete _music[channel]; + _music[channel] = nullptr; + + _music[channel] = new BaseSound(_gameRef); + if (_music[channel] && DID_SUCCEED(_music[channel]->setSound(filename, Audio::Mixer::kMusicSoundType, true))) { + if (_musicStartTime[channel]) { + _music[channel]->setPositionTime(_musicStartTime[channel]); + _musicStartTime[channel] = 0; + } + if (loopStart) { + _music[channel]->setLoopStart(loopStart); + } + return _music[channel]->play(looping); + } else { + delete _music[channel]; + _music[channel] = nullptr; + return STATUS_FAILED; + } +} + + +////////////////////////////////////////////////////////////////////////// +bool BaseGameMusic::stopMusic(int channel) { + if (channel >= NUM_MUSIC_CHANNELS) { + BaseEngine::LOG(0, "**Error** Attempting to use music channel %d (max num channels: %d)", channel, NUM_MUSIC_CHANNELS); + return STATUS_FAILED; + } + + if (_music[channel]) { + _music[channel]->stop(); + delete _music[channel]; + _music[channel] = nullptr; + return STATUS_OK; + } else { + return STATUS_FAILED; + } +} + + +////////////////////////////////////////////////////////////////////////// +bool BaseGameMusic::pauseMusic(int channel) { + if (channel >= NUM_MUSIC_CHANNELS) { + BaseEngine::LOG(0, "**Error** Attempting to use music channel %d (max num channels: %d)", channel, NUM_MUSIC_CHANNELS); + return STATUS_FAILED; + } + + if (_music[channel]) { + return _music[channel]->pause(); + } else { + return STATUS_FAILED; + } +} + + +////////////////////////////////////////////////////////////////////////// +bool BaseGameMusic::resumeMusic(int channel) { + if (channel >= NUM_MUSIC_CHANNELS) { + BaseEngine::LOG(0, "**Error** Attempting to use music channel %d (max num channels: %d)", channel, NUM_MUSIC_CHANNELS); + return STATUS_FAILED; + } + + if (_music[channel]) { + return _music[channel]->resume(); + } else { + return STATUS_FAILED; + } +} + + +////////////////////////////////////////////////////////////////////////// +bool BaseGameMusic::setMusicStartTime(int channel, uint32 time) { + if (channel >= NUM_MUSIC_CHANNELS) { + BaseEngine::LOG(0, "**Error** Attempting to use music channel %d (max num channels: %d)", channel, NUM_MUSIC_CHANNELS); + return STATUS_FAILED; + } + + _musicStartTime[channel] = time; + if (_music[channel] && _music[channel]->isPlaying()) { + return _music[channel]->setPositionTime(time); + } else { + return STATUS_OK; + } +} + +////////////////////////////////////////////////////////////////////////// +bool BaseGameMusic::updateMusicCrossfade() { + /* byte globMusicVol = _soundMgr->getVolumePercent(SOUND_MUSIC); */ + + if (!_musicCrossfadeRunning) { + return STATUS_OK; + } + if (_gameRef->_state == GAME_FROZEN) { + return STATUS_OK; + } + + if (_musicCrossfadeChannel1 < 0 || _musicCrossfadeChannel1 >= NUM_MUSIC_CHANNELS || !_music[_musicCrossfadeChannel1]) { + _musicCrossfadeRunning = false; + return STATUS_OK; + } + if (_musicCrossfadeChannel2 < 0 || _musicCrossfadeChannel2 >= NUM_MUSIC_CHANNELS || !_music[_musicCrossfadeChannel2]) { + _musicCrossfadeRunning = false; + return STATUS_OK; + } + + if (!_music[_musicCrossfadeChannel1]->isPlaying()) { + _music[_musicCrossfadeChannel1]->play(); + } + if (!_music[_musicCrossfadeChannel2]->isPlaying()) { + _music[_musicCrossfadeChannel2]->play(); + } + + uint32 currentTime = _gameRef->_liveTimer - _musicCrossfadeStartTime; + + if (currentTime >= _musicCrossfadeLength) { + _musicCrossfadeRunning = false; + //_music[_musicCrossfadeChannel2]->setVolume(GlobMusicVol); + _music[_musicCrossfadeChannel2]->setVolumePercent(100); + + _music[_musicCrossfadeChannel1]->stop(); + //_music[_musicCrossfadeChannel1]->setVolume(GlobMusicVol); + _music[_musicCrossfadeChannel1]->setVolumePercent(100); + + + if (_musicCrossfadeSwap) { + // swap channels + BaseSound *dummy = _music[_musicCrossfadeChannel1]; + int dummyInt = _musicStartTime[_musicCrossfadeChannel1]; + + _music[_musicCrossfadeChannel1] = _music[_musicCrossfadeChannel2]; + _musicStartTime[_musicCrossfadeChannel1] = _musicStartTime[_musicCrossfadeChannel2]; + + _music[_musicCrossfadeChannel2] = dummy; + _musicStartTime[_musicCrossfadeChannel2] = dummyInt; + } + } else { + //_music[_musicCrossfadeChannel1]->setVolume(GlobMusicVol - (float)CurrentTime / (float)_musicCrossfadeLength * GlobMusicVol); + //_music[_musicCrossfadeChannel2]->setVolume((float)CurrentTime / (float)_musicCrossfadeLength * GlobMusicVol); + _music[_musicCrossfadeChannel1]->setVolumePercent((int)(100.0f - (float)currentTime / (float)_musicCrossfadeLength * 100.0f)); + _music[_musicCrossfadeChannel2]->setVolumePercent((int)((float)currentTime / (float)_musicCrossfadeLength * 100.0f)); + + //_gameRef->QuickMessageForm("%d %d", _music[_musicCrossfadeChannel1]->GetVolume(), _music[_musicCrossfadeChannel2]->GetVolume()); + } + + return STATUS_OK; +} + +bool BaseGameMusic::persistChannels(BasePersistenceManager *persistMgr) { + for (int i = 0; i < NUM_MUSIC_CHANNELS; i++) { + persistMgr->transfer(TMEMBER(_music[i])); + persistMgr->transfer(TMEMBER(_musicStartTime[i])); + } + return true; +} + +bool BaseGameMusic::persistCrossfadeSettings(BasePersistenceManager *persistMgr) { + persistMgr->transfer(TMEMBER(_musicCrossfadeRunning)); + persistMgr->transfer(TMEMBER(_musicCrossfadeStartTime)); + persistMgr->transfer(TMEMBER(_musicCrossfadeLength)); + persistMgr->transfer(TMEMBER(_musicCrossfadeChannel1)); + persistMgr->transfer(TMEMBER(_musicCrossfadeChannel2)); + persistMgr->transfer(TMEMBER(_musicCrossfadeSwap)); + return true; +} + +bool BaseGameMusic::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, const char *name) { + ////////////////////////////////////////////////////////////////////////// + // PlayMusic / PlayMusicChannel + ////////////////////////////////////////////////////////////////////////// + if (strcmp(name, "PlayMusic") == 0 || strcmp(name, "PlayMusicChannel") == 0) { + int channel = 0; + if (strcmp(name, "PlayMusic") == 0) { + stack->correctParams(3); + } else { + stack->correctParams(4); + channel = stack->pop()->getInt(); + } + + const char *filename = stack->pop()->getString(); + ScValue *valLooping = stack->pop(); + bool looping = valLooping->isNULL() ? true : valLooping->getBool(); + + ScValue *valLoopStart = stack->pop(); + uint32 loopStart = (uint32)(valLoopStart->isNULL() ? 0 : valLoopStart->getInt()); + + + if (DID_FAIL(playMusic(channel, filename, looping, loopStart))) { + stack->pushBool(false); + } else { + stack->pushBool(true); + } + return STATUS_OK; + } + + ////////////////////////////////////////////////////////////////////////// + // StopMusic / StopMusicChannel + ////////////////////////////////////////////////////////////////////////// + else if (strcmp(name, "StopMusic") == 0 || strcmp(name, "StopMusicChannel") == 0) { + int channel = 0; + + if (strcmp(name, "StopMusic") == 0) { + stack->correctParams(0); + } else { + stack->correctParams(1); + channel = stack->pop()->getInt(); + } + + if (DID_FAIL(stopMusic(channel))) { + stack->pushBool(false); + } else { + stack->pushBool(true); + } + return STATUS_OK; + } + + ////////////////////////////////////////////////////////////////////////// + // PauseMusic / PauseMusicChannel + ////////////////////////////////////////////////////////////////////////// + else if (strcmp(name, "PauseMusic") == 0 || strcmp(name, "PauseMusicChannel") == 0) { + int channel = 0; + + if (strcmp(name, "PauseMusic") == 0) { + stack->correctParams(0); + } else { + stack->correctParams(1); + channel = stack->pop()->getInt(); + } + + if (DID_FAIL(pauseMusic(channel))) { + stack->pushBool(false); + } else { + stack->pushBool(true); + } + return STATUS_OK; + } + + ////////////////////////////////////////////////////////////////////////// + // ResumeMusic / ResumeMusicChannel + ////////////////////////////////////////////////////////////////////////// + else if (strcmp(name, "ResumeMusic") == 0 || strcmp(name, "ResumeMusicChannel") == 0) { + int channel = 0; + if (strcmp(name, "ResumeMusic") == 0) { + stack->correctParams(0); + } else { + stack->correctParams(1); + channel = stack->pop()->getInt(); + } + + if (DID_FAIL(resumeMusic(channel))) { + stack->pushBool(false); + } else { + stack->pushBool(true); + } + return STATUS_OK; + } + + ////////////////////////////////////////////////////////////////////////// + // GetMusic / GetMusicChannel + ////////////////////////////////////////////////////////////////////////// + else if (strcmp(name, "GetMusic") == 0 || strcmp(name, "GetMusicChannel") == 0) { + int channel = 0; + if (strcmp(name, "GetMusic") == 0) { + stack->correctParams(0); + } else { + stack->correctParams(1); + channel = stack->pop()->getInt(); + } + if (channel < 0 || channel >= NUM_MUSIC_CHANNELS) { + stack->pushNULL(); + } else { + if (!_music[channel] || !_music[channel]->getFilename()) { + stack->pushNULL(); + } else { + stack->pushString(_music[channel]->getFilename()); + } + } + return STATUS_OK; + } + + ////////////////////////////////////////////////////////////////////////// + // SetMusicPosition / SetMusicChannelPosition + ////////////////////////////////////////////////////////////////////////// + else if (strcmp(name, "SetMusicPosition") == 0 || strcmp(name, "SetMusicChannelPosition") == 0 || strcmp(name, "SetMusicPositionChannel") == 0) { + int channel = 0; + if (strcmp(name, "SetMusicPosition") == 0) { + stack->correctParams(1); + } else { + stack->correctParams(2); + channel = stack->pop()->getInt(); + } + + uint32 time = stack->pop()->getInt(); + + if (DID_FAIL(setMusicStartTime(channel, time))) { + stack->pushBool(false); + } else { + stack->pushBool(true); + } + + return STATUS_OK; + } + + ////////////////////////////////////////////////////////////////////////// + // GetMusicPosition / GetMusicChannelPosition + ////////////////////////////////////////////////////////////////////////// + else if (strcmp(name, "GetMusicPosition") == 0 || strcmp(name, "GetMusicChannelPosition") == 0) { + int channel = 0; + if (strcmp(name, "GetMusicPosition") == 0) { + stack->correctParams(0); + } else { + stack->correctParams(1); + channel = stack->pop()->getInt(); + } + + if (channel < 0 || channel >= NUM_MUSIC_CHANNELS || !_music[channel]) { + stack->pushInt(0); + } else { + stack->pushInt(_music[channel]->getPositionTime()); + } + return STATUS_OK; + } + + ////////////////////////////////////////////////////////////////////////// + // IsMusicPlaying / IsMusicChannelPlaying + ////////////////////////////////////////////////////////////////////////// + else if (strcmp(name, "IsMusicPlaying") == 0 || strcmp(name, "IsMusicChannelPlaying") == 0) { + int channel = 0; + if (strcmp(name, "IsMusicPlaying") == 0) { + stack->correctParams(0); + } else { + stack->correctParams(1); + channel = stack->pop()->getInt(); + } + + if (channel < 0 || channel >= NUM_MUSIC_CHANNELS || !_music[channel]) { + stack->pushBool(false); + } else { + stack->pushBool(_music[channel]->isPlaying()); + } + return STATUS_OK; + } + + ////////////////////////////////////////////////////////////////////////// + // SetMusicVolume / SetMusicChannelVolume + ////////////////////////////////////////////////////////////////////////// + else if (strcmp(name, "SetMusicVolume") == 0 || strcmp(name, "SetMusicChannelVolume") == 0) { + int channel = 0; + if (strcmp(name, "SetMusicVolume") == 0) { + stack->correctParams(1); + } else { + stack->correctParams(2); + channel = stack->pop()->getInt(); + } + + int volume = stack->pop()->getInt(); + if (channel < 0 || channel >= NUM_MUSIC_CHANNELS || !_music[channel]) { + stack->pushBool(false); + } else { + if (DID_FAIL(_music[channel]->setVolumePercent(volume))) { + stack->pushBool(false); + } else { + stack->pushBool(true); + } + } + return STATUS_OK; + } + + ////////////////////////////////////////////////////////////////////////// + // GetMusicVolume / GetMusicChannelVolume + ////////////////////////////////////////////////////////////////////////// + else if (strcmp(name, "GetMusicVolume") == 0 || strcmp(name, "GetMusicChannelVolume") == 0) { + int channel = 0; + if (strcmp(name, "GetMusicVolume") == 0) { + stack->correctParams(0); + } else { + stack->correctParams(1); + channel = stack->pop()->getInt(); + } + + if (channel < 0 || channel >= NUM_MUSIC_CHANNELS || !_music[channel]) { + stack->pushInt(0); + } else { + stack->pushInt(_music[channel]->getVolumePercent()); + } + + return STATUS_OK; + } + + ////////////////////////////////////////////////////////////////////////// + // MusicCrossfade + ////////////////////////////////////////////////////////////////////////// + else if (strcmp(name, "MusicCrossfade") == 0) { + stack->correctParams(4); + int channel1 = stack->pop()->getInt(0); + int channel2 = stack->pop()->getInt(0); + uint32 fadeLength = (uint32)stack->pop()->getInt(0); + bool swap = stack->pop()->getBool(true); + + if (_musicCrossfadeRunning) { + script->runtimeError("Game.MusicCrossfade: Music crossfade is already in progress."); + stack->pushBool(false); + return STATUS_OK; + } + + _musicCrossfadeStartTime = _gameRef->_liveTimer; + _musicCrossfadeChannel1 = channel1; + _musicCrossfadeChannel2 = channel2; + _musicCrossfadeLength = fadeLength; + _musicCrossfadeSwap = swap; + + _musicCrossfadeRunning = true; + + stack->pushBool(true); + return STATUS_OK; + } + + ////////////////////////////////////////////////////////////////////////// + // GetSoundLength + ////////////////////////////////////////////////////////////////////////// + else if (strcmp(name, "GetSoundLength") == 0) { + stack->correctParams(1); + + int length = 0; + const char *filename = stack->pop()->getString(); + + BaseSound *sound = new BaseSound(_gameRef); + if (sound && DID_SUCCEED(sound->setSound(filename, Audio::Mixer::kMusicSoundType, true))) { + length = sound->getLength(); + delete sound; + sound = nullptr; + } + stack->pushInt(length); + return STATUS_OK; + } else { + return STATUS_FAILED; + } +} + +} // end of namespace Wintermute diff --git a/engines/wintermute/base/base_game_music.h b/engines/wintermute/base/base_game_music.h new file mode 100644 index 0000000000..058a8cadef --- /dev/null +++ b/engines/wintermute/base/base_game_music.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. + * + */ + +/* + * This file is based on WME Lite. + * http://dead-code.org/redir.php?target=wmelite + * Copyright (c) 2011 Jan Nedoma + */ + +#ifndef WINTERMUTE_BASE_GAME_MUSIC_H +#define WINTERMUTE_BASE_GAME_MUSIC_H + +#include "common/scummsys.h" + + +namespace Wintermute { + +#define NUM_MUSIC_CHANNELS 5 +class BasePersistenceManager; +class BaseSound; +class ScStack; +class ScScript; +class BaseGame; +class BaseGameMusic { +public: + BaseGameMusic(BaseGame *gameRef); + void cleanup(); + + bool scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, const char *name); + + bool resumeMusic(int channel); + bool setMusicStartTime(int channel, uint32 time); + bool pauseMusic(int channel); + bool stopMusic(int channel); + bool playMusic(int channel, const char *filename, bool looping = true, uint32 loopStart = 0); + bool updateMusicCrossfade(); + + bool persistChannels(BasePersistenceManager *persistMgr); + bool persistCrossfadeSettings(BasePersistenceManager *persistMgr); +private: + BaseGame *_gameRef; + BaseSound *_music[NUM_MUSIC_CHANNELS]; + uint32 _musicStartTime[NUM_MUSIC_CHANNELS]; + bool _musicCrossfadeRunning; + bool _musicCrossfadeSwap; + uint32 _musicCrossfadeStartTime; + uint32 _musicCrossfadeLength; + int _musicCrossfadeChannel1; + int _musicCrossfadeChannel2; +}; + +} // end of namespace Wintermute + +#endif diff --git a/engines/wintermute/base/base_keyboard_state.cpp b/engines/wintermute/base/base_keyboard_state.cpp index da7baafd2d..072a1bb71b 100644 --- a/engines/wintermute/base/base_keyboard_state.cpp +++ b/engines/wintermute/base/base_keyboard_state.cpp @@ -200,9 +200,8 @@ const char *BaseKeyboardState::scToString() { bool BaseKeyboardState::readKey(Common::Event *event) { //_currentPrintable = (event->type == SDL_TEXTINPUT); // TODO _currentCharCode = keyCodeToVKey(event); - if ((_currentCharCode <= Common::KEYCODE_z && _currentCharCode >= Common::KEYCODE_a) || - (_currentCharCode <= Common::KEYCODE_9 && _currentCharCode >= Common::KEYCODE_0) || - (_currentCharCode == Common::KEYCODE_SPACE)) { + // Verify that this is a printable ISO-8859-character (including the upper charset) + if ((_currentCharCode <= 0x7E && _currentCharCode >= 0x20) || (_currentCharCode <= 0xFF && _currentCharCode >= 0xA0)) { _currentPrintable = true; } else { _currentPrintable = false; @@ -258,6 +257,11 @@ bool BaseKeyboardState::isAltDown() { } ////////////////////////////////////////////////////////////////////////// +bool BaseKeyboardState::isCurrentPrintable() const { + return _currentPrintable; +} + +////////////////////////////////////////////////////////////////////////// uint32 BaseKeyboardState::keyCodeToVKey(Common::Event *event) { if (event->type != Common::EVENT_KEYDOWN) { return 0; @@ -267,7 +271,7 @@ uint32 BaseKeyboardState::keyCodeToVKey(Common::Event *event) { case Common::KEYCODE_KP_ENTER: return Common::KEYCODE_RETURN; default: - return (uint32)event->kbd.keycode; + return (uint32)event->kbd.ascii; } } diff --git a/engines/wintermute/base/base_keyboard_state.h b/engines/wintermute/base/base_keyboard_state.h index dfd0efdec0..b62ece02b7 100644 --- a/engines/wintermute/base/base_keyboard_state.h +++ b/engines/wintermute/base/base_keyboard_state.h @@ -39,14 +39,6 @@ namespace Wintermute { class BaseKeyboardState : public BaseScriptable { public: - uint32 _currentKeyData; - uint32 _currentCharCode; - bool _currentPrintable; - - bool _currentShift; - bool _currentAlt; - bool _currentControl; - DECLARE_PERSISTENT(BaseKeyboardState, BaseScriptable) BaseKeyboardState(BaseGame *inGame); virtual ~BaseKeyboardState(); @@ -57,6 +49,7 @@ public: static bool isShiftDown(); static bool isControlDown(); static bool isAltDown(); + bool isCurrentPrintable() const; // scripting interface virtual ScValue *scGetProperty(const Common::String &name); @@ -65,6 +58,14 @@ public: virtual const char *scToString(); private: + bool _currentPrintable; + uint32 _currentKeyData; + uint32 _currentCharCode; + + bool _currentShift; + bool _currentAlt; + bool _currentControl; + uint8 *_keyStates; uint32 keyCodeToVKey(Common::Event *event); Common::KeyCode vKeyToKeyCode(uint32 vkey); //TODO, reimplement using ScummVM-backend diff --git a/engines/wintermute/base/base_named_object.cpp b/engines/wintermute/base/base_named_object.cpp index 915bf24d7f..f99ec2f5db 100644 --- a/engines/wintermute/base/base_named_object.cpp +++ b/engines/wintermute/base/base_named_object.cpp @@ -32,38 +32,38 @@ namespace Wintermute { ////////////////////////////////////////////////////////////////////////// BaseNamedObject::BaseNamedObject(BaseGame *inGame) : BaseClass(inGame) { - _name = NULL; + _name = nullptr; } ////////////////////////////////////////////////////////////////////////// BaseNamedObject::BaseNamedObject() : BaseClass() { - _name = NULL; + _name = nullptr; } ////////////////////////////////////////////////////////////////////////// BaseNamedObject::BaseNamedObject(TDynamicConstructor, TDynamicConstructor) { - _name = NULL; + _name = nullptr; } ////////////////////////////////////////////////////////////////////////// BaseNamedObject::~BaseNamedObject(void) { delete[] _name; - _name = NULL; + _name = nullptr; } ////////////////////////////////////////////////////////////////////// void BaseNamedObject::setName(const char *name) { delete[] _name; - _name = NULL; + _name = nullptr; - if (name == NULL) { + if (name == nullptr) { return; } _name = new char [strlen(name) + 1]; - if (_name != NULL) { + if (_name != nullptr) { strcpy(_name, name); } } diff --git a/engines/wintermute/base/base_object.cpp b/engines/wintermute/base/base_object.cpp index eba8416485..898c0497a2 100644 --- a/engines/wintermute/base/base_object.cpp +++ b/engines/wintermute/base/base_object.cpp @@ -60,18 +60,18 @@ BaseObject::BaseObject(BaseGame *inGame) : BaseScriptHolder(inGame) { _ready = true; - _soundEvent = NULL; + _soundEvent = nullptr; _iD = _gameRef->getSequence(); BasePlatform::setRectEmpty(&_rect); _rectSet = false; - _cursor = NULL; - _activeCursor = NULL; + _cursor = nullptr; + _activeCursor = nullptr; _sharedCursors = false; - _sFX = NULL; + _sFX = nullptr; _sFXStart = 0; _sFXVolume = 100; _autoSoundPanning = true; @@ -86,7 +86,7 @@ BaseObject::BaseObject(BaseGame *inGame) : BaseScriptHolder(inGame) { _relativeRotate = 0.0f; for (int i = 0; i < 7; i++) { - _caption[i] = NULL; + _caption[i] = nullptr; } _saveState = true; @@ -109,25 +109,25 @@ BaseObject::~BaseObject() { ////////////////////////////////////////////////////////////////////////// bool BaseObject::cleanup() { if (_gameRef && _gameRef->_activeObject == this) { - _gameRef->_activeObject = NULL; + _gameRef->_activeObject = nullptr; } BaseScriptHolder::cleanup(); delete[] _soundEvent; - _soundEvent = NULL; + _soundEvent = nullptr; if (!_sharedCursors) { delete _cursor; delete _activeCursor; - _cursor = NULL; - _activeCursor = NULL; + _cursor = nullptr; + _activeCursor = nullptr; } delete _sFX; - _sFX = NULL; + _sFX = nullptr; for (int i = 0; i < 7; i++) { delete[] _caption[i]; - _caption[i] = NULL; + _caption[i] = nullptr; } _sFXType = SFX_NONE; @@ -160,7 +160,7 @@ const char *BaseObject::getCaption(int caseVal) { if (caseVal == 0) { caseVal = 1; } - if (caseVal < 1 || caseVal > 7 || _caption[caseVal - 1] == NULL) { + if (caseVal < 1 || caseVal > 7 || _caption[caseVal - 1] == nullptr) { return ""; } else { return _caption[caseVal - 1]; @@ -223,9 +223,9 @@ bool BaseObject::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisSta stack->correctParams(0); if (!_sharedCursors) { delete _cursor; - _cursor = NULL; + _cursor = nullptr; } else { - _cursor = NULL; + _cursor = nullptr; } stack->pushNULL(); @@ -317,12 +317,12 @@ bool BaseObject::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisSta ScValue *val3 = stack->pop(); if (val1->_type == VAL_BOOL) { - filename = NULL; + filename = nullptr; looping = val1->getBool(); loopStart = val2->getInt(); } else { if (val1->isNULL()) { - filename = NULL; + filename = nullptr; } else { filename = val1->getString(); } @@ -351,7 +351,7 @@ bool BaseObject::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisSta ScValue *val2 = stack->pop(); if (val2->isNULL()) { - filename = NULL; + filename = nullptr; eventName = val1->getString(); } else { filename = val1->getString(); @@ -1010,14 +1010,14 @@ bool BaseObject::persist(BasePersistenceManager *persistMgr) { bool BaseObject::setCursor(const char *filename) { if (!_sharedCursors) { delete _cursor; - _cursor = NULL; + _cursor = nullptr; } _sharedCursors = false; _cursor = new BaseSprite(_gameRef); if (!_cursor || DID_FAIL(_cursor->loadFile(filename))) { delete _cursor; - _cursor = NULL; + _cursor = nullptr; return STATUS_FAILED; } else { return STATUS_OK; @@ -1031,7 +1031,7 @@ bool BaseObject::setActiveCursor(const char *filename) { _activeCursor = new BaseSprite(_gameRef); if (!_activeCursor || DID_FAIL(_activeCursor->loadFile(filename))) { delete _activeCursor; - _activeCursor = NULL; + _activeCursor = nullptr; return STATUS_FAILED; } else { return STATUS_OK; @@ -1066,7 +1066,7 @@ bool BaseObject::handleMouseWheel(int delta) { ////////////////////////////////////////////////////////////////////////// bool BaseObject::playSFX(const char *filename, bool looping, bool playNow, const char *eventName, uint32 loopStart) { // just play loaded sound - if (filename == NULL && _sFX) { + if (filename == nullptr && _sFX) { if (_gameRef->_editorMode || _sFXStart) { _sFX->setVolumePercent(_sFXVolume); _sFX->setPositionTime(_sFXStart); @@ -1085,7 +1085,7 @@ bool BaseObject::playSFX(const char *filename, bool looping, bool playNow, const } } - if (filename == NULL) { + if (filename == nullptr) { return STATUS_FAILED; } @@ -1111,7 +1111,7 @@ bool BaseObject::playSFX(const char *filename, bool looping, bool playNow, const } } else { delete _sFX; - _sFX = NULL; + _sFX = nullptr; return STATUS_FAILED; } } @@ -1123,7 +1123,7 @@ bool BaseObject::stopSFX(bool deleteSound) { _sFX->stop(); if (deleteSound) { delete _sFX; - _sFX = NULL; + _sFX = nullptr; } return STATUS_OK; } else { @@ -1179,7 +1179,7 @@ bool BaseObject::updateSounds() { if (_soundEvent) { if (_sFX && !_sFX->isPlaying()) { applyEvent(_soundEvent); - setSoundEvent(NULL); + setSoundEvent(nullptr); } } @@ -1229,7 +1229,7 @@ bool BaseObject::isReady() { ////////////////////////////////////////////////////////////////////////// void BaseObject::setSoundEvent(const char *eventName) { delete[] _soundEvent; - _soundEvent = NULL; + _soundEvent = nullptr; if (eventName) { _soundEvent = new char[strlen(eventName) + 1]; if (_soundEvent) { diff --git a/engines/wintermute/base/base_object.h b/engines/wintermute/base/base_object.h index d7d91a25f6..c8491c2cf6 100644 --- a/engines/wintermute/base/base_object.h +++ b/engines/wintermute/base/base_object.h @@ -52,7 +52,7 @@ protected: bool resumeSFX(); bool pauseSFX(); bool stopSFX(bool deleteSound = true); - bool playSFX(const char *filename, bool looping = false, bool playNow = true, const char *eventName = NULL, uint32 loopStart = 0); + bool playSFX(const char *filename, bool looping = false, bool playNow = true, const char *eventName = nullptr, uint32 loopStart = 0); BaseSound *_sFX; TSFXType _sFXType; float _sFXParam1; @@ -110,8 +110,8 @@ public: bool _movable; bool _zoomable; bool _shadowable; - int _posY; - int _posX; + int32 _posY; + int32 _posX; bool _registrable; char *_caption[7]; bool _saveState; diff --git a/engines/wintermute/base/base_parser.cpp b/engines/wintermute/base/base_parser.cpp index 9a0e9e3ad9..7f18c1f0cf 100644 --- a/engines/wintermute/base/base_parser.cpp +++ b/engines/wintermute/base/base_parser.cpp @@ -51,7 +51,7 @@ BaseParser::BaseParser() { ////////////////////////////////////////////////////////////////////// BaseParser::~BaseParser() { - if (_whiteSpace != NULL) { + if (_whiteSpace != nullptr) { delete[] _whiteSpace; } } @@ -136,7 +136,7 @@ void BaseParser::skipCharacters(char **buf, const char *toSkip) { if (ch == '\n') { _parserLine++; } - if (strchr(toSkip, ch) == NULL) { + if (strchr(toSkip, ch) == nullptr) { return; } ++*buf; // skip this character @@ -250,10 +250,10 @@ Common::String BaseParser::getToken(char **buf) { *t++ = 0; } else if (*b == 0) { *buf = b; - return NULL; + return nullptr; } else { // Error. - return NULL; + return nullptr; } *buf = b; diff --git a/engines/wintermute/base/base_parser.h b/engines/wintermute/base/base_parser.h index 76ca8ea856..87a936c624 100644 --- a/engines/wintermute/base/base_parser.h +++ b/engines/wintermute/base/base_parser.h @@ -70,7 +70,7 @@ public: virtual ~BaseParser(); private: char *getLastOffender(); - void skipToken(char **buf, char *tok, char *msg = NULL); + void skipToken(char **buf, char *tok, char *msg = nullptr); int getTokenInt(char **buf); float getTokenFloat(char **buf); Common::String getToken(char **buf); diff --git a/engines/wintermute/base/base_persistence_manager.cpp b/engines/wintermute/base/base_persistence_manager.cpp index 4cb67b87e1..84a1c2ec67 100644 --- a/engines/wintermute/base/base_persistence_manager.cpp +++ b/engines/wintermute/base/base_persistence_manager.cpp @@ -36,8 +36,10 @@ #include "engines/wintermute/math/vector2.h" #include "engines/wintermute/base/gfx/base_image.h" #include "engines/wintermute/base/sound/base_sound.h" +#include "engines/wintermute/graphics/transparent_surface.h" #include "engines/wintermute/wintermute.h" #include "graphics/decoders/bmp.h" +#include "graphics/scaler.h" #include "common/memstream.h" #include "common/str.h" #include "common/system.h" @@ -45,37 +47,40 @@ namespace Wintermute { -#define SAVE_BUFFER_INIT_SIZE 100000 -#define SAVE_BUFFER_GROW_BY 50000 - -#define SAVE_MAGIC 0x45564153 -#define SAVE_MAGIC_2 0x32564153 +// The original WME-Lite savegames had the following: +//#define SAVE_MAGIC 0x45564153 +//#define SAVE_MAGIC_2 0x32564153 +// In case anyone tries to load original savegames, or for that matter +// in case we ever want to attempt to support original savegames, we +// avoid those numbers, and use this instead: +#define SAVE_MAGIC_3 0x12564154 ////////////////////////////////////////////////////////////////////////// BasePersistenceManager::BasePersistenceManager(const char *savePrefix, bool deleteSingleton) { _saving = false; -// _buffer = NULL; -// _bufferSize = 0; _offset = 0; - _saveStream = NULL; - _loadStream = NULL; + _saveStream = nullptr; + _loadStream = nullptr; _deleteSingleton = deleteSingleton; if (BaseEngine::instance().getGameRef()) { _gameRef = BaseEngine::instance().getGameRef(); } else { - _gameRef = NULL; + _gameRef = nullptr; } - _richBuffer = NULL; + _richBuffer = nullptr; _richBufferSize = 0; - _savedDescription = NULL; + _scummVMThumbnailData = nullptr; + _scummVMThumbSize = 0; + + _savedDescription = nullptr; // _savedTimestamp = 0; _savedVerMajor = _savedVerMinor = _savedVerBuild = 0; _savedExtMajor = _savedExtMinor = 0; _thumbnailDataSize = 0; - _thumbnailData = NULL; + _thumbnailData = nullptr; if (savePrefix) { _savePrefix = savePrefix; } else if (_gameRef) { @@ -89,28 +94,21 @@ BasePersistenceManager::BasePersistenceManager(const char *savePrefix, bool dele ////////////////////////////////////////////////////////////////////////// BasePersistenceManager::~BasePersistenceManager() { cleanup(); - if (_deleteSingleton && BaseEngine::instance().getGameRef() == NULL) + if (_deleteSingleton && BaseEngine::instance().getGameRef() == nullptr) BaseEngine::destroy(); } ////////////////////////////////////////////////////////////////////////// void BasePersistenceManager::cleanup() { - /* if (_buffer) { - if (_saving) free(_buffer); - else delete[] _buffer; // allocated by file manager - } - _buffer = NULL; - - _bufferSize = 0;*/ _offset = 0; delete[] _richBuffer; - _richBuffer = NULL; + _richBuffer = nullptr; _richBufferSize = 0; delete[] _savedDescription; - _savedDescription = NULL; // ref to buffer + _savedDescription = nullptr; // ref to buffer // _savedTimestamp = 0; _savedVerMajor = _savedVerMinor = _savedVerBuild = 0; _savedExtMajor = _savedExtMinor = 0; @@ -118,25 +116,31 @@ void BasePersistenceManager::cleanup() { _thumbnailDataSize = 0; if (_thumbnailData) { delete[] _thumbnailData; - _thumbnailData = NULL; + _thumbnailData = nullptr; + } + + _scummVMThumbSize = 0; + if (_scummVMThumbnailData) { + delete[] _scummVMThumbnailData; + _scummVMThumbnailData = nullptr; } delete _loadStream; delete _saveStream; - _loadStream = NULL; - _saveStream = NULL; + _loadStream = nullptr; + _saveStream = nullptr; } Common::String BasePersistenceManager::getFilenameForSlot(int slot) const { // 3 Digits, to allow for one save-slot for autosave + slot 1 - 100 (which will be numbered 0-99 filename-wise) - return Common::String::format("%s-save%03d.wsv", _savePrefix.c_str(), slot); + return Common::String::format("%s.%03d", _savePrefix.c_str(), slot); } void BasePersistenceManager::getSaveStateDesc(int slot, SaveStateDescriptor &desc) { Common::String filename = getFilenameForSlot(slot); debugC(kWintermuteDebugSaveGame, "Trying to list savegame %s in slot %d", filename.c_str(), slot); if (DID_FAIL(readHeader(filename))) { - warning("getSavedDesc(%d) - Failed for %s", slot, filename.c_str()); + debugC(kWintermuteDebugSaveGame, "getSavedDesc(%d) - Failed for %s", slot, filename.c_str()); return; } desc.setSaveSlot(slot); @@ -144,13 +148,28 @@ void BasePersistenceManager::getSaveStateDesc(int slot, SaveStateDescriptor &des desc.setDeletableFlag(true); desc.setWriteProtectedFlag(false); - if (_thumbnailDataSize > 0) { - Common::MemoryReadStream thumbStream(_thumbnailData, _thumbnailDataSize); + int thumbSize = 0; + byte *thumbData = nullptr; + if (_scummVMThumbSize > 0) { + thumbSize = _scummVMThumbSize; + thumbData = _scummVMThumbnailData; + } else if (_thumbnailDataSize > 0) { + thumbSize = _thumbnailDataSize; + thumbData = _thumbnailData; + } + + if (thumbSize > 0) { + Common::MemoryReadStream thumbStream(thumbData, thumbSize, DisposeAfterUse::NO); Graphics::BitmapDecoder bmpDecoder; if (bmpDecoder.loadStream(thumbStream)) { - Graphics::Surface *surf = new Graphics::Surface; - surf = bmpDecoder.getSurface()->convertTo(g_system->getOverlayFormat()); - desc.setThumbnail(surf); + const Graphics::Surface *bmpSurface = bmpDecoder.getSurface(); + TransparentSurface *scaleableSurface = new TransparentSurface(*bmpSurface, false); + Graphics::Surface *scaled = scaleableSurface->scale(kThumbnailWidth, kThumbnailHeight2); + Graphics::Surface *thumb = scaled->convertTo(g_system->getOverlayFormat()); + desc.setThumbnail(thumb); + delete scaleableSurface; + scaled->free(); + delete scaled; } } @@ -165,13 +184,13 @@ void BasePersistenceManager::deleteSaveSlot(int slot) { } uint32 BasePersistenceManager::getMaxUsedSlot() { - Common::String saveMask = Common::String::format("%s-save???.wsv", _savePrefix.c_str()); + Common::String saveMask = Common::String::format("%s.???", _savePrefix.c_str()); Common::StringArray saves = g_system->getSavefileManager()->listSavefiles(saveMask); Common::StringArray::iterator it = saves.begin(); int ret = -1; for (; it != saves.end(); ++it) { int num = -1; - sscanf(it->c_str(), "save%d", &num); + sscanf(it->c_str(), ".%d", &num); ret = MAX(ret, num); } return ret; @@ -202,19 +221,18 @@ bool BasePersistenceManager::initSave(const char *desc) { _gameRef->_cachedThumbnail = new BaseSaveThumbHelper(_gameRef); if (DID_FAIL(_gameRef->_cachedThumbnail->storeThumbnail(true))) { delete _gameRef->_cachedThumbnail; - _gameRef->_cachedThumbnail = NULL; + _gameRef->_cachedThumbnail = nullptr; } } uint32 magic = DCGF_MAGIC; putDWORD(magic); - magic = SAVE_MAGIC_2; + magic = SAVE_MAGIC_3; putDWORD(magic); byte verMajor, verMinor, extMajor, extMinor; _gameRef->getVersion(&verMajor, &verMinor, &extMajor, &extMinor); - //uint32 version = MAKELONG(MAKEWORD(VerMajor, VerMinor), MAKEWORD(ExtMajor, ExtMinor)); _saveStream->writeByte(verMajor); _saveStream->writeByte(verMinor); _saveStream->writeByte(extMajor); @@ -243,10 +261,29 @@ bool BasePersistenceManager::initSave(const char *desc) { if (!thumbnailOK) { putDWORD(0); } + thumbnailOK = false; + // Again for the ScummVM-thumb: + if (_gameRef->_cachedThumbnail) { + if (_gameRef->_cachedThumbnail->_scummVMThumb) { + Common::MemoryWriteStreamDynamic scummVMthumbStream(DisposeAfterUse::YES); + if (_gameRef->_cachedThumbnail->_scummVMThumb->writeBMPToStream(&scummVMthumbStream)) { + _saveStream->writeUint32LE(scummVMthumbStream.size()); + _saveStream->write(scummVMthumbStream.getData(), scummVMthumbStream.size()); + } else { + _saveStream->writeUint32LE(0); + } + + thumbnailOK = true; + } + } + if (!thumbnailOK) { + putDWORD(0); + } + // in any case, destroy the cached thumbnail once used delete _gameRef->_cachedThumbnail; - _gameRef->_cachedThumbnail = NULL; + _gameRef->_cachedThumbnail = nullptr; uint32 dataOffset = _offset + sizeof(uint32) + // data offset @@ -270,7 +307,7 @@ bool BasePersistenceManager::readHeader(const Common::String &filename) { _saving = false; _loadStream = g_system->getSavefileManager()->openForLoading(filename); - //_buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename, &_bufferSize); + if (_loadStream) { uint32 magic; magic = getDWORD(); @@ -282,28 +319,32 @@ bool BasePersistenceManager::readHeader(const Common::String &filename) { magic = getDWORD(); - if (magic == SAVE_MAGIC || magic == SAVE_MAGIC_2) { + if (magic == SAVE_MAGIC_3) { _savedVerMajor = _loadStream->readByte(); _savedVerMinor = _loadStream->readByte(); _savedExtMajor = _loadStream->readByte(); _savedExtMinor = _loadStream->readByte(); - if (magic == SAVE_MAGIC_2) { - _savedVerBuild = (byte)getDWORD(); - _savedName = getStringObj(); - - // load thumbnail - _thumbnailDataSize = getDWORD(); - if (_thumbnailDataSize > 0) { - _thumbnailData = new byte[_thumbnailDataSize]; - if (_thumbnailData) { - getBytes(_thumbnailData, _thumbnailDataSize); - } else { - _thumbnailDataSize = 0; - } + _savedVerBuild = (byte)getDWORD(); + _savedName = getStringObj(); + + // load thumbnail + _thumbnailDataSize = getDWORD(); + if (_thumbnailDataSize > 0) { + _thumbnailData = new byte[_thumbnailDataSize]; + if (_thumbnailData) { + getBytes(_thumbnailData, _thumbnailDataSize); + } else { + _thumbnailDataSize = 0; } + } + + _scummVMThumbSize = getDWORD(); + _scummVMThumbnailData = new byte[_scummVMThumbSize]; + if (_scummVMThumbnailData) { + getBytes(_scummVMThumbnailData, _scummVMThumbSize); } else { - _savedVerBuild = 35; // last build with ver1 savegames + _scummVMThumbSize = 0; } uint32 dataOffset = getDWORD(); @@ -448,7 +489,7 @@ char *BasePersistenceManager::getString() { if (!strcmp(ret, "(null)")) { delete[] ret; - return NULL; + return nullptr; } else { return ret; } @@ -461,7 +502,7 @@ bool BasePersistenceManager::putTimeDate(const TimeDate &t) { _saveStream->writeSint32LE(t.tm_mday); _saveStream->writeSint32LE(t.tm_mon); _saveStream->writeSint32LE(t.tm_year); - // _saveStream->writeSint32LE(t.tm_wday); //TODO: Add this in when merging next + _saveStream->writeSint32LE(t.tm_wday); if (_saveStream->err()) { return STATUS_FAILED; @@ -477,20 +518,26 @@ TimeDate BasePersistenceManager::getTimeDate() { t.tm_mday = _loadStream->readSint32LE(); t.tm_mon = _loadStream->readSint32LE(); t.tm_year = _loadStream->readSint32LE(); - // t.tm_wday = _loadStream->readSint32LE(); //TODO: Add this in when merging next + t.tm_wday = _loadStream->readSint32LE(); return t; } void BasePersistenceManager::putFloat(float val) { - Common::String str = Common::String::format("F%f", val); + int32 exponent = 0; + float significand = frexp(val, &exponent); + Common::String str = Common::String::format("FS%f", significand); _saveStream->writeUint32LE(str.size()); _saveStream->writeString(str); + _saveStream->writeSint32LE(exponent); } float BasePersistenceManager::getFloat() { char *str = getString(); float value = 0.0f; - int ret = sscanf(str, "F%f", &value); + float significand = 0.0f; + int32 exponent = _loadStream->readSint32LE(); + int ret = sscanf(str, "FS%f", &significand); + value = ldexp(significand, exponent); if (ret != 1) { warning("%s not parsed as float", str); } @@ -499,16 +546,21 @@ float BasePersistenceManager::getFloat() { } void BasePersistenceManager::putDouble(double val) { - Common::String str = Common::String::format("D%f", val); - str.format("D%f", val); + int32 exponent = 0; + double significand = frexp(val, &exponent); + Common::String str = Common::String::format("DS%f", significand); _saveStream->writeUint32LE(str.size()); _saveStream->writeString(str); + _saveStream->writeSint32LE(exponent); } double BasePersistenceManager::getDouble() { char *str = getString(); - float value = 0.0f; // TODO: Do we ever really need to carry a full double-precision number? - int ret = sscanf(str, "D%f", &value); + double value = 0.0f; + float significand = 0.0f; + int32 exponent = _loadStream->readSint32LE(); + int ret = sscanf(str, "DS%f", &significand); + value = ldexp(significand, exponent); if (ret != 1) { warning("%s not parsed as double", str); } @@ -791,7 +843,7 @@ bool BasePersistenceManager::transfer(const char *name, void *val) { if (_saving) { SystemClassRegistry::getInstance()->getPointerID(*(void **)val, &classID, &instanceID); - if (*(void **)val != NULL && (classID == -1 || instanceID == -1)) { + if (*(void **)val != nullptr && (classID == -1 || instanceID == -1)) { debugC(kWintermuteDebugSaveGame, "Warning: invalid instance '%s'", name); } diff --git a/engines/wintermute/base/base_persistence_manager.h b/engines/wintermute/base/base_persistence_manager.h index a262c92a0b..8cc21b353b 100644 --- a/engines/wintermute/base/base_persistence_manager.h +++ b/engines/wintermute/base/base_persistence_manager.h @@ -87,12 +87,14 @@ public: bool transfer(const char *name, Common::String *val); bool transfer(const char *name, Vector2 *val); bool transfer(const char *name, AnsiStringArray &Val); - BasePersistenceManager(const char *savePrefix = NULL, bool deleteSingleton = false); + BasePersistenceManager(const char *savePrefix = nullptr, bool deleteSingleton = false); virtual ~BasePersistenceManager(); bool checkVersion(byte verMajor, byte verMinor, byte verBuild); uint32 _thumbnailDataSize; byte *_thumbnailData; + uint32 _scummVMThumbSize; + byte *_scummVMThumbnailData; Common::String getFilenameForSlot(int slot) const; private: bool _deleteSingleton; diff --git a/engines/wintermute/base/base_region.cpp b/engines/wintermute/base/base_region.cpp index 0bc5975e51..a3a23f770a 100644 --- a/engines/wintermute/base/base_region.cpp +++ b/engines/wintermute/base/base_region.cpp @@ -103,7 +103,7 @@ bool BaseRegion::pointInRegion(int x, int y) { ////////////////////////////////////////////////////////////////////////// bool BaseRegion::loadFile(const char *filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "BaseRegion::LoadFile failed for file '%s'", filename); return STATUS_FAILED; } @@ -289,7 +289,7 @@ bool BaseRegion::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisSta if (index >= 0 && index < (int32)_points.size()) { delete _points[index]; - _points[index] = NULL; + _points[index] = nullptr; _points.remove_at(index); createRegion(); diff --git a/engines/wintermute/base/base_region.h b/engines/wintermute/base/base_region.h index 464f25be2f..6b7905fe53 100644 --- a/engines/wintermute/base/base_region.h +++ b/engines/wintermute/base/base_region.h @@ -51,7 +51,7 @@ public: bool loadBuffer(byte *buffer, bool complete = true); Rect32 _rect; BaseArray<BasePoint *> _points; - virtual bool saveAsText(BaseDynamicBuffer *buffer, int indent) { return saveAsText(buffer, indent, NULL); } + virtual bool saveAsText(BaseDynamicBuffer *buffer, int indent) { return saveAsText(buffer, indent, nullptr); } virtual bool saveAsText(BaseDynamicBuffer *buffer, int indent, const char *nameOverride); // scripting interface diff --git a/engines/wintermute/base/base_save_thumb_helper.cpp b/engines/wintermute/base/base_save_thumb_helper.cpp index b4205c21c4..76d703a697 100644 --- a/engines/wintermute/base/base_save_thumb_helper.cpp +++ b/engines/wintermute/base/base_save_thumb_helper.cpp @@ -30,50 +30,79 @@ #include "engines/wintermute/base/gfx/base_image.h" #include "engines/wintermute/base/gfx/base_renderer.h" #include "engines/wintermute/base/base_game.h" +#include "graphics/scaler.h" namespace Wintermute { ////////////////////////////////////////////////////////////////////////// BaseSaveThumbHelper::BaseSaveThumbHelper(BaseGame *inGame) : BaseClass(inGame) { - _thumbnail = NULL; + _thumbnail = nullptr; + _scummVMThumb = nullptr; } ////////////////////////////////////////////////////////////////////////// BaseSaveThumbHelper::~BaseSaveThumbHelper(void) { delete _thumbnail; - _thumbnail = NULL; + _thumbnail = nullptr; + delete _scummVMThumb; + _scummVMThumb = nullptr; } -////////////////////////////////////////////////////////////////////////// -bool BaseSaveThumbHelper::storeThumbnail(bool doFlip) { - delete _thumbnail; - _thumbnail = NULL; - +BaseImage *BaseSaveThumbHelper::storeThumb(bool doFlip, int width, int height) { + BaseImage *thumbnail = nullptr; if (_gameRef->_thumbnailWidth > 0 && _gameRef->_thumbnailHeight > 0) { if (doFlip) { // when using opengl on windows it seems to be necessary to do this twice // works normally for direct3d _gameRef->displayContent(false); _gameRef->_renderer->flip(); - + _gameRef->displayContent(false); _gameRef->_renderer->flip(); } - + BaseImage *screenshot = _gameRef->_renderer->takeScreenshot(); if (!screenshot) { - return STATUS_FAILED; + return nullptr; } - + // normal thumbnail if (_gameRef->_thumbnailWidth > 0 && _gameRef->_thumbnailHeight > 0) { - _thumbnail = new BaseImage(); - _thumbnail->copyFrom(screenshot, _gameRef->_thumbnailWidth, _gameRef->_thumbnailHeight); + thumbnail = new BaseImage(); + thumbnail->copyFrom(screenshot, width, height); } + + + delete screenshot; + screenshot = nullptr; + } + return thumbnail; +} + +////////////////////////////////////////////////////////////////////////// +bool BaseSaveThumbHelper::storeThumbnail(bool doFlip) { + delete _thumbnail; + _thumbnail = nullptr; + if (_gameRef->_thumbnailWidth > 0 && _gameRef->_thumbnailHeight > 0) { - delete screenshot; - screenshot = NULL; + _thumbnail = storeThumb(doFlip, _gameRef->_thumbnailWidth, _gameRef->_thumbnailHeight); + if (!_thumbnail) { + return STATUS_FAILED; + } + } + storeScummVMThumbNail(); + return STATUS_OK; +} + +////////////////////////////////////////////////////////////////////////// +bool BaseSaveThumbHelper::storeScummVMThumbNail(bool doFlip) { + delete _scummVMThumb; + _scummVMThumb = nullptr; + + _scummVMThumb = storeThumb(doFlip, kThumbnailWidth, kThumbnailHeight2); + if (!_scummVMThumb) { + return STATUS_FAILED; } return STATUS_OK; } diff --git a/engines/wintermute/base/base_save_thumb_helper.h b/engines/wintermute/base/base_save_thumb_helper.h index 8863508ac9..8e8a7183c2 100644 --- a/engines/wintermute/base/base_save_thumb_helper.h +++ b/engines/wintermute/base/base_save_thumb_helper.h @@ -40,9 +40,12 @@ public: BaseSaveThumbHelper(BaseGame *inGame); virtual ~BaseSaveThumbHelper(void); bool storeThumbnail(bool doFlip = false); + bool storeScummVMThumbNail(bool doFlip = false); BaseImage *_thumbnail; + BaseImage *_scummVMThumb; private: + BaseImage *storeThumb(bool doFlip, int width, int height); BaseImage *_richThumbnail; }; diff --git a/engines/wintermute/base/base_script_holder.cpp b/engines/wintermute/base/base_script_holder.cpp index c5d5e82f76..d1a9d4aa46 100644 --- a/engines/wintermute/base/base_script_holder.cpp +++ b/engines/wintermute/base/base_script_holder.cpp @@ -43,7 +43,7 @@ BaseScriptHolder::BaseScriptHolder(BaseGame *inGame) : BaseScriptable(inGame) { setName("<unnamed>"); _freezable = true; - _filename = NULL; + _filename = nullptr; } @@ -56,11 +56,11 @@ BaseScriptHolder::~BaseScriptHolder() { ////////////////////////////////////////////////////////////////////////// bool BaseScriptHolder::cleanup() { delete[] _filename; - _filename = NULL; + _filename = nullptr; for (uint32 i = 0; i < _scripts.size(); i++) { _scripts[i]->finish(true); - _scripts[i]->_owner = NULL; + _scripts[i]->_owner = nullptr; } _scripts.clear(); @@ -69,15 +69,15 @@ bool BaseScriptHolder::cleanup() { ////////////////////////////////////////////////////////////////////// void BaseScriptHolder::setFilename(const char *filename) { - if (_filename != NULL) { + if (_filename != nullptr) { delete[] _filename; - _filename = NULL; + _filename = nullptr; } - if (filename == NULL) { + if (filename == nullptr) { return; } _filename = new char [strlen(filename) + 1]; - if (_filename != NULL) { + if (_filename != nullptr) { strcpy(_filename, filename); } } @@ -342,7 +342,7 @@ bool BaseScriptHolder::removeScript(ScScript *script) { } ////////////////////////////////////////////////////////////////////////// -bool BaseScriptHolder::canHandleEvent(const char *EventName) { +bool BaseScriptHolder::canHandleEvent(const char *EventName) const { for (uint32 i = 0; i < _scripts.size(); i++) { if (!_scripts[i]->_thread && _scripts[i]->canHandleEvent(EventName)) { return true; @@ -353,7 +353,7 @@ bool BaseScriptHolder::canHandleEvent(const char *EventName) { ////////////////////////////////////////////////////////////////////////// -bool BaseScriptHolder::canHandleMethod(const char *MethodName) { +bool BaseScriptHolder::canHandleMethod(const char *MethodName) const { for (uint32 i = 0; i < _scripts.size(); i++) { if (!_scripts[i]->_thread && _scripts[i]->canHandleMethod(MethodName)) { return true; @@ -388,8 +388,8 @@ bool BaseScriptHolder::parseProperty(byte *buffer, bool complete) { buffer = params; } - char *propName = NULL; - char *propValue = NULL; + char *propName = nullptr; + char *propValue = nullptr; while ((cmd = parser.getCommand((char **)&buffer, commands, (char **)¶ms)) > 0) { switch (cmd) { @@ -418,16 +418,16 @@ bool BaseScriptHolder::parseProperty(byte *buffer, bool complete) { if (cmd == PARSERR_TOKENNOTFOUND) { delete[] propName; delete[] propValue; - propName = NULL; - propValue = NULL; + propName = nullptr; + propValue = nullptr; _gameRef->LOG(0, "Syntax error in PROPERTY definition"); return STATUS_FAILED; } - if (cmd == PARSERR_GENERIC || propName == NULL || propValue == NULL) { + if (cmd == PARSERR_GENERIC || propName == nullptr || propValue == nullptr) { delete[] propName; delete[] propValue; - propName = NULL; - propValue = NULL; + propName = nullptr; + propValue = nullptr; _gameRef->LOG(0, "Error loading PROPERTY definition"); return STATUS_FAILED; } @@ -440,8 +440,8 @@ bool BaseScriptHolder::parseProperty(byte *buffer, bool complete) { delete val; delete[] propName; delete[] propValue; - propName = NULL; - propValue = NULL; + propName = nullptr; + propValue = nullptr; return STATUS_OK; } @@ -474,7 +474,7 @@ ScScript *BaseScriptHolder::invokeMethodThread(const char *methodName) { } } } - return NULL; + return nullptr; } diff --git a/engines/wintermute/base/base_script_holder.h b/engines/wintermute/base/base_script_holder.h index 5fd0dbec9c..320f0fb07a 100644 --- a/engines/wintermute/base/base_script_holder.h +++ b/engines/wintermute/base/base_script_holder.h @@ -43,8 +43,8 @@ public: virtual ~BaseScriptHolder(); virtual ScScript *invokeMethodThread(const char *methodName); virtual void makeFreezable(bool freezable); - bool canHandleEvent(const char *eventName); - virtual bool canHandleMethod(const char *eventMethod); + bool canHandleEvent(const char *eventName) const; + virtual bool canHandleMethod(const char *eventMethod) const; bool cleanup(); bool removeScript(ScScript *script); bool addScript(const char *filename); diff --git a/engines/wintermute/base/base_scriptable.cpp b/engines/wintermute/base/base_scriptable.cpp index a2dd8b00e7..7dbcd72200 100644 --- a/engines/wintermute/base/base_scriptable.cpp +++ b/engines/wintermute/base/base_scriptable.cpp @@ -39,14 +39,14 @@ BaseScriptable::BaseScriptable(BaseGame *inGame, bool noValue, bool persistable) _refCount = 0; if (noValue) { - _scValue = NULL; + _scValue = nullptr; } else { _scValue = new ScValue(_gameRef); } _persistable = persistable; - _scProp = NULL; + _scProp = nullptr; } @@ -55,8 +55,8 @@ BaseScriptable::~BaseScriptable() { //if (_refCount>0) _gameRef->LOG(0, "Warning: Destroying object, _refCount=%d", _refCount); delete _scValue; delete _scProp; - _scValue = NULL; - _scProp = NULL; + _scValue = nullptr; + _scProp = nullptr; } @@ -83,7 +83,7 @@ ScValue *BaseScriptable::scGetProperty(const Common::String &name) { if (_scProp) { return _scProp->getProp(name.c_str()); // TODO: Change to Common::String } else { - return NULL; + return nullptr; } } @@ -178,14 +178,14 @@ void BaseScriptable::scDebuggerDesc(char *buf, int bufSize) { } ////////////////////////////////////////////////////////////////////////// -bool BaseScriptable::canHandleMethod(const char *eventMethod) { +bool BaseScriptable::canHandleMethod(const char *eventMethod) const { return false; } ////////////////////////////////////////////////////////////////////////// ScScript *BaseScriptable::invokeMethodThread(const char *methodName) { - return NULL; + return nullptr; } } // end of namespace Wintermute diff --git a/engines/wintermute/base/base_scriptable.h b/engines/wintermute/base/base_scriptable.h index fbe14fc299..b0b4e77ed2 100644 --- a/engines/wintermute/base/base_scriptable.h +++ b/engines/wintermute/base/base_scriptable.h @@ -48,7 +48,7 @@ public: virtual ~BaseScriptable(); // high level scripting interface - virtual bool canHandleMethod(const char *eventMethod); + virtual bool canHandleMethod(const char *eventMethod) const; virtual bool scSetProperty(const char *name, ScValue *value); virtual ScValue *scGetProperty(const Common::String &name); virtual bool scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, const char *name); diff --git a/engines/wintermute/base/base_sprite.cpp b/engines/wintermute/base/base_sprite.cpp index 468af1bd75..4f55e47c05 100644 --- a/engines/wintermute/base/base_sprite.cpp +++ b/engines/wintermute/base/base_sprite.cpp @@ -64,7 +64,7 @@ void BaseSprite::setDefaults() { _currentFrame = -1; _looping = false; _lastFrameTime = 0; - setFilename(NULL); + setFilename(nullptr); _finished = false; _changed = false; _paused = false; @@ -72,7 +72,7 @@ void BaseSprite::setDefaults() { _moveX = _moveY = 0; _editorMuted = false; - _editorBgFile = NULL; + _editorBgFile = nullptr; _editorBgOffsetX = _editorBgOffsetY = 0; _editorBgAlpha = 0xFF; _streamed = false; @@ -94,7 +94,7 @@ void BaseSprite::cleanup() { _frames.clear(); delete[] _editorBgFile; - _editorBgFile = NULL; + _editorBgFile = nullptr; setDefaults(); } @@ -141,7 +141,7 @@ bool BaseSprite::loadFile(const Common::String &filename, int lifeTime, TSpriteC } } else { BaseFileManager::getEngineInstance()->closeFile(file); - file = NULL; + file = nullptr; } bool ret = STATUS_FAILED; @@ -154,7 +154,7 @@ bool BaseSprite::loadFile(const Common::String &filename, int lifeTime, TSpriteC BaseFrame *frame = new BaseFrame(_gameRef); BaseSubFrame *subframe = new BaseSubFrame(_gameRef); subframe->setSurface(filename, true, 0, 0, 0, lifeTime, true); - if (subframe->_surface == NULL) { + if (subframe->_surface == nullptr) { _gameRef->LOG(0, "Error loading simple sprite '%s'", filename.c_str()); ret = STATUS_FAILED; delete frame; @@ -440,7 +440,7 @@ bool BaseSprite::display(int x, int y, BaseObject *registerVal, float zoomX, flo BaseSurface *BaseSprite::getSurface() { // only used for animated textures for 3D models if (_currentFrame < 0 || _currentFrame >= (int32)_frames.size()) { - return NULL; + return nullptr; } BaseFrame *frame = _frames[_currentFrame]; if (frame && frame->_subframes.size() > 0) { @@ -448,10 +448,10 @@ BaseSurface *BaseSprite::getSurface() { if (subframe) { return subframe->_surface; } else { - return NULL; + return nullptr; } } else { - return NULL; + return nullptr; } } @@ -611,13 +611,13 @@ bool BaseSprite::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisSta else if (strcmp(name, "AddFrame") == 0) { stack->correctParams(1); ScValue *val = stack->pop(); - const char *filename = NULL; + const char *filename = nullptr; if (!val->isNULL()) { filename = val->getString(); } BaseFrame *frame = new BaseFrame(_gameRef); - if (filename != NULL) { + if (filename != nullptr) { BaseSubFrame *sub = new BaseSubFrame(_gameRef); if (DID_SUCCEED(sub->setSurface(filename))) { sub->setDefaultRect(); @@ -643,13 +643,13 @@ bool BaseSprite::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisSta } ScValue *val = stack->pop(); - const char *filename = NULL; + const char *filename = nullptr; if (!val->isNULL()) { filename = val->getString(); } BaseFrame *frame = new BaseFrame(_gameRef); - if (filename != NULL) { + if (filename != nullptr) { BaseSubFrame *sub = new BaseSubFrame(_gameRef); if (DID_SUCCEED(sub->setSurface(filename))) { frame->_subframes.add(sub); @@ -740,7 +740,7 @@ ScValue *BaseSprite::scGetProperty(const Common::String &name) { // Owner (RO) ////////////////////////////////////////////////////////////////////////// else if (name == "Owner") { - if (_owner == NULL) { + if (_owner == nullptr) { _scValue->setNULL(); } else { _scValue->setNative(_owner, true); diff --git a/engines/wintermute/base/base_sprite.h b/engines/wintermute/base/base_sprite.h index 1d244c3a52..ac1a0e919b 100644 --- a/engines/wintermute/base/base_sprite.h +++ b/engines/wintermute/base/base_sprite.h @@ -47,18 +47,18 @@ public: bool getBoundingRect(Rect32 *rect, int x, int y, float scaleX = 100, float scaleY = 100); int _moveY; int _moveX; - bool display(int x, int y, BaseObject *registerOwner = NULL, float zoomX = 100, float zoomY = 100, uint32 alpha = 0xFFFFFFFF, float rotate = 0.0f, TSpriteBlendMode blendMode = BLEND_NORMAL); + bool display(int x, int y, BaseObject *registerOwner = nullptr, float zoomX = 100, float zoomY = 100, uint32 alpha = 0xFFFFFFFF, float rotate = 0.0f, TSpriteBlendMode blendMode = BLEND_NORMAL); bool getCurrentFrame(float zoomX = 100, float zoomY = 100); void reset(); bool isChanged(); bool isFinished(); bool loadBuffer(byte *buffer, bool compete = true, int lifeTime = -1, TSpriteCacheType cacheType = CACHE_ALL); bool loadFile(const Common::String &filename, int lifeTime = -1, TSpriteCacheType cacheType = CACHE_ALL); - bool draw(int x, int y, BaseObject *Register = NULL, float zoomX = 100, float zoomY = 100, uint32 alpha = 0xFFFFFFFF); + bool draw(int x, int y, BaseObject *Register = nullptr, float zoomX = 100, float zoomY = 100, uint32 alpha = 0xFFFFFFFF); bool _looping; int _currentFrame; - bool addFrame(const char *filename, uint32 delay = 0, int hotspotX = 0, int hotspotY = 0, Rect32 *rect = NULL); - BaseSprite(BaseGame *inGame, BaseObject *owner = NULL); + bool addFrame(const char *filename, uint32 delay = 0, int hotspotX = 0, int hotspotY = 0, Rect32 *rect = nullptr); + BaseSprite(BaseGame *inGame, BaseObject *owner = nullptr); virtual ~BaseSprite(); BaseArray<BaseFrame *> _frames; bool saveAsText(BaseDynamicBuffer *buffer, int indent); diff --git a/engines/wintermute/base/base_string_table.cpp b/engines/wintermute/base/base_string_table.cpp index 2f890beea1..11ec7b094f 100644 --- a/engines/wintermute/base/base_string_table.cpp +++ b/engines/wintermute/base/base_string_table.cpp @@ -50,7 +50,7 @@ BaseStringTable::~BaseStringTable() { ////////////////////////////////////////////////////////////////////////// bool BaseStringTable::addString(const char *key, const char *val, bool reportDuplicities) { - if (key == NULL || val == NULL) { + if (key == nullptr || val == nullptr) { return STATUS_FAILED; } @@ -74,13 +74,13 @@ bool BaseStringTable::addString(const char *key, const char *val, bool reportDup ////////////////////////////////////////////////////////////////////////// char *BaseStringTable::getKey(const char *str) const { - if (str == NULL || str[0] != '/') { - return NULL; + if (str == nullptr || str[0] != '/') { + return nullptr; } const char *value = strchr(str + 1, '/'); - if (value == NULL) { - return NULL; + if (value == nullptr) { + return nullptr; } char *key = new char[value - str]; @@ -110,12 +110,12 @@ char *BaseStringTable::getKey(const char *str) const { ////////////////////////////////////////////////////////////////////////// void BaseStringTable::expand(char **str) const { - if (str == NULL || *str == NULL || *str[0] != '/') { + if (str == nullptr || *str == nullptr || *str[0] != '/') { return; } char *value = strchr(*str + 1, '/'); - if (value == NULL) { + if (value == nullptr) { return; } @@ -149,12 +149,12 @@ void BaseStringTable::expand(char **str) const { ////////////////////////////////////////////////////////////////////////// const char *BaseStringTable::expandStatic(const char *string) const { - if (string == NULL || string[0] == '\0' || string[0] != '/') { + if (string == nullptr || string[0] == '\0' || string[0] != '/') { return string; } const char *value = strchr(string + 1, '/'); - if (value == NULL) { + if (value == nullptr) { return string; } @@ -193,7 +193,7 @@ bool BaseStringTable::loadFile(const char *filename, bool clearOld) { uint32 size; byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename, &size); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "BaseStringTable::LoadFile failed for file '%s'", filename); return STATUS_FAILED; } @@ -222,12 +222,12 @@ bool BaseStringTable::loadFile(const char *filename, bool clearOld) { char *line = new char[realLength + 1]; Common::strlcpy(line, (char *)&buffer[pos], realLength + 1); char *value = strchr(line, '\t'); - if (value == NULL) { + if (value == nullptr) { value = strchr(line, ' '); } if (line[0] != ';') { - if (value != NULL) { + if (value != nullptr) { value[0] = '\0'; value++; for (uint32 i = 0; i < strlen(value); i++) { diff --git a/engines/wintermute/base/base_sub_frame.cpp b/engines/wintermute/base/base_sub_frame.cpp index 77cc522ae7..a06d7f50eb 100644 --- a/engines/wintermute/base/base_sub_frame.cpp +++ b/engines/wintermute/base/base_sub_frame.cpp @@ -44,7 +44,7 @@ IMPLEMENT_PERSISTENT(BaseSubFrame, false) ////////////////////////////////////////////////////////////////////////// BaseSubFrame::BaseSubFrame(BaseGame *inGame) : BaseScriptable(inGame, true) { - _surface = NULL; + _surface = nullptr; _hotspotX = _hotspotY = 0; _alpha = 0xFFFFFFFF; _transparent = 0xFFFF00FF; @@ -54,7 +54,7 @@ BaseSubFrame::BaseSubFrame(BaseGame *inGame) : BaseScriptable(inGame, true) { _editorSelected = false; - _surfaceFilename = NULL; + _surfaceFilename = nullptr; _cKDefault = true; _cKRed = _cKBlue = _cKGreen = 0; _lifeTime = -1; @@ -73,7 +73,7 @@ BaseSubFrame::~BaseSubFrame() { _gameRef->_surfaceStorage->removeSurface(_surface); } delete[] _surfaceFilename; - _surfaceFilename = NULL; + _surfaceFilename = nullptr; } @@ -118,10 +118,10 @@ bool BaseSubFrame::loadBuffer(byte *buffer, int lifeTime, bool keepLoaded) { int ar = 255, ag = 255, ab = 255, alpha = 255; bool custoTrans = false; BasePlatform::setRectEmpty(&rect); - char *surfaceFile = NULL; + char *surfaceFile = nullptr; delete _surface; - _surface = NULL; + _surface = nullptr; while ((cmd = parser.getCommand((char **)&buffer, commands, ¶ms)) > 0) { switch (cmd) { @@ -184,7 +184,7 @@ bool BaseSubFrame::loadBuffer(byte *buffer, int lifeTime, bool keepLoaded) { return STATUS_FAILED; } - if (surfaceFile != NULL) { + if (surfaceFile != nullptr) { if (custoTrans) { setSurface(surfaceFile, false, r, g, b, lifeTime, keepLoaded); } else { @@ -198,7 +198,7 @@ bool BaseSubFrame::loadBuffer(byte *buffer, int lifeTime, bool keepLoaded) { } /* - if (_surface == NULL) + if (_surface == nullptr) { _gameRef->LOG(0, "Error parsing sub-frame. Image not set."); return STATUS_FAILED; @@ -236,7 +236,7 @@ bool BaseSubFrame::draw(int x, int y, BaseObject *registerOwner, float zoomX, fl return STATUS_OK; } - if (registerOwner != NULL && !_decoration) { + if (registerOwner != nullptr && !_decoration) { if (zoomX == 100 && zoomY == 100) { _gameRef->_renderer->addRectToList(new BaseActiveRect(_gameRef, registerOwner, this, x - _hotspotX + getRect().left, y - _hotspotY + getRect().top, getRect().right - getRect().left, getRect().bottom - getRect().top, zoomX, zoomY, precise)); } else { @@ -426,7 +426,7 @@ bool BaseSubFrame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisS _gameRef->_surfaceStorage->removeSurface(_surface); } delete[] _surfaceFilename; - _surfaceFilename = NULL; + _surfaceFilename = nullptr; stack->pushBool(true); } else { const char *filename = val->getString(); @@ -617,11 +617,11 @@ const char *BaseSubFrame::scToString() { bool BaseSubFrame::setSurface(const Common::String &filename, bool defaultCK, byte ckRed, byte ckGreen, byte ckBlue, int lifeTime, bool keepLoaded) { if (_surface) { _gameRef->_surfaceStorage->removeSurface(_surface); - _surface = NULL; + _surface = nullptr; } delete[] _surfaceFilename; - _surfaceFilename = NULL; + _surfaceFilename = nullptr; _surface = _gameRef->_surfaceStorage->addSurface(filename, defaultCK, ckRed, ckGreen, ckBlue, lifeTime, keepLoaded); if (_surface) { @@ -645,7 +645,7 @@ bool BaseSubFrame::setSurface(const Common::String &filename, bool defaultCK, by ////////////////////////////////////////////////////////////////////////// bool BaseSubFrame::setSurfaceSimple() { if (!_surfaceFilename) { - _surface = NULL; + _surface = nullptr; return STATUS_OK; } _surface = _gameRef->_surfaceStorage->addSurface(_surfaceFilename, _cKDefault, _cKRed, _cKGreen, _cKBlue, _lifeTime, _keepLoaded); diff --git a/engines/wintermute/base/base_sub_frame.h b/engines/wintermute/base/base_sub_frame.h index c173ae69d1..2888761bb3 100644 --- a/engines/wintermute/base/base_sub_frame.h +++ b/engines/wintermute/base/base_sub_frame.h @@ -52,7 +52,7 @@ public: BaseSubFrame(BaseGame *inGame); virtual ~BaseSubFrame(); bool loadBuffer(byte *buffer, int lifeTime, bool keepLoaded); - bool draw(int x, int y, BaseObject *registerOwner = NULL, float zoomX = 100, float zoomY = 100, bool precise = true, uint32 alpha = 0xFFFFFFFF, float rotate = 0.0f, TSpriteBlendMode blendMode = BLEND_NORMAL); + bool draw(int x, int y, BaseObject *registerOwner = nullptr, float zoomX = 100, float zoomY = 100, bool precise = true, uint32 alpha = 0xFFFFFFFF, float rotate = 0.0f, TSpriteBlendMode blendMode = BLEND_NORMAL); bool getBoundingRect(Rect32 *rect, int x, int y, float scaleX = 100, float scaleY = 100); const char* getSurfaceFilename(); diff --git a/engines/wintermute/base/base_surface_storage.cpp b/engines/wintermute/base/base_surface_storage.cpp index 4e795ca813..08d2d2f767 100644 --- a/engines/wintermute/base/base_surface_storage.cpp +++ b/engines/wintermute/base/base_surface_storage.cpp @@ -124,12 +124,12 @@ BaseSurface *BaseSurfaceStorage::addSurface(const Common::String &filename, bool surface = _gameRef->_renderer->createSurface(); if (!surface) { - return NULL; + return nullptr; } if (DID_FAIL(surface->create(filename, defaultCK, ckRed, ckGreen, ckBlue, lifeTime, keepLoaded))) { delete surface; - return NULL; + return nullptr; } else { surface->_referenceCount = 1; _surfaces.push_back(surface); @@ -176,32 +176,29 @@ bool BaseSurfaceStorage::sortSurfaces() { ////////////////////////////////////////////////////////////////////////// -int BaseSurfaceStorage::surfaceSortCB(const void *arg1, const void *arg2) { - const BaseSurface *s1 = *((const BaseSurface *const *)arg1); - const BaseSurface *s2 = *((const BaseSurface *const *)arg2); - +bool BaseSurfaceStorage::surfaceSortCB(const BaseSurface *s1, const BaseSurface *s2) { // sort by life time if (s1->_lifeTime <= 0 && s2->_lifeTime > 0) { - return 1; + return false; } else if (s1->_lifeTime > 0 && s2->_lifeTime <= 0) { - return -1; + return true; } // sort by validity if (s1->_valid && !s2->_valid) { - return -1; + return true; } else if (!s1->_valid && s2->_valid) { - return 1; + return false; } // sort by time else if (s1->_lastUsedTime > s2->_lastUsedTime) { - return 1; + return false; } else if (s1->_lastUsedTime < s2->_lastUsedTime) { - return -1; + return true; } else { - return 0; + return false; } } diff --git a/engines/wintermute/base/base_surface_storage.h b/engines/wintermute/base/base_surface_storage.h index aef8ad23f9..61738e69a2 100644 --- a/engines/wintermute/base/base_surface_storage.h +++ b/engines/wintermute/base/base_surface_storage.h @@ -39,7 +39,7 @@ public: uint32 _lastCleanupTime; bool initLoop(); bool sortSurfaces(); - static int surfaceSortCB(const void *arg1, const void *arg2); + static bool surfaceSortCB(const BaseSurface *arg1, const BaseSurface *arg2); bool cleanup(bool warn = false); //DECLARE_PERSISTENT(BaseSurfaceStorage, BaseClass); diff --git a/engines/wintermute/base/base_transition_manager.cpp b/engines/wintermute/base/base_transition_manager.cpp index 7785f3d5af..6ae51d8e83 100644 --- a/engines/wintermute/base/base_transition_manager.cpp +++ b/engines/wintermute/base/base_transition_manager.cpp @@ -51,7 +51,7 @@ BaseTransitionMgr::~BaseTransitionMgr() { ////////////////////////////////////////////////////////////////////////// -bool BaseTransitionMgr::isReady() { +bool BaseTransitionMgr::isReady() const { return (_state == TRANS_MGR_READY); } diff --git a/engines/wintermute/base/base_transition_manager.h b/engines/wintermute/base/base_transition_manager.h index d16a44c88e..edb3045a58 100644 --- a/engines/wintermute/base/base_transition_manager.h +++ b/engines/wintermute/base/base_transition_manager.h @@ -41,7 +41,7 @@ public: bool _preserveInteractive; bool update(); bool start(TTransitionType type, bool nonInteractive = false); - bool isReady(); + bool isReady() const; TTransMgrState _state; BaseTransitionMgr(BaseGame *inGame); virtual ~BaseTransitionMgr(); diff --git a/engines/wintermute/base/base_viewport.cpp b/engines/wintermute/base/base_viewport.cpp index 7ec995449f..5a488b707f 100644 --- a/engines/wintermute/base/base_viewport.cpp +++ b/engines/wintermute/base/base_viewport.cpp @@ -38,7 +38,7 @@ IMPLEMENT_PERSISTENT(BaseViewport, false) ////////////////////////////////////////////////////////////////////////// BaseViewport::BaseViewport(BaseGame *inGame) : BaseClass(inGame) { BasePlatform::setRectEmpty(&_rect); - _mainObject = NULL; + _mainObject = nullptr; _offsetX = _offsetY = 0; } @@ -86,13 +86,13 @@ Rect32 *BaseViewport::getRect() { ////////////////////////////////////////////////////////////////////////// -int BaseViewport::getWidth() { +int BaseViewport::getWidth() const { return _rect.right - _rect.left; } ////////////////////////////////////////////////////////////////////////// -int BaseViewport::getHeight() { +int BaseViewport::getHeight() const { return _rect.bottom - _rect.top; } diff --git a/engines/wintermute/base/base_viewport.h b/engines/wintermute/base/base_viewport.h index 98ad1c1e14..c69682da62 100644 --- a/engines/wintermute/base/base_viewport.h +++ b/engines/wintermute/base/base_viewport.h @@ -36,15 +36,15 @@ namespace Wintermute { class BaseObject; class BaseViewport : public BaseClass { public: - int getHeight(); - int getWidth(); + int getHeight() const; + int getWidth() const; Rect32 *getRect(); bool setRect(int left, int top, int right, int bottom, bool noCheck = false); DECLARE_PERSISTENT(BaseViewport, BaseClass) int _offsetY; int _offsetX; BaseObject *_mainObject; - BaseViewport(BaseGame *inGame = NULL); + BaseViewport(BaseGame *inGame = nullptr); virtual ~BaseViewport(); private: Rect32 _rect; diff --git a/engines/wintermute/base/file/base_disk_file.cpp b/engines/wintermute/base/file/base_disk_file.cpp index 25be3dad2d..3c1ecc7a73 100644 --- a/engines/wintermute/base/file/base_disk_file.cpp +++ b/engines/wintermute/base/file/base_disk_file.cpp @@ -39,10 +39,10 @@ namespace Wintermute { -void correctSlashes(char *fileName) { - for (size_t i = 0; i < strlen(fileName); i++) { +void correctSlashes(Common::String &fileName) { + for (size_t i = 0; i < fileName.size(); i++) { if (fileName[i] == '\\') { - fileName[i] = '/'; + fileName.setChar('/', i); } } } @@ -66,6 +66,12 @@ static Common::FSNode getNodeForRelativePath(const Common::String &filename) { const Common::FSNode gameDataDir(ConfMan.get("path")); Common::FSNode curNode = gameDataDir; + Common::String fixedPath = ""; + while (!path.empty()) { + fixedPath += path.nextToken() + "/"; + } + fixedPath.deleteLastChar(); + // Parse all path-elements while (!path.empty()) { // Get the next path-component by slicing on '\\' @@ -109,13 +115,14 @@ bool diskFileExists(const Common::String &filename) { Common::SeekableReadStream *openDiskFile(const Common::String &filename) { uint32 prefixSize = 0; - Common::SeekableReadStream *file = NULL; + Common::SeekableReadStream *file = nullptr; Common::String fixedFilename = filename; + correctSlashes(fixedFilename); // Absolute path: TODO: Add specific fallbacks here. - if (filename.contains(':')) { - if (filename.hasPrefix("c:\\windows\\fonts\\")) { // East Side Story refers to "c:\windows\fonts\framd.ttf" - fixedFilename = filename.c_str() + 17; + if (fixedFilename.contains(':')) { + if (fixedFilename.hasPrefix("c:/windows/fonts/")) { // East Side Story refers to "c:\windows\fonts\framd.ttf" + fixedFilename = filename.c_str() + 14; } else { error("openDiskFile::Absolute path or invalid filename used in %s", filename.c_str()); } @@ -125,7 +132,7 @@ Common::SeekableReadStream *openDiskFile(const Common::String &filename) { SearchMan.listMatchingMembers(files, fixedFilename); for (Common::ArchiveMemberList::iterator it = files.begin(); it != files.end(); ++it) { - if ((*it)->getName() == filename) { + if ((*it)->getName().equalsIgnoreCase(lastPathComponent(fixedFilename,'/'))) { file = (*it)->createReadStream(); break; } @@ -157,7 +164,7 @@ Common::SeekableReadStream *openDiskFile(const Common::String &filename) { if (!compBuffer) { error("Error allocating memory for compressed file '%s'", filename.c_str()); delete file; - return NULL; + return nullptr; } byte *data = new byte[uncompSize]; @@ -165,7 +172,7 @@ Common::SeekableReadStream *openDiskFile(const Common::String &filename) { error("Error allocating buffer for file '%s'", filename.c_str()); delete[] compBuffer; delete file; - return NULL; + return nullptr; } file->seek(dataOffset + prefixSize, SEEK_SET); file->read(compBuffer, compSize); @@ -174,7 +181,7 @@ Common::SeekableReadStream *openDiskFile(const Common::String &filename) { error("Error uncompressing file '%s'", filename.c_str()); delete[] compBuffer; delete file; - return NULL; + return nullptr; } delete[] compBuffer; @@ -188,7 +195,7 @@ Common::SeekableReadStream *openDiskFile(const Common::String &filename) { return file; } - return NULL; + return nullptr; } } // end of namespace Wintermute diff --git a/engines/wintermute/base/file/base_file.h b/engines/wintermute/base/file/base_file.h index 82f6ce3554..8eda6d51d9 100644 --- a/engines/wintermute/base/file/base_file.h +++ b/engines/wintermute/base/file/base_file.h @@ -45,10 +45,10 @@ protected: uint32 _pos; uint32 _size; public: - virtual uint32 getSize() { + virtual uint32 getSize() const { return _size; }; - virtual uint32 getPos() { + virtual uint32 getPos() const { return _pos; }; virtual bool seek(uint32 pos, int whence = SEEK_SET) = 0; diff --git a/engines/wintermute/base/file/base_file_entry.cpp b/engines/wintermute/base/file/base_file_entry.cpp index b9805d78dd..1968da6f47 100644 --- a/engines/wintermute/base/file/base_file_entry.cpp +++ b/engines/wintermute/base/file/base_file_entry.cpp @@ -37,7 +37,7 @@ namespace Wintermute { Common::SeekableReadStream *BaseFileEntry::createReadStream() const { Common::SeekableReadStream *file = _package->getFilePointer(); if (!file) { - return NULL; + return nullptr; } bool compressed = (_compressedLength != 0); @@ -55,7 +55,7 @@ Common::SeekableReadStream *BaseFileEntry::createReadStream() const { ////////////////////////////////////////////////////////////////////////// BaseFileEntry::BaseFileEntry() { - _package = NULL; + _package = nullptr; _length = _compressedLength = _offset = _flags = 0; _filename = ""; @@ -67,7 +67,7 @@ BaseFileEntry::BaseFileEntry() { ////////////////////////////////////////////////////////////////////////// BaseFileEntry::~BaseFileEntry() { - _package = NULL; // ref only + _package = nullptr; // ref only } } // end of namespace Wintermute diff --git a/engines/wintermute/base/file/base_package.cpp b/engines/wintermute/base/file/base_package.cpp index 51a1558a7c..4434ed3951 100644 --- a/engines/wintermute/base/file/base_package.cpp +++ b/engines/wintermute/base/file/base_package.cpp @@ -157,7 +157,7 @@ PackageSet::PackageSet(Common::FSNode file, const Common::String &filename, bool pkg->_cd = stream->readByte(); pkg->_priority = hdr._priority; delete[] pkgName; - pkgName = NULL; + pkgName = nullptr; if (!hdr._masterIndex) { pkg->_cd = 0; // override CD to fixed disk @@ -186,7 +186,7 @@ PackageSet::PackageSet(Common::FSNode file, const Common::String &filename, bool Common::String upcName = name; upcName.toUppercase(); delete[] name; - name = NULL; + name = nullptr; offset = stream->readUint32LE(); offset += absoluteOffset; @@ -270,7 +270,7 @@ Common::SeekableReadStream *PackageSet::createReadStreamForMember(const Common:: if (it != _files.end()) { return it->_value->createReadStream(); } - return NULL; + return nullptr; } } // end of namespace Wintermute diff --git a/engines/wintermute/base/file/base_resources.cpp b/engines/wintermute/base/file/base_resources.cpp deleted file mode 100644 index 0b32cb0c4f..0000000000 --- a/engines/wintermute/base/file/base_resources.cpp +++ /dev/null @@ -1,2830 +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. - * - */ - -/* - * This file is based on WME Lite. - * http://dead-code.org/redir.php?target=wmelite - * Copyright (c) 2011 Jan Nedoma - */ - -#include "engines/wintermute/base/file/base_resources.h" -#include "common/str.h" -#include "common/memstream.h" - -namespace Wintermute { - -unsigned char invalid[] = { - 0x42, 0x4d, 0x36, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x04, 0x00, 0x00, 0x28, 0x00, - 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x4e, 0x00, 0x00, 0x20, 0x4e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -} ; - -unsigned char invaliddebug[] = { - 0x42, 0x4d, 0x36, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x04, 0x00, 0x00, 0x28, 0x00, - 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, - 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, - 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0x00, 0xc0, 0xdc, 0xc0, 0x00, 0xf0, 0xca, 0xa6, 0x00, 0x00, 0x20, - 0x40, 0x00, 0x00, 0x20, 0x60, 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, 0x20, 0xa0, 0x00, 0x00, 0x20, - 0xc0, 0x00, 0x00, 0x20, 0xe0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x00, 0x40, - 0x40, 0x00, 0x00, 0x40, 0x60, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x40, 0xa0, 0x00, 0x00, 0x40, - 0xc0, 0x00, 0x00, 0x40, 0xe0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x20, 0x00, 0x00, 0x60, - 0x40, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x80, 0x00, 0x00, 0x60, 0xa0, 0x00, 0x00, 0x60, - 0xc0, 0x00, 0x00, 0x60, 0xe0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x00, 0x80, - 0x40, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0xa0, 0x00, 0x00, 0x80, - 0xc0, 0x00, 0x00, 0x80, 0xe0, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0xa0, 0x20, 0x00, 0x00, 0xa0, - 0x40, 0x00, 0x00, 0xa0, 0x60, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0xa0, 0xa0, 0x00, 0x00, 0xa0, - 0xc0, 0x00, 0x00, 0xa0, 0xe0, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x20, 0x00, 0x00, 0xc0, - 0x40, 0x00, 0x00, 0xc0, 0x60, 0x00, 0x00, 0xc0, 0x80, 0x00, 0x00, 0xc0, 0xa0, 0x00, 0x00, 0xc0, - 0xc0, 0x00, 0x00, 0xc0, 0xe0, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x20, 0x00, 0x00, 0xe0, - 0x40, 0x00, 0x00, 0xe0, 0x60, 0x00, 0x00, 0xe0, 0x80, 0x00, 0x00, 0xe0, 0xa0, 0x00, 0x00, 0xe0, - 0xc0, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x60, 0x00, 0x40, 0x00, 0x80, 0x00, 0x40, 0x00, 0xa0, 0x00, 0x40, 0x00, - 0xc0, 0x00, 0x40, 0x00, 0xe0, 0x00, 0x40, 0x20, 0x00, 0x00, 0x40, 0x20, 0x20, 0x00, 0x40, 0x20, - 0x40, 0x00, 0x40, 0x20, 0x60, 0x00, 0x40, 0x20, 0x80, 0x00, 0x40, 0x20, 0xa0, 0x00, 0x40, 0x20, - 0xc0, 0x00, 0x40, 0x20, 0xe0, 0x00, 0x40, 0x40, 0x00, 0x00, 0x40, 0x40, 0x20, 0x00, 0x40, 0x40, - 0x40, 0x00, 0x40, 0x40, 0x60, 0x00, 0x40, 0x40, 0x80, 0x00, 0x40, 0x40, 0xa0, 0x00, 0x40, 0x40, - 0xc0, 0x00, 0x40, 0x40, 0xe0, 0x00, 0x40, 0x60, 0x00, 0x00, 0x40, 0x60, 0x20, 0x00, 0x40, 0x60, - 0x40, 0x00, 0x40, 0x60, 0x60, 0x00, 0x40, 0x60, 0x80, 0x00, 0x40, 0x60, 0xa0, 0x00, 0x40, 0x60, - 0xc0, 0x00, 0x40, 0x60, 0xe0, 0x00, 0x40, 0x80, 0x00, 0x00, 0x40, 0x80, 0x20, 0x00, 0x40, 0x80, - 0x40, 0x00, 0x40, 0x80, 0x60, 0x00, 0x40, 0x80, 0x80, 0x00, 0x40, 0x80, 0xa0, 0x00, 0x40, 0x80, - 0xc0, 0x00, 0x40, 0x80, 0xe0, 0x00, 0x40, 0xa0, 0x00, 0x00, 0x40, 0xa0, 0x20, 0x00, 0x40, 0xa0, - 0x40, 0x00, 0x40, 0xa0, 0x60, 0x00, 0x40, 0xa0, 0x80, 0x00, 0x40, 0xa0, 0xa0, 0x00, 0x40, 0xa0, - 0xc0, 0x00, 0x40, 0xa0, 0xe0, 0x00, 0x40, 0xc0, 0x00, 0x00, 0x40, 0xc0, 0x20, 0x00, 0x40, 0xc0, - 0x40, 0x00, 0x40, 0xc0, 0x60, 0x00, 0x40, 0xc0, 0x80, 0x00, 0x40, 0xc0, 0xa0, 0x00, 0x40, 0xc0, - 0xc0, 0x00, 0x40, 0xc0, 0xe0, 0x00, 0x40, 0xe0, 0x00, 0x00, 0x40, 0xe0, 0x20, 0x00, 0x40, 0xe0, - 0x40, 0x00, 0x40, 0xe0, 0x60, 0x00, 0x40, 0xe0, 0x80, 0x00, 0x40, 0xe0, 0xa0, 0x00, 0x40, 0xe0, - 0xc0, 0x00, 0x40, 0xe0, 0xe0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, 0x80, 0x00, - 0x40, 0x00, 0x80, 0x00, 0x60, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xa0, 0x00, 0x80, 0x00, - 0xc0, 0x00, 0x80, 0x00, 0xe0, 0x00, 0x80, 0x20, 0x00, 0x00, 0x80, 0x20, 0x20, 0x00, 0x80, 0x20, - 0x40, 0x00, 0x80, 0x20, 0x60, 0x00, 0x80, 0x20, 0x80, 0x00, 0x80, 0x20, 0xa0, 0x00, 0x80, 0x20, - 0xc0, 0x00, 0x80, 0x20, 0xe0, 0x00, 0x80, 0x40, 0x00, 0x00, 0x80, 0x40, 0x20, 0x00, 0x80, 0x40, - 0x40, 0x00, 0x80, 0x40, 0x60, 0x00, 0x80, 0x40, 0x80, 0x00, 0x80, 0x40, 0xa0, 0x00, 0x80, 0x40, - 0xc0, 0x00, 0x80, 0x40, 0xe0, 0x00, 0x80, 0x60, 0x00, 0x00, 0x80, 0x60, 0x20, 0x00, 0x80, 0x60, - 0x40, 0x00, 0x80, 0x60, 0x60, 0x00, 0x80, 0x60, 0x80, 0x00, 0x80, 0x60, 0xa0, 0x00, 0x80, 0x60, - 0xc0, 0x00, 0x80, 0x60, 0xe0, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x20, 0x00, 0x80, 0x80, - 0x40, 0x00, 0x80, 0x80, 0x60, 0x00, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0xa0, 0x00, 0x80, 0x80, - 0xc0, 0x00, 0x80, 0x80, 0xe0, 0x00, 0x80, 0xa0, 0x00, 0x00, 0x80, 0xa0, 0x20, 0x00, 0x80, 0xa0, - 0x40, 0x00, 0x80, 0xa0, 0x60, 0x00, 0x80, 0xa0, 0x80, 0x00, 0x80, 0xa0, 0xa0, 0x00, 0x80, 0xa0, - 0xc0, 0x00, 0x80, 0xa0, 0xe0, 0x00, 0x80, 0xc0, 0x00, 0x00, 0x80, 0xc0, 0x20, 0x00, 0x80, 0xc0, - 0x40, 0x00, 0x80, 0xc0, 0x60, 0x00, 0x80, 0xc0, 0x80, 0x00, 0x80, 0xc0, 0xa0, 0x00, 0x80, 0xc0, - 0xc0, 0x00, 0x80, 0xc0, 0xe0, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x80, 0xe0, 0x20, 0x00, 0x80, 0xe0, - 0x40, 0x00, 0x80, 0xe0, 0x60, 0x00, 0x80, 0xe0, 0x80, 0x00, 0x80, 0xe0, 0xa0, 0x00, 0x80, 0xe0, - 0xc0, 0x00, 0x80, 0xe0, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x20, 0x00, 0xc0, 0x00, - 0x40, 0x00, 0xc0, 0x00, 0x60, 0x00, 0xc0, 0x00, 0x80, 0x00, 0xc0, 0x00, 0xa0, 0x00, 0xc0, 0x00, - 0xc0, 0x00, 0xc0, 0x00, 0xe0, 0x00, 0xc0, 0x20, 0x00, 0x00, 0xc0, 0x20, 0x20, 0x00, 0xc0, 0x20, - 0x40, 0x00, 0xc0, 0x20, 0x60, 0x00, 0xc0, 0x20, 0x80, 0x00, 0xc0, 0x20, 0xa0, 0x00, 0xc0, 0x20, - 0xc0, 0x00, 0xc0, 0x20, 0xe0, 0x00, 0xc0, 0x40, 0x00, 0x00, 0xc0, 0x40, 0x20, 0x00, 0xc0, 0x40, - 0x40, 0x00, 0xc0, 0x40, 0x60, 0x00, 0xc0, 0x40, 0x80, 0x00, 0xc0, 0x40, 0xa0, 0x00, 0xc0, 0x40, - 0xc0, 0x00, 0xc0, 0x40, 0xe0, 0x00, 0xc0, 0x60, 0x00, 0x00, 0xc0, 0x60, 0x20, 0x00, 0xc0, 0x60, - 0x40, 0x00, 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60, 0x80, 0x00, 0xc0, 0x60, 0xa0, 0x00, 0xc0, 0x60, - 0xc0, 0x00, 0xc0, 0x60, 0xe0, 0x00, 0xc0, 0x80, 0x00, 0x00, 0xc0, 0x80, 0x20, 0x00, 0xc0, 0x80, - 0x40, 0x00, 0xc0, 0x80, 0x60, 0x00, 0xc0, 0x80, 0x80, 0x00, 0xc0, 0x80, 0xa0, 0x00, 0xc0, 0x80, - 0xc0, 0x00, 0xc0, 0x80, 0xe0, 0x00, 0xc0, 0xa0, 0x00, 0x00, 0xc0, 0xa0, 0x20, 0x00, 0xc0, 0xa0, - 0x40, 0x00, 0xc0, 0xa0, 0x60, 0x00, 0xc0, 0xa0, 0x80, 0x00, 0xc0, 0xa0, 0xa0, 0x00, 0xc0, 0xa0, - 0xc0, 0x00, 0xc0, 0xa0, 0xe0, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0xc0, 0xc0, 0x20, 0x00, 0xc0, 0xc0, - 0x40, 0x00, 0xc0, 0xc0, 0x60, 0x00, 0xc0, 0xc0, 0x80, 0x00, 0xc0, 0xc0, 0xa0, 0x00, 0xf0, 0xfb, - 0xff, 0x00, 0xa4, 0xa0, 0xa0, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, - 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, - 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, - 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, - 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, - 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, - 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0xf9, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, - 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0xf9, - 0x00, 0x00, 0x00, 0xf9, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, - 0x00, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0xf9, - 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, - 0x00, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, - 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, - 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0xf9, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, - 0x00, 0x00, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, - 0x00, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, - 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0xf9, 0xf9, 0x00, - 0x00, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0xf9, - 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0xf9, - 0xf9, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0xf9, - 0x00, 0x00, 0x00, 0xf9, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, - 0x00, 0xf9, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, - 0x00, 0x00, 0x00, 0xf9, 0xf9, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, - 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, - 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, - 0xf9, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, - 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, - 0xf9, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0xf9, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, - 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, - 0xf9, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, - 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0xf9, - 0x00, 0x00, 0x00, 0xf9, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, - 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0xf9, - 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, - 0x00, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0xf9, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 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, 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, 0x00, 0x00, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, - 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, - 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, - 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, - 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9 -} ; - -unsigned char systemfont[] = { - 0x42, 0x4d, 0x36, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x04, 0x00, 0x00, 0x28, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x70, 0x0b, 0x00, 0x00, 0x70, 0x0b, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x80, 0x80, - 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, - 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, - 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, - 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, - 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, - 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x02, 0x01, 0x00, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, - 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, - 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, - 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x00, 0x01, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x02, 0x02, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, - 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, - 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, - 0x01, 0x00, 0x00, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x01, 0x00, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, - 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, - 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, - 0x00, 0x01, 0x01, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, - 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, - 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, - 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x02, 0x02, - 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, - 0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x00, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x02, 0x02, - 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, - 0x01, 0x02, 0x02, 0x01, 0x00, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, - 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x01, 0x02, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, - 0x02, 0x00, 0x01, 0x02, 0x01, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x01, 0x00, 0x02, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, - 0x02, 0x00, 0x01, 0x01, 0x00, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, 0x00, 0x02, 0x00, 0x01, 0x02, 0x00, 0x02, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, - 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x02, 0x02, - 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, - 0x02, 0x01, 0x00, 0x02, 0x01, 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x01, 0x02, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x01, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, - 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, - 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x01, 0x00, - 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x02, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, - 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, - 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, - 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x01, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, - 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, - 0x00, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, - 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x00, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x01, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x00, 0x01, 0x02, 0x00, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02, - 0x02, 0x02, 0x01, 0x01, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x01, - 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x01, 0x00, 0x02, 0x01, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02, - 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02, - 0x00, 0x01, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, - 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, - 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, - 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, - 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, - 0x00, 0x02, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x00, 0x02, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02, - 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, - 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, - 0x00, 0x01, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, - 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, - 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, - 0x00, 0x02, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x00, 0x02, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, - 0x02, 0x01, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, - 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x02, 0x02, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x02, 0x02, - 0x00, 0x02, 0x02, 0x00, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, - 0x00, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 -} ; - -Common::SeekableReadStream *BaseResources::getFile(const Common::String &filename) { - if (scumm_stricmp(filename.c_str(), "invalid.bmp") == 0) { - return new Common::MemoryReadStream(invalid, sizeof(invalid), DisposeAfterUse::NO); - } else if (scumm_stricmp(filename.c_str(), "invalid_debug.bmp") == 0) { - return new Common::MemoryReadStream(invaliddebug, sizeof(invalid), DisposeAfterUse::NO); - } else if (scumm_stricmp(filename.c_str(), "syste_font.bmp") == 0) { - return new Common::MemoryReadStream(systemfont, sizeof(invalid), DisposeAfterUse::NO); - } - return NULL; -} - -bool BaseResources::hasFile(const Common::String &filename) { - if (scumm_stricmp(filename.c_str(), "invalid.bmp") == 0) { - return true; - } else if (scumm_stricmp(filename.c_str(), "invalid_debug.bmp") == 0) { - return true; - } else if (scumm_stricmp(filename.c_str(), "syste_font.bmp") == 0) { - return true; - } - return false; -} - -} // end of namespace Wintermute diff --git a/engines/wintermute/base/file/base_save_thumb_file.cpp b/engines/wintermute/base/file/base_save_thumb_file.cpp index 94d3e5a94e..2c4ddf4875 100644 --- a/engines/wintermute/base/file/base_save_thumb_file.cpp +++ b/engines/wintermute/base/file/base_save_thumb_file.cpp @@ -38,7 +38,7 @@ namespace Wintermute { ////////////////////////////////////////////////////////////////////////// BaseSaveThumbFile::BaseSaveThumbFile() { - _data = NULL; + _data = nullptr; } @@ -99,7 +99,7 @@ bool BaseSaveThumbFile::open(const Common::String &filename) { ////////////////////////////////////////////////////////////////////////// bool BaseSaveThumbFile::close() { delete[] _data; - _data = NULL; + _data = nullptr; _pos = 0; _size = 0; diff --git a/engines/wintermute/base/font/base_font.cpp b/engines/wintermute/base/font/base_font.cpp index 87dd3da5a3..e3c8827254 100644 --- a/engines/wintermute/base/font/base_font.cpp +++ b/engines/wintermute/base/font/base_font.cpp @@ -89,7 +89,7 @@ BaseFont *BaseFont::createFromFile(BaseGame *gameRef, const Common::String &file if (font) { if (DID_FAIL(font->loadFile(filename))) { delete font; - return NULL; + return nullptr; } } return font; @@ -98,7 +98,7 @@ BaseFont *BaseFont::createFromFile(BaseGame *gameRef, const Common::String &file if (font) { if (DID_FAIL(font->loadFile(filename))) { delete font; - return NULL; + return nullptr; } } return font; @@ -119,7 +119,7 @@ bool BaseFont::isTrueType(BaseGame *gameRef, const Common::String &filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { return false; } diff --git a/engines/wintermute/base/font/base_font_bitmap.cpp b/engines/wintermute/base/font/base_font_bitmap.cpp index 55f46c476b..af66cbb89f 100644 --- a/engines/wintermute/base/font/base_font_bitmap.cpp +++ b/engines/wintermute/base/font/base_font_bitmap.cpp @@ -49,8 +49,8 @@ IMPLEMENT_PERSISTENT(BaseFontBitmap, false) ////////////////////////////////////////////////////////////////////// BaseFontBitmap::BaseFontBitmap(BaseGame *inGame) : BaseFont(inGame) { - _subframe = NULL; - _sprite = NULL; + _subframe = nullptr; + _sprite = nullptr; _widthsFrame = 0; memset(_widths, 0, NUM_CHARACTERS); _tileWidth = _tileHeight = _numColumns = 0; @@ -64,8 +64,8 @@ BaseFontBitmap::BaseFontBitmap(BaseGame *inGame) : BaseFont(inGame) { BaseFontBitmap::~BaseFontBitmap() { delete _subframe; delete _sprite; - _subframe = NULL; - _sprite = NULL; + _subframe = nullptr; + _sprite = nullptr; } @@ -112,7 +112,7 @@ int BaseFontBitmap::textHeightDraw(const byte *text, int x, int y, int width, TT return 0; } - if (text == NULL || text[0] == '\0') { + if (text == nullptr || text[0] == '\0') { return _tileHeight; } @@ -273,7 +273,7 @@ void BaseFontBitmap::drawChar(byte c, int x, int y) { ////////////////////////////////////////////////////////////////////// bool BaseFontBitmap::loadFile(const Common::String &filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "BaseFontBitmap::LoadFile failed for file '%s'", filename.c_str()); return STATUS_FAILED; } @@ -347,8 +347,8 @@ bool BaseFontBitmap::loadBuffer(byte *buffer) { int i; int r = 255, g = 255, b = 255; bool custoTrans = false; - char *surfaceFile = NULL; - char *spriteFile = NULL; + char *surfaceFile = nullptr; + char *spriteFile = nullptr; bool autoWidth = false; int spaceWidth = 0; @@ -428,16 +428,16 @@ bool BaseFontBitmap::loadBuffer(byte *buffer) { return STATUS_FAILED; } - if (spriteFile != NULL) { + if (spriteFile != nullptr) { delete _sprite; _sprite = new BaseSprite(_gameRef, this); if (!_sprite || DID_FAIL(_sprite->loadFile(spriteFile))) { delete _sprite; - _sprite = NULL; + _sprite = nullptr; } } - if (surfaceFile != NULL && !_sprite) { + if (surfaceFile != nullptr && !_sprite) { _subframe = new BaseSubFrame(_gameRef); if (custoTrans) { _subframe->setSurface(surfaceFile, false, r, g, b); @@ -447,7 +447,7 @@ bool BaseFontBitmap::loadBuffer(byte *buffer) { } - if (((_subframe == NULL || _subframe->_surface == NULL) && _sprite == NULL) || _numColumns == 0 || _tileWidth == 0 || _tileHeight == 0) { + if (((_subframe == nullptr || _subframe->_surface == nullptr) && _sprite == nullptr) || _numColumns == 0 || _tileWidth == 0 || _tileHeight == 0) { _gameRef->LOG(0, "Incomplete font definition"); return STATUS_FAILED; } @@ -530,7 +530,7 @@ int BaseFontBitmap::getCharWidth(byte index) { ////////////////////////////////////////////////////////////////////////// bool BaseFontBitmap::getWidths() { - BaseSurface *surf = NULL; + BaseSurface *surf = nullptr; if (_sprite) { if (_widthsFrame >= 0 && _widthsFrame < (int32)_sprite->_frames.size()) { @@ -539,7 +539,7 @@ bool BaseFontBitmap::getWidths() { } } } - if (surf == NULL && _subframe) { + if (surf == nullptr && _subframe) { surf = _subframe->_surface; } if (!surf || DID_FAIL(surf->startPixelOp())) { diff --git a/engines/wintermute/base/font/base_font_storage.cpp b/engines/wintermute/base/font/base_font_storage.cpp index 8128ffe897..6a625f30ae 100644 --- a/engines/wintermute/base/font/base_font_storage.cpp +++ b/engines/wintermute/base/font/base_font_storage.cpp @@ -72,7 +72,7 @@ bool BaseFontStorage::initLoop() { ////////////////////////////////////////////////////////////////////////// BaseFont *BaseFontStorage::addFont(const Common::String &filename) { if (!filename.size()) { - return NULL; + return nullptr; } for (uint32 i = 0; i < _fonts.size(); i++) { @@ -84,11 +84,11 @@ BaseFont *BaseFontStorage::addFont(const Common::String &filename) { /* BaseFont* font = new BaseFont(_gameRef); - if (!font) return NULL; + if (!font) return nullptr; if (DID_FAIL(font->loadFile(filename))) { delete font; - return NULL; + return nullptr; } else { font->_refCount = 1; diff --git a/engines/wintermute/base/font/base_font_truetype.cpp b/engines/wintermute/base/font/base_font_truetype.cpp index f236329fcd..7f1ff340d2 100644 --- a/engines/wintermute/base/font/base_font_truetype.cpp +++ b/engines/wintermute/base/font/base_font_truetype.cpp @@ -38,6 +38,7 @@ #include "engines/wintermute/wintermute.h" #include "graphics/fonts/ttf.h" #include "graphics/fontman.h" +#include "common/unzip.h" #include <limits.h> namespace Wintermute { @@ -49,13 +50,13 @@ BaseFontTT::BaseFontTT(BaseGame *inGame) : BaseFont(inGame) { _fontHeight = 12; _isBold = _isItalic = _isUnderline = _isStriked = false; - _fontFile = NULL; - _font = NULL; - _fallbackFont = NULL; - _deletableFont = NULL; + _fontFile = nullptr; + _font = nullptr; + _fallbackFont = nullptr; + _deletableFont = nullptr; for (int i = 0; i < NUM_CACHED_TEXTS; i++) { - _cachedTexts[i] = NULL; + _cachedTexts[i] = nullptr; } _lineHeight = 0; @@ -72,10 +73,10 @@ BaseFontTT::~BaseFontTT(void) { _layers.clear(); delete[] _fontFile; - _fontFile = NULL; + _fontFile = nullptr; delete _deletableFont; - _font = NULL; + _font = nullptr; } @@ -85,7 +86,7 @@ void BaseFontTT::clearCache() { if (_cachedTexts[i]) { delete _cachedTexts[i]; } - _cachedTexts[i] = NULL; + _cachedTexts[i] = nullptr; } } @@ -95,13 +96,13 @@ void BaseFontTT::initLoop() { if (_gameRef->_constrainedMemory) { // purge all cached images not used in the last frame for (int i = 0; i < NUM_CACHED_TEXTS; i++) { - if (_cachedTexts[i] == NULL) { + if (_cachedTexts[i] == nullptr) { continue; } if (!_cachedTexts[i]->_marked) { delete _cachedTexts[i]; - _cachedTexts[i] = NULL; + _cachedTexts[i] = nullptr; } else { _cachedTexts[i]->_marked = false; } @@ -150,7 +151,7 @@ int BaseFontTT::getTextHeight(byte *text, int width) { ////////////////////////////////////////////////////////////////////////// void BaseFontTT::drawText(const byte *text, int x, int y, int width, TTextAlign align, int maxHeight, int maxLength) { - if (text == NULL || strcmp((const char *)text, "") == 0) { + if (text == nullptr || strcmp((const char *)text, "") == 0) { return; } @@ -162,7 +163,7 @@ void BaseFontTT::drawText(const byte *text, int x, int y, int width, TTextAlign // HACK: J.U.L.I.A. uses CP1252, we need to fix that, // And we still don't have any UTF8-support. if (_gameRef->_textEncoding != TEXT_UTF8) { - textStr = StringUtil::ansiToWide((char *)text); + textStr = StringUtil::ansiToWide((const char *)text); } if (maxLength >= 0 && textStr.size() > (uint32)maxLength) { @@ -173,25 +174,25 @@ void BaseFontTT::drawText(const byte *text, int x, int y, int width, TTextAlign BaseRenderer *renderer = _gameRef->_renderer; // find cached surface, if exists - int minPriority = INT_MAX; + uint32 minUseTime = UINT_MAX; int minIndex = -1; - BaseSurface *surface = NULL; + BaseSurface *surface = nullptr; int textOffset = 0; for (int i = 0; i < NUM_CACHED_TEXTS; i++) { - if (_cachedTexts[i] == NULL) { - minPriority = 0; + if (_cachedTexts[i] == nullptr) { + minUseTime = 0; minIndex = i; } else { if (_cachedTexts[i]->_text == textStr && _cachedTexts[i]->_align == align && _cachedTexts[i]->_width == width && _cachedTexts[i]->_maxHeight == maxHeight && _cachedTexts[i]->_maxLength == maxLength) { surface = _cachedTexts[i]->_surface; textOffset = _cachedTexts[i]->_textOffset; - _cachedTexts[i]->_priority++; _cachedTexts[i]->_marked = true; + _cachedTexts[i]->_lastUsed = g_system->getMillis(); break; } else { - if (_cachedTexts[i]->_priority < minPriority) { - minPriority = _cachedTexts[i]->_priority; + if (_cachedTexts[i]->_lastUsed < minUseTime) { + minUseTime = _cachedTexts[i]->_lastUsed; minIndex = i; } } @@ -204,7 +205,7 @@ void BaseFontTT::drawText(const byte *text, int x, int y, int width, TTextAlign surface = renderTextToTexture(textStr, width, align, maxHeight, textOffset); if (surface) { // write surface to cache - if (_cachedTexts[minIndex] != NULL) { + if (_cachedTexts[minIndex] != nullptr) { delete _cachedTexts[minIndex]; } _cachedTexts[minIndex] = new BaseCachedTTFontText; @@ -214,10 +215,10 @@ void BaseFontTT::drawText(const byte *text, int x, int y, int width, TTextAlign _cachedTexts[minIndex]->_width = width; _cachedTexts[minIndex]->_maxHeight = maxHeight; _cachedTexts[minIndex]->_maxLength = maxLength; - _cachedTexts[minIndex]->_priority = 1; _cachedTexts[minIndex]->_text = textStr; _cachedTexts[minIndex]->_textOffset = textOffset; _cachedTexts[minIndex]->_marked = true; + _cachedTexts[minIndex]->_lastUsed = g_system->getMillis(); } } @@ -254,7 +255,7 @@ BaseSurface *BaseFontTT::renderTextToTexture(const WideString &text, int width, lines.pop_back(); } if (lines.size() == 0) { - return NULL; + return nullptr; } Graphics::TextAlign alignment = Graphics::kTextAlignInvalid; @@ -303,7 +304,7 @@ int BaseFontTT::getLetterHeight() { ////////////////////////////////////////////////////////////////////// bool BaseFontTT::loadFile(const Common::String &filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "BaseFontTT::LoadFile failed for file '%s'", filename.c_str()); return STATUS_FAILED; } @@ -421,7 +422,7 @@ bool BaseFontTT::loadBuffer(byte *buffer) { _layers.add(layer); } else { delete layer; - layer = NULL; + layer = nullptr; cmd = PARSERR_TOKENNOTFOUND; } } @@ -527,9 +528,9 @@ bool BaseFontTT::persist(BasePersistenceManager *persistMgr) { if (!persistMgr->getIsSaving()) { for (int i = 0; i < NUM_CACHED_TEXTS; i++) { - _cachedTexts[i] = NULL; + _cachedTexts[i] = nullptr; } - _fallbackFont = _font = _deletableFont = NULL; + _fallbackFont = _font = _deletableFont = nullptr; } return STATUS_OK; @@ -546,26 +547,52 @@ bool BaseFontTT::initFont() { if (!_fontFile) { return STATUS_FAILED; } - +#ifdef USE_FREETYPE2 Common::SeekableReadStream *file = BaseFileManager::getEngineInstance()->openFile(_fontFile); if (!file) { - //TODO: Try to fallback from Arial to FreeSans - /* - // the requested font file is not in wme file space; try loading a system font - AnsiString fontFileName = PathUtil::combine(BasePlatform::getSystemFontPath(), PathUtil::getFileName(_fontFile)); - file = BaseFileManager::getEngineInstance()->openFile(fontFileName.c_str(), false); - if (!file) { - _gameRef->LOG(0, "Error loading TrueType font '%s'", _fontFile); - //return STATUS_FAILED; - }*/ + if (Common::String(_fontFile) != "arial.ttf") { + warning("%s has no replacement font yet, using FreeSans for now (if available)", _fontFile); + } + // Fallback1: Try to find FreeSans.ttf + file = SearchMan.createReadStreamForMember("FreeSans.ttf"); } if (file) { -#ifdef USE_FREETYPE2 _deletableFont = Graphics::loadTTFFont(*file, 96, _fontHeight); // Use the same dpi as WME (96 vs 72). _font = _deletableFont; -#endif + BaseFileManager::getEngineInstance()->closeFile(file); + file = nullptr; + } + + // Fallback2: Try to find ScummModern.zip, and get the font from there: + if (!_font) { + Common::SeekableReadStream *themeFile = SearchMan.createReadStreamForMember("scummmodern.zip"); + if (themeFile) { + Common::Archive *themeArchive = Common::makeZipArchive(themeFile); + if (themeArchive->hasFile("FreeSans.ttf")) { + file = nullptr; + file = themeArchive->createReadStreamForMember("FreeSans.ttf"); + _deletableFont = Graphics::loadTTFFont(*file, 96, _fontHeight); // Use the same dpi as WME (96 vs 72). + _font = _deletableFont; + } + // We're not using BaseFileManager, so clean up after ourselves: + delete file; + file = nullptr; + delete themeArchive; + themeArchive = nullptr; + } } + + // Fallback3: Try to ask FontMan for the FreeSans.ttf ScummModern.zip uses: + if (!_font) { + // Really not desireable, as we will get a font with dpi-72 then + Common::String fontName = Common::String::format("%s-%s@%d", "FreeSans.ttf", "ASCII", _fontHeight); + warning("Looking for %s", fontName.c_str()); + _font = FontMan.getFontByName(fontName); + } +#endif // USE_FREETYPE2 + + // Fallback4: Just use the Big GUI-font. (REALLY undesireable) if (!_font) { _font = _fallbackFont = FontMan.getFontByUsage(Graphics::FontManager::kBigGUIFont); warning("BaseFontTT::InitFont - Couldn't load font: %s", _fontFile); @@ -600,7 +627,7 @@ void BaseFontTT::measureText(const WideString &text, int maxWidth, int maxHeight TextLine *line = (*it); textWidth = MAX(textWidth, line->GetWidth()); delete line; - line = NULL; + line = nullptr; }*/ } diff --git a/engines/wintermute/base/font/base_font_truetype.h b/engines/wintermute/base/font/base_font_truetype.h index 02dca7439f..ba4aac9380 100644 --- a/engines/wintermute/base/font/base_font_truetype.h +++ b/engines/wintermute/base/font/base_font_truetype.h @@ -54,15 +54,16 @@ private: int _priority; int _textOffset; bool _marked; + uint32 _lastUsed; BaseCachedTTFontText() { //_text = L""; _text = ""; _width = _maxHeight = _maxLength = -1; _align = TAL_LEFT; - _surface = NULL; - _priority = -1; + _surface = nullptr; _textOffset = 0; + _lastUsed = 0; _marked = false; } diff --git a/engines/wintermute/base/gfx/base_image.cpp b/engines/wintermute/base/gfx/base_image.cpp index 4b15d563ed..75de95128f 100644 --- a/engines/wintermute/base/gfx/base_image.cpp +++ b/engines/wintermute/base/gfx/base_image.cpp @@ -43,10 +43,10 @@ namespace Wintermute { ////////////////////////////////////////////////////////////////////// BaseImage::BaseImage() { _fileManager = BaseFileManager::getEngineInstance(); - _palette = NULL; - _surface = NULL; - _decoder = NULL; - _deletableSurface = NULL; + _palette = nullptr; + _surface = nullptr; + _decoder = nullptr; + _deletableSurface = nullptr; } @@ -105,7 +105,7 @@ void BaseImage::copyFrom(const Graphics::Surface *surface) { } ////////////////////////////////////////////////////////////////////////// -bool BaseImage::saveBMPFile(const char *filename) const { +bool BaseImage::saveBMPFile(const Common::String &filename) const { warning("BaseImage::saveBMPFile - stubbed"); // TODO return false; } @@ -118,7 +118,7 @@ bool BaseImage::resize(int newWidth, int newHeight) { if (_deletableSurface) { _deletableSurface->free(); delete _deletableSurface; - _deletableSurface = NULL; + _deletableSurface = nullptr; } _surface = _deletableSurface = temp.scale((uint16)newWidth, (uint16)newHeight); temp.free(); @@ -222,7 +222,7 @@ bool BaseImage::copyFrom(BaseImage *origImage, int newWidth, int newHeight) { if (_deletableSurface) { _deletableSurface->free(); delete _deletableSurface; - _deletableSurface = NULL; + _deletableSurface = nullptr; } _surface = _deletableSurface = temp.scale((uint16)newWidth, (uint16)newHeight); return true; diff --git a/engines/wintermute/base/gfx/base_image.h b/engines/wintermute/base/gfx/base_image.h index 6d01b84184..017305e5d0 100644 --- a/engines/wintermute/base/gfx/base_image.h +++ b/engines/wintermute/base/gfx/base_image.h @@ -55,7 +55,7 @@ public: byte getAlphaAt(int x, int y) const; bool writeBMPToStream(Common::WriteStream *stream) const; bool resize(int newWidth, int newHeight); - bool saveBMPFile(const char *filename) const; + bool saveBMPFile(const Common::String &filename) const; bool copyFrom(BaseImage *origImage, int newWidth = 0, int newHeight = 0); void copyFrom(const Graphics::Surface *surface); private: diff --git a/engines/wintermute/base/gfx/base_renderer.cpp b/engines/wintermute/base/gfx/base_renderer.cpp index e7ffc14c25..c20881e425 100644 --- a/engines/wintermute/base/gfx/base_renderer.cpp +++ b/engines/wintermute/base/gfx/base_renderer.cpp @@ -29,6 +29,7 @@ #include "engines/wintermute/base/base_active_rect.h" #include "engines/wintermute/base/gfx/base_renderer.h" #include "engines/wintermute/base/gfx/base_surface.h" +#include "engines/wintermute/base/gfx/base_image.h" #include "engines/wintermute/base/base_sub_frame.h" #include "engines/wintermute/base/base_region.h" #include "engines/wintermute/platform_osystem.h" @@ -56,7 +57,7 @@ BaseRenderer::BaseRenderer(BaseGame *inGame) : BaseClass(inGame) { _loadImageName = ""; _saveImageName = ""; - _saveLoadImage = NULL; + _saveLoadImage = nullptr; _loadInProgress = false; _hasDrawnSaveLoadImage = false; @@ -132,24 +133,24 @@ void BaseRenderer::initSaveLoad(bool isSaving, bool quickSave) { if (isSaving && !quickSave) { delete _saveLoadImage; - _saveLoadImage = NULL; + _saveLoadImage = nullptr; if (_saveImageName.size()) { _saveLoadImage = createSurface(); if (!_saveLoadImage || DID_FAIL(_saveLoadImage->create(_saveImageName, true, 0, 0, 0))) { delete _saveLoadImage; - _saveLoadImage = NULL; + _saveLoadImage = nullptr; } } } else { delete _saveLoadImage; - _saveLoadImage = NULL; + _saveLoadImage = nullptr; if (_loadImageName.size()) { _saveLoadImage = createSurface(); if (!_saveLoadImage || DID_FAIL(_saveLoadImage->create(_loadImageName, true, 0, 0, 0))) { delete _saveLoadImage; - _saveLoadImage = NULL; + _saveLoadImage = nullptr; } } _loadInProgress = true; @@ -162,7 +163,7 @@ void BaseRenderer::endSaveLoad() { _indicatorWidthDrawn = 0; delete _saveLoadImage; - _saveLoadImage = NULL; + _saveLoadImage = nullptr; } void BaseRenderer::persistSaveLoadImages(BasePersistenceManager *persistMgr) { @@ -214,7 +215,7 @@ BaseObject *BaseRenderer::getObjectAt(int x, int y) { } } - return (BaseObject *)NULL; + return (BaseObject *)nullptr; } @@ -317,7 +318,7 @@ bool BaseRenderer::clipCursor() { ////////////////////////////////////////////////////////////////////////// bool BaseRenderer::unclipCursor() { /* - if (!_windowed) ::ClipCursor(NULL); + if (!_windowed) ::ClipCursor(nullptr); */ return STATUS_OK; } @@ -344,6 +345,22 @@ void BaseRenderer::addRectToList(BaseActiveRect *rect) { _rectList.push_back(rect); } +bool BaseRenderer::saveScreenShot(const Common::String &filename, int sizeX, int sizeY) { + BaseImage *image = takeScreenshot(); + if (image) { + if (sizeX != 0 && sizeY != 0) { + if (!DID_SUCCEED(image->resize(sizeX, sizeY))) { + delete image; + return false; + } + } + image->saveBMPFile(filename); + delete image; + return true; + } + return false; +} + ////////////////////////////////////////////////////////////////////////// bool BaseRenderer::displayIndicator() { if (!_indicatorDisplay || !_indicatorProgress) { diff --git a/engines/wintermute/base/gfx/base_renderer.h b/engines/wintermute/base/gfx/base_renderer.h index 0475824464..5a24e0179a 100644 --- a/engines/wintermute/base/gfx/base_renderer.h +++ b/engines/wintermute/base/gfx/base_renderer.h @@ -61,6 +61,7 @@ public: * @return a BaseImage containing the current screen-buffer. */ virtual BaseImage *takeScreenshot() = 0; + virtual bool saveScreenShot(const Common::String &filename, int sizeX = 0, int sizeY = 0); virtual bool setViewport(int left, int top, int right, int bottom); virtual bool setViewport(Rect32 *rect); virtual Rect32 getViewPort() = 0; @@ -81,12 +82,13 @@ public: * @param g the green component to fade too. * @param b the blue component to fade too. * @param a the alpha component to fade too. - * @param rect the portion of the screen to fade (if NULL, the entire screen will be faded). + * @param rect the portion of the screen to fade (if nullptr, the entire screen will be faded). */ - virtual void fadeToColor(byte r, byte g, byte b, byte a, Common::Rect *rect = NULL) = 0; - virtual bool drawLine(int x1, int y1, int x2, int y2, uint32 color); - virtual bool drawRect(int x1, int y1, int x2, int y2, uint32 color, int width = 1); - BaseRenderer(BaseGame *inGame = NULL); + virtual void fadeToColor(byte r, byte g, byte b, byte a, Common::Rect *rect = nullptr) = 0; + + virtual bool drawLine(int x1, int y1, int x2, int y2, uint32 color); // Unused outside indicator-display + virtual bool drawRect(int x1, int y1, int x2, int y2, uint32 color, int width = 1); // Unused outside indicator-display + BaseRenderer(BaseGame *inGame = nullptr); virtual ~BaseRenderer(); virtual bool setProjection() { return STATUS_OK; @@ -100,7 +102,7 @@ public: * @param g the green component to fill with. * @param b the blue component to fill with. */ - virtual bool fill(byte r, byte g, byte b, Common::Rect *rect = NULL) = 0; + virtual bool fill(byte r, byte g, byte b, Common::Rect *rect = nullptr) = 0; virtual void onWindowChange(); virtual bool initRenderer(int width, int height, bool windowed); /** @@ -179,7 +181,7 @@ public: void setIndicator(int width, int height, int x, int y, uint32 color); void persistSaveLoadImages(BasePersistenceManager *persistMgr); void initSaveLoad(bool isSaving, bool quickSave = false); - void endSaveLoad(); + virtual void endSaveLoad(); void setLoadingScreen(const char *filename, int x, int y); void setSaveImage(const char *filename, int x, int y); diff --git a/engines/wintermute/base/gfx/base_surface.h b/engines/wintermute/base/gfx/base_surface.h index ee53c03e77..1ada900161 100644 --- a/engines/wintermute/base/gfx/base_surface.h +++ b/engines/wintermute/base/gfx/base_surface.h @@ -55,6 +55,7 @@ public: virtual bool display(int x, int y, Rect32 rect, TSpriteBlendMode blendMode = BLEND_NORMAL, bool mirrorX = false, bool mirrorY = false) = 0; virtual bool displayZoom(int x, int y, Rect32 rect, float zoomX, float zoomY, uint32 alpha = 0xFFFFFFFF, bool transparent = false, TSpriteBlendMode blendMode = BLEND_NORMAL, bool mirrorX = false, bool mirrorY = false) = 0; virtual bool displayTransform(int x, int y, int hotX, int hotY, Rect32 rect, float zoomX, float zoomY, uint32 alpha, float rotate, TSpriteBlendMode blendMode = BLEND_NORMAL, bool mirrorX = false, bool mirrorY = false) = 0; + virtual bool repeatLastDisplayOp(int offsetX, int offsetY, int numTimesX, int numTimesY) = 0; virtual bool restore(); virtual bool create(const Common::String &filename, bool defaultCK, byte ckRed, byte ckGreen, byte ckBlue, int lifeTime = -1, bool keepLoaded = false) = 0; virtual bool create(int width, int height); @@ -62,7 +63,7 @@ public: return STATUS_FAILED; } virtual bool putPixel(int x, int y, byte r, byte g, byte b, int a = -1); - virtual bool getPixel(int x, int y, byte *r, byte *g, byte *b, byte *a = NULL); + virtual bool getPixel(int x, int y, byte *r, byte *g, byte *b, byte *a = nullptr); virtual bool comparePixel(int x, int y, byte r, byte g, byte b, int a = -1); virtual bool startPixelOp(); virtual bool endPixelOp(); @@ -79,7 +80,7 @@ public: } Common::String getFileNameStr() { return _filename; } const char* getFileName() { return _filename.c_str(); } - //void SetWidth(int Width){ _width = Width; } + //void SetWidth(int Width) { _width = Width; } //void SetHeight(int Height){ _height = Height; } protected: bool _ckDefault; diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp index 7970a25300..061f52776e 100644 --- a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp +++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp @@ -28,6 +28,7 @@ #include "engines/wintermute/base/gfx/osystem/base_render_osystem.h" #include "engines/wintermute/base/gfx/osystem/base_surface_osystem.h" +#include "engines/wintermute/base/gfx/osystem/render_ticket.h" #include "engines/wintermute/base/base_surface_storage.h" #include "engines/wintermute/base/gfx/base_image.h" #include "engines/wintermute/math/math_util.h" @@ -40,56 +41,6 @@ namespace Wintermute { -RenderTicket::RenderTicket(BaseSurfaceOSystem *owner, const Graphics::Surface *surf, Common::Rect *srcRect, Common::Rect *dstRect, bool mirrorX, bool mirrorY, bool disableAlpha) : _owner(owner), - _srcRect(*srcRect), _dstRect(*dstRect), _drawNum(0), _isValid(true), _wantsDraw(true), _hasAlpha(!disableAlpha) { - _colorMod = 0; - _mirror = TransparentSurface::FLIP_NONE; - if (mirrorX) { - _mirror |= TransparentSurface::FLIP_V; - } - if (mirrorY) { - _mirror |= TransparentSurface::FLIP_H; - } - if (surf) { - _surface = new Graphics::Surface(); - _surface->create((uint16)srcRect->width(), (uint16)srcRect->height(), surf->format); - assert(_surface->format.bytesPerPixel == 4); - // Get a clipped copy of the surface - for (int i = 0; i < _surface->h; i++) { - memcpy(_surface->getBasePtr(0, i), surf->getBasePtr(srcRect->left, srcRect->top + i), srcRect->width() * _surface->format.bytesPerPixel); - } - // Then scale it if necessary - if (dstRect->width() != srcRect->width() || dstRect->height() != srcRect->height()) { - TransparentSurface src(*_surface, false); - Graphics::Surface *temp = src.scale(dstRect->width(), dstRect->height()); - _surface->free(); - delete _surface; - _surface = temp; - } - } else { - _surface = NULL; - } -} - -RenderTicket::~RenderTicket() { - if (_surface) { - _surface->free(); - delete _surface; - } -} - -bool RenderTicket::operator==(RenderTicket &t) { - if ((t._srcRect != _srcRect) || - (t._dstRect != _dstRect) || - (t._mirror != _mirror) || - (t._owner != _owner) || - (t._hasAlpha != _hasAlpha) || - (t._colorMod != _colorMod)) { - return false; - } - return true; -} - BaseRenderer *makeOSystemRenderer(BaseGame *inGame) { return new BaseRenderOSystem(inGame); } @@ -100,16 +51,33 @@ BaseRenderOSystem::BaseRenderOSystem(BaseGame *inGame) : BaseRenderer(inGame) { _blankSurface = new Graphics::Surface(); _drawNum = 1; _needsFlip = true; + _spriteBatch = false; + _batchNum = 0; + _skipThisFrame = false; + _previousTicket = nullptr; _borderLeft = _borderRight = _borderTop = _borderBottom = 0; _ratioX = _ratioY = 1.0f; setAlphaMod(255); setColorMod(255, 255, 255); - _dirtyRect = NULL; + _dirtyRect = nullptr; + _disableDirtyRects = false; + if (ConfMan.hasKey("dirty_rects")) { + _disableDirtyRects = !ConfMan.getBool("dirty_rects"); + } } ////////////////////////////////////////////////////////////////////////// BaseRenderOSystem::~BaseRenderOSystem() { + RenderQueueIterator it = _renderQueue.begin(); + while (it != _renderQueue.end()) { + RenderTicket *ticket = *it; + it = _renderQueue.erase(it); + delete ticket; + } + + delete _dirtyRect; + _renderSurface->free(); delete _renderSurface; _blankSurface->free(); @@ -198,6 +166,14 @@ bool BaseRenderOSystem::indicatorFlip() { } bool BaseRenderOSystem::flip() { + if (_skipThisFrame) { + _skipThisFrame = false; + delete _dirtyRect; + _dirtyRect = nullptr; + g_system->updateScreen(); + _needsFlip = false; + return true; + } if (!_disableDirtyRects) { drawTickets(); } else { @@ -220,7 +196,7 @@ bool BaseRenderOSystem::flip() { } // g_system->copyRectToScreen((byte *)_renderSurface->pixels, _renderSurface->pitch, _dirtyRect->left, _dirtyRect->top, _dirtyRect->width(), _dirtyRect->height()); delete _dirtyRect; - _dirtyRect = NULL; + _dirtyRect = nullptr; g_system->updateScreen(); _needsFlip = false; } @@ -259,14 +235,6 @@ void BaseRenderOSystem::fade(uint16 alpha) { ////////////////////////////////////////////////////////////////////////// void BaseRenderOSystem::fadeToColor(byte r, byte g, byte b, byte a, Common::Rect *rect) { - // This particular warning is rather messy, as this function is called a ton, - // thus we avoid printing it more than once. - - // TODO: Add fading with dirty rects. - if (!_disableDirtyRects) { - warning("BaseRenderOSystem::FadeToColor - Breaks when using dirty rects"); - } - Common::Rect fillRect; if (rect) { @@ -294,7 +262,7 @@ void BaseRenderOSystem::fadeToColor(byte r, byte g, byte b, byte a, Common::Rect Common::Rect sizeRect(fillRect); sizeRect.translate(-fillRect.top, -fillRect.left); surf.fillRect(fillRect, col); - drawSurface(NULL, &surf, &sizeRect, &fillRect, false, false); + drawSurface(nullptr, &surf, &sizeRect, &fillRect, false, false); surf.free(); //SDL_SetRenderDrawColor(_renderer, r, g, b, a); @@ -307,22 +275,38 @@ Graphics::PixelFormat BaseRenderOSystem::getPixelFormat() const { } void BaseRenderOSystem::drawSurface(BaseSurfaceOSystem *owner, const Graphics::Surface *surf, Common::Rect *srcRect, Common::Rect *dstRect, bool mirrorX, bool mirrorY, bool disableAlpha) { + // Start searching from the beginning for the first and second items (since it's empty the first time around + // then keep incrementing the start-position, to avoid comparing against already used tickets. + if (_drawNum == 0 || _drawNum == 1) { + _lastAddedTicket = _renderQueue.begin(); + } + // Skip rects that are completely outside the screen: if ((dstRect->left < 0 && dstRect->right < 0) || (dstRect->top < 0 && dstRect->bottom < 0)) { return; } if (owner) { // Fade-tickets are owner-less - RenderTicket compare(owner, NULL, srcRect, dstRect, mirrorX, mirrorY, disableAlpha); + RenderTicket compare(owner, nullptr, srcRect, dstRect, mirrorX, mirrorY, disableAlpha); + compare._batchNum = _batchNum; + if (_spriteBatch) { + _batchNum++; + } compare._colorMod = _colorMod; RenderQueueIterator it; - for (it = _renderQueue.begin(); it != _renderQueue.end(); ++it) { - if ((*it)->_owner == owner && *(*it) == compare && (*it)->_isValid) { - (*it)->_colorMod = _colorMod; + // Avoid calling end() and operator* every time, when potentially going through + // LOTS of tickets. + RenderQueueIterator endIterator = _renderQueue.end(); + RenderTicket *compareTicket = nullptr; + for (it = _lastAddedTicket; it != endIterator; ++it) { + compareTicket = *it; + if (*(compareTicket) == compare && compareTicket->_isValid) { + compareTicket->_colorMod = _colorMod; if (_disableDirtyRects) { - drawFromSurface(*it, NULL); + drawFromSurface(compareTicket); } else { - drawFromTicket(*it); + drawFromTicket(compareTicket); + _previousTicket = compareTicket; } return; } @@ -332,10 +316,50 @@ void BaseRenderOSystem::drawSurface(BaseSurfaceOSystem *owner, const Graphics::S ticket->_colorMod = _colorMod; if (!_disableDirtyRects) { drawFromTicket(ticket); + _previousTicket = ticket; } else { ticket->_wantsDraw = true; _renderQueue.push_back(ticket); - drawFromSurface(ticket, NULL); + } +} + +void BaseRenderOSystem::repeatLastDraw(int offsetX, int offsetY, int numTimesX, int numTimesY) { + if (_previousTicket && _lastAddedTicket != _renderQueue.end()) { + RenderTicket *origTicket = _previousTicket; + + // Make sure drawSurface WILL start from the correct _lastAddedTicket + if (*_lastAddedTicket != origTicket) { + RenderQueueIterator it; + RenderQueueIterator endIterator = _renderQueue.end(); + for (it = _renderQueue.begin(); it != endIterator; ++it) { + if ((*it) == _previousTicket) { + _lastAddedTicket = it; + break; + } + } + } + Common::Rect srcRect(0, 0, 0, 0); + srcRect.setWidth(origTicket->getSrcRect()->width()); + srcRect.setHeight(origTicket->getSrcRect()->height()); + + Common::Rect dstRect = origTicket->_dstRect; + int initLeft = dstRect.left; + int initRight = dstRect.right; + + for (int i = 0; i < numTimesY; i++) { + if (i == 0) { + dstRect.translate(offsetX, 0); + } + for (int j = (i == 0 ? 1 : 0); j < numTimesX; j++) { + drawSurface(origTicket->_owner, origTicket->getSurface(), &srcRect, &dstRect, false, false); + dstRect.translate(offsetX, 0); + } + dstRect.left = initLeft; + dstRect.right = initRight; + dstRect.translate(0, offsetY); + } + } else { + error("Repeat-draw failed (did you forget to draw something before this?)"); } } @@ -363,28 +387,31 @@ void BaseRenderOSystem::drawFromTicket(RenderTicket *renderTicket) { renderTicket->_drawNum = _drawNum++; _renderQueue.push_back(renderTicket); addDirtyRect(renderTicket->_dstRect); + ++_lastAddedTicket; } else { // Before something - Common::List<RenderTicket *>::iterator pos; + RenderQueueIterator pos; for (pos = _renderQueue.begin(); pos != _renderQueue.end(); pos++) { if ((*pos)->_drawNum >= _drawNum) { break; } } _renderQueue.insert(pos, renderTicket); - Common::List<RenderTicket *>::iterator it; renderTicket->_drawNum = _drawNum++; // Increment the following tickets, so they still are in line + RenderQueueIterator it; for (it = pos; it != _renderQueue.end(); ++it) { (*it)->_drawNum++; (*it)->_wantsDraw = false; } addDirtyRect(renderTicket->_dstRect); + _lastAddedTicket = pos; } } else { // Was drawn last round, still in the same order if (_drawNum == renderTicket->_drawNum) { _drawNum++; + ++_lastAddedTicket; } else { // Remove the ticket from the list RenderQueueIterator it = _renderQueue.begin(); @@ -421,9 +448,12 @@ void BaseRenderOSystem::addDirtyRect(const Common::Rect &rect) { void BaseRenderOSystem::drawTickets() { RenderQueueIterator it = _renderQueue.begin(); // Clean out the old tickets - int decrement = 0; + // Note: We draw invalid tickets too, otherwise we wouldn't be honouring + // the draw request they obviously made BEFORE becoming invalid, either way + // we have a copy of their data, so their invalidness won't affect us. + uint32 decrement = 0; while (it != _renderQueue.end()) { - if ((*it)->_wantsDraw == false || (*it)->_isValid == false) { + if ((*it)->_wantsDraw == false) { RenderTicket *ticket = *it; addDirtyRect((*it)->_dstRect); it = _renderQueue.erase(it); @@ -435,6 +465,12 @@ void BaseRenderOSystem::drawTickets() { } } if (!_dirtyRect || _dirtyRect->width() == 0 || _dirtyRect->height() == 0) { + it = _renderQueue.begin(); + while (it != _renderQueue.end()) { + RenderTicket *ticket = *it; + ticket->_wantsDraw = false; + ++it; + } return; } // The color-mods are stored in the RenderTickets on add, since we set that state again during @@ -447,7 +483,7 @@ void BaseRenderOSystem::drawTickets() { for (it = _renderQueue.begin(); it != _renderQueue.end(); ++it) { RenderTicket *ticket = *it; assert(ticket->_drawNum == _drawNum++); - if (ticket->_isValid && ticket->_dstRect.intersects(*_dirtyRect)) { + if (ticket->_dstRect.intersects(*_dirtyRect)) { // dstClip is the area we want redrawn. Common::Rect dstClip(ticket->_dstRect); // reduce it to the dirty rect @@ -460,7 +496,7 @@ void BaseRenderOSystem::drawTickets() { dstClip.translate(-offsetX, -offsetY); _colorMod = ticket->_colorMod; - drawFromSurface(ticket->getSurface(), &ticket->_srcRect, &pos, &dstClip, ticket->_mirror); + drawFromSurface(ticket, &pos, &dstClip); _needsFlip = true; } // Some tickets want redraw but don't actually clip the dirty area (typically the ones that shouldnt become clear-color) @@ -470,46 +506,40 @@ void BaseRenderOSystem::drawTickets() { // Revert the colorMod-state. _colorMod = oldColorMod; + + it = _renderQueue.begin(); + // Clean out the old tickets + decrement = 0; + while (it != _renderQueue.end()) { + if ((*it)->_isValid == false) { + RenderTicket *ticket = *it; + addDirtyRect((*it)->_dstRect); + it = _renderQueue.erase(it); + delete ticket; + decrement++; + } else { + (*it)->_drawNum -= decrement; + ++it; + } + } + } // Replacement for SDL2's SDL_RenderCopy -void BaseRenderOSystem::drawFromSurface(RenderTicket *ticket, Common::Rect *clipRect) { - TransparentSurface src(*ticket->getSurface(), false); - bool doDelete = false; - if (!clipRect) { - doDelete = true; - clipRect = new Common::Rect(); - clipRect->setWidth(ticket->getSurface()->w); - clipRect->setHeight(ticket->getSurface()->h); - } - - src._enableAlphaBlit = ticket->_hasAlpha; - src.blit(*_renderSurface, ticket->_dstRect.left, ticket->_dstRect.top, ticket->_mirror, clipRect, _colorMod, clipRect->width(), clipRect->height()); - if (doDelete) { - delete clipRect; - } +void BaseRenderOSystem::drawFromSurface(RenderTicket *ticket) { + ticket->drawToSurface(_renderSurface); } -void BaseRenderOSystem::drawFromSurface(const Graphics::Surface *surf, Common::Rect *srcRect, Common::Rect *dstRect, Common::Rect *clipRect, uint32 mirror) { - TransparentSurface src(*surf, false); - bool doDelete = false; - if (!clipRect) { - doDelete = true; - clipRect = new Common::Rect(); - clipRect->setWidth(surf->w); - clipRect->setHeight(surf->h); - } - src.blit(*_renderSurface, dstRect->left, dstRect->top, mirror, clipRect, _colorMod, clipRect->width(), clipRect->height()); - if (doDelete) { - delete clipRect; - } +void BaseRenderOSystem::drawFromSurface(RenderTicket *ticket, Common::Rect *dstRect, Common::Rect *clipRect) { + ticket->drawToSurface(_renderSurface, dstRect, clipRect); } ////////////////////////////////////////////////////////////////////////// bool BaseRenderOSystem::drawLine(int x1, int y1, int x2, int y2, uint32 color) { - - if (!_disableDirtyRects) { - warning("BaseRenderOSystem::DrawLine - doesn't work for dirty rects yet"); + // This function isn't used outside of indicator-displaying, and thus quite unused in + // BaseRenderOSystem when dirty-rects are enabled. + if (!_disableDirtyRects && !_indicatorDisplay) { + error("BaseRenderOSystem::DrawLine - doesn't work for dirty rects yet"); } byte r = RGBCOLGetR(color); @@ -606,4 +636,36 @@ BaseSurface *BaseRenderOSystem::createSurface() { return new BaseSurfaceOSystem(_gameRef); } +void BaseRenderOSystem::endSaveLoad() { + BaseRenderer::endSaveLoad(); + + // Clear the scale-buffered tickets as we just loaded. + RenderQueueIterator it = _renderQueue.begin(); + while (it != _renderQueue.end()) { + RenderTicket *ticket = *it; + it = _renderQueue.erase(it); + delete ticket; + } + // HACK: After a save the buffer will be drawn before the scripts get to update it, + // so just skip this single frame. + _skipThisFrame = true; + _drawNum = 1; + + _renderSurface->fillRect(Common::Rect(0, 0, _renderSurface->h, _renderSurface->w), _renderSurface->format.ARGBToColor(255, 0, 0, 0)); + g_system->copyRectToScreen((byte *)_renderSurface->pixels, _renderSurface->pitch, 0, 0, _renderSurface->w, _renderSurface->h); + g_system->updateScreen(); +} + +bool BaseRenderOSystem::startSpriteBatch() { + _spriteBatch = true; + _batchNum = 1; + return STATUS_OK; +} + +bool BaseRenderOSystem::endSpriteBatch() { + _spriteBatch = false; + _batchNum = 0; + return STATUS_OK; +} + } // end of namespace Wintermute diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.h b/engines/wintermute/base/gfx/osystem/base_render_osystem.h index 1e72508cd0..cc2ed57f9b 100644 --- a/engines/wintermute/base/gfx/osystem/base_render_osystem.h +++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.h @@ -36,27 +36,7 @@ namespace Wintermute { class BaseSurfaceOSystem; -class RenderTicket { - Graphics::Surface *_surface; -public: - RenderTicket(BaseSurfaceOSystem *owner, const Graphics::Surface *surf, Common::Rect *srcRect, Common::Rect *dstRest, bool mirrorX = false, bool mirrorY = false, bool disableAlpha = false); - RenderTicket() : _isValid(true), _wantsDraw(false), _drawNum(0) {} - ~RenderTicket(); - const Graphics::Surface *getSurface() { return _surface; } - Common::Rect _srcRect; - Common::Rect _dstRect; - uint32 _mirror; - bool _hasAlpha; - - bool _isValid; - bool _wantsDraw; - uint32 _drawNum; - uint32 _colorMod; - - BaseSurfaceOSystem *_owner; - bool operator==(RenderTicket &a); -}; - +class RenderTicket; class BaseRenderOSystem : public BaseRenderer { public: BaseRenderOSystem(BaseGame *inGame); @@ -64,17 +44,17 @@ public: Common::String getName() const; - bool initRenderer(int width, int height, bool windowed); - bool flip(); + bool initRenderer(int width, int height, bool windowed) override; + bool flip() override; virtual bool indicatorFlip(); - bool fill(byte r, byte g, byte b, Common::Rect *rect = NULL); - Graphics::PixelFormat getPixelFormat() const; - void fade(uint16 alpha); - void fadeToColor(byte r, byte g, byte b, byte a, Common::Rect *rect = NULL); + bool fill(byte r, byte g, byte b, Common::Rect *rect = nullptr) override; + Graphics::PixelFormat getPixelFormat() const override; + void fade(uint16 alpha) override; + void fadeToColor(byte r, byte g, byte b, byte a, Common::Rect *rect = nullptr) override; - bool drawLine(int x1, int y1, int x2, int y2, uint32 color); + bool drawLine(int x1, int y1, int x2, int y2, uint32 color) override; - BaseImage *takeScreenshot(); + BaseImage *takeScreenshot() override; void setAlphaMod(byte alpha); void setColorMod(byte r, byte g, byte b); @@ -82,32 +62,40 @@ public: void invalidateTicketsFromSurface(BaseSurfaceOSystem *surf); void drawFromTicket(RenderTicket *renderTicket); - bool setViewport(int left, int top, int right, int bottom); - bool setViewport(Rect32 *rect) { return BaseRenderer::setViewport(rect); } - Rect32 getViewPort(); + bool setViewport(int left, int top, int right, int bottom) override; + bool setViewport(Rect32 *rect) override { return BaseRenderer::setViewport(rect); } + Rect32 getViewPort() override; void modTargetRect(Common::Rect *rect); - void pointFromScreen(Point32 *point); + void pointFromScreen(Point32 *point) ; void pointToScreen(Point32 *point); - void dumpData(const char *filename); + void dumpData(const char *filename) override; - float getScaleRatioX() const { + float getScaleRatioX() const override { return _ratioX; } - float getScaleRatioY() const { + float getScaleRatioY() const override { return _ratioY; } - - void drawSurface(BaseSurfaceOSystem *owner, const Graphics::Surface *surf, Common::Rect *srcRect, Common::Rect *dstRect, bool mirrorX, bool mirrorY, bool disableAlpha = false); - BaseSurface *createSurface(); + virtual bool startSpriteBatch() override; + virtual bool endSpriteBatch() override; + void endSaveLoad(); + void drawSurface(BaseSurfaceOSystem *owner, const Graphics::Surface *surf, Common::Rect *srcRect, Common::Rect *dstRect, bool mirrorX, bool mirrorY, bool disableAlpha = false) ; + void repeatLastDraw(int offsetX, int offsetY, int numTimesX, int numTimesY); + BaseSurface *createSurface() override; private: - void addDirtyRect(const Common::Rect &rect); + void addDirtyRect(const Common::Rect &rect) ; void drawTickets(); - void drawFromSurface(RenderTicket *ticket, Common::Rect *clipRect); - void drawFromSurface(const Graphics::Surface *surf, Common::Rect *srcRect, Common::Rect *dstRect, Common::Rect *clipRect, uint32 mirror); + // Non-dirty-rects: + void drawFromSurface(RenderTicket *ticket); + // Dirty-rects: + void drawFromSurface(RenderTicket *ticket, Common::Rect *dstRect, Common::Rect *clipRect); typedef Common::List<RenderTicket *>::iterator RenderQueueIterator; Common::Rect *_dirtyRect; Common::List<RenderTicket *> _renderQueue; + RenderQueueIterator _lastAddedTicket; + RenderTicket *_previousTicket; + bool _needsFlip; uint32 _drawNum; Common::Rect _renderRect; @@ -119,11 +107,15 @@ private: int _borderRight; int _borderBottom; - static const bool _disableDirtyRects = true; + bool _disableDirtyRects; + bool _spriteBatch; + uint32 _batchNum; float _ratioX; float _ratioY; uint32 _colorMod; uint32 _clearColor; + + bool _skipThisFrame; }; } // end of namespace Wintermute diff --git a/engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp index bee876bb65..e3e4884fbb 100644 --- a/engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp +++ b/engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp @@ -47,9 +47,9 @@ namespace Wintermute { ////////////////////////////////////////////////////////////////////////// BaseSurfaceOSystem::BaseSurfaceOSystem(BaseGame *inGame) : BaseSurface(inGame) { _surface = new Graphics::Surface(); - _alphaMask = NULL; + _alphaMask = nullptr; _hasAlpha = true; - _lockPixels = NULL; + _lockPixels = nullptr; _lockPitch = 0; _loaded = false; } @@ -59,11 +59,11 @@ BaseSurfaceOSystem::~BaseSurfaceOSystem() { if (_surface) { _surface->free(); delete _surface; - _surface = NULL; + _surface = nullptr; } delete[] _alphaMask; - _alphaMask = NULL; + _alphaMask = nullptr; _gameRef->addMem(-_width * _height * 4); BaseRenderOSystem *renderer = static_cast<BaseRenderOSystem *>(_gameRef->_renderer); @@ -140,23 +140,32 @@ bool BaseSurfaceOSystem::finishLoad() { // Well, actually, we don't convert via 24-bit as the color-key application overwrites the Alpha-channel anyhow. _surface->free(); delete _surface; + + bool needsColorKey = false; + bool replaceAlpha = true; if (_filename.hasSuffix(".bmp") && image->getSurface()->format.bytesPerPixel == 4) { _surface = image->getSurface()->convertTo(g_system->getScreenFormat(), image->getPalette()); - TransparentSurface trans(*_surface); - trans.applyColorKey(_ckRed, _ckGreen, _ckBlue); + needsColorKey = true; + replaceAlpha = false; } else if (image->getSurface()->format.bytesPerPixel == 1 && image->getPalette()) { _surface = image->getSurface()->convertTo(g_system->getScreenFormat(), image->getPalette()); - TransparentSurface trans(*_surface); - trans.applyColorKey(_ckRed, _ckGreen, _ckBlue, true); + needsColorKey = true; } else if (image->getSurface()->format.bytesPerPixel >= 3 && image->getSurface()->format != g_system->getScreenFormat()) { _surface = image->getSurface()->convertTo(g_system->getScreenFormat()); if (image->getSurface()->format.bytesPerPixel == 3) { - TransparentSurface trans(*_surface); - trans.applyColorKey(_ckRed, _ckGreen, _ckBlue, true); + needsColorKey = true; } } else { _surface = new Graphics::Surface(); _surface->copyFrom(*image->getSurface()); + if (_surface->format.aBits() == 0) { + needsColorKey = true; + } + } + + if (needsColorKey) { + TransparentSurface trans(*_surface); + trans.applyColorKey(_ckRed, _ckGreen, _ckBlue, replaceAlpha); } _hasAlpha = hasTransparency(_surface); @@ -177,7 +186,7 @@ void BaseSurfaceOSystem::genAlphaMask(Graphics::Surface *surface) { return; // TODO: Reimplement this delete[] _alphaMask; - _alphaMask = NULL; + _alphaMask = nullptr; if (!surface) { return; } @@ -214,7 +223,7 @@ void BaseSurfaceOSystem::genAlphaMask(Graphics::Surface *surface) { if (!hasTransparency) { delete[] _alphaMask; - _alphaMask = NULL; + _alphaMask = nullptr; } } @@ -293,7 +302,7 @@ bool BaseSurfaceOSystem::isTransparentAtLite(int x, int y) { ////////////////////////////////////////////////////////////////////////// bool BaseSurfaceOSystem::startPixelOp() { - //SDL_LockTexture(_texture, NULL, &_lockPixels, &_lockPitch); + //SDL_LockTexture(_texture, nullptr, &_lockPixels, &_lockPitch); // Any pixel-op makes the caching useless: BaseRenderOSystem *renderer = static_cast<BaseRenderOSystem *>(_gameRef->_renderer); renderer->invalidateTicketsFromSurface(this); @@ -414,6 +423,12 @@ bool BaseSurfaceOSystem::drawSprite(int x, int y, Rect32 *rect, float zoomX, flo return STATUS_OK; } +bool BaseSurfaceOSystem::repeatLastDisplayOp(int offsetX, int offsetY, int numTimesX, int numTimesY) { + BaseRenderOSystem *renderer = static_cast<BaseRenderOSystem *>(_gameRef->_renderer); + renderer->repeatLastDraw(offsetX, offsetY, numTimesX, numTimesY); + return STATUS_OK; +} + bool BaseSurfaceOSystem::putSurface(const Graphics::Surface &surface, bool hasAlpha) { _loaded = true; _surface->free(); diff --git a/engines/wintermute/base/gfx/osystem/base_surface_osystem.h b/engines/wintermute/base/gfx/osystem/base_surface_osystem.h index 43422ef4e7..9091ec65b1 100644 --- a/engines/wintermute/base/gfx/osystem/base_surface_osystem.h +++ b/engines/wintermute/base/gfx/osystem/base_surface_osystem.h @@ -41,27 +41,28 @@ public: BaseSurfaceOSystem(BaseGame *inGame); ~BaseSurfaceOSystem(); - bool create(const Common::String &filename, bool defaultCK, byte ckRed, byte ckGreen, byte ckBlue, int lifeTime = -1, bool keepLoaded = false); - bool create(int width, int height); + bool create(const Common::String &filename, bool defaultCK, byte ckRed, byte ckGreen, byte ckBlue, int lifeTime = -1, bool keepLoaded = false) override; + bool create(int width, int height) override; - bool isTransparentAt(int x, int y); - bool isTransparentAtLite(int x, int y); + bool isTransparentAt(int x, int y) override; + bool isTransparentAtLite(int x, int y) override; - bool startPixelOp(); - bool endPixelOp(); + bool startPixelOp() override; + bool endPixelOp() override; - bool displayTransZoom(int x, int y, Rect32 rect, float zoomX, float zoomY, uint32 alpha = 0xFFFFFFFF, TSpriteBlendMode blendMode = BLEND_NORMAL, bool mirrorX = false, bool mirrorY = false); - bool displayTrans(int x, int y, Rect32 rect, uint32 alpha = 0xFFFFFFFF, TSpriteBlendMode blendMode = BLEND_NORMAL, bool mirrorX = false, bool mirrorY = false); - bool displayTransOffset(int x, int y, Rect32 rect, uint32 alpha = 0xFFFFFFFF, TSpriteBlendMode blendMode = BLEND_NORMAL, bool mirrorX = false, bool mirrorY = false, int offsetX = 0, int offsetY = 0); - bool display(int x, int y, Rect32 rect, TSpriteBlendMode blendMode = BLEND_NORMAL, bool mirrorX = false, bool mirrorY = false); - bool displayZoom(int x, int y, Rect32 rect, float zoomX, float zoomY, uint32 alpha = 0xFFFFFFFF, bool transparent = false, TSpriteBlendMode blendMode = BLEND_NORMAL, bool mirrorX = false, bool mirrorY = false); - bool displayTransform(int x, int y, int hotX, int hotY, Rect32 Rect, float zoomX, float zoomY, uint32 alpha, float rotate, TSpriteBlendMode blendMode = BLEND_NORMAL, bool mirrorX = false, bool mirrorY = false); - virtual bool putSurface(const Graphics::Surface &surface, bool hasAlpha = false); + bool displayTransZoom(int x, int y, Rect32 rect, float zoomX, float zoomY, uint32 alpha = 0xFFFFFFFF, TSpriteBlendMode blendMode = BLEND_NORMAL, bool mirrorX = false, bool mirrorY = false) override; + bool displayTrans(int x, int y, Rect32 rect, uint32 alpha = 0xFFFFFFFF, TSpriteBlendMode blendMode = BLEND_NORMAL, bool mirrorX = false, bool mirrorY = false) override; + bool displayTransOffset(int x, int y, Rect32 rect, uint32 alpha = 0xFFFFFFFF, TSpriteBlendMode blendMode = BLEND_NORMAL, bool mirrorX = false, bool mirrorY = false, int offsetX = 0, int offsetY = 0) override; + bool display(int x, int y, Rect32 rect, TSpriteBlendMode blendMode = BLEND_NORMAL, bool mirrorX = false, bool mirrorY = false) override; + bool displayZoom(int x, int y, Rect32 rect, float zoomX, float zoomY, uint32 alpha = 0xFFFFFFFF, bool transparent = false, TSpriteBlendMode blendMode = BLEND_NORMAL, bool mirrorX = false, bool mirrorY = false) override; + bool displayTransform(int x, int y, int hotX, int hotY, Rect32 Rect, float zoomX, float zoomY, uint32 alpha, float rotate, TSpriteBlendMode blendMode = BLEND_NORMAL, bool mirrorX = false, bool mirrorY = false) override; + bool repeatLastDisplayOp(int offsetX, int offsetY, int numTimesX, int numTimesY) override; + virtual bool putSurface(const Graphics::Surface &surface, bool hasAlpha = false) override; /* static unsigned DLL_CALLCONV ReadProc(void *buffer, unsigned size, unsigned count, fi_handle handle); static int DLL_CALLCONV SeekProc(fi_handle handle, long offset, int origin); static long DLL_CALLCONV TellProc(fi_handle handle);*/ - virtual int getWidth() { + virtual int getWidth() override { if (!_loaded) { finishLoad(); } @@ -70,7 +71,7 @@ public: } return _width; } - virtual int getHeight() { + virtual int getHeight() override { if (!_loaded) { finishLoad(); } diff --git a/engines/wintermute/base/gfx/osystem/render_ticket.cpp b/engines/wintermute/base/gfx/osystem/render_ticket.cpp new file mode 100644 index 0000000000..d253ddca4b --- /dev/null +++ b/engines/wintermute/base/gfx/osystem/render_ticket.cpp @@ -0,0 +1,115 @@ +/* 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. + * + */ + +/* + * This file is based on WME Lite. + * http://dead-code.org/redir.php?target=wmelite + * Copyright (c) 2011 Jan Nedoma + */ + +#include "engines/wintermute/graphics/transparent_surface.h" +#include "engines/wintermute/base/gfx/osystem/render_ticket.h" + +namespace Wintermute { + +RenderTicket::RenderTicket(BaseSurfaceOSystem *owner, const Graphics::Surface *surf, Common::Rect *srcRect, Common::Rect *dstRect, bool mirrorX, bool mirrorY, bool disableAlpha) : _owner(owner), +_srcRect(*srcRect), _dstRect(*dstRect), _drawNum(0), _isValid(true), _wantsDraw(true), _hasAlpha(!disableAlpha) { + _colorMod = 0; + _batchNum = 0; + _mirror = TransparentSurface::FLIP_NONE; + if (mirrorX) { + _mirror |= TransparentSurface::FLIP_V; + } + if (mirrorY) { + _mirror |= TransparentSurface::FLIP_H; + } + if (surf) { + _surface = new Graphics::Surface(); + _surface->create((uint16)srcRect->width(), (uint16)srcRect->height(), surf->format); + assert(_surface->format.bytesPerPixel == 4); + // Get a clipped copy of the surface + for (int i = 0; i < _surface->h; i++) { + memcpy(_surface->getBasePtr(0, i), surf->getBasePtr(srcRect->left, srcRect->top + i), srcRect->width() * _surface->format.bytesPerPixel); + } + // Then scale it if necessary + if (dstRect->width() != srcRect->width() || dstRect->height() != srcRect->height()) { + TransparentSurface src(*_surface, false); + Graphics::Surface *temp = src.scale(dstRect->width(), dstRect->height()); + _surface->free(); + delete _surface; + _surface = temp; + } + } else { + _surface = nullptr; + } +} + +RenderTicket::~RenderTicket() { + if (_surface) { + _surface->free(); + delete _surface; + } +} + +bool RenderTicket::operator==(RenderTicket &t) { + if ((t._owner != _owner) || + (t._batchNum != t._batchNum) || + (t._hasAlpha != _hasAlpha) || + (t._mirror != _mirror) || + (t._colorMod != _colorMod) || + (t._dstRect != _dstRect) || + (t._srcRect != _srcRect)) { + return false; + } + return true; +} + +// Replacement for SDL2's SDL_RenderCopy +void RenderTicket::drawToSurface(Graphics::Surface *_targetSurface) { + TransparentSurface src(*getSurface(), false); + + Common::Rect clipRect; + clipRect.setWidth(getSurface()->w); + clipRect.setHeight(getSurface()->h); + + src._enableAlphaBlit = _hasAlpha; + src.blit(*_targetSurface, _dstRect.left, _dstRect.top, _mirror, &clipRect, _colorMod, clipRect.width(), clipRect.height()); +} + +void RenderTicket::drawToSurface(Graphics::Surface *_targetSurface, Common::Rect *dstRect, Common::Rect *clipRect) { + TransparentSurface src(*getSurface(), false); + bool doDelete = false; + if (!clipRect) { + doDelete = true; + clipRect = new Common::Rect(); + clipRect->setWidth(getSurface()->w); + clipRect->setHeight(getSurface()->h); + } + + src._enableAlphaBlit = _hasAlpha; + src.blit(*_targetSurface, dstRect->left, dstRect->top, _mirror, clipRect, _colorMod, clipRect->width(), clipRect->height()); + if (doDelete) { + delete clipRect; + } +} + +} // end of namespace Wintermute diff --git a/engines/wintermute/base/gfx/osystem/render_ticket.h b/engines/wintermute/base/gfx/osystem/render_ticket.h new file mode 100644 index 0000000000..968b42b5e1 --- /dev/null +++ b/engines/wintermute/base/gfx/osystem/render_ticket.h @@ -0,0 +1,69 @@ +/* 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. + * + */ + +/* + * This file is based on WME Lite. + * http://dead-code.org/redir.php?target=wmelite + * Copyright (c) 2011 Jan Nedoma + */ + +#ifndef WINTERMUTE_RENDER_TICKET_H +#define WINTERMUTE_RENDER_TICKET_H + +#include "graphics/surface.h" +#include "common/rect.h" + +namespace Wintermute { + +class BaseSurfaceOSystem; +class RenderTicket { +public: + RenderTicket(BaseSurfaceOSystem *owner, const Graphics::Surface *surf, Common::Rect *srcRect, Common::Rect *dstRest, bool mirrorX = false, bool mirrorY = false, bool disableAlpha = false); + RenderTicket() : _isValid(true), _wantsDraw(false), _drawNum(0) {} + ~RenderTicket(); + const Graphics::Surface *getSurface() { return _surface; } + // Non-dirty-rects: + void drawToSurface(Graphics::Surface *_targetSurface); + // Dirty-rects: + void drawToSurface(Graphics::Surface *_targetSurface, Common::Rect *dstRect, Common::Rect *clipRect); + + Common::Rect _dstRect; + uint32 _batchNum; + + bool _isValid; + bool _wantsDraw; + uint32 _drawNum; + uint32 _colorMod; + + BaseSurfaceOSystem *_owner; + bool operator==(RenderTicket &a); + const Common::Rect *getSrcRect() { return &_srcRect; } +private: + Graphics::Surface *_surface; + Common::Rect _srcRect; + bool _hasAlpha; + uint32 _mirror; +}; + +} // end of namespace Wintermute + +#endif diff --git a/engines/wintermute/base/particles/part_emitter.cpp b/engines/wintermute/base/particles/part_emitter.cpp index bab4d4609e..1026969055 100644 --- a/engines/wintermute/base/particles/part_emitter.cpp +++ b/engines/wintermute/base/particles/part_emitter.cpp @@ -88,7 +88,7 @@ PartEmitter::PartEmitter(BaseGame *inGame, BaseScriptHolder *owner) : BaseObject _useRegion = false; - _emitEvent = NULL; + _emitEvent = nullptr; _owner = owner; } @@ -112,7 +112,7 @@ PartEmitter::~PartEmitter(void) { _sprites.clear(); delete[] _emitEvent; - _emitEvent = NULL; + _emitEvent = nullptr; } ////////////////////////////////////////////////////////////////////////// @@ -325,7 +325,7 @@ bool PartEmitter::display(BaseRegion *region) { } for (uint32 i = 0; i < _particles.size(); i++) { - if (region != NULL && _useRegion) { + if (region != nullptr && _useRegion) { if (!region->pointInRegion((int)_particles[i]->_pos.x, (int)_particles[i]->_pos.y)) { continue; } @@ -373,16 +373,13 @@ bool PartEmitter::sortParticlesByZ() { } ////////////////////////////////////////////////////////////////////////// -int PartEmitter::compareZ(const void *obj1, const void *obj2) { - const PartParticle *p1 = *(const PartParticle *const *)obj1; - const PartParticle *p2 = *(const PartParticle *const *)obj2; - +bool PartEmitter::compareZ(const PartParticle *p1, const PartParticle *p2) { if (p1->_posZ < p2->_posZ) { - return -1; + return true; } else if (p1->_posZ > p2->_posZ) { - return 1; + return false; } else { - return 0; + return false; } } @@ -405,7 +402,7 @@ bool PartEmitter::setBorderThickness(int thicknessLeft, int thicknessRight, int ////////////////////////////////////////////////////////////////////////// PartForce *PartEmitter::addForceByName(const Common::String &name) { - PartForce *force = NULL; + PartForce *force = nullptr; for (uint32 i = 0; i < _forces.size(); i++) { if (scumm_stricmp(name.c_str(), _forces[i]->getName()) == 0) { @@ -1136,7 +1133,7 @@ bool PartEmitter::scSetProperty(const char *name, ScValue *value) { ////////////////////////////////////////////////////////////////////////// else if (strcmp(name, "EmitEvent") == 0) { delete[] _emitEvent; - _emitEvent = NULL; + _emitEvent = nullptr; if (!value->isNULL()) { BaseUtils::setString(&_emitEvent, value->getString()); } diff --git a/engines/wintermute/base/particles/part_emitter.h b/engines/wintermute/base/particles/part_emitter.h index f2c8f139f1..54a49df230 100644 --- a/engines/wintermute/base/particles/part_emitter.h +++ b/engines/wintermute/base/particles/part_emitter.h @@ -48,7 +48,7 @@ public: bool start(); bool update(); - bool display() { return display(NULL); } // To avoid shadowing the inherited display-function. + bool display() { return display(nullptr); } // To avoid shadowing the inherited display-function. bool display(BaseRegion *region); bool sortParticlesByZ(); @@ -127,7 +127,7 @@ private: BaseScriptHolder *_owner; PartForce *addForceByName(const Common::String &name); - int static compareZ(const void *obj1, const void *obj2); + bool static compareZ(const PartParticle *p1, const PartParticle *p2); bool initParticle(PartParticle *particle, uint32 currentTime, uint32 timerDelta); bool updateInternal(uint32 currentTime, uint32 timerDelta); uint32 _lastGenTime; diff --git a/engines/wintermute/base/particles/part_particle.cpp b/engines/wintermute/base/particles/part_particle.cpp index 0b850d9618..f1aba114de 100644 --- a/engines/wintermute/base/particles/part_particle.cpp +++ b/engines/wintermute/base/particles/part_particle.cpp @@ -41,7 +41,7 @@ PartParticle::PartParticle(BaseGame *inGame) : BaseClass(inGame) { _posZ = 0.0f; _velocity = Vector2(0.0f, 0.0f); _scale = 100.0f; - _sprite = NULL; + _sprite = nullptr; _creationTime = 0; _lifeTime = 0; _isDead = true; @@ -65,7 +65,7 @@ PartParticle::PartParticle(BaseGame *inGame) : BaseClass(inGame) { ////////////////////////////////////////////////////////////////////////// PartParticle::~PartParticle(void) { delete _sprite; - _sprite = NULL; + _sprite = nullptr; } ////////////////////////////////////////////////////////////////////////// @@ -76,7 +76,7 @@ bool PartParticle::setSprite(const Common::String &filename) { } delete _sprite; - _sprite = NULL; + _sprite = nullptr; SystemClassRegistry::getInstance()->_disabled = true; _sprite = new BaseSprite(_gameRef, (BaseObject*)_gameRef); @@ -85,7 +85,7 @@ bool PartParticle::setSprite(const Common::String &filename) { return STATUS_OK; } else { delete _sprite; - _sprite = NULL; + _sprite = nullptr; SystemClassRegistry::getInstance()->_disabled = false; return STATUS_FAILED; } @@ -199,7 +199,7 @@ bool PartParticle::display(PartEmitter *emitter) { _sprite->getCurrentFrame(); return _sprite->display((int)_pos.x, (int)_pos.y, - NULL, + nullptr, _scale, _scale, BYTETORGBA(255, 255, 255, _currentAlpha), _rotation, @@ -260,7 +260,7 @@ bool PartParticle::persist(BasePersistenceManager *persistMgr) { setSprite(filename); SystemClassRegistry::getInstance()->_disabled = false; delete[] filename; - filename = NULL; + filename = nullptr; } return STATUS_OK; diff --git a/engines/wintermute/base/saveload.cpp b/engines/wintermute/base/saveload.cpp index 12204e1b35..465684a7a3 100644 --- a/engines/wintermute/base/saveload.cpp +++ b/engines/wintermute/base/saveload.cpp @@ -78,7 +78,7 @@ bool SaveLoad::loadGame(const Common::String &filename, BaseGame *gameRef) { //_gameRef->LOG(0, "Load end %d", BaseUtils::GetUsedMemMB()); // AdGame: if (DID_SUCCEED(ret)) { - SystemClassRegistry::getInstance()->enumInstances(SaveLoad::afterLoadRegion, "AdRegion", NULL); + SystemClassRegistry::getInstance()->enumInstances(SaveLoad::afterLoadRegion, "AdRegion", nullptr); } return ret; } @@ -114,13 +114,13 @@ bool SaveLoad::saveGame(int slot, const char *desc, bool quickSave, BaseGame *ga ////////////////////////////////////////////////////////////////////////// bool SaveLoad::initAfterLoad() { - SystemClassRegistry::getInstance()->enumInstances(afterLoadRegion, "BaseRegion", NULL); - SystemClassRegistry::getInstance()->enumInstances(afterLoadSubFrame, "BaseSubFrame", NULL); - SystemClassRegistry::getInstance()->enumInstances(afterLoadSound, "BaseSound", NULL); - SystemClassRegistry::getInstance()->enumInstances(afterLoadFont, "BaseFontTT", NULL); - SystemClassRegistry::getInstance()->enumInstances(afterLoadScript, "ScScript", NULL); + SystemClassRegistry::getInstance()->enumInstances(afterLoadRegion, "BaseRegion", nullptr); + SystemClassRegistry::getInstance()->enumInstances(afterLoadSubFrame, "BaseSubFrame", nullptr); + SystemClassRegistry::getInstance()->enumInstances(afterLoadSound, "BaseSound", nullptr); + SystemClassRegistry::getInstance()->enumInstances(afterLoadFont, "BaseFontTT", nullptr); + SystemClassRegistry::getInstance()->enumInstances(afterLoadScript, "ScScript", nullptr); // AdGame: - SystemClassRegistry::getInstance()->enumInstances(afterLoadScene, "AdScene", NULL); + SystemClassRegistry::getInstance()->enumInstances(afterLoadScene, "AdScene", nullptr); return STATUS_OK; } diff --git a/engines/wintermute/base/scriptables/script.cpp b/engines/wintermute/base/scriptables/script.cpp index 9469bd46a7..23c452b73c 100644 --- a/engines/wintermute/base/scriptables/script.cpp +++ b/engines/wintermute/base/scriptables/script.cpp @@ -39,58 +39,58 @@ IMPLEMENT_PERSISTENT(ScScript, false) ////////////////////////////////////////////////////////////////////////// ScScript::ScScript(BaseGame *inGame, ScEngine *engine) : BaseClass(inGame) { - _buffer = NULL; + _buffer = nullptr; _bufferSize = _iP = 0; - _scriptStream = NULL; - _filename = NULL; + _scriptStream = nullptr; + _filename = nullptr; _currentLine = 0; - _symbols = NULL; + _symbols = nullptr; _numSymbols = 0; _engine = engine; - _globals = NULL; + _globals = nullptr; - _scopeStack = NULL; - _callStack = NULL; - _thisStack = NULL; - _stack = NULL; + _scopeStack = nullptr; + _callStack = nullptr; + _thisStack = nullptr; + _stack = nullptr; - _operand = NULL; - _reg1 = NULL; + _operand = nullptr; + _reg1 = nullptr; - _functions = NULL; + _functions = nullptr; _numFunctions = 0; - _methods = NULL; + _methods = nullptr; _numMethods = 0; - _events = NULL; + _events = nullptr; _numEvents = 0; - _externals = NULL; + _externals = nullptr; _numExternals = 0; _state = SCRIPT_FINISHED; _origState = SCRIPT_FINISHED; - _waitObject = NULL; + _waitObject = nullptr; _waitTime = 0; _waitFrozen = false; - _waitScript = NULL; + _waitScript = nullptr; _timeSlice = 0; _thread = false; _methodThread = false; - _threadEvent = NULL; + _threadEvent = nullptr; _freezable = true; - _owner = NULL; + _owner = nullptr; _unbreakable = false; - _parentScript = NULL; + _parentScript = nullptr; _tracingMode = false; } @@ -242,7 +242,7 @@ bool ScScript::create(const char *filename, byte *buffer, uint32 size, BaseScrip _methodThread = false; delete[] _threadEvent; - _threadEvent = NULL; + _threadEvent = nullptr; _filename = new char[strlen(filename) + 1]; if (_filename) { @@ -383,52 +383,52 @@ void ScScript::cleanup() { if (_buffer) { delete[] _buffer; } - _buffer = NULL; + _buffer = nullptr; if (_filename) { delete[] _filename; } - _filename = NULL; + _filename = nullptr; if (_symbols) { delete[] _symbols; } - _symbols = NULL; + _symbols = nullptr; _numSymbols = 0; if (_globals && !_thread) { delete _globals; } - _globals = NULL; + _globals = nullptr; delete _scopeStack; - _scopeStack = NULL; + _scopeStack = nullptr; delete _callStack; - _callStack = NULL; + _callStack = nullptr; delete _thisStack; - _thisStack = NULL; + _thisStack = nullptr; delete _stack; - _stack = NULL; + _stack = nullptr; if (_functions) { delete[] _functions; } - _functions = NULL; + _functions = nullptr; _numFunctions = 0; if (_methods) { delete[] _methods; } - _methods = NULL; + _methods = nullptr; _numMethods = 0; if (_events) { delete[] _events; } - _events = NULL; + _events = nullptr; _numEvents = 0; @@ -440,25 +440,25 @@ void ScScript::cleanup() { } delete[] _externals; } - _externals = NULL; + _externals = nullptr; _numExternals = 0; delete _operand; delete _reg1; - _operand = NULL; - _reg1 = NULL; + _operand = nullptr; + _reg1 = nullptr; delete[] _threadEvent; - _threadEvent = NULL; + _threadEvent = nullptr; _state = SCRIPT_FINISHED; - _waitObject = NULL; + _waitObject = nullptr; _waitTime = 0; _waitFrozen = false; - _waitScript = NULL; + _waitScript = nullptr; - _parentScript = NULL; // ref only + _parentScript = nullptr; // ref only delete _scriptStream; } @@ -511,7 +511,7 @@ bool ScScript::executeInstruction() { bool ret = STATUS_OK; uint32 dw; - const char *str = NULL; + const char *str = nullptr; //ScValue* op = new ScValue(_gameRef); _operand->cleanup(); @@ -622,11 +622,11 @@ bool ScScript::executeInstruction() { } /* ScValue* val = var->getProp(MethodName); - if (val){ + if (val) { dw = GetFuncPos(val->getString()); - if (dw==0){ + if (dw==0) { TExternalFunction* f = GetExternal(val->getString()); - if (f){ + if (f) { ExternalCall(_stack, _thisStack, f); } else{ @@ -787,7 +787,7 @@ bool ScScript::executeInstruction() { ScValue *var = _stack->pop(); ScValue *val = _stack->pop(); - if (val == NULL) { + if (val == nullptr) { runtimeError("Script stack corruption detected. Please report this script at WME bug reports forum."); var->setNULL(); } else { @@ -928,7 +928,7 @@ bool ScScript::executeInstruction() { case II_AND: op2 = _stack->pop(); op1 = _stack->pop(); - if (op1 == NULL || op2 == NULL) { + if (op1 == nullptr || op2 == nullptr) { runtimeError("Script corruption detected. Did you use '=' instead of '==' for comparison?"); _operand->setBool(false); } else { @@ -940,7 +940,7 @@ bool ScScript::executeInstruction() { case II_OR: op2 = _stack->pop(); op1 = _stack->pop(); - if (op1 == NULL || op2 == NULL) { + if (op1 == nullptr || op2 == nullptr) { runtimeError("Script corruption detected. Did you use '=' instead of '==' for comparison?"); _operand->setBool(false); } else { @@ -955,13 +955,13 @@ bool ScScript::executeInstruction() { /* if ((op1->isNULL() && !op2->isNULL()) || (!op1->isNULL() && op2->isNULL())) _operand->setBool(false); - else if (op1->isNative() && op2->isNative()){ + else if (op1->isNative() && op2->isNative()) { _operand->setBool(op1->getNative() == op2->getNative()); } - else if (op1->getType()==VAL_STRING || op2->getType()==VAL_STRING){ + else if (op1->getType()==VAL_STRING || op2->getType()==VAL_STRING) { _operand->setBool(scumm_stricmp(op1->getString(), op2->getString())==0); } - else if (op1->getType()==VAL_FLOAT && op2->getType()==VAL_FLOAT){ + else if (op1->getType()==VAL_FLOAT && op2->getType()==VAL_FLOAT) { _operand->setBool(op1->getFloat() == op2->getFloat()); } else{ @@ -979,13 +979,13 @@ bool ScScript::executeInstruction() { /* if ((op1->isNULL() && !op2->isNULL()) || (!op1->isNULL() && op2->isNULL())) _operand->setBool(true); - else if (op1->isNative() && op2->isNative()){ + else if (op1->isNative() && op2->isNative()) { _operand->setBool(op1->getNative() != op2->getNative()); } - else if (op1->getType()==VAL_STRING || op2->getType()==VAL_STRING){ + else if (op1->getType()==VAL_STRING || op2->getType()==VAL_STRING) { _operand->setBool(scumm_stricmp(op1->getString(), op2->getString())!=0); } - else if (op1->getType()==VAL_FLOAT && op2->getType()==VAL_FLOAT){ + else if (op1->getType()==VAL_FLOAT && op2->getType()==VAL_FLOAT) { _operand->setBool(op1->getFloat() != op2->getFloat()); } else{ @@ -1002,7 +1002,7 @@ bool ScScript::executeInstruction() { op1 = _stack->pop(); /* - if (op1->getType()==VAL_FLOAT && op2->getType()==VAL_FLOAT){ + if (op1->getType()==VAL_FLOAT && op2->getType()==VAL_FLOAT) { _operand->setBool(op1->getFloat() < op2->getFloat()); } else _operand->setBool(op1->getInt() < op2->getInt()); @@ -1017,7 +1017,7 @@ bool ScScript::executeInstruction() { op1 = _stack->pop(); /* - if (op1->getType()==VAL_FLOAT && op2->getType()==VAL_FLOAT){ + if (op1->getType()==VAL_FLOAT && op2->getType()==VAL_FLOAT) { _operand->setBool(op1->getFloat() > op2->getFloat()); } else _operand->setBool(op1->getInt() > op2->getInt()); @@ -1032,7 +1032,7 @@ bool ScScript::executeInstruction() { op1 = _stack->pop(); /* - if (op1->getType()==VAL_FLOAT && op2->getType()==VAL_FLOAT){ + if (op1->getType()==VAL_FLOAT && op2->getType()==VAL_FLOAT) { _operand->setBool(op1->getFloat() <= op2->getFloat()); } else _operand->setBool(op1->getInt() <= op2->getInt()); @@ -1047,7 +1047,7 @@ bool ScScript::executeInstruction() { op1 = _stack->pop(); /* - if (op1->getType()==VAL_FLOAT && op2->getType()==VAL_FLOAT){ + if (op1->getType()==VAL_FLOAT && op2->getType()==VAL_FLOAT) { _operand->setBool(op1->getFloat() >= op2->getFloat()); } else _operand->setBool(op1->getInt() >= op2->getInt()); @@ -1108,7 +1108,7 @@ uint32 ScScript::getFuncPos(const Common::String &name) { ////////////////////////////////////////////////////////////////////////// -uint32 ScScript::getMethodPos(const Common::String &name) { +uint32 ScScript::getMethodPos(const Common::String &name) const { for (uint32 i = 0; i < _numMethods; i++) { if (name == _methods[i].name) { return _methods[i].pos; @@ -1120,7 +1120,7 @@ uint32 ScScript::getMethodPos(const Common::String &name) { ////////////////////////////////////////////////////////////////////////// ScValue *ScScript::getVar(char *name) { - ScValue *ret = NULL; + ScValue *ret = nullptr; // scope locals if (_scopeStack->_sP >= 0) { @@ -1130,20 +1130,20 @@ ScValue *ScScript::getVar(char *name) { } // script globals - if (ret == NULL) { + if (ret == nullptr) { if (_globals->propExists(name)) { ret = _globals->getProp(name); } } // engine globals - if (ret == NULL) { + if (ret == nullptr) { if (_engine->_globals->propExists(name)) { ret = _engine->_globals->getProp(name); } } - if (ret == NULL) { + if (ret == nullptr) { //RuntimeError("Variable '%s' is inaccessible in the current block. Consider changing the script.", name); _gameRef->LOG(0, "Warning: variable '%s' is inaccessible in the current block. Consider changing the script (script:%s, line:%d)", name, _filename, _currentLine); ScValue *val = new ScValue(_gameRef); @@ -1263,8 +1263,8 @@ bool ScScript::persist(BasePersistenceManager *persistMgr) { _scriptStream = new Common::MemoryReadStream(_buffer, _bufferSize); initTables(); } else { - _buffer = NULL; - _scriptStream = NULL; + _buffer = nullptr; + _scriptStream = nullptr; } } @@ -1306,11 +1306,11 @@ bool ScScript::persist(BasePersistenceManager *persistMgr) { ////////////////////////////////////////////////////////////////////////// ScScript *ScScript::invokeEventHandler(const Common::String &eventName, bool unbreakable) { - //if (_state!=SCRIPT_PERSISTENT) return NULL; + //if (_state!=SCRIPT_PERSISTENT) return nullptr; uint32 pos = getEventPos(eventName); if (!pos) { - return NULL; + return nullptr; } ScScript *thread = new ScScript(_gameRef, _engine); @@ -1322,17 +1322,17 @@ ScScript *ScScript::invokeEventHandler(const Common::String &eventName, bool unb return thread; } else { delete thread; - return NULL; + return nullptr; } } else { - return NULL; + return nullptr; } } ////////////////////////////////////////////////////////////////////////// -uint32 ScScript::getEventPos(const Common::String &name) { +uint32 ScScript::getEventPos(const Common::String &name) const { for (int i = _numEvents - 1; i >= 0; i--) { if (scumm_stricmp(name.c_str(), _events[i].name) == 0) { return _events[i].pos; @@ -1343,13 +1343,13 @@ uint32 ScScript::getEventPos(const Common::String &name) { ////////////////////////////////////////////////////////////////////////// -bool ScScript::canHandleEvent(const Common::String &eventName) { +bool ScScript::canHandleEvent(const Common::String &eventName) const { return getEventPos(eventName) != 0; } ////////////////////////////////////////////////////////////////////////// -bool ScScript::canHandleMethod(const Common::String &methodName) { +bool ScScript::canHandleMethod(const Common::String &methodName) const { return getMethodPos(methodName) != 0; } @@ -1390,7 +1390,7 @@ ScScript::TExternalFunction *ScScript::getExternal(char *name) { return &_externals[i]; } } - return NULL; + return nullptr; } @@ -1446,7 +1446,7 @@ const char *ScScript::dbgGetFilename() { ////////////////////////////////////////////////////////////////////////// void ScScript::afterLoad() { - if (_buffer == NULL) { + if (_buffer == nullptr) { byte *buffer = _engine->getCompiledScript(_filename, &_bufferSize); if (!buffer) { _gameRef->LOG(0, "Error reinitializing script '%s' after load. Script will be terminated.", _filename); diff --git a/engines/wintermute/base/scriptables/script.h b/engines/wintermute/base/scriptables/script.h index 0616bce58a..428eb9a17e 100644 --- a/engines/wintermute/base/scriptables/script.h +++ b/engines/wintermute/base/scriptables/script.h @@ -57,8 +57,8 @@ public: bool _freezable; bool resume(); bool pause(); - bool canHandleEvent(const Common::String &eventName); - bool canHandleMethod(const Common::String &methodName); + bool canHandleEvent(const Common::String &eventName) const; + bool canHandleMethod(const Common::String &methodName) const; bool createThread(ScScript *original, uint32 initIP, const Common::String &eventName); bool createMethodThread(ScScript *original, const Common::String &methodName); ScScript *invokeEventHandler(const Common::String &eventName, bool unbreakable = false); @@ -78,8 +78,8 @@ public: TScriptState _origState; ScValue *getVar(char *name); uint32 getFuncPos(const Common::String &name); - uint32 getEventPos(const Common::String &name); - uint32 getMethodPos(const Common::String &name); + uint32 getEventPos(const Common::String &name) const; + uint32 getMethodPos(const Common::String &name) const; typedef struct { uint32 magic; uint32 version; diff --git a/engines/wintermute/base/scriptables/script_engine.cpp b/engines/wintermute/base/scriptables/script_engine.cpp index 3d1863946e..d5c5797a39 100644 --- a/engines/wintermute/base/scriptables/script_engine.cpp +++ b/engines/wintermute/base/scriptables/script_engine.cpp @@ -30,7 +30,6 @@ #include "engines/wintermute/base/scriptables/script_value.h" #include "engines/wintermute/base/scriptables/script.h" #include "engines/wintermute/base/scriptables/script_stack.h" -#include "engines/wintermute/base/scriptables/script_ext_math.h" #include "engines/wintermute/base/base_engine.h" #include "engines/wintermute/base/base_game.h" #include "engines/wintermute/base/base_file_manager.h" @@ -70,10 +69,10 @@ ScEngine::ScEngine(BaseGame *inGame) : BaseClass(inGame) { // prepare script cache for (int i = 0; i < MAX_CACHED_SCRIPTS; i++) { - _cachedScripts[i] = NULL; + _cachedScripts[i] = nullptr; } - _currentScript = NULL; + _currentScript = nullptr; _isProfiling = false; _profilingStartTime = 0; @@ -106,11 +105,11 @@ bool ScEngine::cleanup() { _scripts.clear(); delete _globals; - _globals = NULL; + _globals = nullptr; emptyScriptCache(); - _currentScript = NULL; // ref only + _currentScript = nullptr; // ref only return STATUS_OK; } @@ -141,7 +140,7 @@ ScScript *ScEngine::runScript(const char *filename, BaseScriptHolder *owner) { // get script from cache compBuffer = getCompiledScript(filename, &compSize); if (!compBuffer) { - return NULL; + return nullptr; } // add new script @@ -150,7 +149,7 @@ ScScript *ScEngine::runScript(const char *filename, BaseScriptHolder *owner) { if (DID_FAIL(ret)) { _gameRef->LOG(ret, "Error running script '%s'...", filename); delete script; - return NULL; + return nullptr; } else { // publish the "self" pseudo-variable ScValue val(_gameRef); @@ -192,7 +191,7 @@ byte *ScEngine::getCompiledScript(const char *filename, uint32 *outSize, bool ig byte *buffer = BaseEngine::instance().getFileManager()->readWholeFile(filename, &size); if (!buffer) { _gameRef->LOG(0, "ScEngine::GetCompiledScript - error opening script '%s'", filename); - return NULL; + return nullptr; } // needs to be compiled? @@ -203,14 +202,14 @@ byte *ScEngine::getCompiledScript(const char *filename, uint32 *outSize, bool ig if (!_compilerAvailable) { _gameRef->LOG(0, "ScEngine::GetCompiledScript - script '%s' needs to be compiled but compiler is not available", filename); delete[] buffer; - return NULL; + return nullptr; } // This code will never be called, since _compilerAvailable is const false. // It's only here in the event someone would want to reinclude the compiler. error("Script needs compilation, ScummVM does not contain a WME compiler"); } - byte *ret = NULL; + byte *ret = nullptr; // add script to cache CScCachedScript *cachedScript = new CScCachedScript(filename, compBuffer, compSize); @@ -218,7 +217,7 @@ byte *ScEngine::getCompiledScript(const char *filename, uint32 *outSize, bool ig int index = 0; uint32 minTime = g_system->getMillis(); for (int i = 0; i < MAX_CACHED_SCRIPTS; i++) { - if (_cachedScripts[i] == NULL) { + if (_cachedScripts[i] == nullptr) { index = i; break; } else if (_cachedScripts[i]->_timestamp <= minTime) { @@ -227,7 +226,7 @@ byte *ScEngine::getCompiledScript(const char *filename, uint32 *outSize, bool ig } } - if (_cachedScripts[index] != NULL) { + if (_cachedScripts[index] != nullptr) { delete _cachedScripts[index]; } _cachedScripts[index] = cachedScript; @@ -297,7 +296,7 @@ bool ScEngine::tick() { if (!isValidScript(_scripts[i]->_waitScript) || _scripts[i]->_waitScript->_state == SCRIPT_ERROR) { // fake return value _scripts[i]->_stack->pushNULL(); - _scripts[i]->_waitScript = NULL; + _scripts[i]->_waitScript = nullptr; _scripts[i]->run(); } else { if (_scripts[i]->_waitScript->_state == SCRIPT_THREAD_FINISHED) { @@ -305,7 +304,7 @@ bool ScEngine::tick() { _scripts[i]->_stack->push(_scripts[i]->_waitScript->_stack->pop()); _scripts[i]->run(); _scripts[i]->_waitScript->finish(); - _scripts[i]->_waitScript = NULL; + _scripts[i]->_waitScript = nullptr; } } break; @@ -352,7 +351,7 @@ bool ScEngine::tick() { addScriptTime(_scripts[i]->_filename, g_system->getMillis() - startTime); } } - _currentScript = NULL; + _currentScript = nullptr; } removeFinishedScripts(); @@ -374,7 +373,7 @@ bool ScEngine::tickUnbreakable() { _scripts[i]->executeInstruction(); } _scripts[i]->finish(); - _currentScript = NULL; + _currentScript = nullptr; } removeFinishedScripts(); @@ -445,7 +444,7 @@ bool ScEngine::emptyScriptCache() { for (int i = 0; i < MAX_CACHED_SCRIPTS; i++) { if (_cachedScripts[i]) { delete _cachedScripts[i]; - _cachedScripts[i] = NULL; + _cachedScripts[i] = nullptr; } } return STATUS_OK; @@ -497,7 +496,7 @@ bool ScEngine::persist(BasePersistenceManager *persistMgr) { ////////////////////////////////////////////////////////////////////////// void ScEngine::editorCleanup() { for (uint32 i = 0; i < _scripts.size(); i++) { - if (_scripts[i]->_owner == NULL && (_scripts[i]->_state == SCRIPT_FINISHED || _scripts[i]->_state == SCRIPT_ERROR)) { + if (_scripts[i]->_owner == nullptr && (_scripts[i]->_state == SCRIPT_FINISHED || _scripts[i]->_state == SCRIPT_ERROR)) { delete _scripts[i]; _scripts.remove_at(i); i--; diff --git a/engines/wintermute/base/scriptables/script_engine.h b/engines/wintermute/base/scriptables/script_engine.h index 1a023326eb..639875ffb6 100644 --- a/engines/wintermute/base/scriptables/script_engine.h +++ b/engines/wintermute/base/scriptables/script_engine.h @@ -96,10 +96,10 @@ public: byte *getCompiledScript(const char *filename, uint32 *outSize, bool ignoreCache = false); DECLARE_PERSISTENT(ScEngine, BaseClass) bool cleanup(); - int getNumScripts(int *running = NULL, int *waiting = NULL, int *persistent = NULL); + int getNumScripts(int *running = nullptr, int *waiting = nullptr, int *persistent = nullptr); bool tick(); ScValue *_globals; - ScScript *runScript(const char *filename, BaseScriptHolder *owner = NULL); + ScScript *runScript(const char *filename, BaseScriptHolder *owner = nullptr); static const bool _compilerAvailable = false; ScEngine(BaseGame *inGame); diff --git a/engines/wintermute/base/scriptables/script_ext_array.cpp b/engines/wintermute/base/scriptables/script_ext_array.cpp index 613cbd0758..892d0674ff 100644 --- a/engines/wintermute/base/scriptables/script_ext_array.cpp +++ b/engines/wintermute/base/scriptables/script_ext_array.cpp @@ -69,7 +69,7 @@ SXArray::SXArray(BaseGame *inGame) : BaseScriptable(inGame) { ////////////////////////////////////////////////////////////////////////// SXArray::~SXArray() { delete _values; - _values = NULL; + _values = nullptr; } diff --git a/engines/wintermute/base/scriptables/script_ext_date.cpp b/engines/wintermute/base/scriptables/script_ext_date.cpp index 5aa069d0b2..53a1d36b81 100644 --- a/engines/wintermute/base/scriptables/script_ext_date.cpp +++ b/engines/wintermute/base/scriptables/script_ext_date.cpp @@ -224,7 +224,7 @@ bool SXDate::scSetProperty(const char *name, ScValue *value) { ////////////////////////////////////////////////////////////////////////// // Name ////////////////////////////////////////////////////////////////////////// - if (name == "Name")==0){ + if (name == "Name")==0) { setName(value->getString()); return STATUS_OK; } diff --git a/engines/wintermute/base/scriptables/script_ext_file.cpp b/engines/wintermute/base/scriptables/script_ext_file.cpp index a1d39c5d0a..29e032a759 100644 --- a/engines/wintermute/base/scriptables/script_ext_file.cpp +++ b/engines/wintermute/base/scriptables/script_ext_file.cpp @@ -52,13 +52,13 @@ SXFile::SXFile(BaseGame *inGame, ScStack *stack) : BaseScriptable(inGame) { stack->correctParams(1); ScValue *val = stack->pop(); - _filename = NULL; + _filename = nullptr; if (!val->isNULL()) { BaseUtils::setString(&_filename, val->getString()); } - _readFile = NULL; - _writeFile = NULL; + _readFile = nullptr; + _writeFile = nullptr; _mode = 0; _textMode = false; @@ -73,7 +73,7 @@ SXFile::~SXFile() { ////////////////////////////////////////////////////////////////////////// void SXFile::cleanup() { delete[] _filename; - _filename = NULL; + _filename = nullptr; close(); } @@ -82,12 +82,12 @@ void SXFile::cleanup() { void SXFile::close() { if (_readFile) { BaseFileManager::getEngineInstance()->closeFile(_readFile); - _readFile = NULL; + _readFile = nullptr; } if (_writeFile) { _writeFile->finalize(); delete _writeFile; - _writeFile = NULL; + _writeFile = nullptr; } _mode = 0; _textMode = false; @@ -701,13 +701,13 @@ bool SXFile::scSetProperty(const char *name, ScValue *value) { ////////////////////////////////////////////////////////////////////////// // Length ////////////////////////////////////////////////////////////////////////// - if (strcmp(name, "Length")==0){ + if (strcmp(name, "Length")==0) { int origLength = _length; _length = max(value->getInt(0), 0); char propName[20]; - if (_length < OrigLength){ - for(int i=_length; i<OrigLength; i++){ + if (_length < OrigLength) { + for(int i=_length; i<OrigLength; i++) { sprintf(PropName, "%d", i); _values->DeleteProp(PropName); } @@ -778,8 +778,8 @@ bool SXFile::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(pos)); // try to re-open file if needed - _writeFile = NULL; - _readFile = NULL; + _writeFile = nullptr; + _readFile = nullptr; if (_mode != 0) { // open for reading diff --git a/engines/wintermute/base/scriptables/script_ext_mem_buffer.cpp b/engines/wintermute/base/scriptables/script_ext_mem_buffer.cpp index 8f05b7bff6..9de9905fea 100644 --- a/engines/wintermute/base/scriptables/script_ext_mem_buffer.cpp +++ b/engines/wintermute/base/scriptables/script_ext_mem_buffer.cpp @@ -44,7 +44,7 @@ BaseScriptable *makeSXMemBuffer(BaseGame *inGame, ScStack *stack) { ////////////////////////////////////////////////////////////////////////// SXMemBuffer::SXMemBuffer(BaseGame *inGame, ScStack *stack) : BaseScriptable(inGame) { stack->correctParams(1); - _buffer = NULL; + _buffer = nullptr; _size = 0; int newSize = stack->pop()->getInt(); @@ -73,7 +73,7 @@ void SXMemBuffer::cleanup() { if (_size) { free(_buffer); } - _buffer = NULL; + _buffer = nullptr; _size = 0; } @@ -109,7 +109,7 @@ bool SXMemBuffer::resize(int newSize) { ////////////////////////////////////////////////////////////////////////// bool SXMemBuffer::checkBounds(ScScript *script, int start, int length) { - if (_buffer == NULL) { + if (_buffer == nullptr) { script->runtimeError("Cannot use Set/Get methods on an uninitialized memory buffer"); return false; } @@ -476,15 +476,15 @@ bool SXMemBuffer::scSetProperty(const char *name, ScValue *value) { ////////////////////////////////////////////////////////////////////////// // Length ////////////////////////////////////////////////////////////////////////// - if (strcmp(name, "Length")==0){ + if (strcmp(name, "Length")==0) { int origLength = _length; _length = max(value->getInt(0), 0); char propName[20]; - if (_length < OrigLength){ - for(int i=_length; i<OrigLength; i++){ - sprintf(PropName, "%d", i); - _values->DeleteProp(PropName); + if (_length < origLength) { + for(int i=_length; i < origLength; i++) { + sprintf(propName, "%d", i); + _values->DeleteProp(propName); } } return STATUS_OK; @@ -509,7 +509,7 @@ bool SXMemBuffer::persist(BasePersistenceManager *persistMgr) { _buffer = malloc(_size); persistMgr->getBytes((byte *)_buffer, _size); } else { - _buffer = NULL; + _buffer = nullptr; } } diff --git a/engines/wintermute/base/scriptables/script_ext_string.cpp b/engines/wintermute/base/scriptables/script_ext_string.cpp index 5f7da1c2dd..6b4a615509 100644 --- a/engines/wintermute/base/scriptables/script_ext_string.cpp +++ b/engines/wintermute/base/scriptables/script_ext_string.cpp @@ -45,7 +45,7 @@ BaseScriptable *makeSXString(BaseGame *inGame, ScStack *stack) { ////////////////////////////////////////////////////////////////////////// SXString::SXString(BaseGame *inGame, ScStack *stack) : BaseScriptable(inGame) { - _string = NULL; + _string = nullptr; _capacity = 0; stack->correctParams(1); @@ -81,7 +81,7 @@ void SXString::setStringVal(const char *val) { if (len >= _capacity) { _capacity = len + 1; delete[] _string; - _string = NULL; + _string = nullptr; _string = new char[_capacity]; memset(_string, 0, _capacity); } @@ -331,7 +331,7 @@ bool SXString::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack array->push(val); delete val; - val = NULL; + val = nullptr; } stack->pushNative(array, false); @@ -420,7 +420,7 @@ bool SXString::persist(BasePersistenceManager *persistMgr) { _string = new char[_capacity]; persistMgr->getBytes((byte *)_string, _capacity); } else { - _string = NULL; + _string = nullptr; } } diff --git a/engines/wintermute/base/scriptables/script_stack.cpp b/engines/wintermute/base/scriptables/script_stack.cpp index 77367045c2..3239decae8 100644 --- a/engines/wintermute/base/scriptables/script_stack.cpp +++ b/engines/wintermute/base/scriptables/script_stack.cpp @@ -58,7 +58,7 @@ ScStack::~ScStack() { ScValue *ScStack::pop() { if (_sP < 0) { _gameRef->LOG(0, "Fatal: Stack underflow"); - return NULL; + return nullptr; } return _values[_sP--]; @@ -97,7 +97,7 @@ ScValue *ScStack::getPushValue() { ////////////////////////////////////////////////////////////////////////// ScValue *ScStack::getTop() { if (_sP < 0 || _sP >= (int32)_values.size()) { - return NULL; + return nullptr; } else { return _values[_sP]; } @@ -108,7 +108,7 @@ ScValue *ScStack::getTop() { ScValue *ScStack::getAt(int index) { index = _sP - index; if (index < 0 || index >= (int32)_values.size()) { - return NULL; + return nullptr; } else { return _values[index]; } @@ -147,73 +147,36 @@ void ScStack::correctParams(uint32 expectedParams) { ////////////////////////////////////////////////////////////////////////// void ScStack::pushNULL() { - /* - ScValue* val = new ScValue(_gameRef); - val->setNULL(); - Push(val); - delete val; - */ getPushValue()->setNULL(); } ////////////////////////////////////////////////////////////////////////// void ScStack::pushInt(int val) { - /* - ScValue* val = new ScValue(_gameRef); - val->setInt(Val); - Push(val); - delete val; - */ getPushValue()->setInt(val); } ////////////////////////////////////////////////////////////////////////// void ScStack::pushFloat(double val) { - /* - ScValue* val = new ScValue(_gameRef); - val->setFloat(Val); - Push(val); - delete val; - */ getPushValue()->setFloat(val); } ////////////////////////////////////////////////////////////////////////// void ScStack::pushBool(bool val) { - /* - ScValue* val = new ScValue(_gameRef); - val->setBool(Val); - Push(val); - delete val; - */ getPushValue()->setBool(val); } ////////////////////////////////////////////////////////////////////////// void ScStack::pushString(const char *val) { - /* - ScValue* val = new ScValue(_gameRef); - val->setString(Val); - Push(val); - delete val; - */ getPushValue()->setString(val); } ////////////////////////////////////////////////////////////////////////// void ScStack::pushNative(BaseScriptable *val, bool persistent) { - /* - ScValue* val = new ScValue(_gameRef); - val->setNative(Val, Persistent); - Push(val); - delete val; - */ - getPushValue()->setNative(val, persistent); } diff --git a/engines/wintermute/base/scriptables/script_value.cpp b/engines/wintermute/base/scriptables/script_value.cpp index 0bc7ab5807..46d6c25d44 100644 --- a/engines/wintermute/base/scriptables/script_value.cpp +++ b/engines/wintermute/base/scriptables/script_value.cpp @@ -49,9 +49,9 @@ ScValue::ScValue(BaseGame *inGame) : BaseClass(inGame) { _valBool = false; _valInt = 0; _valFloat = 0.0f; - _valNative = NULL; - _valString = NULL; - _valRef = NULL; + _valNative = nullptr; + _valString = nullptr; + _valRef = nullptr; _persistent = false; _isConstVar = false; } @@ -64,9 +64,9 @@ ScValue::ScValue(BaseGame *inGame, bool val) : BaseClass(inGame) { _valInt = 0; _valFloat = 0.0f; - _valNative = NULL; - _valString = NULL; - _valRef = NULL; + _valNative = nullptr; + _valString = nullptr; + _valRef = nullptr; _persistent = false; _isConstVar = false; } @@ -79,9 +79,9 @@ ScValue::ScValue(BaseGame *inGame, int val) : BaseClass(inGame) { _valFloat = 0.0f; _valBool = false; - _valNative = NULL; - _valString = NULL; - _valRef = NULL; + _valNative = nullptr; + _valString = nullptr; + _valRef = nullptr; _persistent = false; _isConstVar = false; } @@ -94,9 +94,9 @@ ScValue::ScValue(BaseGame *inGame, double val) : BaseClass(inGame) { _valInt = 0; _valBool = false; - _valNative = NULL; - _valString = NULL; - _valRef = NULL; + _valNative = nullptr; + _valString = nullptr; + _valRef = nullptr; _persistent = false; _isConstVar = false; } @@ -105,14 +105,14 @@ ScValue::ScValue(BaseGame *inGame, double val) : BaseClass(inGame) { ////////////////////////////////////////////////////////////////////////// ScValue::ScValue(BaseGame *inGame, const char *val) : BaseClass(inGame) { _type = VAL_STRING; - _valString = NULL; + _valString = nullptr; setStringVal(val); _valBool = false; _valInt = 0; _valFloat = 0.0f; - _valNative = NULL; - _valRef = NULL; + _valNative = nullptr; + _valRef = nullptr; _persistent = false; _isConstVar = false; } @@ -131,7 +131,7 @@ void ScValue::cleanup(bool ignoreNatives) { _valNative->_refCount--; if (_valNative->_refCount <= 0) { delete _valNative; - _valNative = NULL; + _valNative = nullptr; } } } @@ -142,9 +142,9 @@ void ScValue::cleanup(bool ignoreNatives) { _valBool = false; _valInt = 0; _valFloat = 0.0f; - _valNative = NULL; - _valString = NULL; - _valRef = NULL; + _valNative = nullptr; + _valString = nullptr; + _valRef = nullptr; _persistent = false; _isConstVar = false; } @@ -176,13 +176,13 @@ ScValue *ScValue::getProp(const char *name) { return _gameRef->_scValue; } - ScValue *ret = NULL; + ScValue *ret = nullptr; if (_type == VAL_NATIVE && _valNative) { ret = _valNative->scGetProperty(name); } - if (ret == NULL) { + if (ret == nullptr) { _valIter = _valObject.find(name); if (_valIter != _valObject.end()) { ret = _valIter->_value; @@ -200,7 +200,7 @@ bool ScValue::deleteProp(const char *name) { _valIter = _valObject.find(name); if (_valIter != _valObject.end()) { delete _valIter->_value; - _valIter->_value = NULL; + _valIter->_value = nullptr; } return STATUS_OK; @@ -220,7 +220,7 @@ bool ScValue::setProp(const char *name, ScValue *val, bool copyWhole, bool setAs } if (DID_FAIL(ret)) { - ScValue *newVal = NULL; + ScValue *newVal = nullptr; _valIter = _valObject.find(name); if (_valIter != _valObject.end()) { @@ -242,9 +242,9 @@ bool ScValue::setProp(const char *name, ScValue *val, bool copyWhole, bool setAs /* _valIter = _valObject.find(Name); - if (_valIter != _valObject.end()){ + if (_valIter != _valObject.end()) { delete _valIter->_value; - _valIter->_value = NULL; + _valIter->_value = nullptr; } ScValue* val = new ScValue(_gameRef); val->Copy(Val, CopyWhole); @@ -451,11 +451,11 @@ void ScValue::setString(const Common::String &val) { void ScValue::setStringVal(const char *val) { if (_valString) { delete[] _valString; - _valString = NULL; + _valString = nullptr; } - if (val == NULL) { - _valString = NULL; + if (val == nullptr) { + _valString = nullptr; return; } @@ -479,7 +479,7 @@ void ScValue::setNULL() { delete _valNative; } } - _valNative = NULL; + _valNative = nullptr; deleteProps(); _type = VAL_NULL; @@ -493,7 +493,7 @@ void ScValue::setNative(BaseScriptable *val, bool persistent) { return; } - if (val == NULL) { + if (val == nullptr) { setNULL(); } else { if (_valNative && !_persistent) { @@ -502,7 +502,7 @@ void ScValue::setNative(BaseScriptable *val, bool persistent) { if (_valNative != val) { delete _valNative; } - _valNative = NULL; + _valNative = nullptr; } } @@ -693,7 +693,7 @@ BaseScriptable *ScValue::getNative() { if (_type == VAL_NATIVE) { return _valNative; } else { - return NULL; + return nullptr; } } @@ -714,7 +714,7 @@ void ScValue::copy(ScValue *orig, bool copyWhole) { if (_valNative != orig->_valNative) { delete _valNative; } - _valNative = NULL; + _valNative = nullptr; } } @@ -827,7 +827,7 @@ bool ScValue::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_valRef)); persistMgr->transfer(TMEMBER(_valString)); - /* + /* // TODO: Convert to Debug-statements. FILE* f = fopen("c:\\val.log", "a+"); switch(_type) { diff --git a/engines/wintermute/base/sound/base_sound.cpp b/engines/wintermute/base/sound/base_sound.cpp index 00d07cd3c2..f246c03fe1 100644 --- a/engines/wintermute/base/sound/base_sound.cpp +++ b/engines/wintermute/base/sound/base_sound.cpp @@ -36,7 +36,7 @@ namespace Wintermute { IMPLEMENT_PERSISTENT(BaseSound, false) BaseSound::BaseSound(BaseGame *inGame) : BaseClass(inGame) { - _sound = NULL; + _sound = nullptr; _soundFilename = ""; _soundType = Audio::Mixer::kSFXSoundType; @@ -57,13 +57,13 @@ BaseSound::~BaseSound() { if (_sound) { _gameRef->_soundMgr->removeSound(_sound); } - _sound = NULL; + _sound = nullptr; } bool BaseSound::setSound(const Common::String &filename, Audio::Mixer::SoundType type, bool streamed) { if (_sound) { _gameRef->_soundMgr->removeSound(_sound); - _sound = NULL; + _sound = nullptr; } _soundFilename = Common::String(); // Set empty diff --git a/engines/wintermute/base/sound/base_sound_buffer.cpp b/engines/wintermute/base/sound/base_sound_buffer.cpp index 250570f2b8..9c919abac6 100644 --- a/engines/wintermute/base/sound/base_sound_buffer.cpp +++ b/engines/wintermute/base/sound/base_sound_buffer.cpp @@ -49,13 +49,13 @@ namespace Wintermute { ////////////////////////////////////////////////////////////////////////// BaseSoundBuffer::BaseSoundBuffer(BaseGame *inGame) : BaseClass(inGame) { - _stream = NULL; - _handle = NULL; -// _sync = NULL; + _stream = nullptr; + _handle = nullptr; +// _sync = nullptr; _streamed = false; _filename = ""; - _file = NULL; + _file = nullptr; _privateVolume = 255; _volume = 255; @@ -76,10 +76,10 @@ BaseSoundBuffer::~BaseSoundBuffer() { if (_handle) { g_system->getMixer()->stopHandle(*_handle); delete _handle; - _handle = NULL; + _handle = nullptr; } delete _stream; - _stream = NULL; + _stream = nullptr; } @@ -111,7 +111,7 @@ bool BaseSoundBuffer::loadFromFile(const Common::String &filename, bool forceRel if (Audio::loadWAVFromStream(*_file, waveSize, waveRate, waveFlags, &waveType)) { if (waveType == 1) { // We need to wrap the file in a substream to make sure the size is right. - _file = new Common::SeekableSubReadStream(_file, 0, waveSize); + _file = new Common::SeekableSubReadStream(_file, _file->pos(), waveSize + _file->pos(), DisposeAfterUse::YES); _stream = Audio::makeRawStream(_file, waveRate, waveFlags, DisposeAfterUse::YES); } else { error("BSoundBuffer::LoadFromFile - WAVE not supported yet for %s with type %d", filename.c_str(), waveType); @@ -134,7 +134,7 @@ bool BaseSoundBuffer::play(bool looping, uint32 startSample) { if (_handle) { g_system->getMixer()->stopHandle(*_handle); delete _handle; - _handle = NULL; + _handle = nullptr; } // Store the loop-value for save-games. setLooping(looping); diff --git a/engines/wintermute/base/sound/base_sound_manager.cpp b/engines/wintermute/base/sound/base_sound_manager.cpp index 441793144d..c6eb871a85 100644 --- a/engines/wintermute/base/sound/base_sound_manager.cpp +++ b/engines/wintermute/base/sound/base_sound_manager.cpp @@ -50,6 +50,7 @@ namespace Wintermute { BaseSoundMgr::BaseSoundMgr(BaseGame *inGame) : BaseClass(inGame) { _soundAvailable = false; _volumeMaster = 255; + _volumeMasterPercent = 100; } @@ -72,7 +73,7 @@ bool BaseSoundMgr::cleanup() { ////////////////////////////////////////////////////////////////////////// void BaseSoundMgr::saveSettings() { if (_soundAvailable) { - ConfMan.setInt("master_volume", _volumeMaster); + ConfMan.setInt("master_volume_percent", _volumeMasterPercent); } } @@ -83,7 +84,8 @@ bool BaseSoundMgr::initialize() { if (!g_system->getMixer()->isReady()) { return STATUS_FAILED; } - _volumeMaster = (ConfMan.hasKey("master_volume") ? ConfMan.getInt("master_volume") : 255); + byte volumeMasterPercent = (ConfMan.hasKey("master_volume_percent") ? ConfMan.getInt("master_volume_percent") : 100); + setMasterVolumePercent(volumeMasterPercent); _soundAvailable = true; return STATUS_OK; @@ -92,7 +94,7 @@ bool BaseSoundMgr::initialize() { ////////////////////////////////////////////////////////////////////////// BaseSoundBuffer *BaseSoundMgr::addSound(const Common::String &filename, Audio::Mixer::SoundType type, bool streamed) { if (!_soundAvailable) { - return NULL; + return nullptr; } BaseSoundBuffer *sound; @@ -112,7 +114,7 @@ BaseSoundBuffer *BaseSoundMgr::addSound(const Common::String &filename, Audio::M sound = new BaseSoundBuffer(_gameRef); if (!sound) { - return NULL; + return nullptr; } sound->setStreaming(streamed); @@ -123,7 +125,7 @@ BaseSoundBuffer *BaseSoundMgr::addSound(const Common::String &filename, Audio::M if (DID_FAIL(res)) { _gameRef->LOG(res, "Error loading sound '%s'", useFilename.c_str()); delete sound; - return NULL; + return nullptr; } // Make sure the master-volume is applied to the sound. @@ -134,7 +136,7 @@ BaseSoundBuffer *BaseSoundMgr::addSound(const Common::String &filename, Audio::M return sound; - return NULL; + return nullptr; } ////////////////////////////////////////////////////////////////////////// @@ -217,6 +219,11 @@ byte BaseSoundMgr::getVolumePercent(Audio::Mixer::SoundType type) { ////////////////////////////////////////////////////////////////////////// bool BaseSoundMgr::setMasterVolume(byte value) { + // This function intentionally doesn't touch _volumeMasterPercent, + // as that variable keeps track of what the game actually wanted, + // and this gives a close approximation, while letting the game + // be none the wiser about round-off-errors. This function should thus + // ONLY be called by setMasterVolumePercent. _volumeMaster = value; for (uint32 i = 0; i < _sounds.size(); i++) { _sounds[i]->updateVolume(); @@ -226,14 +233,15 @@ bool BaseSoundMgr::setMasterVolume(byte value) { ////////////////////////////////////////////////////////////////////////// bool BaseSoundMgr::setMasterVolumePercent(byte percent) { - setMasterVolume(percent * 255 / 100); + _volumeMasterPercent = percent; + setMasterVolume((int)ceil(percent * 255.0 / 100.0)); return STATUS_OK; } ////////////////////////////////////////////////////////////////////////// byte BaseSoundMgr::getMasterVolumePercent() { - return getMasterVolume() * 100 / 255; + return _volumeMasterPercent; } ////////////////////////////////////////////////////////////////////////// diff --git a/engines/wintermute/base/sound/base_sound_manager.h b/engines/wintermute/base/sound/base_sound_manager.h index 36a729b5ae..1ee3c13fdb 100644 --- a/engines/wintermute/base/sound/base_sound_manager.h +++ b/engines/wintermute/base/sound/base_sound_manager.h @@ -45,7 +45,6 @@ public: //DECLARE_PERSISTENT(BaseSoundMgr, BaseClass); byte getMasterVolumePercent(); byte getMasterVolume(); - bool setMasterVolume(byte percent); bool setMasterVolumePercent(byte percent); byte getVolumePercent(Audio::Mixer::SoundType type); bool setVolumePercent(Audio::Mixer::SoundType type, byte percent); @@ -61,6 +60,9 @@ public: virtual ~BaseSoundMgr(); Common::Array<BaseSoundBuffer *> _sounds; void saveSettings(); +private: + int _volumeMasterPercent; // Necessary to avoid round-offs. + bool setMasterVolume(byte percent); }; } // end of namespace Wintermute diff --git a/engines/wintermute/dcgf.h b/engines/wintermute/dcgf.h index fc4174094b..4f8e96e0ac 100644 --- a/engines/wintermute/dcgf.h +++ b/engines/wintermute/dcgf.h @@ -34,10 +34,10 @@ #define DCGF_VER_MAJOR 1 #define DCGF_VER_MINOR 1 #define DCGF_VER_BUILD 1 -#define DCGF_VER_SUFFIX "beta" +#define DCGF_VER_SUFFIX "ScummVM" #define DCGF_VER_BETA true -#define DCGF_NAME "WME Lite" +#define DCGF_NAME "WME-ScummVM" #define DCGF_MAGIC 0xDEC0ADDE // minimal saved game version we support diff --git a/engines/wintermute/debugger.cpp b/engines/wintermute/debugger.cpp new file mode 100644 index 0000000000..1160a16d37 --- /dev/null +++ b/engines/wintermute/debugger.cpp @@ -0,0 +1,48 @@ +/* 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. + * + */ + +#include "engines/wintermute/debugger.h" +#include "engines/wintermute/wintermute.h" +#include "engines/wintermute/base/base_game.h" + +namespace Wintermute { + +Console::Console(WintermuteEngine *vm) : GUI::Debugger(), _engineRef(vm) { + DCmd_Register("show_fps", WRAP_METHOD(Console, Cmd_ShowFps)); +} + +Console::~Console(void) { + +} + +bool Console::Cmd_ShowFps(int argc, const char **argv) { + if (argc > 1) { + if (Common::String(argv[1]) == "true") { + _engineRef->_game->_debugShowFPS = true; + } else if (Common::String(argv[1]) == "false") { + _engineRef->_game->_debugShowFPS = false; + } + } + return true; +} + +} // end of namespace Wintermute diff --git a/engines/wintermute/base/file/base_resources.h b/engines/wintermute/debugger.h index 91c30bcfa7..069980385e 100644 --- a/engines/wintermute/base/file/base_resources.h +++ b/engines/wintermute/debugger.h @@ -8,38 +8,36 @@ * 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. * */ -/* - * This file is based on WME Lite. - * http://dead-code.org/redir.php?target=wmelite - * Copyright (c) 2011 Jan Nedoma - */ - -#ifndef WINTERMUTE_BASE_RESOURCES_H -#define WINTERMUTE_BASE_RESOURCES_H +#ifndef WINTERMUTE_DEBUGGER_H +#define WINTERMUTE_DEBUGGER_H -#include "common/stream.h" -#include "common/str.h" +#include "gui/debugger.h" namespace Wintermute { -class BaseResources { +class WintermuteEngine; +class Console : public GUI::Debugger { public: - static Common::SeekableReadStream *getFile(const Common::String &filename); - static bool hasFile(const Common::String &filename); + Console(WintermuteEngine *vm); + virtual ~Console(); + + bool Cmd_ShowFps(int argc, const char **argv); +private: + WintermuteEngine *_engineRef; }; -} // end of namespace Wintermute +} -#endif +#endif // WINTERMUTE_DEBUGGER_H diff --git a/engines/wintermute/detection.cpp b/engines/wintermute/detection.cpp index 04f7f3b112..1bf2c76a50 100644 --- a/engines/wintermute/detection.cpp +++ b/engines/wintermute/detection.cpp @@ -28,6 +28,7 @@ #include "common/error.h" #include "common/fs.h" #include "common/util.h" +#include "common/translation.h" #include "engines/metaengine.h" @@ -49,6 +50,20 @@ static ADGameDescription s_fallbackDesc = { ADGF_UNSTABLE, GUIO0() }; + +static const ADExtraGuiOptionsMap gameGuiOptions[] = { + { + GAMEOPTION_SHOW_FPS, + { + _s("Show FPS-counter"), + _s("Show the current number of frames per second in the upper left corner"), + "show_fps", + false + } + }, + AD_EXTRA_GUI_OPTIONS_TERMINATOR +}; + static char s_fallbackGameIdBuf[256]; static const char *directoryGlobs[] = { @@ -58,8 +73,9 @@ static const char *directoryGlobs[] = { class WintermuteMetaEngine : public AdvancedMetaEngine { public: - WintermuteMetaEngine() : AdvancedMetaEngine(Wintermute::gameDescriptions, sizeof(ADGameDescription), Wintermute::wintermuteGames) { + WintermuteMetaEngine() : AdvancedMetaEngine(Wintermute::gameDescriptions, sizeof(ADGameDescription), Wintermute::wintermuteGames, gameGuiOptions) { _singleid = "wintermute"; + _guioptions = GUIO2(GUIO_NOMIDI, GAMEOPTION_SHOW_FPS); _maxScanDepth = 2; _directoryGlobs = directoryGlobs; } diff --git a/engines/wintermute/detection_tables.h b/engines/wintermute/detection_tables.h index 4f8a962591..6b6dec635d 100644 --- a/engines/wintermute/detection_tables.h +++ b/engines/wintermute/detection_tables.h @@ -22,6 +22,8 @@ namespace Wintermute { +#define GAMEOPTION_SHOW_FPS GUIO_GAMEOPTIONS1 + static const PlainGameDescriptor wintermuteGames[] = { {"5ld", "Five Lethal Demons"}, {"5ma", "Five Magical Amulets"}, @@ -84,6 +86,16 @@ static const ADGameDescription gameDescriptions[] = { ADGF_UNSTABLE, GUIO0() }, + // Chivalry is Not Dead (Version from deirdrakai.com) + { + "chivalry", + "", + AD_ENTRY1s("data.dcp", "ae6d91b9517f4d2851a8ad94c96951c8", 7278302), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_UNSTABLE, + GUIO0() + }, // Dead City (English) { "deadcity", diff --git a/engines/wintermute/graphics/transparent_surface.cpp b/engines/wintermute/graphics/transparent_surface.cpp index 9319899495..11aeb26821 100644 --- a/engines/wintermute/graphics/transparent_surface.cpp +++ b/engines/wintermute/graphics/transparent_surface.cpp @@ -29,11 +29,11 @@ namespace Wintermute { -byte *TransparentSurface::_lookup = NULL; +byte *TransparentSurface::_lookup = nullptr; void TransparentSurface::destroyLookup() { - delete _lookup; - _lookup = NULL; + delete[] _lookup; + _lookup = nullptr; } TransparentSurface::TransparentSurface() : Surface(), _enableAlphaBlit(true) {} @@ -219,8 +219,8 @@ Common::Rect TransparentSurface::blit(Graphics::Surface &target, int posX, int p #endif Graphics::Surface *img; - Graphics::Surface *imgScaled = NULL; - byte *savedPixels = NULL; + Graphics::Surface *imgScaled = nullptr; + byte *savedPixels = nullptr; if ((width != srcImage.w) || (height != srcImage.h)) { // Scale the image img = imgScaled = srcImage.scale(width, height); @@ -394,6 +394,8 @@ TransparentSurface *TransparentSurface::scale(const Common::Rect &srcRect, const // dstRect(x, y) = srcRect(x * srcW / dstW, y * srcH / dstH); TransparentSurface *target = new TransparentSurface(); + assert(format.bytesPerPixel == 4); + int srcW = srcRect.width(); int srcH = srcRect.height(); int dstW = dstRect.width(); diff --git a/engines/wintermute/graphics/transparent_surface.h b/engines/wintermute/graphics/transparent_surface.h index 8b00dccbd9..dc079a1fbc 100644 --- a/engines/wintermute/graphics/transparent_surface.h +++ b/engines/wintermute/graphics/transparent_surface.h @@ -98,7 +98,7 @@ struct TransparentSurface : public Graphics::Surface { Common::Rect blit(Graphics::Surface &target, int posX = 0, int posY = 0, int flipping = FLIP_NONE, - Common::Rect *pPartRect = NULL, + Common::Rect *pPartRect = nullptr, uint color = BS_ARGB(255, 255, 255, 255), int width = -1, int height = -1); void applyColorKey(uint8 r, uint8 g, uint8 b, bool overwriteAlpha = false); diff --git a/engines/wintermute/module.mk b/engines/wintermute/module.mk index 7b5b1b1a3a..5c0406b353 100644 --- a/engines/wintermute/module.mk +++ b/engines/wintermute/module.mk @@ -42,7 +42,6 @@ MODULE_OBJS := \ base/file/base_file.o \ base/file/base_file_entry.o \ base/file/base_package.o \ - base/file/base_resources.o \ base/file/base_save_thumb_file.o \ base/font/base_font_bitmap.o \ base/font/base_font_truetype.o \ @@ -53,6 +52,7 @@ MODULE_OBJS := \ base/gfx/base_surface.o \ base/gfx/osystem/base_surface_osystem.o \ base/gfx/osystem/base_render_osystem.o \ + base/gfx/osystem/render_ticket.o \ base/particles/part_particle.o \ base/particles/part_emitter.o \ base/particles/part_force.o \ @@ -67,6 +67,7 @@ MODULE_OBJS := \ base/base_file_manager.o \ base/base_frame.o \ base/base_game.o \ + base/base_game_music.o \ base/base_keyboard_state.o \ base/base_named_object.o \ base/base_object.o \ @@ -108,6 +109,7 @@ MODULE_OBJS := \ utils/utils.o \ video/video_player.o \ video/video_theora_player.o \ + debugger.o \ wintermute.o \ persistent.o diff --git a/engines/wintermute/persistent.h b/engines/wintermute/persistent.h index c862df5d6b..ca9281f798 100644 --- a/engines/wintermute/persistent.h +++ b/engines/wintermute/persistent.h @@ -36,53 +36,53 @@ class BasePersistenceManager; // persistence support typedef void *(*PERSISTBUILD)(void); typedef bool(*PERSISTLOAD)(void *, BasePersistenceManager *); -typedef void (*SYS_INSTANCE_CALLBACK)(void *Instance, void *Data); +typedef void(*SYS_INSTANCE_CALLBACK)(void *instance, void *data); } // end of namespace Wintermute #include "engines/wintermute/system/sys_class_registry.h" namespace Wintermute { -#define DECLARE_PERSISTENT(class_name, parent_class)\ +#define DECLARE_PERSISTENT(className, parentClass)\ static const char _className[];\ - static void* persistBuild(void);\ - virtual const char* getClassName();\ + static void *persistBuild(void);\ + virtual const char *getClassName();\ static bool persistLoad(void* Instance, BasePersistenceManager* PersistMgr);\ - class_name(TDynamicConstructor p1, TDynamicConstructor p2) :parent_class(p1, p2){ /*memset(this, 0, sizeof(class_name));*/ };\ - virtual bool persist(BasePersistenceManager* PersistMgr);\ + className(TDynamicConstructor p1, TDynamicConstructor p2) : parentClass(p1, p2) { /*memset(this, 0, sizeof(class_name));*/ };\ + virtual bool persist(BasePersistenceManager *persistMgr);\ void* operator new (size_t size);\ void operator delete(void* p);\ -#define IMPLEMENT_PERSISTENT(class_name, persistent_class)\ - const char class_name::_className[] = #class_name;\ - void* class_name::persistBuild(){\ - return ::new class_name(DYNAMIC_CONSTRUCTOR, DYNAMIC_CONSTRUCTOR);\ +#define IMPLEMENT_PERSISTENT(className, persistentClass)\ + const char className::_className[] = #className;\ + void* className::persistBuild() {\ + return ::new className(DYNAMIC_CONSTRUCTOR, DYNAMIC_CONSTRUCTOR);\ }\ \ - bool class_name::persistLoad(void* Instance, BasePersistenceManager* PersistMgr){\ - return ((class_name*)Instance)->persist(PersistMgr);\ + bool className::persistLoad(void *instance, BasePersistenceManager *persistMgr) {\ + return ((className*)instance)->persist(persistMgr);\ }\ \ - const char* class_name::getClassName(){\ - return #class_name;\ + const char *className::getClassName() {\ + return #className;\ }\ \ /*SystemClass Register##class_name(class_name::_className, class_name::PersistBuild, class_name::PersistLoad, persistent_class);*/\ \ - void* class_name::operator new (size_t size){\ + void* className::operator new(size_t size) {\ void* ret = ::operator new(size);\ - SystemClassRegistry::getInstance()->registerInstance(#class_name, ret);\ + SystemClassRegistry::getInstance()->registerInstance(#className, ret);\ return ret;\ }\ \ - void class_name::operator delete (void* p){\ - SystemClassRegistry::getInstance()->unregisterInstance(#class_name, p);\ + void className::operator delete(void *p) {\ + SystemClassRegistry::getInstance()->unregisterInstance(#className, p);\ ::operator delete(p);\ }\ -#define TMEMBER(member_name) #member_name, &member_name -#define TMEMBER_INT(member_name) #member_name, (int*)&member_name +#define TMEMBER(memberName) #memberName, &memberName +#define TMEMBER_INT(memberName) #memberName, (int*)&memberName } // end of namespace Wintermute diff --git a/engines/wintermute/platform_osystem.cpp b/engines/wintermute/platform_osystem.cpp index 0bd99b11cd..362c0da624 100644 --- a/engines/wintermute/platform_osystem.cpp +++ b/engines/wintermute/platform_osystem.cpp @@ -26,6 +26,7 @@ * Copyright (c) 2011 Jan Nedoma */ +#include "engines/wintermute/wintermute.h" #include "engines/wintermute/base/base_game.h" #include "engines/wintermute/base/gfx/osystem/base_render_osystem.h" #include "engines/wintermute/platform_osystem.h" @@ -35,14 +36,21 @@ namespace Wintermute { -BaseGame *BasePlatform::_gameRef = NULL; +BaseGame *BasePlatform::_gameRef = nullptr; +WintermuteEngine *BasePlatform::_engineRef = nullptr; #define CLASS_NAME "GF_FRAME" -int BasePlatform::initialize(BaseGame *inGame, int argc, char *argv[]) { +int BasePlatform::initialize(WintermuteEngine *engineRef, BaseGame *inGame, int argc, char *argv[]) { _gameRef = inGame; + _engineRef = engineRef; return true; } +void BasePlatform::deinit() { + _gameRef = nullptr; + _engineRef = nullptr; +} + ////////////////////////////////////////////////////////////////////////// void BasePlatform::handleEvent(Common::Event *event) { switch (event->type) { @@ -86,6 +94,11 @@ void BasePlatform::handleEvent(Common::Event *event) { } break; case Common::EVENT_KEYDOWN: + if (event->kbd.flags & Common::KBD_CTRL) { + if (event->kbd.keycode == Common::KEYCODE_d) { + _engineRef->trigDebugger(); + } + } if (_gameRef) { _gameRef->handleKeypress(event); } @@ -234,7 +247,7 @@ bool BasePlatform::unionRect(Rect32 *lprcDst, Rect32 *lprcSrc1, Rect32 *lprcSrc2 ////////////////////////////////////////////////////////////////////////// bool BasePlatform::copyRect(Rect32 *lprcDst, Rect32 *lprcSrc) { - if (lprcDst == NULL || lprcSrc == NULL) { + if (lprcDst == nullptr || lprcSrc == nullptr) { return false; } diff --git a/engines/wintermute/platform_osystem.h b/engines/wintermute/platform_osystem.h index 21a77e0a0e..8c39b29ea9 100644 --- a/engines/wintermute/platform_osystem.h +++ b/engines/wintermute/platform_osystem.h @@ -36,11 +36,12 @@ namespace Wintermute { class BaseGame; - +class WintermuteEngine; ////////////////////////////////////////////////////////////////////////// class BasePlatform { public: - static int initialize(BaseGame *inGame, int argc, char *argv[]); + static int initialize(WintermuteEngine *engineRef, BaseGame *inGame, int argc, char *argv[]); + static void deinit(); static void handleEvent(Common::Event *event); static AnsiString getPlatformName(); @@ -66,6 +67,7 @@ public: private: // Set by initialize on game-startup, the object referred to is also deleted by deinit in WintermuteEngine static BaseGame *_gameRef; + static WintermuteEngine *_engineRef; }; } // end of namespace Wintermute diff --git a/engines/wintermute/system/sys_class.cpp b/engines/wintermute/system/sys_class.cpp index 06b36b84de..cda58bbb48 100644 --- a/engines/wintermute/system/sys_class.cpp +++ b/engines/wintermute/system/sys_class.cpp @@ -41,7 +41,7 @@ SystemClass::SystemClass(const AnsiString &name, PERSISTBUILD build, PERSISTLOAD _build = build; _load = load; - _next = NULL; + _next = nullptr; _savedID = -1; _persistent = persistentClass; _numInst = 0; @@ -119,7 +119,7 @@ void *SystemClass::idToPointer(int savedID) { return (it->_value)->getInstance(); } } - return NULL; + return nullptr; } ////////////////////////////////////////////////////////////////////////// diff --git a/engines/wintermute/system/sys_class_registry.cpp b/engines/wintermute/system/sys_class_registry.cpp index 7c1911c2bf..3e2b8665ee 100644 --- a/engines/wintermute/system/sys_class_registry.cpp +++ b/engines/wintermute/system/sys_class_registry.cpp @@ -115,7 +115,7 @@ bool SystemClassRegistry::registerInstance(const char *className, void *instance } SystemInstance *inst = (*mapIt)._value->addInstance(instance, _count++); - return (inst != NULL); + return (inst != nullptr); } ////////////////////////////////////////////////////////////////////////// @@ -152,7 +152,7 @@ bool SystemClassRegistry::unregisterInstance(const char *className, void *instan ////////////////////////////////////////////////////////////////////////// bool SystemClassRegistry::getPointerID(void *pointer, int *classID, int *instanceID) { - if (pointer == NULL) { + if (pointer == nullptr) { return true; } @@ -173,7 +173,7 @@ bool SystemClassRegistry::getPointerID(void *pointer, int *classID, int *instanc void *SystemClassRegistry::idToPointer(int classID, int instanceID) { SavedInstanceMap::iterator it = _savedInstanceMap.find(instanceID); if (it == _savedInstanceMap.end()) { - return NULL; + return nullptr; } else { return (*it)._value->getInstance(); } diff --git a/engines/wintermute/ui/ui_button.cpp b/engines/wintermute/ui/ui_button.cpp index 7967d566f9..6ee577f009 100644 --- a/engines/wintermute/ui/ui_button.cpp +++ b/engines/wintermute/ui/ui_button.cpp @@ -48,11 +48,11 @@ IMPLEMENT_PERSISTENT(UIButton, false) ////////////////////////////////////////////////////////////////////////// UIButton::UIButton(BaseGame *inGame) : UIObject(inGame) { - _backPress = _backHover = _backDisable = _backFocus = NULL; + _backPress = _backHover = _backDisable = _backFocus = nullptr; - _fontHover = _fontPress = _fontDisable = _fontFocus = NULL; + _fontHover = _fontPress = _fontDisable = _fontFocus = nullptr; - _imageDisable = _imagePress = _imageHover = _imageFocus = NULL; + _imageDisable = _imagePress = _imageHover = _imageFocus = nullptr; _align = TAL_CENTER; @@ -104,7 +104,7 @@ UIButton::~UIButton() { ////////////////////////////////////////////////////////////////////////// bool UIButton::loadFile(const char *filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "UIButton::LoadFile failed for file '%s'", filename); return STATUS_FAILED; } @@ -235,7 +235,7 @@ bool UIButton::loadBuffer(byte *buffer, bool complete) { _back = new UITiledImage(_gameRef); if (!_back || DID_FAIL(_back->loadFile((char *)params))) { delete _back; - _back = NULL; + _back = nullptr; cmd = PARSERR_GENERIC; } break; @@ -245,7 +245,7 @@ bool UIButton::loadBuffer(byte *buffer, bool complete) { _backHover = new UITiledImage(_gameRef); if (!_backHover || DID_FAIL(_backHover->loadFile((char *)params))) { delete _backHover; - _backHover = NULL; + _backHover = nullptr; cmd = PARSERR_GENERIC; } break; @@ -255,7 +255,7 @@ bool UIButton::loadBuffer(byte *buffer, bool complete) { _backPress = new UITiledImage(_gameRef); if (!_backPress || DID_FAIL(_backPress->loadFile((char *)params))) { delete _backPress; - _backPress = NULL; + _backPress = nullptr; cmd = PARSERR_GENERIC; } break; @@ -265,7 +265,7 @@ bool UIButton::loadBuffer(byte *buffer, bool complete) { _backDisable = new UITiledImage(_gameRef); if (!_backDisable || DID_FAIL(_backDisable->loadFile((char *)params))) { delete _backDisable; - _backDisable = NULL; + _backDisable = nullptr; cmd = PARSERR_GENERIC; } break; @@ -275,7 +275,7 @@ bool UIButton::loadBuffer(byte *buffer, bool complete) { _backFocus = new UITiledImage(_gameRef); if (!_backFocus || DID_FAIL(_backFocus->loadFile((char *)params))) { delete _backFocus; - _backFocus = NULL; + _backFocus = nullptr; cmd = PARSERR_GENERIC; } break; @@ -285,7 +285,7 @@ bool UIButton::loadBuffer(byte *buffer, bool complete) { _image = new BaseSprite(_gameRef); if (!_image || DID_FAIL(_image->loadFile((char *)params))) { delete _image; - _image = NULL; + _image = nullptr; cmd = PARSERR_GENERIC; } break; @@ -295,7 +295,7 @@ bool UIButton::loadBuffer(byte *buffer, bool complete) { _imageHover = new BaseSprite(_gameRef); if (!_imageHover || DID_FAIL(_imageHover->loadFile((char *)params))) { delete _imageHover; - _imageHover = NULL; + _imageHover = nullptr; cmd = PARSERR_GENERIC; } break; @@ -305,7 +305,7 @@ bool UIButton::loadBuffer(byte *buffer, bool complete) { _imagePress = new BaseSprite(_gameRef); if (!_imagePress || DID_FAIL(_imagePress->loadFile((char *)params))) { delete _imagePress; - _imagePress = NULL; + _imagePress = nullptr; cmd = PARSERR_GENERIC; } break; @@ -315,7 +315,7 @@ bool UIButton::loadBuffer(byte *buffer, bool complete) { _imageDisable = new BaseSprite(_gameRef); if (!_imageDisable || DID_FAIL(_imageDisable->loadFile((char *)params))) { delete _imageDisable; - _imageDisable = NULL; + _imageDisable = nullptr; cmd = PARSERR_GENERIC; } break; @@ -325,7 +325,7 @@ bool UIButton::loadBuffer(byte *buffer, bool complete) { _imageFocus = new BaseSprite(_gameRef); if (!_imageFocus || DID_FAIL(_imageFocus->loadFile((char *)params))) { delete _imageFocus; - _imageFocus = NULL; + _imageFocus = nullptr; cmd = PARSERR_GENERIC; } break; @@ -416,7 +416,7 @@ bool UIButton::loadBuffer(byte *buffer, bool complete) { _cursor = new BaseSprite(_gameRef); if (!_cursor || DID_FAIL(_cursor->loadFile((char *)params))) { delete _cursor; - _cursor = NULL; + _cursor = nullptr; cmd = PARSERR_GENERIC; } break; @@ -592,7 +592,7 @@ bool UIButton::saveAsText(BaseDynamicBuffer *buffer, int indent) { void UIButton::correctSize() { Rect32 rect; - BaseSprite *img = NULL; + BaseSprite *img = nullptr; if (_image) { img = _image; } else if (_imageDisable) { @@ -622,15 +622,15 @@ void UIButton::correctSize() { } if (_text) { - int text_height; + int textHeight; if (_font) { - text_height = _font->getTextHeight((byte *)_text, _width); + textHeight = _font->getTextHeight((byte *)_text, _width); } else { - text_height = _gameRef->_systemFont->getTextHeight((byte *)_text, _width); + textHeight = _gameRef->getSystemFont()->getTextHeight((byte *)_text, _width); } - if (text_height > _height) { - _height = text_height; + if (textHeight > _height) { + _height = textHeight; } } @@ -650,8 +650,8 @@ bool UIButton::display(int offsetX, int offsetY) { return STATUS_OK; } - UITiledImage *back = NULL; - BaseSprite *image = NULL; + UITiledImage *back = nullptr; + BaseSprite *image = nullptr; BaseFont *font = 0; //RECT rect; @@ -717,7 +717,7 @@ bool UIButton::display(int offsetX, int offsetY) { if (_font) { font = _font; } else { - font = _gameRef->_systemFont; + font = _gameRef->getSystemFont(); } } @@ -734,9 +734,9 @@ bool UIButton::display(int offsetX, int offsetY) { if (back) { back->display(offsetX + _posX, offsetY + _posY, _width, _height); } - //if (image) image->Draw(ImageX +((_press||_oneTimePress)&&back?1:0), ImageY +((_press||_oneTimePress)&&back?1:0), NULL); + //if (image) image->Draw(ImageX +((_press||_oneTimePress)&&back?1:0), ImageY +((_press||_oneTimePress)&&back?1:0), nullptr); if (image) { - image->draw(imageX + ((_press || _oneTimePress) && back ? 1 : 0), imageY + ((_press || _oneTimePress) && back ? 1 : 0), _pixelPerfect ? this : NULL); + image->draw(imageX + ((_press || _oneTimePress) && back ? 1 : 0), imageY + ((_press || _oneTimePress) && back ? 1 : 0), _pixelPerfect ? this : nullptr); } if (font && _text) { @@ -745,7 +745,7 @@ bool UIButton::display(int offsetX, int offsetY) { } if (!_pixelPerfect || !_image) { - _gameRef->_renderer->addRectToList(new BaseActiveRect(_gameRef, this, NULL, offsetX + _posX, offsetY + _posY, _width, _height, 100, 100, false)); + _gameRef->_renderer->addRectToList(new BaseActiveRect(_gameRef, this, nullptr, offsetX + _posX, offsetY + _posY, _width, _height, 100, 100, false)); } // reset unused sprites @@ -800,11 +800,11 @@ bool UIButton::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack _gameRef->_fontStorage->removeFont(_fontDisable); } if (val->isNULL()) { - _fontDisable = NULL; + _fontDisable = nullptr; stack->pushBool(true); } else { _fontDisable = _gameRef->_fontStorage->addFont(val->getString()); - stack->pushBool(_fontDisable != NULL); + stack->pushBool(_fontDisable != nullptr); } return STATUS_OK; } @@ -820,11 +820,11 @@ bool UIButton::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack _gameRef->_fontStorage->removeFont(_fontHover); } if (val->isNULL()) { - _fontHover = NULL; + _fontHover = nullptr; stack->pushBool(true); } else { _fontHover = _gameRef->_fontStorage->addFont(val->getString()); - stack->pushBool(_fontHover != NULL); + stack->pushBool(_fontHover != nullptr); } return STATUS_OK; } @@ -840,11 +840,11 @@ bool UIButton::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack _gameRef->_fontStorage->removeFont(_fontPress); } if (val->isNULL()) { - _fontPress = NULL; + _fontPress = nullptr; stack->pushBool(true); } else { _fontPress = _gameRef->_fontStorage->addFont(val->getString()); - stack->pushBool(_fontPress != NULL); + stack->pushBool(_fontPress != nullptr); } return STATUS_OK; } @@ -860,11 +860,11 @@ bool UIButton::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack _gameRef->_fontStorage->removeFont(_fontFocus); } if (val->isNULL()) { - _fontFocus = NULL; + _fontFocus = nullptr; stack->pushBool(true); } else { _fontFocus = _gameRef->_fontStorage->addFont(val->getString()); - stack->pushBool(_fontFocus != NULL); + stack->pushBool(_fontFocus != nullptr); } return STATUS_OK; } @@ -880,7 +880,7 @@ bool UIButton::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack const char *filename = stack->pop()->getString(); if (!_imageDisable || DID_FAIL(_imageDisable->loadFile(filename))) { delete _imageDisable; - _imageDisable = NULL; + _imageDisable = nullptr; stack->pushBool(false); } else { stack->pushBool(true); @@ -929,7 +929,7 @@ bool UIButton::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack const char *filename = stack->pop()->getString(); if (!_imageHover || DID_FAIL(_imageHover->loadFile(filename))) { delete _imageHover; - _imageHover = NULL; + _imageHover = nullptr; stack->pushBool(false); } else { stack->pushBool(true); @@ -977,7 +977,7 @@ bool UIButton::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack const char *filename = stack->pop()->getString(); if (!_imagePress || DID_FAIL(_imagePress->loadFile(filename))) { delete _imagePress; - _imagePress = NULL; + _imagePress = nullptr; stack->pushBool(false); } else { stack->pushBool(true); @@ -1025,7 +1025,7 @@ bool UIButton::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack const char *filename = stack->pop()->getString(); if (!_imageFocus || DID_FAIL(_imageFocus->loadFile(filename))) { delete _imageFocus; - _imageFocus = NULL; + _imageFocus = nullptr; stack->pushBool(false); } else { stack->pushBool(true); diff --git a/engines/wintermute/ui/ui_button.h b/engines/wintermute/ui/ui_button.h index 93333a2534..fea264976f 100644 --- a/engines/wintermute/ui/ui_button.h +++ b/engines/wintermute/ui/ui_button.h @@ -62,7 +62,7 @@ public: UITiledImage *_backHover; UITiledImage *_backDisable; UITiledImage *_backFocus; - UIButton(BaseGame *inGame = NULL); + UIButton(BaseGame *inGame = nullptr); virtual ~UIButton(); bool loadFile(const char *filename); bool loadBuffer(byte *buffer, bool complete = true); diff --git a/engines/wintermute/ui/ui_edit.cpp b/engines/wintermute/ui/ui_edit.cpp index a3283d5a01..0a2e6f13bc 100644 --- a/engines/wintermute/ui/ui_edit.cpp +++ b/engines/wintermute/ui/ui_edit.cpp @@ -56,12 +56,12 @@ IMPLEMENT_PERSISTENT(UIEdit, false) UIEdit::UIEdit(BaseGame *inGame) : UIObject(inGame) { _type = UI_EDIT; - _fontSelected = NULL; + _fontSelected = nullptr; _selStart = _selEnd = 10000; _scrollOffset = 0; - _cursorChar = NULL; + _cursorChar = nullptr; setCursorChar("|"); _cursorBlinkRate = 600; @@ -88,14 +88,14 @@ UIEdit::~UIEdit() { } delete[] _cursorChar; - _cursorChar = NULL; + _cursorChar = nullptr; } ////////////////////////////////////////////////////////////////////////// bool UIEdit::loadFile(const char *filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "UIEdit::LoadFile failed for file '%s'", filename); return STATUS_FAILED; } @@ -194,7 +194,7 @@ bool UIEdit::loadBuffer(byte *buffer, bool complete) { _back = new UITiledImage(_gameRef); if (!_back || DID_FAIL(_back->loadFile((char *)params))) { delete _back; - _back = NULL; + _back = nullptr; cmd = PARSERR_GENERIC; } break; @@ -204,7 +204,7 @@ bool UIEdit::loadBuffer(byte *buffer, bool complete) { _image = new BaseSprite(_gameRef); if (!_image || DID_FAIL(_image->loadFile((char *)params))) { delete _image; - _image = NULL; + _image = nullptr; cmd = PARSERR_GENERIC; } break; @@ -263,7 +263,7 @@ bool UIEdit::loadBuffer(byte *buffer, bool complete) { _cursor = new BaseSprite(_gameRef); if (!_cursor || DID_FAIL(_cursor->loadFile((char *)params))) { delete _cursor; - _cursor = NULL; + _cursor = nullptr; cmd = PARSERR_GENERIC; } break; @@ -388,7 +388,7 @@ bool UIEdit::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, _gameRef->_fontStorage->removeFont(_fontSelected); } _fontSelected = _gameRef->_fontStorage->addFont(stack->pop()->getString()); - stack->pushBool(_fontSelected != NULL); + stack->pushBool(_fontSelected != nullptr); return STATUS_OK; } else { @@ -579,7 +579,7 @@ bool UIEdit::display(int offsetX, int offsetY) { _back->display(offsetX + _posX, offsetY + _posY, _width, _height); } if (_image) { - _image->draw(offsetX + _posX, offsetY + _posY, NULL); + _image->draw(offsetX + _posX, offsetY + _posY, nullptr); } // prepare fonts @@ -589,7 +589,7 @@ bool UIEdit::display(int offsetX, int offsetY) { if (_font) { font = _font; } else { - font = _gameRef->_systemFont; + font = _gameRef->getSystemFont(); } if (_fontSelected) { @@ -726,7 +726,7 @@ bool UIEdit::display(int offsetX, int offsetY) { } - _gameRef->_renderer->addRectToList(new BaseActiveRect(_gameRef, this, NULL, offsetX + _posX, offsetY + _posY, _width, _height, 100, 100, false)); + _gameRef->_renderer->addRectToList(new BaseActiveRect(_gameRef, this, nullptr, offsetX + _posX, offsetY + _posY, _width, _height, 100, 100, false)); _gameRef->_textEncoding = OrigEncoding; diff --git a/engines/wintermute/ui/ui_entity.cpp b/engines/wintermute/ui/ui_entity.cpp index 1cb4e0926b..00d442e895 100644 --- a/engines/wintermute/ui/ui_entity.cpp +++ b/engines/wintermute/ui/ui_entity.cpp @@ -43,7 +43,7 @@ IMPLEMENT_PERSISTENT(UIEntity, false) ////////////////////////////////////////////////////////////////////////// UIEntity::UIEntity(BaseGame *inGame) : UIObject(inGame) { _type = UI_CUSTOM; - _entity = NULL; + _entity = nullptr; } @@ -52,14 +52,14 @@ UIEntity::~UIEntity() { if (_entity) { _gameRef->unregisterObject(_entity); } - _entity = NULL; + _entity = nullptr; } ////////////////////////////////////////////////////////////////////////// bool UIEntity::loadFile(const char *filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "UIEntity::LoadFile failed for file '%s'", filename); return STATUS_FAILED; } @@ -223,7 +223,7 @@ bool UIEntity::setEntity(const char *filename) { _entity = new AdEntity(_gameRef); if (!_entity || DID_FAIL(_entity->loadFile(filename))) { delete _entity; - _entity = NULL; + _entity = nullptr; return STATUS_FAILED; } else { _entity->_nonIntMouseEvents = true; diff --git a/engines/wintermute/ui/ui_object.cpp b/engines/wintermute/ui/ui_object.cpp index 8e5bae993c..9dea3dadf9 100644 --- a/engines/wintermute/ui/ui_object.cpp +++ b/engines/wintermute/ui/ui_object.cpp @@ -43,27 +43,27 @@ IMPLEMENT_PERSISTENT(UIObject, false) ////////////////////////////////////////////////////////////////////////// UIObject::UIObject(BaseGame *inGame) : BaseObject(inGame) { - _back = NULL; - _image = NULL; - _font = NULL; - _text = NULL; + _back = nullptr; + _image = nullptr; + _font = nullptr; + _text = nullptr; _sharedFonts = _sharedImages = false; _width = _height = 0; - _listenerObject = NULL; - _listenerParamObject = NULL; + _listenerObject = nullptr; + _listenerParamObject = nullptr; _listenerParamDWORD = 0; _disable = false; _visible = true; _type = UI_UNKNOWN; - _parent = NULL; + _parent = nullptr; _parentNotify = false; - _focusedWidget = NULL; + _focusedWidget = nullptr; _canFocus = false; _nonIntMouseEvents = true; @@ -91,7 +91,7 @@ UIObject::~UIObject() { delete[] _text; } - _focusedWidget = NULL; // ref only + _focusedWidget = nullptr; // ref only } @@ -168,11 +168,11 @@ bool UIObject::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack _gameRef->_fontStorage->removeFont(_font); } if (val->isNULL()) { - _font = NULL; + _font = nullptr; stack->pushBool(true); } else { _font = _gameRef->_fontStorage->addFont(val->getString()); - stack->pushBool(_font != NULL); + stack->pushBool(_font != nullptr); } return STATUS_OK; } @@ -187,7 +187,7 @@ bool UIObject::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack /* const char *filename = */ val->getString(); delete _image; - _image = NULL; + _image = nullptr; if (val->isNULL()) { stack->pushBool(true); return STATUS_OK; @@ -196,7 +196,7 @@ bool UIObject::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack _image = new BaseSprite(_gameRef); if (!_image || DID_FAIL(_image->loadFile(val->getString()))) { delete _image; - _image = NULL; + _image = nullptr; stack->pushBool(false); } else { stack->pushBool(true); diff --git a/engines/wintermute/ui/ui_object.h b/engines/wintermute/ui/ui_object.h index ec2ea33de1..c77acfef41 100644 --- a/engines/wintermute/ui/ui_object.h +++ b/engines/wintermute/ui/ui_object.h @@ -60,7 +60,7 @@ public: bool _visible; UITiledImage *_back; bool _disable; - UIObject(BaseGame *inGame = NULL); + UIObject(BaseGame *inGame = nullptr); virtual ~UIObject(); int _width; int _height; diff --git a/engines/wintermute/ui/ui_text.cpp b/engines/wintermute/ui/ui_text.cpp index 2c10f176c7..3b5adf07b7 100644 --- a/engines/wintermute/ui/ui_text.cpp +++ b/engines/wintermute/ui/ui_text.cpp @@ -69,14 +69,14 @@ bool UIText::display(int offsetX, int offsetY) { BaseFont *font = _font; if (!font) { - font = _gameRef->_systemFont; + font = _gameRef->getSystemFont(); } if (_back) { _back->display(offsetX + _posX, offsetY + _posY, _width, _height); } if (_image) { - _image->draw(offsetX + _posX, offsetY + _posY, NULL); + _image->draw(offsetX + _posX, offsetY + _posY, nullptr); } if (font && _text) { @@ -104,7 +104,7 @@ bool UIText::display(int offsetX, int offsetY) { ////////////////////////////////////////////////////////////////////////// bool UIText::loadFile(const char *filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "UIText::LoadFile failed for file '%s'", filename); return STATUS_FAILED; } @@ -203,7 +203,7 @@ bool UIText::loadBuffer(byte *buffer, bool complete) { _back = new UITiledImage(_gameRef); if (!_back || DID_FAIL(_back->loadFile((char *)params))) { delete _back; - _back = NULL; + _back = nullptr; cmd = PARSERR_GENERIC; } break; @@ -213,7 +213,7 @@ bool UIText::loadBuffer(byte *buffer, bool complete) { _image = new BaseSprite(_gameRef); if (!_image || DID_FAIL(_image->loadFile((char *)params))) { delete _image; - _image = NULL; + _image = nullptr; cmd = PARSERR_GENERIC; } break; @@ -274,7 +274,7 @@ bool UIText::loadBuffer(byte *buffer, bool complete) { _cursor = new BaseSprite(_gameRef); if (!_cursor || DID_FAIL(_cursor->loadFile((char *)params))) { delete _cursor; - _cursor = NULL; + _cursor = nullptr; cmd = PARSERR_GENERIC; } break; diff --git a/engines/wintermute/ui/ui_text.h b/engines/wintermute/ui/ui_text.h index da4d113500..11dcdb166d 100644 --- a/engines/wintermute/ui/ui_text.h +++ b/engines/wintermute/ui/ui_text.h @@ -40,7 +40,7 @@ private: public: virtual bool display(int offsetX, int offsetY); DECLARE_PERSISTENT(UIText, UIObject) - UIText(BaseGame *inGame = NULL); + UIText(BaseGame *inGame = nullptr); virtual ~UIText(); TTextAlign _textAlign; TVerticalAlign _verticalAlign; diff --git a/engines/wintermute/ui/ui_tiled_image.cpp b/engines/wintermute/ui/ui_tiled_image.cpp index 2b337330c7..be9f87cf58 100644 --- a/engines/wintermute/ui/ui_tiled_image.cpp +++ b/engines/wintermute/ui/ui_tiled_image.cpp @@ -42,7 +42,7 @@ IMPLEMENT_PERSISTENT(UITiledImage, false) ////////////////////////////////////////////////////////////////////////// UITiledImage::UITiledImage(BaseGame *inGame) : BaseObject(inGame) { - _image = NULL; + _image = nullptr; BasePlatform::setRectEmpty(&_upLeft); BasePlatform::setRectEmpty(&_upMiddle); @@ -59,7 +59,7 @@ UITiledImage::UITiledImage(BaseGame *inGame) : BaseObject(inGame) { ////////////////////////////////////////////////////////////////////////// UITiledImage::~UITiledImage() { delete _image; - _image = NULL; + _image = nullptr; } @@ -104,14 +104,11 @@ bool UITiledImage::display(int x, int y, int width, int height) { } // tiles - yyy = y + (_upMiddle.bottom - _upMiddle.top); - for (row = 0; row < nuRows; row++) { + if (nuRows > 0 && nuColumns > 0) { + yyy = y + (_upMiddle.bottom - _upMiddle.top); xxx = x + (_upLeft.right - _upLeft.left); - for (col = 0; col < nuColumns; col++) { - _image->_surface->displayTrans(xxx, yyy, _middleMiddle); - xxx += tileWidth; - } - yyy += tileWidth; + _image->_surface->displayTrans(xxx, yyy, _middleMiddle); + _image->_surface->repeatLastDisplayOp(tileWidth, tileWidth, nuColumns, nuRows); } _gameRef->_renderer->endSpriteBatch(); @@ -123,7 +120,7 @@ bool UITiledImage::display(int x, int y, int width, int height) { ////////////////////////////////////////////////////////////////////////// bool UITiledImage::loadFile(const char *filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "UITiledImage::LoadFile failed for file '%s'", filename); return STATUS_FAILED; } @@ -208,7 +205,7 @@ bool UITiledImage::loadBuffer(byte *buffer, bool complete) { _image = new BaseSubFrame(_gameRef); if (!_image || DID_FAIL(_image->setSurface((char *)params))) { delete _image; - _image = NULL; + _image = nullptr; cmd = PARSERR_GENERIC; } break; diff --git a/engines/wintermute/ui/ui_tiled_image.h b/engines/wintermute/ui/ui_tiled_image.h index c413e7f129..ded7a285dd 100644 --- a/engines/wintermute/ui/ui_tiled_image.h +++ b/engines/wintermute/ui/ui_tiled_image.h @@ -44,8 +44,9 @@ public: virtual bool saveAsText(BaseDynamicBuffer *buffer, int indent); bool display(int x, int y, int width, int height); - UITiledImage(BaseGame *inGame = NULL); + UITiledImage(BaseGame *inGame = nullptr); virtual ~UITiledImage(); +private: BaseSubFrame *_image; Rect32 _upLeft; Rect32 _upMiddle; diff --git a/engines/wintermute/ui/ui_window.cpp b/engines/wintermute/ui/ui_window.cpp index 9606486efb..39bc1bdcfe 100644 --- a/engines/wintermute/ui/ui_window.cpp +++ b/engines/wintermute/ui/ui_window.cpp @@ -59,9 +59,9 @@ UIWindow::UIWindow(BaseGame *inGame) : UIObject(inGame) { _titleAlign = TAL_LEFT; _transparent = false; - _backInactive = NULL; - _fontInactive = NULL; - _imageInactive = NULL; + _backInactive = nullptr; + _fontInactive = nullptr; + _imageInactive = nullptr; _type = UI_WINDOW; _canFocus = true; @@ -70,8 +70,8 @@ UIWindow::UIWindow(BaseGame *inGame) : UIObject(inGame) { _dragFrom.x = _dragFrom.y = 0; _mode = WINDOW_NORMAL; - _shieldWindow = NULL; - _shieldButton = NULL; + _shieldWindow = nullptr; + _shieldButton = nullptr; _fadeColor = 0x00000000; _fadeBackground = false; @@ -81,7 +81,7 @@ UIWindow::UIWindow(BaseGame *inGame) : UIObject(inGame) { _inGame = false; _clipContents = false; - _viewport = NULL; + _viewport = nullptr; _pauseMusic = true; } @@ -99,9 +99,9 @@ void UIWindow::cleanup() { delete _shieldWindow; delete _shieldButton; delete _viewport; - _shieldWindow = NULL; - _shieldButton = NULL; - _viewport = NULL; + _shieldWindow = nullptr; + _shieldButton = nullptr; + _viewport = nullptr; delete _backInactive; if (!_sharedFonts && _fontInactive) { @@ -210,7 +210,7 @@ bool UIWindow::display(int offsetX, int offsetY) { back->display(_posX + offsetX, _posY + offsetY, _width, _height); } if (image) { - image->draw(_posX + offsetX, _posY + offsetY, _transparent ? NULL : this); + image->draw(_posX + offsetX, _posY + offsetY, _transparent ? nullptr : this); } if (!BasePlatform::isRectEmpty(&_titleRect) && font && _text) { @@ -218,7 +218,7 @@ bool UIWindow::display(int offsetX, int offsetY) { } if (!_transparent && !image) { - _gameRef->_renderer->addRectToList(new BaseActiveRect(_gameRef, this, NULL, _posX + offsetX, _posY + offsetY, _width, _height, 100, 100, false)); + _gameRef->_renderer->addRectToList(new BaseActiveRect(_gameRef, this, nullptr, _posX + offsetX, _posY + offsetY, _width, _height, 100, 100, false)); } for (uint32 i = 0; i < _widgets.size(); i++) { @@ -240,7 +240,7 @@ bool UIWindow::display(int offsetX, int offsetY) { ////////////////////////////////////////////////////////////////////////// bool UIWindow::loadFile(const char *filename) { byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename); - if (buffer == NULL) { + if (buffer == nullptr) { _gameRef->LOG(0, "UIWindow::LoadFile failed for file '%s'", filename); return STATUS_FAILED; } @@ -374,7 +374,7 @@ bool UIWindow::loadBuffer(byte *buffer, bool complete) { _back = new UITiledImage(_gameRef); if (!_back || DID_FAIL(_back->loadFile((char *)params))) { delete _back; - _back = NULL; + _back = nullptr; cmd = PARSERR_GENERIC; } break; @@ -384,7 +384,7 @@ bool UIWindow::loadBuffer(byte *buffer, bool complete) { _backInactive = new UITiledImage(_gameRef); if (!_backInactive || DID_FAIL(_backInactive->loadFile((char *)params))) { delete _backInactive; - _backInactive = NULL; + _backInactive = nullptr; cmd = PARSERR_GENERIC; } break; @@ -394,7 +394,7 @@ bool UIWindow::loadBuffer(byte *buffer, bool complete) { _image = new BaseSprite(_gameRef); if (!_image || DID_FAIL(_image->loadFile((char *)params))) { delete _image; - _image = NULL; + _image = nullptr; cmd = PARSERR_GENERIC; } break; @@ -404,7 +404,7 @@ bool UIWindow::loadBuffer(byte *buffer, bool complete) { _imageInactive = new BaseSprite(_gameRef); if (!_imageInactive || DID_FAIL(_imageInactive->loadFile((char *)params))) { delete _imageInactive; - _imageInactive = NULL; + _imageInactive = nullptr; cmd = PARSERR_GENERIC; } break; @@ -473,7 +473,7 @@ bool UIWindow::loadBuffer(byte *buffer, bool complete) { _cursor = new BaseSprite(_gameRef); if (!_cursor || DID_FAIL(_cursor->loadFile((char *)params))) { delete _cursor; - _cursor = NULL; + _cursor = nullptr; cmd = PARSERR_GENERIC; } break; @@ -482,7 +482,7 @@ bool UIWindow::loadBuffer(byte *buffer, bool complete) { UIButton *btn = new UIButton(_gameRef); if (!btn || DID_FAIL(btn->loadBuffer(params, false))) { delete btn; - btn = NULL; + btn = nullptr; cmd = PARSERR_GENERIC; } else { btn->_parent = this; @@ -495,7 +495,7 @@ bool UIWindow::loadBuffer(byte *buffer, bool complete) { UIText *text = new UIText(_gameRef); if (!text || DID_FAIL(text->loadBuffer(params, false))) { delete text; - text = NULL; + text = nullptr; cmd = PARSERR_GENERIC; } else { text->_parent = this; @@ -508,7 +508,7 @@ bool UIWindow::loadBuffer(byte *buffer, bool complete) { UIEdit *edit = new UIEdit(_gameRef); if (!edit || DID_FAIL(edit->loadBuffer(params, false))) { delete edit; - edit = NULL; + edit = nullptr; cmd = PARSERR_GENERIC; } else { edit->_parent = this; @@ -521,7 +521,7 @@ bool UIWindow::loadBuffer(byte *buffer, bool complete) { UIWindow *win = new UIWindow(_gameRef); if (!win || DID_FAIL(win->loadBuffer(params, false))) { delete win; - win = NULL; + win = nullptr; cmd = PARSERR_GENERIC; } else { win->_parent = this; @@ -616,7 +616,7 @@ bool UIWindow::loadBuffer(byte *buffer, bool complete) { _fadeColor = BYTETORGBA(fadeR, fadeG, fadeB, fadeA); } - _focusedWidget = NULL; + _focusedWidget = nullptr; return STATUS_OK; } @@ -795,7 +795,7 @@ bool UIWindow::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack _gameRef->_fontStorage->removeFont(_fontInactive); } _fontInactive = _gameRef->_fontStorage->addFont(stack->pop()->getString()); - stack->pushBool(_fontInactive != NULL); + stack->pushBool(_fontInactive != nullptr); return STATUS_OK; } @@ -811,7 +811,7 @@ bool UIWindow::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack const char *filename = stack->pop()->getString(); if (!_imageInactive || DID_FAIL(_imageInactive->loadFile(filename))) { delete _imageInactive; - _imageInactive = NULL; + _imageInactive = nullptr; stack->pushBool(false); } else { stack->pushBool(true); @@ -1294,7 +1294,7 @@ bool UIWindow::moveFocus(bool forward) { } } if (!found) { - _focusedWidget = NULL; + _focusedWidget = nullptr; } if (!_focusedWidget) { diff --git a/engines/wintermute/utils/string_util.cpp b/engines/wintermute/utils/string_util.cpp index 7b3b0e1297..9fffad85cd 100644 --- a/engines/wintermute/utils/string_util.cpp +++ b/engines/wintermute/utils/string_util.cpp @@ -205,7 +205,7 @@ bool StringUtil::isUtf8BOM(const byte *buffer, uint32 bufferSize) { ////////////////////////////////////////////////////////////////////////// int StringUtil::indexOf(const WideString &str, const WideString &toFind, size_t startFrom) { const char *index = strstr(str.c_str(), toFind.c_str()); - if (index == NULL) { + if (index == nullptr) { return -1; } else { return index - str.c_str(); @@ -213,8 +213,10 @@ int StringUtil::indexOf(const WideString &str, const WideString &toFind, size_t } Common::String StringUtil::encodeSetting(const Common::String &str) { - if (str.contains('=')) { - error("Setting contains '='"); + for (uint32 i = 0; i < str.size(); i++) { + if ((str[i] < 33) || (str[i] == '=') || (str[i] > 126)) { + error("Setting contains illegal characters: %s", str.c_str()); + } } return str; } diff --git a/engines/wintermute/utils/utils.cpp b/engines/wintermute/utils/utils.cpp index 824b16ccdb..6e0d69edbe 100644 --- a/engines/wintermute/utils/utils.cpp +++ b/engines/wintermute/utils/utils.cpp @@ -96,7 +96,7 @@ char *BaseUtils::setString(char **string, const char *value) { char *BaseUtils::strEntry(int entry, const char *str, const char delim) { int numEntries = 0; - const char *start = NULL; + const char *start = nullptr; int len = 0; for (uint32 i = 0; i <= strlen(str); i++) { @@ -117,7 +117,7 @@ char *BaseUtils::strEntry(int entry, const char *str, const char delim) { } } } - return NULL; + return nullptr; } ////////////////////////////////////////////////////////////////////////// diff --git a/engines/wintermute/video/video_player.cpp b/engines/wintermute/video/video_player.cpp index 2577b8aedc..42857b5c1b 100644 --- a/engines/wintermute/video/video_player.cpp +++ b/engines/wintermute/video/video_player.cpp @@ -50,7 +50,7 @@ bool VideoPlayer::setDefaults() { _playPosX = _playPosY = 0; _playZoom = 0.0f; - _filename = NULL; + _filename = nullptr; _slowRendering = false; diff --git a/engines/wintermute/video/video_player.h b/engines/wintermute/video/video_player.h index d5466da679..a49e910b0c 100644 --- a/engines/wintermute/video/video_player.h +++ b/engines/wintermute/video/video_player.h @@ -58,7 +58,7 @@ public: bool _playing; bool display(); bool update(); - bool initialize(const char *inFilename, const char *subtitleFile = NULL); + bool initialize(const char *inFilename, const char *subtitleFile = nullptr); bool cleanup(); VideoPlayer(BaseGame *inGame); virtual ~VideoPlayer(); diff --git a/engines/wintermute/video/video_theora_player.cpp b/engines/wintermute/video/video_theora_player.cpp index d14c807e11..1f6842c416 100644 --- a/engines/wintermute/video/video_theora_player.cpp +++ b/engines/wintermute/video/video_theora_player.cpp @@ -51,7 +51,7 @@ VideoTheoraPlayer::VideoTheoraPlayer(BaseGame *inGame) : BaseClass(inGame) { ////////////////////////////////////////////////////////////////////////// void VideoTheoraPlayer::SetDefaults() { - _file = NULL; + _file = nullptr; _filename = ""; _startTime = 0; _looping = false; @@ -68,8 +68,8 @@ void VideoTheoraPlayer::SetDefaults() { _playbackStarted = false; _dontDropFrames = false; - _texture = NULL; - _alphaImage = NULL; + _texture = nullptr; + _alphaImage = nullptr; _alphaFilename = ""; _frameRendered = false; @@ -84,10 +84,10 @@ void VideoTheoraPlayer::SetDefaults() { _savedState = THEORA_STATE_NONE; _savedPos = 0; _volume = 100; - _theoraDecoder = NULL; + _theoraDecoder = nullptr; // TODO: Add subtitles-support - //_subtitler = NULL; + //_subtitler = nullptr; } ////////////////////////////////////////////////////////////////////////// @@ -100,7 +100,7 @@ VideoTheoraPlayer::~VideoTheoraPlayer(void) { void VideoTheoraPlayer::cleanup() { if (_file) { BaseFileManager::getEngineInstance()->closeFile(_file); - _file = NULL; + _file = nullptr; } _surface.free(); @@ -108,11 +108,11 @@ void VideoTheoraPlayer::cleanup() { _theoraDecoder->close(); } delete _theoraDecoder; - _theoraDecoder = NULL; + _theoraDecoder = nullptr; delete _alphaImage; - _alphaImage = NULL; + _alphaImage = nullptr; delete _texture; - _texture = NULL; + _texture = nullptr; } ////////////////////////////////////////////////////////////////////////// @@ -157,7 +157,7 @@ bool VideoTheoraPlayer::resetStream() { _theoraDecoder->close(); } delete _theoraDecoder; - _theoraDecoder = NULL; + _theoraDecoder = nullptr; _file = BaseFileManager::getEngineInstance()->openFile(_filename, true, false); if (!_file) { @@ -419,7 +419,7 @@ bool VideoTheoraPlayer::setAlphaImage(const Common::String &filename) { _alphaImage = new BaseImage(); if (!_alphaImage || DID_FAIL(_alphaImage->loadFile(filename))) { delete _alphaImage; - _alphaImage = NULL; + _alphaImage = nullptr; _alphaFilename = ""; return STATUS_FAILED; } diff --git a/engines/wintermute/video/video_theora_player.h b/engines/wintermute/video/video_theora_player.h index 593c1b9666..7a6742271c 100644 --- a/engines/wintermute/video/video_theora_player.h +++ b/engines/wintermute/video/video_theora_player.h @@ -62,7 +62,7 @@ public: //CVidSubtitler *_subtitler; // control methods - bool initialize(const Common::String &filename, const Common::String &subtitleFile = NULL); + bool initialize(const Common::String &filename, const Common::String &subtitleFile = nullptr); bool initializeSimple(); bool update(); bool play(TVideoPlayback type = VID_PLAY_CENTER, int x = 0, int y = 0, bool freezeGame = false, bool freezeMusic = true, bool looping = false, uint32 startTime = 0, float forceZoom = -1.0f, int volume = -1); diff --git a/engines/wintermute/wintermute.cpp b/engines/wintermute/wintermute.cpp index c9726e150a..f33452d11c 100644 --- a/engines/wintermute/wintermute.cpp +++ b/engines/wintermute/wintermute.cpp @@ -34,6 +34,7 @@ #include "engines/util.h" #include "engines/wintermute/ad/ad_game.h" #include "engines/wintermute/wintermute.h" +#include "engines/wintermute/debugger.h" #include "engines/wintermute/platform_osystem.h" #include "engines/wintermute/base/base_engine.h" @@ -48,6 +49,8 @@ namespace Wintermute { // This might not be the prettiest solution WintermuteEngine::WintermuteEngine() : Engine(g_system) { _game = new AdGame(""); + _debugger = nullptr; + _trigDebug = false; } WintermuteEngine::WintermuteEngine(OSystem *syst, const ADGameDescription *desc) @@ -55,6 +58,7 @@ WintermuteEngine::WintermuteEngine(OSystem *syst, const ADGameDescription *desc) // Put your engine in a sane state, but do nothing big yet; // in particular, do not load data from files; rather, if you // need to do such things, do them from init(). + ConfMan.registerDefault("show_fps","false"); // Do not initialize graphics here @@ -70,14 +74,16 @@ WintermuteEngine::WintermuteEngine(OSystem *syst, const ADGameDescription *desc) DebugMan.addDebugChannel(kWintermuteDebugAudio, "audio", "audio-playback-related issues"); DebugMan.addDebugChannel(kWintermuteDebugGeneral, "general", "various issues not covered by any of the above"); - _game = NULL; + _game = nullptr; + _debugger = nullptr; + _trigDebug = false; } WintermuteEngine::~WintermuteEngine() { // Dispose your resources here deinit(); delete _game; - delete _console; + delete _debugger; // Remove all of our debug levels here DebugMan.clearAllDebugChannels(); @@ -106,7 +112,7 @@ Common::Error WintermuteEngine::run() { } // Create debugger console. It requires GFX to be initialized - _console = new Console(this); + _debugger = new Console(this); // DebugMan.enableDebugChannel("enginelog"); debugC(1, kWintermuteDebugLog, "Engine Debug-LOG enabled"); @@ -133,7 +139,7 @@ int WintermuteEngine::init() { return 1; } BaseEngine::instance().setGameRef(_game); - BasePlatform::initialize(_game, 0, NULL); + BasePlatform::initialize(this, _game, 0, nullptr); bool windowedMode = !ConfMan.getBool("fullscreen"); @@ -168,7 +174,7 @@ int WintermuteEngine::init() { if (DID_FAIL(_game->loadSettings("startup.settings"))) { _game->LOG(0, "Error loading game settings."); delete _game; - _game = NULL; + _game = nullptr; warning("Some of the essential files are missing. Please reinstall."); return 2; @@ -184,7 +190,7 @@ int WintermuteEngine::init() { _game->LOG(ret, "Error initializing renderer. Exiting."); delete _game; - _game = NULL; + _game = nullptr; return 3; } @@ -203,7 +209,7 @@ int WintermuteEngine::init() { if (DID_FAIL(_game->loadFile(_game->_settingsGameFile ? _game->_settingsGameFile : "default.game"))) { _game->LOG(ret, "Error loading game file. Exiting."); delete _game; - _game = NULL; + _game = nullptr; return false; } @@ -230,13 +236,20 @@ int WintermuteEngine::messageLoop() { uint32 diff = 0; const uint32 maxFPS = 60; - const uint32 frameTime = (uint32)((1.0 / maxFPS) * 1000); + const uint32 frameTime = 2 * (uint32)((1.0 / maxFPS) * 1000); while (!done) { + _debugger->onFrame(); + Common::Event event; while (_system->getEventManager()->pollEvent(event)) { BasePlatform::handleEvent(&event); } + if (_trigDebug) { + _debugger->attach(); + _trigDebug = false; + } + if (_game && _game->_renderer->_active && _game->_renderer->_ready) { _game->displayContent(); _game->displayQuickMsg(); @@ -265,13 +278,14 @@ int WintermuteEngine::messageLoop() { if (_game) { delete _game; - _game = NULL; + _game = nullptr; } return 0; } void WintermuteEngine::deinit() { BaseEngine::destroy(); + BasePlatform::deinit(); } Common::Error WintermuteEngine::loadGameState(int slot) { @@ -295,7 +309,7 @@ bool WintermuteEngine::canLoadGameStateCurrently() { bool WintermuteEngine::getGameInfo(const Common::FSList &fslist, Common::String &name, Common::String &caption) { bool retVal = false; caption = name = "(invalid)"; - Common::SeekableReadStream *stream = NULL; + Common::SeekableReadStream *stream = nullptr; // Quick-fix, instead of possibly breaking the persistence-system, let's just roll with it BaseFileManager *fileMan = new BaseFileManager(Common::UNK_LANG); fileMan->registerPackages(fslist); diff --git a/engines/wintermute/wintermute.h b/engines/wintermute/wintermute.h index d24b120658..fcaa2840a9 100644 --- a/engines/wintermute/wintermute.h +++ b/engines/wintermute/wintermute.h @@ -48,6 +48,9 @@ public: WintermuteEngine(); ~WintermuteEngine(); + virtual GUI::Debugger *getDebugger() { return _debugger; } + void trigDebugger() { _trigDebug = true; } + virtual Common::Error run(); virtual bool hasFeature(EngineFeature f) const; Common::SaveFileManager *getSaveFileMan() { return _saveFileMan; } @@ -58,19 +61,15 @@ public: // For detection-purposes: static bool getGameInfo(const Common::FSList &fslist, Common::String &name, Common::String &caption); private: + bool _trigDebug; int init(); void deinit(); int messageLoop(); - Console *_console; + GUI::Debugger *_debugger; BaseGame *_game; const ADGameDescription *_gameDescription; -}; -// Example console class -class Console : public GUI::Debugger { -public: - Console(WintermuteEngine *vm) {} - virtual ~Console(void) {} + friend class Console; }; } // End of namespace Wintermute diff --git a/graphics/decoders/iff.cpp b/graphics/decoders/iff.cpp new file mode 100644 index 0000000000..50c7b4f7de --- /dev/null +++ b/graphics/decoders/iff.cpp @@ -0,0 +1,241 @@ +/* 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. + */ + +#include "common/iff_container.h" +#include "common/stream.h" +#include "common/util.h" + +#include "graphics/decoders/iff.h" + +namespace Graphics { + +IFFDecoder::IFFDecoder() { + _surface = 0; + _palette = 0; + + destroy(); +} + +IFFDecoder::~IFFDecoder() { + destroy(); +} + +void IFFDecoder::destroy() { + if (_surface) { + _surface->free(); + delete _surface; + _surface = 0; + } + + if (_palette) { + delete[] _palette; + _palette = 0; + } + + memset(&_header, 0, sizeof(Header)); + _paletteRanges.clear(); + _type = TYPE_UNKNOWN; + _paletteColorCount = 0; + _numRelevantPlanes = 8; + _pixelPacking = false; +} + +bool IFFDecoder::loadStream(Common::SeekableReadStream &stream) { + destroy(); + + const uint32 form = stream.readUint32BE(); + + if (form != ID_FORM) { + warning("Failed reading IFF-file"); + return false; + } + + stream.skip(4); + + const uint32 type = stream.readUint32BE(); + + switch (type) { + case ID_ILBM: + _type = TYPE_ILBM; + break; + case ID_PBM: + _type = TYPE_PBM; + break; + } + + if (type == TYPE_UNKNOWN) { + warning("Failed reading IFF-file"); + return false; + } + + while (1) { + const uint32 chunkType = stream.readUint32BE(); + const uint32 chunkSize = stream.readUint32BE(); + + if (stream.eos()) + break; + + switch (chunkType) { + case ID_BMHD: + loadHeader(stream); + break; + case ID_CMAP: + loadPalette(stream, chunkSize); + break; + case ID_CRNG: + loadPaletteRange(stream, chunkSize); + break; + case ID_BODY: + loadBitmap(stream); + break; + default: + stream.skip(chunkSize); + } + } + + return true; +} + +void IFFDecoder::loadHeader(Common::SeekableReadStream &stream) { + _header.width = stream.readUint16BE(); + _header.height = stream.readUint16BE(); + _header.x = stream.readUint16BE(); + _header.y = stream.readUint16BE(); + _header.numPlanes = stream.readByte(); + _header.masking = stream.readByte(); + _header.compression = stream.readByte(); + _header.flags = stream.readByte(); + _header.transparentColor = stream.readUint16BE(); + _header.xAspect = stream.readByte(); + _header.yAspect = stream.readByte(); + _header.pageWidth = stream.readUint16BE(); + _header.pageHeight = stream.readUint16BE(); + + assert(_header.width >= 1); + assert(_header.height >= 1); + assert(_header.numPlanes >= 1 && _header.numPlanes <= 8 && _header.numPlanes != 7); +} + +void IFFDecoder::loadPalette(Common::SeekableReadStream &stream, const uint32 size) { + _palette = new byte[size]; + stream.read(_palette, size); + _paletteColorCount = size / 3; +} + +void IFFDecoder::loadPaletteRange(Common::SeekableReadStream &stream, const uint32 size) { + PaletteRange range; + + range.timer = stream.readSint16BE(); + range.step = stream.readSint16BE(); + range.flags = stream.readSint16BE(); + range.first = stream.readByte(); + range.last = stream.readByte(); + + _paletteRanges.push_back(range); +} + +void IFFDecoder::loadBitmap(Common::SeekableReadStream &stream) { + _numRelevantPlanes = MIN(_numRelevantPlanes, _header.numPlanes); + + if (_numRelevantPlanes != 1 && _numRelevantPlanes != 2 && _numRelevantPlanes != 4) + _pixelPacking = false; + + uint16 outPitch = _header.width; + + if (_pixelPacking) + outPitch /= (8 / _numRelevantPlanes); + + // FIXME: CLUT8 is not a proper format for packed bitmaps but there is no way to tell it to use 1, 2 or 4 bits per pixel + _surface = new Graphics::Surface(); + _surface->create(outPitch, _header.height, Graphics::PixelFormat::createFormatCLUT8()); + + if (_type == TYPE_ILBM) { + uint32 scanlinePitch = ((_header.width + 15) >> 4) << 1; + byte *scanlines = new byte[scanlinePitch * _header.numPlanes]; + byte *data = (byte *)_surface->pixels; + + for (uint16 i = 0; i < _header.height; ++i) { + byte *scanline = scanlines; + + for (uint16 j = 0; j < _header.numPlanes; ++j) { + uint16 outSize = scanlinePitch; + + if (_header.compression) { + Common::PackBitsReadStream packStream(stream); + packStream.read(scanline, outSize); + } else { + stream.read(scanline, outSize); + } + + scanline += outSize; + } + + packPixels(scanlines, data, scanlinePitch, outPitch); + data += outPitch; + } + + delete[] scanlines; + } else if (_type == TYPE_PBM) { + byte *data = (byte *)_surface->pixels; + uint32 outSize = _header.width * _header.height; + + if (_header.compression) { + Common::PackBitsReadStream packStream(stream); + packStream.read(data, outSize); + } else { + stream.read(data, outSize); + } + } +} + +void IFFDecoder::packPixels(byte *scanlines, byte *data, const uint16 scanlinePitch, const uint16 outPitch) { + uint32 numPixels = _header.width; + + if (_pixelPacking) + numPixels = outPitch * (8 / _numRelevantPlanes); + + for (uint32 x = 0; x < numPixels; ++x) { + byte *scanline = scanlines; + byte pixel = 0; + byte offset = x >> 3; + byte bit = 0x80 >> (x & 7); + + // first build a pixel by scanning all the usable planes in the input + for (uint32 plane = 0; plane < _numRelevantPlanes; ++plane) { + if (scanline[offset] & bit) + pixel |= (1 << plane); + + scanline += scanlinePitch; + } + + // then output the pixel according to the requested packing + if (!_pixelPacking) + data[x] = pixel; + else if (_numRelevantPlanes == 1) + data[x / 8] |= (pixel << (x & 7)); + else if (_numRelevantPlanes == 2) + data[x / 4] |= (pixel << ((x & 3) << 1)); + else if (_numRelevantPlanes == 4) + data[x / 2] |= (pixel << ((x & 1) << 2)); + } +} + +} // End of namespace Graphics diff --git a/graphics/decoders/iff.h b/graphics/decoders/iff.h new file mode 100644 index 0000000000..beac62e519 --- /dev/null +++ b/graphics/decoders/iff.h @@ -0,0 +1,119 @@ +/* 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. + */ + +/** + * @file + * Image decoder used in engines: + * - gob + * - parallaction + * - queen + * - saga + */ + +#ifndef GRAPHICS_DECODERS_IFF_H +#define GRAPHICS_DECODERS_IFF_H + +#include "common/array.h" +#include "common/endian.h" + +#include "graphics/surface.h" +#include "graphics/decoders/image_decoder.h" + +namespace Common { +class SeekableReadStream; +} + +namespace Graphics { + +struct Surface; + +class IFFDecoder : public ImageDecoder { +public: + struct Header { + uint16 width, height; + uint16 x, y; + byte numPlanes; + byte masking; + byte compression; + byte flags; + uint16 transparentColor; + byte xAspect, yAspect; + uint16 pageWidth, pageHeight; + }; + + struct PaletteRange { + int16 timer, step, flags; + byte first, last; + }; + + enum Type { + TYPE_UNKNOWN = 0, + TYPE_ILBM, + TYPE_PBM + }; + + IFFDecoder(); + virtual ~IFFDecoder(); + + // ImageDecoder API + void destroy(); + bool loadStream(Common::SeekableReadStream &stream); + const Header *getHeader() const { return &_header; } + const Surface *getSurface() const { return _surface; } + const byte *getPalette() const { return _palette; } + const Common::Array<PaletteRange> &getPaletteRanges() const { return _paletteRanges; } + uint16 getPaletteColorCount() const { return _paletteColorCount; } + + /** + * The number of planes to decode, also determines the pixel packing if _packPixels is true. + * 8 == decode all planes, map 1 pixel in 1 byte. (default, no packing even if _packPixels is true) + */ + void setNumRelevantPlanes(const uint8 numRelevantPlanes) { _numRelevantPlanes = numRelevantPlanes; } + + /** + * Enables pixel packing, the amount of packing is determined by _numRelevantPlanes + * 1 == decode first plane, pack 8 pixels in 1 byte. This makes _surface->w 1/8th of _header.width + * 2 == decode first 2 planes, pack 4 pixels in 1 byte. This makes _surface->w 1/4th of _header.width + * 4 == decode first 4 planes, pack 2 pixels in 1 byte. This makes _surface->w half of _header.width + * Packed bitmaps won't have a proper surface format since there is no way to tell it to use 1, 2 or 4 bits per pixel + */ + void setPixelPacking(const bool pixelPacking) { _pixelPacking = pixelPacking; } +private: + + Header _header; + Surface *_surface; + byte *_palette; + Common::Array<PaletteRange> _paletteRanges; + Type _type; + uint16 _paletteColorCount; + uint8 _numRelevantPlanes; + bool _pixelPacking; + + void loadHeader(Common::SeekableReadStream &stream); + void loadPalette(Common::SeekableReadStream &stream, const uint32 size); + void loadPaletteRange(Common::SeekableReadStream &stream, const uint32 size); + void loadBitmap(Common::SeekableReadStream &stream); + void packPixels(byte *scanlines, byte *data, const uint16 scanlinePitch, const uint16 outPitch); +}; + +} // End of namespace Graphics + +#endif // GRAPHICS_DECODERS_IFF_H diff --git a/graphics/decoders/jpeg.cpp b/graphics/decoders/jpeg.cpp index 08bc1f7a3d..8adbab133f 100644 --- a/graphics/decoders/jpeg.cpp +++ b/graphics/decoders/jpeg.cpp @@ -74,7 +74,7 @@ const Surface *JPEGDecoder::getSurface() const { // Create an RGBA8888 surface _rgbSurface = new Graphics::Surface(); - _rgbSurface->create(_w, _h, Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0)); + _rgbSurface->create(_w, _h, Graphics::PixelFormat(4, 8, 8, 8, 0, 24, 16, 8, 0)); // Get our component surfaces const Graphics::Surface *yComponent = getComponent(1); @@ -215,28 +215,34 @@ bool JPEGDecoder::loadStream(Common::SeekableReadStream &stream) { bool JPEGDecoder::readJFIF() { uint16 length = _stream->readUint16BE(); uint32 tag = _stream->readUint32BE(); + if (tag != MKTAG('J', 'F', 'I', 'F')) { warning("JPEGDecoder::readJFIF() tag mismatch"); return false; } + if (_stream->readByte() != 0) { // NULL warning("JPEGDecoder::readJFIF() NULL mismatch"); return false; } + byte majorVersion = _stream->readByte(); byte minorVersion = _stream->readByte(); - if (majorVersion != 1 || minorVersion != 1) - warning("JPEGDecoder::readJFIF() Non-v1.1 JPEGs may not be handled correctly"); + if (majorVersion != 1 || minorVersion > 2) + warning("JPEGDecoder::readJFIF(): v%d.%02d JPEGs may not be handled correctly", majorVersion, minorVersion); + /* byte densityUnits = */_stream->readByte(); /* uint16 xDensity = */_stream->readUint16BE(); /* uint16 yDensity = */_stream->readUint16BE(); byte thumbW = _stream->readByte(); byte thumbH = _stream->readByte(); + _stream->seek(thumbW * thumbH * 3, SEEK_CUR); // Ignore thumbnail if (length != (thumbW * thumbH * 3) + 16) { warning("JPEGDecoder::readJFIF() length mismatch"); return false; } + return true; } diff --git a/graphics/decoders/png.cpp b/graphics/decoders/png.cpp index 4f917b44b1..11e26162eb 100644 --- a/graphics/decoders/png.cpp +++ b/graphics/decoders/png.cpp @@ -227,7 +227,7 @@ bool PNGDecoder::loadStream(Common::SeekableReadStream &stream) { png_read_end(pngPtr, NULL); // Destroy libpng structures - png_destroy_read_struct(&pngPtr, &infoPtr, NULL); + png_destroy_read_struct(&pngPtr, &infoPtr, &endInfo); // We no longer need the file stream, thus close it here _stream = 0; diff --git a/graphics/iff.cpp b/graphics/iff.cpp deleted file mode 100644 index 4011126bd3..0000000000 --- a/graphics/iff.cpp +++ /dev/null @@ -1,268 +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. - */ - -#include "graphics/iff.h" -#include "graphics/surface.h" - -#include "common/endian.h" -#include "common/func.h" -#include "common/iff_container.h" -#include "common/textconsole.h" -#include "common/util.h" - -namespace Graphics { - -void BMHD::load(Common::ReadStream *stream) { - assert(stream); - stream->read(this, sizeof(BMHD)); - width = FROM_BE_16(width); - height = FROM_BE_16(height); - x = FROM_BE_16(x); - y = FROM_BE_16(y); - transparentColor = FROM_BE_16(transparentColor); - pageWidth = FROM_BE_16(pageWidth); - pageHeight = FROM_BE_16(pageHeight); -} - - -void ILBMDecoder::loadHeader(Common::ReadStream *stream) { - _header.load(stream); -} - -void ILBMDecoder::loadBitmap(uint32 mode, byte *buffer, Common::ReadStream *stream) { - assert(stream); - uint32 numPlanes = MIN(mode & ILBM_UNPACK_PLANES, (uint32)_header.depth); - assert(numPlanes == 1 || numPlanes == 2 || numPlanes == 3 || numPlanes == 4 || numPlanes == 5 || numPlanes == 8); - - bool packPixels = (mode & ILBM_PACK_PLANES) != 0; - if (numPlanes != 1 && numPlanes != 2 && numPlanes != 4) { - packPixels = false; - } - - uint32 outPitch = _header.width; - if (packPixels) { - outPitch /= (8 / numPlanes); - } - byte *out = buffer; - - switch (_header.pack) { - case 1: { // PackBits compressed bitmap - Graphics::PackBitsReadStream packStream(*stream); - - // setup a buffer to hold enough data to build a line in the output - uint32 scanlineWidth = ((_header.width + 15) / 16) << 1; - byte *scanline = new byte[scanlineWidth * _header.depth]; - - for (uint i = 0; i < _header.height; ++i) { - byte *s = scanline; - for (uint32 j = 0; j < _header.depth; ++j) { - packStream.read(s, scanlineWidth); - s += scanlineWidth; - } - - planarToChunky(out, outPitch, scanline, scanlineWidth, numPlanes, packPixels); - out += outPitch; - } - - delete[] scanline; - break; - } - - default: - // implement other compression types here! - error("only RLE compressed ILBM files are supported"); - break; - } -} - -void ILBMDecoder::planarToChunky(byte *out, uint32 outPitch, byte *in, uint32 inWidth, uint32 nPlanes, bool packPlanes) { - byte pix, ofs, bit; - byte *s; - - uint32 pixels = outPitch; - if (packPlanes) { - pixels *= (8 / nPlanes); - } - - for (uint32 x = 0; x < pixels; ++x) { - - pix = 0; - ofs = x >> 3; - bit = 0x80 >> (x & 7); - - // first build a pixel by scanning all the usable planes in the input - s = in; - for (uint32 plane = 0; plane < nPlanes; ++plane) { - if (s[ofs] & bit) { - pix |= (1 << plane); - } - s += inWidth; - } - - - // then output the pixel according to the requested packing - if (!packPlanes) { - out[x] = pix; - } else if (nPlanes == 1) { - out[x / 8] |= (pix << (x & 7)); - } else if (nPlanes == 2) { - out[x / 4] |= (pix << ((x & 3) << 1)); - } else if (nPlanes == 4) { - out[x / 2] |= (pix << ((x & 1) << 2)); - } - } - -} - - -// handles PBM subtype of IFF FORM files -// -struct PBMDecoder { - /** - * PBM header data, necessary for loadBitmap() - */ - Graphics::BMHD _header; - - /** - * Fills the _header member from the given stream. - */ - void loadHeader(Common::ReadStream *stream); - - /** - * Loads and unpacks the PBM bitmap data from the stream into the buffer. - * The functions assumes the buffer is large enough to contain all data. - */ - void loadBitmap(byte *buffer, Common::ReadStream *stream); -}; - -void PBMDecoder::loadHeader(Common::ReadStream *stream) { - _header.load(stream); -} - - -void PBMDecoder::loadBitmap(byte *buffer, Common::ReadStream *stream) { - uint32 outSize = _header.width * _header.height; - - switch (_header.pack) { - case 0: - stream->read(buffer, outSize); - break; - - case 1: { - PackBitsReadStream packStream(*stream); - packStream.read(buffer, outSize); - break; - } - } -} - - -struct PBMLoader { - PBMDecoder _decoder; - Surface *_surface; - byte *_colors; - - void load(Common::ReadStream &input, Surface &surface, byte *&colors) { - _surface = &surface; - _colors = colors; - Common::IFFParser parser(&input); - Common::Functor1Mem<Common::IFFChunk &, bool, PBMLoader> c(this, &PBMLoader::callback); - parser.parse(c); - } - - bool callback(Common::IFFChunk &chunk) { - switch (chunk._type) { - case ID_BMHD: - _decoder.loadHeader(chunk._stream); - break; - - case ID_CMAP: - if (_colors) { - chunk._stream->read(_colors, chunk._size); - } - break; - - case ID_BODY: - if (_surface) { - _surface->create(_decoder._header.width, _decoder._header.height, PixelFormat::createFormatCLUT8()); - _decoder.loadBitmap((byte *)_surface->pixels, chunk._stream); - } - return true; // stop the parser - } - - return false; - } -}; - -void decodePBM(Common::ReadStream &input, Surface &surface, byte *colors) { - PBMLoader loader; - loader.load(input, surface, colors); -} - - - - -PackBitsReadStream::PackBitsReadStream(Common::ReadStream &input) : _input(&input) { -} - -PackBitsReadStream::~PackBitsReadStream() { -} - -bool PackBitsReadStream::eos() const { - return _input->eos(); -} - -uint32 PackBitsReadStream::read(void *dataPtr, uint32 dataSize) { - byte *out = (byte *)dataPtr; - uint32 left = dataSize; - - uint32 lenR = 0, lenW = 0; - while (left > 0 && !_input->eos()) { - lenR = _input->readByte(); - - if (lenR == 128) { - // no-op - lenW = 0; - } else if (lenR <= 127) { - // literal run - lenR++; - lenW = MIN(lenR, left); - for (uint32 j = 0; j < lenW; j++) { - *out++ = _input->readByte(); - } - for (; lenR > lenW; lenR--) { - _input->readByte(); - } - } else { // len > 128 - // expand run - lenW = MIN((256 - lenR) + 1, left); - byte val = _input->readByte(); - memset(out, val, lenW); - out += lenW; - } - - left -= lenW; - } - - return dataSize - left; -} - -} // End of namespace Graphics diff --git a/graphics/iff.h b/graphics/iff.h deleted file mode 100644 index 4d88148372..0000000000 --- a/graphics/iff.h +++ /dev/null @@ -1,137 +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. - */ - -/* - * Bitmap decoder used in engines: - * - parallaction - * - saga - */ - -#ifndef GRAPHICS_IFF_H -#define GRAPHICS_IFF_H - -#include "common/stream.h" - -namespace Graphics { - -struct Surface; - - -struct BMHD { - uint16 width, height; - uint16 x, y; - byte depth; - byte masking; - byte pack; - byte flags; - uint16 transparentColor; - byte xAspect, yAspect; - uint16 pageWidth, pageHeight; - - BMHD() { - memset(this, 0, sizeof(*this)); - } - - void load(Common::ReadStream *stream); -}; - - -struct ILBMDecoder { - /** - * ILBM header data, necessary for loadBitmap() - */ - Graphics::BMHD _header; - - /** - * Available decoding modes for loadBitmap(). - */ - enum { - ILBM_UNPACK_PLANES = 0xFF, ///< Decode all bitplanes, and map 1 pixel to 1 byte. - ILBM_PACK_PLANES = 0x100, ///< Request unpacking, used as a mask with below options. - - ILBM_1_PLANES = 1, ///< Decode only the first bitplane, don't pack. - ILBM_1_PACK_PLANES = ILBM_1_PLANES | ILBM_PACK_PLANES, ///< Decode only the first bitplane, pack 8 pixels in 1 byte. - ILBM_2_PLANES = 2, ///< Decode first 2 bitplanes, don't pack. - ILBM_2_PACK_PLANES = ILBM_2_PLANES | ILBM_PACK_PLANES, ///< Decode first 2 bitplanes, pack 4 pixels in 1 byte. - ILBM_3_PLANES = 3, ///< Decode first 3 bitplanes, don't pack. - ILBM_4_PLANES = 4, ///< Decode first 4 bitplanes, don't pack. - ILBM_4_PACK_PLANES = ILBM_4_PLANES | ILBM_PACK_PLANES, ///< Decode first 4 bitplanes, pack 2 pixels in 1 byte. - ILBM_5_PLANES = 5, ///< Decode first 5 bitplanes, don't pack. - ILBM_8_PLANES = 8 ///< Decode all 8 bitplanes. - }; - - /** - * Fills the _header member from the given stream. - */ - void loadHeader(Common::ReadStream *stream); - - /** - * Loads and unpacks the ILBM bitmap data from the stream into the buffer. - * The functions assumes the buffer is large enough to contain all data. - * The caller controls how data should be packed by choosing mode from - * the enum above. - */ - void loadBitmap(uint32 mode, byte *buffer, Common::ReadStream *stream); - - /** - * Converts from bitplanar to chunky representation. Intended for internal - * usage, but you can be (ab)use it from client code if you know what you - * are doing. - */ - void planarToChunky(byte *out, uint32 width, byte *in, uint32 planeWidth, uint32 nPlanes, bool packPlanes); -}; - - - -/** - * Handles PBM subtype of IFF FORM files - */ -void decodePBM(Common::ReadStream &input, Surface &surface, byte *colors); - - -/** - * Decode a given PackBits encoded stream. - * - * PackBits is an RLE compression algorithm introduced by Apple. It is also - * used to encode ILBM and PBM subtypes of IFF files, and some flavors of - * TIFF. - * - * As there is no compression across row boundaries in the above formats, - * read() will extract a *new* line on each call, discarding any alignment - * or padding. - */ -class PackBitsReadStream : public Common::ReadStream { - -protected: - Common::ReadStream *_input; - -public: - PackBitsReadStream(Common::ReadStream &input); - ~PackBitsReadStream(); - - virtual bool eos() const; - - uint32 read(void *dataPtr, uint32 dataSize); -}; - -} // End of namespace Graphics - -#endif diff --git a/graphics/module.mk b/graphics/module.mk index f560d9dc97..8b63435905 100644 --- a/graphics/module.mk +++ b/graphics/module.mk @@ -11,7 +11,6 @@ MODULE_OBJS := \ fonts/newfont.o \ fonts/ttf.o \ fonts/winfont.o \ - iff.o \ maccursor.o \ primitives.o \ scaler.o \ @@ -24,6 +23,7 @@ MODULE_OBJS := \ wincursor.o \ yuv_to_rgb.o \ decoders/bmp.o \ + decoders/iff.o \ decoders/jpeg.o \ decoders/pcx.o \ decoders/pict.o \ diff --git a/graphics/primitives.cpp b/graphics/primitives.cpp index b88db39f36..c140dc8644 100644 --- a/graphics/primitives.cpp +++ b/graphics/primitives.cpp @@ -78,4 +78,4 @@ void drawThickLine(int x0, int y0, int x1, int y1, int penX, int penY, int color drawLine(x0 + x, y0 + y, x1 + x, y1 + y, color, plotProc, data); } -} // End of namespace Graphics +} // End of namespace Graphics diff --git a/graphics/primitives.h b/graphics/primitives.h index f0780afc2e..f4a92683ab 100644 --- a/graphics/primitives.h +++ b/graphics/primitives.h @@ -27,6 +27,6 @@ namespace Graphics { void drawLine(int x0, int y0, int x1, int y1, int color, void (*plotProc)(int, int, int, void *), void *data); void drawThickLine(int x0, int y0, int x1, int y1, int penX, int penY, int color, void (*plotProc)(int, int, int, void *), void *data); -} // End of namespace Graphics +} // End of namespace Graphics #endif diff --git a/graphics/scaler.cpp b/graphics/scaler.cpp index b81e8937a8..3325fd4db2 100644 --- a/graphics/scaler.cpp +++ b/graphics/scaler.cpp @@ -152,7 +152,7 @@ void InitScalers(uint32 BitFormat) { g_dotmatrix[12] = g_dotmatrix[14] = format.RGBToColor(63, 63, 63); } -void DestroyScalers(){ +void DestroyScalers() { #ifdef USE_HQ_SCALERS free(RGBtoYUV); RGBtoYUV = 0; diff --git a/graphics/thumbnail.cpp b/graphics/thumbnail.cpp index db61d828d2..ddb377306d 100644 --- a/graphics/thumbnail.cpp +++ b/graphics/thumbnail.cpp @@ -30,17 +30,17 @@ namespace Graphics { namespace { -#define THMB_VERSION 1 +#define THMB_VERSION 2 struct ThumbnailHeader { uint32 type; uint32 size; byte version; uint16 width, height; - byte bpp; + PixelFormat format; }; -#define ThumbnailHeaderSize (4+4+1+2+2+1) +#define ThumbnailHeaderSize (4+4+1+2+2+(1+4+4)) bool loadHeader(Common::SeekableReadStream &in, ThumbnailHeader &header, bool outputWarnings) { header.type = in.readUint32BE(); @@ -64,7 +64,22 @@ bool loadHeader(Common::SeekableReadStream &in, ThumbnailHeader &header, bool ou header.width = in.readUint16BE(); header.height = in.readUint16BE(); - header.bpp = in.readByte(); + header.format.bytesPerPixel = in.readByte(); + // Starting from version 2 on we serialize the whole PixelFormat. + if (header.version >= 2) { + header.format.rLoss = in.readByte(); + header.format.gLoss = in.readByte(); + header.format.bLoss = in.readByte(); + header.format.aLoss = in.readByte(); + + header.format.rShift = in.readByte(); + header.format.gShift = in.readByte(); + header.format.bShift = in.readByte(); + header.format.aShift = in.readByte(); + } else { + // Version 1 used a hardcoded RGB565. + header.format = createPixelFormat<565>(); + } return true; } @@ -100,23 +115,32 @@ Graphics::Surface *loadThumbnail(Common::SeekableReadStream &in) { if (!loadHeader(in, header, true)) return 0; - if (header.bpp != 2) { - warning("trying to load thumbnail with unsupported bit depth %d", header.bpp); + if (header.format.bytesPerPixel != 2 && header.format.bytesPerPixel != 4) { + warning("trying to load thumbnail with unsupported bit depth %d", header.format.bytesPerPixel); return 0; } - Graphics::PixelFormat format = g_system->getOverlayFormat(); Graphics::Surface *const to = new Graphics::Surface(); - to->create(header.width, header.height, format); + to->create(header.width, header.height, header.format); - OverlayColor *pixels = (OverlayColor *)to->pixels; for (int y = 0; y < to->h; ++y) { - for (int x = 0; x < to->w; ++x) { - uint8 r, g, b; - colorToRGB<ColorMasks<565> >(in.readUint16BE(), r, g, b); - - // converting to current OSystem Color - *pixels++ = format.RGBToColor(r, g, b); + switch (header.format.bytesPerPixel) { + case 2: { + uint16 *pixels = (uint16 *)to->getBasePtr(0, y); + for (uint x = 0; x < to->w; ++x) { + *pixels++ = in.readUint16BE(); + } + } break; + + case 4: { + uint32 *pixels = (uint32 *)to->getBasePtr(0, y); + for (uint x = 0; x < to->w; ++x) { + *pixels++ = in.readUint32BE(); + } + } break; + + default: + assert(0); } } @@ -138,8 +162,8 @@ bool saveThumbnail(Common::WriteStream &out) { } bool saveThumbnail(Common::WriteStream &out, const Graphics::Surface &thumb) { - if (thumb.format.bytesPerPixel != 2) { - warning("trying to save thumbnail with bpp different than 2"); + if (thumb.format.bytesPerPixel != 2 && thumb.format.bytesPerPixel != 4) { + warning("trying to save thumbnail with bpp %u", thumb.format.bytesPerPixel); return false; } @@ -149,19 +173,45 @@ bool saveThumbnail(Common::WriteStream &out, const Graphics::Surface &thumb) { header.version = THMB_VERSION; header.width = thumb.w; header.height = thumb.h; - header.bpp = thumb.format.bytesPerPixel; out.writeUint32BE(header.type); out.writeUint32BE(header.size); out.writeByte(header.version); out.writeUint16BE(header.width); out.writeUint16BE(header.height); - out.writeByte(header.bpp); - // TODO: for later this shouldn't be casted to uint16... - uint16 *pixels = (uint16 *)thumb.pixels; - for (uint16 p = 0; p < thumb.w*thumb.h; ++p, ++pixels) - out.writeUint16BE(*pixels); + // Serialize the PixelFormat + out.writeByte(thumb.format.bytesPerPixel); + out.writeByte(thumb.format.rLoss); + out.writeByte(thumb.format.gLoss); + out.writeByte(thumb.format.bLoss); + out.writeByte(thumb.format.aLoss); + out.writeByte(thumb.format.rShift); + out.writeByte(thumb.format.gShift); + out.writeByte(thumb.format.bShift); + out.writeByte(thumb.format.aShift); + + // Serialize the pixel data + for (uint y = 0; y < thumb.h; ++y) { + switch (thumb.format.bytesPerPixel) { + case 2: { + const uint16 *pixels = (const uint16 *)thumb.getBasePtr(0, y); + for (uint x = 0; x < thumb.w; ++x) { + out.writeUint16BE(*pixels++); + } + } break; + + case 4: { + const uint32 *pixels = (const uint32 *)thumb.getBasePtr(0, y); + for (uint x = 0; x < thumb.w; ++x) { + out.writeUint32BE(*pixels++); + } + } break; + + default: + assert(0); + } + } return true; } diff --git a/graphics/thumbnail.h b/graphics/thumbnail.h index df99568f42..45a0fdbf07 100644 --- a/graphics/thumbnail.h +++ b/graphics/thumbnail.h @@ -50,8 +50,6 @@ bool skipThumbnail(Common::SeekableReadStream &in); /** * Loads a thumbnail from the given input stream. - * The loaded thumbnail will be automatically converted to the - * current overlay pixelformat. */ Graphics::Surface *loadThumbnail(Common::SeekableReadStream &in); diff --git a/gui/ThemeEngine.h b/gui/ThemeEngine.h index 6fb93d3b46..6e5fd291b7 100644 --- a/gui/ThemeEngine.h +++ b/gui/ThemeEngine.h @@ -35,7 +35,7 @@ #include "graphics/pixelformat.h" -#define SCUMMVM_THEME_VERSION_STR "SCUMMVM_STX0.8.16" +#define SCUMMVM_THEME_VERSION_STR "SCUMMVM_STX0.8.20" class OSystem; diff --git a/gui/about.cpp b/gui/about.cpp index 03be1f8992..088971f273 100644 --- a/gui/about.cpp +++ b/gui/about.cpp @@ -37,14 +37,16 @@ enum { kScrollMillisPerPixel = 60 }; -// The following commands can be put at the start of a line (all subject to change): -// \C, \L, \R -- set center/left/right alignment -// \c0 - \c4 -- set a custom color: -// 0 normal text (green) -// 1 highlighted text (light green) -// 2 light border (light gray) -// 3 dark border (dark gray) -// 4 background (black) +// Every Line should start with a letter followed by a digit. Currently those can be +// (all subject to change) +// Letter: +// C, L, R -- set center/left/right alignment +// A -- ASCII text to replace the next (latin1) line +// Digit: +// 0 - 2 -- set a custom color: +// 0 normal text +// 1 highlighted text +// 2 disabled text // TODO: Maybe add a tab/indent feature; that is, make it possible to specify // an amount by which that line shall be indented (the indent of course would have // to be considered while performing any word wrapping, too). @@ -54,7 +56,7 @@ enum { static const char *copyright_text[] = { "", -"C0""Copyright (C) 2001-2012 The ScummVM project", +"C0""Copyright (C) 2001-2013 The ScummVM project", "C0""http://www.scummvm.org", "", "C0""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 binary.", @@ -110,16 +112,16 @@ AboutDialog::AboutDialog() const EnginePlugin::List &plugins = EngineMan.getPlugins(); EnginePlugin::List::const_iterator iter = plugins.begin(); for (; iter != plugins.end(); ++iter) { - Common::String str; - str = "C0"; - str += (**iter).getName(); - addLine(str.c_str()); + Common::String str; + str = "C0"; + str += (**iter).getName(); + addLine(str.c_str()); - str = "C2"; - str += (**iter)->getOriginalCopyright(); - addLine(str.c_str()); + str = "C2"; + str += (**iter)->getOriginalCopyright(); + addLine(str.c_str()); - //addLine(""); + //addLine(""); } for (i = 0; i < ARRAYSIZE(gpl_text); i++) @@ -137,9 +139,26 @@ void AboutDialog::addLine(const char *str) { } else { Common::String format(str, 2); str += 2; - + + static Common::String asciiStr; + if (format[0] == 'A') { + bool useAscii = false; +#ifdef USE_TRANSLATION + // We could use TransMan.getCurrentCharset() but rather than compare strings + // it is easier to use TransMan.getCharsetMapping() (non null in case of non + // ISO-8859-1 mapping) + useAscii = (TransMan.getCharsetMapping() != NULL); +#endif + if (useAscii) + asciiStr = str; + return; + } StringArray wrappedLines; - g_gui.getFont().wordWrapText(str, _w - 2 * _xOff, wrappedLines); + if (!asciiStr.empty()) { + g_gui.getFont().wordWrapText(asciiStr, _w - 2 * _xOff, wrappedLines); + asciiStr.clear(); + } else + g_gui.getFont().wordWrapText(str, _w - 2 * _xOff, wrappedLines); for (StringArray::const_iterator i = wrappedLines.begin(); i != wrappedLines.end(); ++i) { _lines.push_back(format + *i); @@ -285,7 +304,7 @@ void AboutDialog::reflowLayout() { int maxW = _w - 2*_xOff; _w = 0; for (i = 0; i < ARRAYSIZE(credits); i++) { - int tmp = g_gui.getStringWidth(credits[i] + 5); + int tmp = g_gui.getStringWidth(credits[i]) + 5; if (_w < tmp && tmp <= maxW) { _w = tmp; } diff --git a/gui/browser.cpp b/gui/browser.cpp index 2b4f254156..84f2d0f747 100644 --- a/gui/browser.cpp +++ b/gui/browser.cpp @@ -32,7 +32,8 @@ namespace GUI { enum { kChooseCmd = 'Chos', - kGoUpCmd = 'GoUp' + kGoUpCmd = 'GoUp', + kHiddenCmd = 'Hidd' }; /* We want to use this as a general directory selector at some point... possible uses @@ -47,6 +48,7 @@ BrowserDialog::BrowserDialog(const char *title, bool dirBrowser) _isDirBrowser = dirBrowser; _fileList = NULL; _currentPath = NULL; + _showHidden = ConfMan.getBool("gui_browser_show_hidden", Common::ConfigManager::kApplicationDomain); // Headline - TODO: should be customizable during creation time new StaticTextWidget(this, "Browser.Headline", title); @@ -61,6 +63,9 @@ BrowserDialog::BrowserDialog(const char *title, bool dirBrowser) _backgroundType = GUI::ThemeEngine::kDialogBackgroundPlain; + // Checkbox for the "show hidden files" state. + _showHiddenWidget = new CheckboxWidget(this, "Browser.Hidden", _("Show hidden files"), _("Show files marked with the hidden attribute"), kHiddenCmd); + // Buttons if (g_system->getOverlayWidth() > 320) new ButtonWidget(this, "Browser.Up", _("Go up"), _("Go to previous directory level"), kGoUpCmd); @@ -132,6 +137,15 @@ void BrowserDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data if (data != (uint32)-1 && _isDirBrowser && !_nodeContent[data].isDirectory()) _fileList->setSelected(-1); break; + case kHiddenCmd: + // Update whether the user wants hidden files to be shown + _showHidden = _showHiddenWidget->getState(); + // We save the state in the application domain to avoid cluttering and + // to prevent odd behavior. + ConfMan.setBool("gui_browser_show_hidden", _showHidden, Common::ConfigManager::kApplicationDomain); + // Update the file listing + updateListing(); + break; default: Dialog::handleCommand(sender, cmd, data); } @@ -145,7 +159,7 @@ void BrowserDialog::updateListing() { ConfMan.set("browser_lastpath", _node.getPath()); // Read in the data from the file system - if (!_node.getChildren(_nodeContent, Common::FSNode::kListAll)) + if (!_node.getChildren(_nodeContent, Common::FSNode::kListAll, _showHidden)) _nodeContent.clear(); else Common::sort(_nodeContent.begin(), _nodeContent.end()); diff --git a/gui/browser.h b/gui/browser.h index e5cc12ad8e..7c098617bb 100644 --- a/gui/browser.h +++ b/gui/browser.h @@ -29,6 +29,7 @@ namespace GUI { class ListWidget; class StaticTextWidget; +class CheckboxWidget; class CommandSender; class BrowserDialog : public Dialog { @@ -40,6 +41,7 @@ public: virtual int runModal(); #else virtual void open(); + virtual void handleCommand(CommandSender *sender, uint32 cmd, uint32 data); #endif @@ -48,11 +50,14 @@ public: protected: #ifdef MACOSX const void *_titleRef; + const void *_chooseRef; #else ListWidget *_fileList; StaticTextWidget *_currentPath; Common::FSNode _node; Common::FSList _nodeContent; + bool _showHidden; + CheckboxWidget *_showHiddenWidget; #endif Common::FSNode _choice; bool _isDirBrowser; diff --git a/gui/browser_osx.mm b/gui/browser_osx.mm index b8aa7c50ee..ecd60915f8 100644 --- a/gui/browser_osx.mm +++ b/gui/browser_osx.mm @@ -28,20 +28,39 @@ #include "common/config-manager.h" #include "common/system.h" #include "common/algorithm.h" +#include "common/translation.h" #include <AppKit/NSOpenPanel.h> #include <Foundation/NSString.h> +#include <Foundation/NSURL.h> namespace GUI { BrowserDialog::BrowserDialog(const char *title, bool dirBrowser) : Dialog("Browser") { - _titleRef = CFStringCreateWithCString(0, title, CFStringGetSystemEncoding()); + + // remember whether this is a file browser or a directory browser. _isDirBrowser = dirBrowser; + + // Get current encoding +#ifdef USE_TRANSLATION + CFStringRef encStr = CFStringCreateWithCString(NULL, TransMan.getCurrentCharset().c_str(), kCFStringEncodingASCII); + CFStringEncoding stringEncoding = CFStringConvertIANACharSetNameToEncoding(encStr); + CFRelease(encStr); +#else + CFStringEncoding stringEncoding = kCFStringEncodingASCII; +#endif + + // Convert title to NSString + _titleRef = CFStringCreateWithCString(0, title, stringEncoding); + + // Convert button text to NSString + _chooseRef = CFStringCreateWithCString(0, _("Choose"), stringEncoding); } BrowserDialog::~BrowserDialog() { CFRelease(_titleRef); + CFRelease(_chooseRef); } int BrowserDialog::runModal() { @@ -58,16 +77,20 @@ int BrowserDialog::runModal() { // Temporarily show the real mouse CGDisplayShowCursor(kCGDirectMainDisplay); - - NSOpenPanel * panel = [NSOpenPanel openPanel]; - [panel setCanChooseDirectories:YES]; - if ([panel runModalForTypes:nil] == NSOKButton) { - const char *filename = [[panel filename] UTF8String]; - _choice = Common::FSNode(filename); - choiceMade = true; + NSOpenPanel *panel = [NSOpenPanel openPanel]; + [panel setCanChooseFiles:!_isDirBrowser]; + [panel setCanChooseDirectories:_isDirBrowser]; + [panel setTitle:(NSString *)_titleRef]; + [panel setPrompt:(NSString *)_chooseRef]; + if ([panel runModal] == NSOKButton) { + NSURL *url = [panel URL]; + if ([url isFileURL]) { + const char *filename = [[url path] UTF8String]; + _choice = Common::FSNode(filename); + choiceMade = true; + } } - // If we were in fullscreen mode, switch back if (wasFullscreen) { g_system->beginGFXTransaction(); diff --git a/gui/credits.h b/gui/credits.h index 37c5a7bd95..42e515dd70 100644 --- a/gui/credits.h +++ b/gui/credits.h @@ -6,6 +6,7 @@ static const char *credits[] = { "C0""Eugene Sandulenko", "", "C1""PR Office", +"A0""Arnaud Boutonne", "C0""Arnaud Boutonn\351", "C2""Public Relations Officer, Project Administrator", "C0""Eugene Sandulenko", @@ -26,6 +27,7 @@ static const char *credits[] = { "", "C1""Engine Teams", "C1""SCUMM", +"A0""Torbjorn Andersson", "C0""Torbj\366rn Andersson", "C0""James Brown", "C2""(retired)", @@ -66,6 +68,7 @@ static const char *credits[] = { "C2""(retired)", "", "C1""AGOS", +"A0""Torbjorn Andersson", "C0""Torbj\366rn Andersson", "C0""Paul Gilbert", "C0""Travis Howell", @@ -75,6 +78,7 @@ static const char *credits[] = { "C2""(retired)", "", "C1""CGE", +"A0""Arnaud Boutonne", "C0""Arnaud Boutonn\351", "C0""Paul Gilbert", "", @@ -104,6 +108,7 @@ static const char *credits[] = { "C0""Pawel Kolodziejski", "", "C1""DreamWeb", +"A0""Torbjorn Andersson", "C0""Torbj\366rn Andersson", "C0""Bertrand Augereau", "C0""Filippos Karapetis", @@ -112,7 +117,9 @@ static const char *credits[] = { "C0""Willem Jan Palenstijn", "", "C1""Gob", +"A0""Torbjorn Andersson", "C0""Torbj\366rn Andersson", +"A0""Arnaud Boutonne", "C0""Arnaud Boutonn\351", "C0""Sven Hesse", "C0""Eugene Sandulenko", @@ -123,11 +130,13 @@ static const char *credits[] = { "C0""Jordi Vilalta Prat", "", "C1""Hugo", +"A0""Arnaud Boutonne", "C0""Arnaud Boutonn\351", "C0""Oystein Eftevaag", "C0""Eugene Sandulenko", "", "C1""Kyra", +"A0""Torbjorn Andersson", "C0""Torbj\366rn Andersson", "C2""VQA Player", "C0""Oystein Eftevaag", @@ -170,6 +179,7 @@ static const char *credits[] = { "C0""Joost Peters", "", "C1""SAGA", +"A0""Torbjorn Andersson", "C0""Torbj\366rn Andersson", "C0""Daniel Balsom", "C2""Original engine reimplementation author (retired)", @@ -191,6 +201,7 @@ static const char *credits[] = { "C0""Lars Skovlund", "", "C1""Sky", +"A0""Robert Goeffringmann", "C0""Robert G\366ffringmann", "C2""(retired)", "C0""Oliver Kiehl", @@ -202,10 +213,12 @@ static const char *credits[] = { "C2""PSX version support", "C0""Thierry Crozat", "C2""Mac version support", +"A0""Robert Goeffringmann", "C0""Robert G\366ffringmann", "C2""(retired)", "", "C1""Sword2", +"A0""Torbjorn Andersson", "C0""Torbj\366rn Andersson", "C0""Fabio Battaglia", "C2""PSX version support", @@ -213,6 +226,7 @@ static const char *credits[] = { "C2""(retired)", "", "C1""Sword25", +"A0""Torbjorn Andersson", "C0""Torbj\366rn Andersson", "C0""Paul Gilbert", "C0""Max Horn", @@ -227,6 +241,7 @@ static const char *credits[] = { "C2""(retired)", "", "C1""Tinsel", +"A0""Torbjorn Andersson", "C0""Torbj\366rn Andersson", "C0""Fabio Battaglia", "C2""PSX version support", @@ -237,7 +252,12 @@ static const char *credits[] = { "C0""Filippos Karapetis", "C0""Joost Peters", "", +"C1""Toltecs", +"C0""Benjamin Haisch", +"C0""Filippos Karapetis", +"", "C1""Tony", +"A0""Arnaud Boutonne", "C0""Arnaud Boutonn\351", "C0""Paul Gilbert", "C0""Alyssa Milburn", @@ -245,11 +265,13 @@ static const char *credits[] = { "C1""Toon", "C0""Sylvain Dupont", "", +"A1""Touche", "C1""Touch\351", "C0""Gregory Montoir", "C2""(retired)", "", "C1""TsAGE", +"A0""Arnaud Boutonne", "C0""Arnaud Boutonn\351", "C0""Paul Gilbert", "", @@ -258,6 +280,7 @@ static const char *credits[] = { "C2""(retired)", "", "C1""Wintermute", +"A0""Einar Johan T. Somaaen", "C0""Einar Johan T. S\370m\345en", "", "", @@ -305,6 +328,7 @@ static const char *credits[] = { "C2""(retired)", "", "C1""PlayStation 2", +"A0""Robert Goeffringmann", "C0""Robert G\366ffringmann", "C2""(retired)", "C0""Max Lingua", @@ -413,9 +437,11 @@ static const char *credits[] = { "", "C1""Packages", "C1""AmigaOS 4", +"A0""Hans-Joerg Frieden", "C0""Hans-J\366rg Frieden", "C2""(retired)", "C0""Hubert Maier", +"A0""Juha Niemimaki", "C0""Juha Niemim\344ki", "C2""(retired)", "", @@ -445,6 +471,7 @@ static const char *credits[] = { "", "C1""MorphOS", "C0""Fabien Coeurjoly", +"A0""Ruediger Hanke", "C0""R\374diger Hanke", "C2""(retired)", "", @@ -475,15 +502,22 @@ static const char *credits[] = { "C1""Basque", "C0""Mikel Iturbe Urretxa", "", +"C1""Belarusian", +"C0""Ivan Lukyanov", +"", "C1""Catalan", "C0""Jordi Vilalta Prat", "", "C1""Czech", +"A0""Zbynik Schwarz", "C0""Zbyn\354k Schwarz", "", "C1""Danish", "C0""Steffen Nyeland", "", +"C1""Finnish", +"C0""Toni Saarela", +"", "C1""French", "C0""Thierry Crozat", "", @@ -502,10 +536,13 @@ static const char *credits[] = { "C1""Italian", "C0""Matteo Angelino", "", +"A1""Norwegian (Bokmaal)", "C1""Norwegian (Bokm\345l)", +"A0""Einar Johan Somaaen", "C0""Einar Johan S\370m\345en", "", "C1""Norwegian (Nynorsk)", +"A0""Einar Johan Somaaen", "C0""Einar Johan S\370m\345en", "", "C1""Polish", @@ -518,6 +555,7 @@ static const char *credits[] = { "C0""Eugene Sandulenko", "", "C1""Spanish", +"A0""Tomas Maidagan", "C0""Tom\341s Maidagan", "C0""Jordi Vilalta Prat", "", @@ -529,6 +567,7 @@ static const char *credits[] = { "", "", "C1""Websites (design)", +"A0""Dobo Balazs", "C0""Dob\363 Bal\341zs", "C2""Website design", "C0""William Claydon", @@ -557,6 +596,7 @@ static const char *credits[] = { "C2""Sound support for C64 version of MM/Zak, Loom PCE support", "C0""Janne Huttunen", "C2""V3 actor mask support, Dig/FT SMUSH audio", +"A0""Kovacs Endre Janos", "C0""Kov\341cs Endre J\341nos", "C2""Several fixes for Simon1", "C0""Jeroen Janssen", @@ -581,12 +621,14 @@ static const char *credits[] = { "C2""Sound support for Amiga SCUMM V2/V3 games, MM NES support", "C0""Robert Crossfield", "C2""Improved support for Apple II/C64 versions of MM", +"A0""Andreas Roever", "C0""Andreas R\366ver", "C2""Broken Sword I & II MPEG2 cutscene support", "C0""Edward Rudd", "C2""Fixes for playing MP3 versions of MI1/Loom audio", "C0""Daniel Schepler", "C2""Final MI1 CD music support, initial Ogg Vorbis support", +"A0""Andre Souza", "C0""Andr\351 Souza", "C2""SDL-based OpenGL renderer", "C0""Tom Frost", @@ -703,6 +745,7 @@ static const char *credits[] = { "C2""For deep tech details about C64 Zak & MM", "C0""Sarien Team", "C2""Original AGI engine code", +"A0""Jimmi Thogersen", "C0""Jimmi Th\370gersen", "C2""For ScummRev, and much obscure code/documentation", "C0""Tristan", diff --git a/gui/debugger.cpp b/gui/debugger.cpp index 972163df6f..35627dd584 100644 --- a/gui/debugger.cpp +++ b/gui/debugger.cpp @@ -554,4 +554,4 @@ bool Debugger::debuggerCompletionCallback(GUI::ConsoleDialog *console, const cha #endif -} // End of namespace GUI +} // End of namespace GUI diff --git a/gui/debugger.h b/gui/debugger.h index 3a587d2723..b79e8723c1 100644 --- a/gui/debugger.h +++ b/gui/debugger.h @@ -207,6 +207,6 @@ public: }; -} // End of namespace GUI +} // End of namespace GUI #endif diff --git a/gui/fluidsynth-dialog.cpp b/gui/fluidsynth-dialog.cpp new file mode 100644 index 0000000000..662518b557 --- /dev/null +++ b/gui/fluidsynth-dialog.cpp @@ -0,0 +1,366 @@ +/* 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. + */ + +#include "gui/fluidsynth-dialog.h" +#include "gui/message.h" +#include "gui/widgets/tab.h" +#include "gui/widgets/popup.h" + +#include "common/config-manager.h" +#include "common/translation.h" +#include "common/debug.h" + +namespace GUI { + +enum { + kActivateChorusCmd = 'acho', + kChorusVoiceCountChangedCmd = 'cvcc', + kChorusLevelChangedCmd = 'clec', + kChorusSpeedChangedCmd = 'cspc', + kChorusDepthChangedCmd = 'cdec', + + kActivateReverbCmd = 'arev', + kReverbRoomSizeChangedCmd = 'rrsc', + kReverbDampingChangedCmd = 'rdac', + kReverbWidthChangedCmd = 'rwic', + kReverbLevelChangedCmd = 'rlec', + + kResetSettingsCmd = 'rese' +}; + +enum { + kWaveFormTypeSine = 0, + kWaveFormTypeTriangle = 1 +}; + +enum { + kInterpolationNone = 0, + kInterpolationLinear = 1, + kInterpolation4thOrder = 2, + kInterpolation7thOrder = 3 +}; + +FluidSynthSettingsDialog::FluidSynthSettingsDialog() + : Dialog("FluidSynthSettings") { + _domain = Common::ConfigManager::kApplicationDomain; + + _tabWidget = new TabWidget(this, "FluidSynthSettings.TabWidget"); + + _tabWidget->addTab(_("Reverb")); + + _reverbActivate = new CheckboxWidget(_tabWidget, "FluidSynthSettings_Reverb.EnableTabCheckbox", _("Active"), 0, kActivateReverbCmd); + + _reverbRoomSizeDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.RoomSizeText", _("Room:")); + _reverbRoomSizeSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Reverb.RoomSizeSlider", 0, kReverbRoomSizeChangedCmd); + // 0.00 - 1.20, Default: 0.20 + _reverbRoomSizeSlider->setMinValue(0); + _reverbRoomSizeSlider->setMaxValue(120); + _reverbRoomSizeLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.RoomSizeLabel", "20"); + + _reverbDampingDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.DampingText", _("Damp:")); + _reverbDampingSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Reverb.DampingSlider", 0, kReverbDampingChangedCmd); + // 0.00 - 1.00, Default: 0.00 + _reverbDampingSlider->setMinValue(0); + _reverbDampingSlider->setMaxValue(100); + _reverbDampingLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.DampingLabel", "0"); + + _reverbWidthDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.WidthText", _("Width:")); + _reverbWidthSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Reverb.WidthSlider", 0, kReverbWidthChangedCmd); + // 0 - 100, Default: 1 + _reverbWidthSlider->setMinValue(0); + _reverbWidthSlider->setMaxValue(100); + _reverbWidthLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.WidthLabel", "1"); + + _reverbLevelDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.LevelText", _("Level:")); + _reverbLevelSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Reverb.LevelSlider", 0, kReverbLevelChangedCmd); + // 0.00 - 1.00, Default: 0.90 + _reverbLevelSlider->setMinValue(0); + _reverbLevelSlider->setMaxValue(100); + _reverbLevelLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.LevelLabel", "90"); + + _tabWidget->addTab(_("Chorus")); + + _chorusActivate = new CheckboxWidget(_tabWidget, "FluidSynthSettings_Chorus.EnableTabCheckbox", _("Active"), 0, kActivateChorusCmd); + + _chorusVoiceCountDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.VoiceCountText", _("N:")); + _chorusVoiceCountSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Chorus.VoiceCountSlider", 0, kChorusVoiceCountChangedCmd); + // 0-99, Default: 3 + _chorusVoiceCountSlider->setMinValue(0); + _chorusVoiceCountSlider->setMaxValue(99); + _chorusVoiceCountLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.VoiceCountLabel", "3"); + + _chorusLevelDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.LevelText", _("Level:")); + _chorusLevelSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Chorus.LevelSlider", 0, kChorusLevelChangedCmd); + // 0.00 - 1.00, Default: 1.00 + _chorusLevelSlider->setMinValue(0); + _chorusLevelSlider->setMaxValue(100); + _chorusLevelLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.LevelLabel", "100"); + + _chorusSpeedDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.SpeedText", _("Speed:")); + _chorusSpeedSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Chorus.SpeedSlider", 0, kChorusSpeedChangedCmd); + // 0.30 - 5.00, Default: 0.30 + _chorusSpeedSlider->setMinValue(30); + _chorusSpeedSlider->setMaxValue(500); + _chorusSpeedLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.SpeedLabel", "30"); + + _chorusDepthDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.DepthText", _("Depth:")); + _chorusDepthSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Chorus.DepthSlider", 0, kChorusDepthChangedCmd); + // 0.00 - 21.00, Default: 8.00 + _chorusDepthSlider->setMinValue(0); + _chorusDepthSlider->setMaxValue(210); + _chorusDepthLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.DepthLabel", "80"); + + _chorusWaveFormTypePopUpDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.WaveFormTypeText", _("Type:")); + _chorusWaveFormTypePopUp = new PopUpWidget(_tabWidget, "FluidSynthSettings_Chorus.WaveFormType"); + + _chorusWaveFormTypePopUp->appendEntry(_("Sine"), kWaveFormTypeSine); + _chorusWaveFormTypePopUp->appendEntry(_("Triangle"), kWaveFormTypeTriangle); + + _tabWidget->addTab(_("Misc")); + + _miscInterpolationPopUpDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Misc.InterpolationText", _("Interpolation:")); + _miscInterpolationPopUp = new PopUpWidget(_tabWidget, "FluidSynthSettings_Misc.Interpolation"); + + _miscInterpolationPopUp->appendEntry(_("None (fastest)"), kInterpolationNone); + _miscInterpolationPopUp->appendEntry(_("Linear"), kInterpolationLinear); + _miscInterpolationPopUp->appendEntry(_("Fourth-order"), kInterpolation4thOrder); + _miscInterpolationPopUp->appendEntry(_("Seventh-order"), kInterpolation7thOrder); + + _tabWidget->setActiveTab(0); + + new ButtonWidget(this, "FluidSynthSettings.ResetSettings", _("Reset"), _("Reset all FluidSynth settings to their default values."), kResetSettingsCmd); + + new ButtonWidget(this, "FluidSynthSettings.Cancel", _("Cancel"), 0, kCloseCmd); + new ButtonWidget(this, "FluidSynthSettings.Ok", _("OK"), 0, kOKCmd); +} + +FluidSynthSettingsDialog::~FluidSynthSettingsDialog() { +} + +void FluidSynthSettingsDialog::open() { + Dialog::open(); + + // Reset result value + setResult(0); + + readSettings(); +} + +void FluidSynthSettingsDialog::close() { + if (getResult()) { + writeSettings(); + } + + Dialog::close(); +} + +void FluidSynthSettingsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { + switch (cmd) { + case kActivateChorusCmd: + setChorusSettingsState(data); + break; + case kChorusVoiceCountChangedCmd: + _chorusVoiceCountLabel->setLabel(Common::String::format("%d", _chorusVoiceCountSlider->getValue())); + _chorusVoiceCountLabel->draw(); + break; + case kChorusLevelChangedCmd: + _chorusLevelLabel->setLabel(Common::String::format("%d", _chorusLevelSlider->getValue())); + _chorusLevelLabel->draw(); + break; + case kChorusSpeedChangedCmd: + _chorusSpeedLabel->setLabel(Common::String::format("%d", _chorusSpeedSlider->getValue())); + _chorusSpeedLabel->draw(); + break; + case kChorusDepthChangedCmd: + _chorusDepthLabel->setLabel(Common::String::format("%d", _chorusDepthSlider->getValue())); + _chorusDepthLabel->draw(); + break; + case kActivateReverbCmd: + setReverbSettingsState(data); + break; + case kReverbRoomSizeChangedCmd: + _reverbRoomSizeLabel->setLabel(Common::String::format("%d", _reverbRoomSizeSlider->getValue())); + _reverbRoomSizeLabel->draw(); + break; + case kReverbDampingChangedCmd: + _reverbDampingLabel->setLabel(Common::String::format("%d", _reverbDampingSlider->getValue())); + _reverbDampingLabel->draw(); + break; + case kReverbWidthChangedCmd: + _reverbWidthLabel->setLabel(Common::String::format("%d", _reverbWidthSlider->getValue())); + _reverbWidthLabel->draw(); + break; + case kReverbLevelChangedCmd: + _reverbLevelLabel->setLabel(Common::String::format("%d", _reverbLevelSlider->getValue())); + _reverbLevelLabel->draw(); + break; + case kResetSettingsCmd: { + MessageDialog alert(_("Do you really want to reset all FluidSynth settings to their default values?"), _("Yes"), _("No")); + if (alert.runModal() == GUI::kMessageOK) { + resetSettings(); + readSettings(); + draw(); + } + break; + } + case kOKCmd: + setResult(1); + close(); + break; + default: + Dialog::handleCommand(sender, cmd, data); + break; + } +} + +void FluidSynthSettingsDialog::setChorusSettingsState(bool enabled) { + _chorusVoiceCountDesc->setEnabled(enabled); + _chorusVoiceCountSlider->setEnabled(enabled); + _chorusVoiceCountLabel->setEnabled(enabled); + _chorusLevelDesc->setEnabled(enabled); + _chorusLevelSlider->setEnabled(enabled); + _chorusLevelLabel->setEnabled(enabled); + _chorusSpeedDesc->setEnabled(enabled); + _chorusSpeedSlider->setEnabled(enabled); + _chorusSpeedLabel->setEnabled(enabled); + _chorusDepthDesc->setEnabled(enabled); + _chorusDepthSlider->setEnabled(enabled); + _chorusDepthLabel->setEnabled(enabled); + _chorusWaveFormTypePopUpDesc->setEnabled(enabled); + _chorusWaveFormTypePopUp->setEnabled(enabled); +} + +void FluidSynthSettingsDialog::setReverbSettingsState(bool enabled) { + _reverbRoomSizeDesc->setEnabled(enabled); + _reverbRoomSizeSlider->setEnabled(enabled); + _reverbRoomSizeLabel->setEnabled(enabled); + _reverbDampingDesc->setEnabled(enabled); + _reverbDampingSlider->setEnabled(enabled); + _reverbDampingLabel->setEnabled(enabled); + _reverbWidthDesc->setEnabled(enabled); + _reverbWidthSlider->setEnabled(enabled); + _reverbWidthLabel->setEnabled(enabled); + _reverbLevelDesc->setEnabled(enabled); + _reverbLevelSlider->setEnabled(enabled); + _reverbLevelLabel->setEnabled(enabled); +} + +void FluidSynthSettingsDialog::readSettings() { + _chorusVoiceCountSlider->setValue(ConfMan.getInt("fluidsynth_chorus_nr", _domain)); + _chorusVoiceCountLabel->setLabel(Common::String::format("%d", _chorusVoiceCountSlider->getValue())); + _chorusLevelSlider->setValue(ConfMan.getInt("fluidsynth_chorus_level", _domain)); + _chorusLevelLabel->setLabel(Common::String::format("%d", _chorusLevelSlider->getValue())); + _chorusSpeedSlider->setValue(ConfMan.getInt("fluidsynth_chorus_speed", _domain)); + _chorusSpeedLabel->setLabel(Common::String::format("%d", _chorusSpeedSlider->getValue())); + _chorusDepthSlider->setValue(ConfMan.getInt("fluidsynth_chorus_depth", _domain)); + _chorusDepthLabel->setLabel(Common::String::format("%d", _chorusDepthSlider->getValue())); + + Common::String waveForm = ConfMan.get("fluidsynth_chorus_waveform", _domain); + if (waveForm == "sine") { + _chorusWaveFormTypePopUp->setSelectedTag(kWaveFormTypeSine); + } else if (waveForm == "triangle") { + _chorusWaveFormTypePopUp->setSelectedTag(kWaveFormTypeTriangle); + } + + _reverbRoomSizeSlider->setValue(ConfMan.getInt("fluidsynth_reverb_roomsize", _domain)); + _reverbRoomSizeLabel->setLabel(Common::String::format("%d", _reverbRoomSizeSlider->getValue())); + _reverbDampingSlider->setValue(ConfMan.getInt("fluidsynth_reverb_damping", _domain)); + _reverbDampingLabel->setLabel(Common::String::format("%d", _reverbDampingSlider->getValue())); + _reverbWidthSlider->setValue(ConfMan.getInt("fluidsynth_reverb_width", _domain)); + _reverbWidthLabel->setLabel(Common::String::format("%d", _reverbWidthSlider->getValue())); + _reverbLevelSlider->setValue(ConfMan.getInt("fluidsynth_reverb_level", _domain)); + _reverbLevelLabel->setLabel(Common::String::format("%d", _reverbLevelSlider->getValue())); + + Common::String interpolation = ConfMan.get("fluidsynth_misc_interpolation", _domain); + if (interpolation == "none") { + _miscInterpolationPopUp->setSelectedTag(kInterpolationNone); + } else if (interpolation == "linear") { + _miscInterpolationPopUp->setSelectedTag(kInterpolationLinear); + } else if (interpolation == "4th") { + _miscInterpolationPopUp->setSelectedTag(kInterpolation4thOrder); + } else if (interpolation == "7th") { + _miscInterpolationPopUp->setSelectedTag(kInterpolation7thOrder); + } + + // This may trigger redrawing, so don't do it until all sliders have + // their proper values. Otherwise, the dialog may crash because of + // invalid slider values. + _chorusActivate->setState(ConfMan.getBool("fluidsynth_chorus_activate", _domain)); + _reverbActivate->setState(ConfMan.getBool("fluidsynth_reverb_activate", _domain)); +} + +void FluidSynthSettingsDialog::writeSettings() { + ConfMan.setBool("fluidsynth_chorus_activate", _chorusActivate->getState()); + ConfMan.setInt("fluidsynth_chorus_nr", _chorusVoiceCountSlider->getValue(), _domain); + ConfMan.setInt("fluidsynth_chorus_level", _chorusLevelSlider->getValue(), _domain); + ConfMan.setInt("fluidsynth_chorus_speed", _chorusSpeedSlider->getValue(), _domain); + ConfMan.setInt("fluidsynth_chorus_depth", _chorusDepthSlider->getValue(), _domain); + + uint32 waveForm = _chorusWaveFormTypePopUp->getSelectedTag(); + if (waveForm == kWaveFormTypeSine) { + ConfMan.set("fluidsynth_chorus_waveform", "sine", _domain); + } else if (waveForm == kWaveFormTypeTriangle) { + ConfMan.set("fluidsynth_chorus_waveform", "triangle", _domain); + } else { + ConfMan.removeKey("fluidsynth_chorus_waveform", _domain); + } + + ConfMan.setBool("fluidsynth_reverb_activate", _reverbActivate->getState()); + ConfMan.setInt("fluidsynth_reverb_roomsize", _reverbRoomSizeSlider->getValue(), _domain); + ConfMan.setInt("fluidsynth_reverb_damping", _reverbDampingSlider->getValue(), _domain); + ConfMan.setInt("fluidsynth_reverb_width", _reverbWidthSlider->getValue(), _domain); + ConfMan.setInt("fluidsynth_reverb_level", _reverbLevelSlider->getValue(), _domain); + + uint32 interpolation = _miscInterpolationPopUp->getSelectedTag(); + if (interpolation == kInterpolationNone) { + ConfMan.set("fluidsynth_misc_interpolation", "none", _domain); + } else if (interpolation == kInterpolationLinear) { + ConfMan.set("fluidsynth_misc_interpolation", "linear", _domain); + } else if (interpolation == kInterpolation4thOrder) { + ConfMan.set("fluidsynth_misc_interpolation", "4th", _domain); + } else if (interpolation == kInterpolation7thOrder) { + ConfMan.set("fluidsynth_misc_interpolation", "7th", _domain); + } else { + ConfMan.removeKey("fluidsynth_misc_interpolation", _domain); + } + + // The main options dialog is responsible for writing the config file. + // That's why we don't actually flush the settings to the file here. +} + +void FluidSynthSettingsDialog::resetSettings() { + ConfMan.removeKey("fluidsynth_chorus_activate", _domain); + ConfMan.removeKey("fluidsynth_chorus_nr", _domain); + ConfMan.removeKey("fluidsynth_chorus_level", _domain); + ConfMan.removeKey("fluidsynth_chorus_speed", _domain); + ConfMan.removeKey("fluidsynth_chorus_depth", _domain); + ConfMan.removeKey("fluidsynth_chorus_waveform", _domain); + + ConfMan.removeKey("fluidsynth_reverb_activate", _domain); + ConfMan.removeKey("fluidsynth_reverb_roomsize", _domain); + ConfMan.removeKey("fluidsynth_reverb_damping", _domain); + ConfMan.removeKey("fluidsynth_reverb_width", _domain); + ConfMan.removeKey("fluidsynth_reverb_level", _domain); + + ConfMan.removeKey("fluidsynth_misc_interpolation", _domain); +} + +} // End of namespace GUI diff --git a/gui/fluidsynth-dialog.h b/gui/fluidsynth-dialog.h new file mode 100644 index 0000000000..4d74c9f93e --- /dev/null +++ b/gui/fluidsynth-dialog.h @@ -0,0 +1,104 @@ +/* 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. + */ + +#ifndef FLUIDSYNTH_DIALOG_H +#define FLUIDSYNTH_DIALOG_H + +#include "common/str.h" +#include "gui/dialog.h" + +namespace GUI { + +class TabWidget; +class CheckboxWidget; +class SliderWidget; +class StaticTextWidget; +class PopUpWidget; + +class FluidSynthSettingsDialog : public Dialog { +public: + FluidSynthSettingsDialog(); + ~FluidSynthSettingsDialog(); + + void open(); + void close(); + void handleCommand(CommandSender *sender, uint32 cmd, uint32 data); + +protected: + void setChorusSettingsState(bool enabled); + void setReverbSettingsState(bool enabled); + + void readSettings(); + void writeSettings(); + + void resetSettings(); + +private: + Common::String _domain; + + TabWidget *_tabWidget; + + CheckboxWidget *_chorusActivate; + + StaticTextWidget *_chorusVoiceCountDesc; + SliderWidget *_chorusVoiceCountSlider; + StaticTextWidget *_chorusVoiceCountLabel; + + StaticTextWidget *_chorusLevelDesc; + SliderWidget *_chorusLevelSlider; + StaticTextWidget *_chorusLevelLabel; + + StaticTextWidget *_chorusSpeedDesc; + SliderWidget *_chorusSpeedSlider; + StaticTextWidget *_chorusSpeedLabel; + + StaticTextWidget *_chorusDepthDesc; + SliderWidget *_chorusDepthSlider; + StaticTextWidget *_chorusDepthLabel; + + StaticTextWidget *_chorusWaveFormTypePopUpDesc; + PopUpWidget *_chorusWaveFormTypePopUp; + + CheckboxWidget *_reverbActivate; + + StaticTextWidget *_reverbRoomSizeDesc; + SliderWidget *_reverbRoomSizeSlider; + StaticTextWidget *_reverbRoomSizeLabel; + + StaticTextWidget *_reverbDampingDesc; + SliderWidget *_reverbDampingSlider; + StaticTextWidget *_reverbDampingLabel; + + StaticTextWidget *_reverbWidthDesc; + SliderWidget *_reverbWidthSlider; + StaticTextWidget *_reverbWidthLabel; + + StaticTextWidget *_reverbLevelDesc; + SliderWidget *_reverbLevelSlider; + StaticTextWidget *_reverbLevelLabel; + + StaticTextWidget *_miscInterpolationPopUpDesc; + PopUpWidget *_miscInterpolationPopUp; +}; + +} // End of namespace GUI + +#endif diff --git a/gui/launcher.cpp b/gui/launcher.cpp index 0f4867ced5..4e35b54db8 100644 --- a/gui/launcher.cpp +++ b/gui/launcher.cpp @@ -1128,7 +1128,7 @@ void LauncherDialog::reflowLayout() { if (g_gui.xmlEval()->getVar("Globals.ShowLauncherLogo") == 1 && g_gui.theme()->supportsImages()) { StaticTextWidget *ver = (StaticTextWidget *)findWidget("Launcher.Version"); if (ver) { - ver->setAlign((Graphics::TextAlign)g_gui.xmlEval()->getVar("Launcher.Version.Align", Graphics::kTextAlignCenter)); + ver->setAlign(g_gui.xmlEval()->getWidgetTextHAlign("Launcher.Version")); ver->setLabel(gScummVMVersionDate); } @@ -1139,7 +1139,7 @@ void LauncherDialog::reflowLayout() { } else { StaticTextWidget *ver = (StaticTextWidget *)findWidget("Launcher.Version"); if (ver) { - ver->setAlign((Graphics::TextAlign)g_gui.xmlEval()->getVar("Launcher.Version.Align", Graphics::kTextAlignCenter)); + ver->setAlign(g_gui.xmlEval()->getWidgetTextHAlign("Launcher.Version")); ver->setLabel(gScummVMFullVersion); } diff --git a/gui/module.mk b/gui/module.mk index a435d8cca7..bda3c88cd5 100644 --- a/gui/module.mk +++ b/gui/module.mk @@ -38,5 +38,10 @@ MODULE_OBJS += \ browser.o endif +ifdef USE_FLUIDSYNTH +MODULE_OBJS += \ + fluidsynth-dialog.o +endif + # Include common rules include $(srcdir)/rules.mk diff --git a/gui/options.cpp b/gui/options.cpp index 4868f1876d..fb57c15d98 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -75,6 +75,12 @@ enum { }; #endif +#ifdef USE_FLUIDSYNTH +enum { + kFluidSynthSettingsCmd = 'flst' +}; +#endif + 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[] = { _s("<default>"), _s("8 kHz"), _s("11kHz"), _s("22 kHz"), _s("44 kHz"), _s("48 kHz"), 0 }; @@ -863,6 +869,10 @@ void OptionsDialog::addMIDIControls(GuiObject *boss, const Common::String &prefi _midiGainSlider->setMaxValue(1000); _midiGainLabel = new StaticTextWidget(boss, prefix + "mcMidiGainLabel", "1.00"); +#ifdef USE_FLUIDSYNTH + new ButtonWidget(boss, prefix + "mcFluidSynthSettings", _("FluidSynth Settings"), 0, kFluidSynthSettingsCmd); +#endif + _enableMIDISettings = true; } @@ -877,7 +887,7 @@ void OptionsDialog::addMT32Controls(GuiObject *boss, const Common::String &prefi _mt32Checkbox = new CheckboxWidget(boss, prefix + "mcMt32Checkbox", _c("True Roland MT-32 (no GM emulation)", "lowres"), _("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")); + _enableGSCheckbox = new CheckboxWidget(boss, prefix + "mcGSCheckbox", _("Roland GS Mode (disable GM mapping)"), _("Turns off General MIDI mapping for games with Roland MT-32 soundtrack")); const MusicPlugin::List p = MusicMan.getPlugins(); // Make sure the null device is the first one in the list to avoid undesired @@ -1231,12 +1241,20 @@ GlobalOptionsDialog::GlobalOptionsDialog() #ifdef SMALL_SCREEN_DEVICE _keysDialog = new KeysDialog(); #endif + +#ifdef USE_FLUIDSYNTH + _fluidSynthSettingsDialog = new FluidSynthSettingsDialog(); +#endif } GlobalOptionsDialog::~GlobalOptionsDialog() { #ifdef SMALL_SCREEN_DEVICE delete _keysDialog; #endif + +#ifdef USE_FLUIDSYNTH + delete _fluidSynthSettingsDialog; +#endif } void GlobalOptionsDialog::open() { @@ -1466,6 +1484,11 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3 _keysDialog->runModal(); break; #endif +#ifdef USE_FLUIDSYNTH + case kFluidSynthSettingsCmd: + _fluidSynthSettingsDialog->runModal(); + break; +#endif default: OptionsDialog::handleCommand(sender, cmd, data); } diff --git a/gui/options.h b/gui/options.h index def56cfa35..081ef4fea5 100644 --- a/gui/options.h +++ b/gui/options.h @@ -32,6 +32,10 @@ #include "gui/KeysDialog.h" #endif +#ifdef USE_FLUIDSYNTH +#include "gui/fluidsynth-dialog.h" +#endif + namespace GUI { class CheckboxWidget; @@ -208,6 +212,9 @@ protected: #ifdef SMALL_SCREEN_DEVICE KeysDialog *_keysDialog; #endif +#ifdef USE_FLUIDSYNTH + FluidSynthSettingsDialog *_fluidSynthSettingsDialog; +#endif StaticTextWidget *_savePath; ButtonWidget *_savePathClearButton; StaticTextWidget *_themePath; diff --git a/gui/themes/default.inc b/gui/themes/default.inc index 7f565eb05d..6d8e6baac7 100644 --- a/gui/themes/default.inc +++ b/gui/themes/default.inc @@ -683,6 +683,7 @@ "<layout type='vertical' center='true' padding='6,6,2,2'> " "<widget name='Version' " "height='Globals.Line.Height' " +"textalign='center' " "/> " "<layout type='horizontal' spacing='5' padding='0,0,0,0'> " "<widget name='SearchDesc' " @@ -740,7 +741,11 @@ "height='Globals.Line.Height' " "/> " "<widget name='List'/> " -"<layout type='horizontal' padding='0,0,8,0'> " +"<layout type='vertical' padding='0,0,8,0'> " +"<widget name='Hidden' " +"type='Checkbox' " +"/> " +"<layout type='horizontal' padding='0,0,0,0'> " "<widget name='Up' " "type='Button' " "/> " @@ -753,6 +758,7 @@ "/> " "</layout> " "</layout> " +"</layout> " "</dialog> " "<dialog name='GlobalOptions' overlays='screen' inset='16' shading='dim'> " "<layout type='vertical' padding='0,0,0,0'> " @@ -891,7 +897,7 @@ "</layout> " "</dialog> " "<dialog name='GlobalOptions_MIDI' overlays='Dialog.GlobalOptions.TabWidget'> " -"<layout type='vertical' padding='16,16,16,16' spacing='8'> " +"<layout type='vertical' padding='16,16,16,16' spacing='6'> " "<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> " "<widget name='auPrefGmPopupDesc' " "type='OptionsLabel' " @@ -927,6 +933,10 @@ "height='Globals.Line.Height' " "/> " "</layout> " +"<widget name='mcFluidSynthSettings' " +"width='150' " +"height='Globals.Button.Height' " +"/> " "</layout> " "</dialog> " "<dialog name='GlobalOptions_MT32' overlays='Dialog.GlobalOptions.TabWidget'> " @@ -1359,6 +1369,153 @@ "</layout> " "</layout> " "</dialog> " +"<dialog name='FluidSynthSettings' overlays='GlobalOptions' shading='dim'> " +"<layout type='vertical' padding='0,0,0,0'> " +"<widget name='TabWidget'/> " +"<layout type='horizontal' padding='8,8,8,8'> " +"<space/> " +"<widget name='ResetSettings' " +"type='Button' " +"/> " +"<widget name='Cancel' " +"type='Button' " +"/> " +"<widget name='Ok' " +"type='Button' " +"/> " +"</layout> " +"</layout> " +"</dialog> " +"<dialog name='FluidSynthSettings_Chorus' overlays='Dialog.FluidSynthSettings.TabWidget'> " +"<layout type='vertical' padding='8,8,8,8' spacing='6'> " +"<widget name='EnableTabCheckbox' " +"type='Checkbox' " +"/> " +"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> " +"<widget name='VoiceCountText' " +"type='OptionsLabel' " +"/> " +"<widget name='VoiceCountSlider' " +"type='Slider' " +"/> " +"<widget name='VoiceCountLabel' " +"width='32' " +"height='Globals.Line.Height' " +"/> " +"</layout> " +"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> " +"<widget name='LevelText' " +"type='OptionsLabel' " +"/> " +"<widget name='LevelSlider' " +"type='Slider' " +"/> " +"<widget name='LevelLabel' " +"width='32' " +"height='Globals.Line.Height' " +"/> " +"</layout> " +"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> " +"<widget name='SpeedText' " +"type='OptionsLabel' " +"/> " +"<widget name='SpeedSlider' " +"type='Slider' " +"/> " +"<widget name='SpeedLabel' " +"width='32' " +"height='Globals.Line.Height' " +"/> " +"</layout> " +"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> " +"<widget name='DepthText' " +"type='OptionsLabel' " +"/> " +"<widget name='DepthSlider' " +"type='Slider' " +"/> " +"<widget name='DepthLabel' " +"width='32' " +"height='Globals.Line.Height' " +"/> " +"</layout> " +"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> " +"<widget name='WaveFormTypeText' " +"type='OptionsLabel' " +"/> " +"<widget name='WaveFormType' " +"type='PopUp' " +"/> " +"</layout> " +"</layout> " +"</dialog> " +"<dialog name='FluidSynthSettings_Reverb' overlays='Dialog.FluidSynthSettings.TabWidget'> " +"<layout type='vertical' padding='8,8,8,8' spacing='6'> " +"<widget name='EnableTabCheckbox' " +"type='Checkbox' " +"/> " +"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> " +"<widget name='RoomSizeText' " +"type='OptionsLabel' " +"/> " +"<widget name='RoomSizeSlider' " +"type='Slider' " +"/> " +"<widget name='RoomSizeLabel' " +"width='32' " +"height='Globals.Line.Height' " +"/> " +"</layout> " +"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> " +"<widget name='DampingText' " +"type='OptionsLabel' " +"/> " +"<widget name='DampingSlider' " +"type='Slider' " +"/> " +"<widget name='DampingLabel' " +"width='32' " +"height='Globals.Line.Height' " +"/> " +"</layout> " +"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> " +"<widget name='WidthText' " +"type='OptionsLabel' " +"/> " +"<widget name='WidthSlider' " +"type='Slider' " +"/> " +"<widget name='WidthLabel' " +"width='32' " +"height='Globals.Line.Height' " +"/> " +"</layout> " +"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> " +"<widget name='LevelText' " +"type='OptionsLabel' " +"/> " +"<widget name='LevelSlider' " +"type='Slider' " +"/> " +"<widget name='LevelLabel' " +"width='32' " +"height='Globals.Line.Height' " +"/> " +"</layout> " +"</layout> " +"</dialog> " +"<dialog name='FluidSynthSettings_Misc' overlays='Dialog.FluidSynthSettings.TabWidget'> " +"<layout type='vertical' padding='8,8,8,8' spacing='6'> " +"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> " +"<widget name='InterpolationText' " +"type='OptionsLabel' " +"/> " +"<widget name='Interpolation' " +"type='PopUp' " +"/> " +"</layout> " +"</layout> " +"</dialog> " "<dialog name='SaveLoadChooser' overlays='screen' inset='8' shading='dim'> " "<layout type='vertical' padding='8,8,8,8' center='true'> " "<widget name='Title' height='Globals.Line.Height'/> " @@ -1659,6 +1816,7 @@ "<layout type='vertical' center='true' padding='16,16,8,8'> " "<widget name='Version' " "height='Globals.Line.Height' " +"textalign='center' " "/> " "<layout type='horizontal' spacing='5' padding='10,0,0,0'> " "<widget name='SearchDesc' " @@ -1717,7 +1875,11 @@ "height='Globals.Line.Height' " "/> " "<widget name='List'/> " -"<layout type='horizontal' padding='0,0,16,0'> " +"<layout type='vertical' padding='0,0,16,0'> " +"<widget name='Hidden' " +"type='Checkbox' " +"/> " +"<layout type='horizontal' padding='0,0,0,0'> " "<widget name='Up' " "type='Button' " "/> " @@ -1730,6 +1892,7 @@ "/> " "</layout> " "</layout> " +"</layout> " "</dialog> " "<dialog name='GlobalOptions' overlays='Dialog.Launcher.GameList' shading='dim'> " "<layout type='vertical' padding='0,0,0,0'> " @@ -1905,6 +2068,10 @@ "height='Globals.Line.Height' " "/> " "</layout> " +"<widget name='mcFluidSynthSettings' " +"width='200' " +"height='Globals.Button.Height' " +"/> " "</layout> " "</dialog> " "<dialog name='GlobalOptions_MT32' overlays='Dialog.GlobalOptions.TabWidget'> " @@ -2323,6 +2490,153 @@ "</layout> " "</layout> " "</dialog> " +"<dialog name='FluidSynthSettings' overlays='GlobalOptions' shading='dim'> " +"<layout type='vertical' padding='0,0,0,0'> " +"<widget name='TabWidget'/> " +"<layout type='horizontal' padding='16,16,16,16'> " +"<space/> " +"<widget name='ResetSettings' " +"type='Button' " +"/> " +"<widget name='Cancel' " +"type='Button' " +"/> " +"<widget name='Ok' " +"type='Button' " +"/> " +"</layout> " +"</layout> " +"</dialog> " +"<dialog name='FluidSynthSettings_Chorus' overlays='Dialog.FluidSynthSettings.TabWidget'> " +"<layout type='vertical' padding='16,16,16,16' spacing='8'> " +"<widget name='EnableTabCheckbox' " +"type='Checkbox' " +"/> " +"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> " +"<widget name='VoiceCountText' " +"type='OptionsLabel' " +"/> " +"<widget name='VoiceCountSlider' " +"type='Slider' " +"/> " +"<widget name='VoiceCountLabel' " +"width='32' " +"height='Globals.Line.Height' " +"/> " +"</layout> " +"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> " +"<widget name='LevelText' " +"type='OptionsLabel' " +"/> " +"<widget name='LevelSlider' " +"type='Slider' " +"/> " +"<widget name='LevelLabel' " +"width='32' " +"height='Globals.Line.Height' " +"/> " +"</layout> " +"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> " +"<widget name='SpeedText' " +"type='OptionsLabel' " +"/> " +"<widget name='SpeedSlider' " +"type='Slider' " +"/> " +"<widget name='SpeedLabel' " +"width='32' " +"height='Globals.Line.Height' " +"/> " +"</layout> " +"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> " +"<widget name='DepthText' " +"type='OptionsLabel' " +"/> " +"<widget name='DepthSlider' " +"type='Slider' " +"/> " +"<widget name='DepthLabel' " +"width='32' " +"height='Globals.Line.Height' " +"/> " +"</layout> " +"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> " +"<widget name='WaveFormTypeText' " +"type='OptionsLabel' " +"/> " +"<widget name='WaveFormType' " +"type='PopUp' " +"/> " +"</layout> " +"</layout> " +"</dialog> " +"<dialog name='FluidSynthSettings_Reverb' overlays='Dialog.FluidSynthSettings.TabWidget'> " +"<layout type='vertical' padding='16,16,16,16' spacing='8'> " +"<widget name='EnableTabCheckbox' " +"type='Checkbox' " +"/> " +"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> " +"<widget name='RoomSizeText' " +"type='OptionsLabel' " +"/> " +"<widget name='RoomSizeSlider' " +"type='Slider' " +"/> " +"<widget name='RoomSizeLabel' " +"width='32' " +"height='Globals.Line.Height' " +"/> " +"</layout> " +"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> " +"<widget name='DampingText' " +"type='OptionsLabel' " +"/> " +"<widget name='DampingSlider' " +"type='Slider' " +"/> " +"<widget name='DampingLabel' " +"width='32' " +"height='Globals.Line.Height' " +"/> " +"</layout> " +"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> " +"<widget name='WidthText' " +"type='OptionsLabel' " +"/> " +"<widget name='WidthSlider' " +"type='Slider' " +"/> " +"<widget name='WidthLabel' " +"width='32' " +"height='Globals.Line.Height' " +"/> " +"</layout> " +"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> " +"<widget name='LevelText' " +"type='OptionsLabel' " +"/> " +"<widget name='LevelSlider' " +"type='Slider' " +"/> " +"<widget name='LevelLabel' " +"width='32' " +"height='Globals.Line.Height' " +"/> " +"</layout> " +"</layout> " +"</dialog> " +"<dialog name='FluidSynthSettings_Misc' overlays='Dialog.FluidSynthSettings.TabWidget'> " +"<layout type='vertical' padding='16,16,16,16' spacing='8'> " +"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> " +"<widget name='InterpolationText' " +"type='OptionsLabel' " +"/> " +"<widget name='Interpolation' " +"type='PopUp' " +"/> " +"</layout> " +"</layout> " +"</dialog> " "<dialog name='SaveLoadChooser' overlays='screen' inset='8' shading='dim'> " "<layout type='vertical' padding='8,8,8,32' center='true'> " "<layout type='horizontal' padding='0,0,0,0'> " diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip Binary files differindex 62eae0cd43..297ff20344 100644 --- a/gui/themes/scummclassic.zip +++ b/gui/themes/scummclassic.zip diff --git a/gui/themes/scummclassic/THEMERC b/gui/themes/scummclassic/THEMERC index b8937adcb2..8f40cb2a7e 100644 --- a/gui/themes/scummclassic/THEMERC +++ b/gui/themes/scummclassic/THEMERC @@ -1 +1 @@ -[SCUMMVM_STX0.8.16:ScummVM Classic Theme:No Author] +[SCUMMVM_STX0.8.20:ScummVM Classic Theme:No Author] diff --git a/gui/themes/scummclassic/classic_layout.stx b/gui/themes/scummclassic/classic_layout.stx index 4a6aae00bc..180e8fba74 100644 --- a/gui/themes/scummclassic/classic_layout.stx +++ b/gui/themes/scummclassic/classic_layout.stx @@ -107,6 +107,7 @@ <layout type = 'vertical' center = 'true' padding = '16, 16, 8, 8'> <widget name = 'Version' height = 'Globals.Line.Height' + textalign = 'center' /> <layout type = 'horizontal' spacing = '5' padding = '10, 0, 0, 0'> <widget name = 'SearchDesc' @@ -166,17 +167,22 @@ height = 'Globals.Line.Height' /> <widget name = 'List'/> - <layout type = 'horizontal' padding = '0, 0, 16, 0'> - <widget name = 'Up' - type = 'Button' - /> - <space/> - <widget name = 'Cancel' - type = 'Button' - /> - <widget name = 'Choose' - type = 'Button' + <layout type = 'vertical' padding = '0, 0, 16, 0'> + <widget name = 'Hidden' + type = 'Checkbox' /> + <layout type = 'horizontal' padding = '0, 0, 0, 0'> + <widget name = 'Up' + type = 'Button' + /> + <space/> + <widget name = 'Cancel' + type = 'Button' + /> + <widget name = 'Choose' + type = 'Button' + /> + </layout> </layout> </layout> </dialog> @@ -359,6 +365,10 @@ height = 'Globals.Line.Height' /> </layout> + <widget name = 'mcFluidSynthSettings' + width = '200' + height = 'Globals.Button.Height' + /> </layout> </dialog> @@ -794,6 +804,157 @@ </layout> </dialog> + <dialog name = 'FluidSynthSettings' overlays = 'GlobalOptions' shading = 'dim'> + <layout type = 'vertical' padding = '0, 0, 0, 0'> + <widget name = 'TabWidget'/> + <layout type = 'horizontal' padding = '16, 16, 16, 16'> + <space/> + <widget name = 'ResetSettings' + type = 'Button' + /> + <widget name = 'Cancel' + type = 'Button' + /> + <widget name = 'Ok' + type = 'Button' + /> + </layout> + </layout> + </dialog> + + <dialog name = 'FluidSynthSettings_Chorus' overlays = 'Dialog.FluidSynthSettings.TabWidget'> + <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'> + <widget name = 'EnableTabCheckbox' + type = 'Checkbox' + /> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'VoiceCountText' + type = 'OptionsLabel' + /> + <widget name = 'VoiceCountSlider' + type = 'Slider' + /> + <widget name = 'VoiceCountLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'LevelText' + type = 'OptionsLabel' + /> + <widget name = 'LevelSlider' + type = 'Slider' + /> + <widget name = 'LevelLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'SpeedText' + type = 'OptionsLabel' + /> + <widget name = 'SpeedSlider' + type = 'Slider' + /> + <widget name = 'SpeedLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'DepthText' + type = 'OptionsLabel' + /> + <widget name = 'DepthSlider' + type = 'Slider' + /> + <widget name = 'DepthLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'WaveFormTypeText' + type = 'OptionsLabel' + /> + <widget name = 'WaveFormType' + type = 'PopUp' + /> + </layout> + </layout> + </dialog> + + <dialog name = 'FluidSynthSettings_Reverb' overlays = 'Dialog.FluidSynthSettings.TabWidget'> + <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'> + <widget name = 'EnableTabCheckbox' + type = 'Checkbox' + /> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'RoomSizeText' + type = 'OptionsLabel' + /> + <widget name = 'RoomSizeSlider' + type = 'Slider' + /> + <widget name = 'RoomSizeLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'DampingText' + type = 'OptionsLabel' + /> + <widget name = 'DampingSlider' + type = 'Slider' + /> + <widget name = 'DampingLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'WidthText' + type = 'OptionsLabel' + /> + <widget name = 'WidthSlider' + type = 'Slider' + /> + <widget name = 'WidthLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'LevelText' + type = 'OptionsLabel' + /> + <widget name = 'LevelSlider' + type = 'Slider' + /> + <widget name = 'LevelLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + </layout> + </dialog> + + <dialog name = 'FluidSynthSettings_Misc' overlays = 'Dialog.FluidSynthSettings.TabWidget'> + <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'InterpolationText' + type = 'OptionsLabel' + /> + <widget name = 'Interpolation' + type = 'PopUp' + /> + </layout> + </layout> + </dialog> + <dialog name = 'SaveLoadChooser' overlays = 'screen' inset = '8' shading = 'dim'> <layout type = 'vertical' padding = '8, 8, 8, 32' center = 'true'> <layout type = 'horizontal' padding = '0, 0, 0, 0'> diff --git a/gui/themes/scummclassic/classic_layout_lowres.stx b/gui/themes/scummclassic/classic_layout_lowres.stx index 57e149b570..8bb03dea17 100644 --- a/gui/themes/scummclassic/classic_layout_lowres.stx +++ b/gui/themes/scummclassic/classic_layout_lowres.stx @@ -105,6 +105,7 @@ <layout type = 'vertical' center = 'true' padding = '6, 6, 2, 2'> <widget name = 'Version' height = 'Globals.Line.Height' + textalign = 'center' /> <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 0'> <widget name = 'SearchDesc' @@ -163,18 +164,22 @@ height = 'Globals.Line.Height' /> <widget name = 'List'/> - <layout type = 'horizontal' padding = '0, 0, 8, 0'> - <widget name = 'Up' - type = 'Button' - /> - <space/> - <widget name = 'Cancel' - type = 'Button' - /> - - <widget name = 'Choose' - type = 'Button' + <layout type = 'vertical' padding = '0, 0, 8, 0'> + <widget name = 'Hidden' + type = 'Checkbox' /> + <layout type = 'horizontal' padding = '0, 0, 0, 0'> + <widget name = 'Up' + type = 'Button' + /> + <space/> + <widget name = 'Cancel' + type = 'Button' + /> + <widget name = 'Choose' + type = 'Button' + /> + </layout> </layout> </layout> </dialog> @@ -321,7 +326,7 @@ </dialog> <dialog name = 'GlobalOptions_MIDI' overlays = 'Dialog.GlobalOptions.TabWidget'> - <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'> + <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '6'> <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '6' center = 'true'> <widget name = 'auPrefGmPopupDesc' type = 'OptionsLabel' @@ -357,6 +362,10 @@ height = 'Globals.Line.Height' /> </layout> + <widget name = 'mcFluidSynthSettings' + width = '150' + height = 'Globals.Button.Height' + /> </layout> </dialog> @@ -805,6 +814,157 @@ </layout> </dialog> + <dialog name = 'FluidSynthSettings' overlays = 'GlobalOptions' shading = 'dim'> + <layout type = 'vertical' padding = '0, 0, 0, 0'> + <widget name = 'TabWidget'/> + <layout type = 'horizontal' padding = '8, 8, 8, 8'> + <space/> + <widget name = 'ResetSettings' + type = 'Button' + /> + <widget name = 'Cancel' + type = 'Button' + /> + <widget name = 'Ok' + type = 'Button' + /> + </layout> + </layout> + </dialog> + + <dialog name = 'FluidSynthSettings_Chorus' overlays = 'Dialog.FluidSynthSettings.TabWidget'> + <layout type = 'vertical' padding = '8, 8, 8, 8' spacing = '6'> + <widget name = 'EnableTabCheckbox' + type = 'Checkbox' + /> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'VoiceCountText' + type = 'OptionsLabel' + /> + <widget name = 'VoiceCountSlider' + type = 'Slider' + /> + <widget name = 'VoiceCountLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'LevelText' + type = 'OptionsLabel' + /> + <widget name = 'LevelSlider' + type = 'Slider' + /> + <widget name = 'LevelLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'SpeedText' + type = 'OptionsLabel' + /> + <widget name = 'SpeedSlider' + type = 'Slider' + /> + <widget name = 'SpeedLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'DepthText' + type = 'OptionsLabel' + /> + <widget name = 'DepthSlider' + type = 'Slider' + /> + <widget name = 'DepthLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'WaveFormTypeText' + type = 'OptionsLabel' + /> + <widget name = 'WaveFormType' + type = 'PopUp' + /> + </layout> + </layout> + </dialog> + + <dialog name = 'FluidSynthSettings_Reverb' overlays = 'Dialog.FluidSynthSettings.TabWidget'> + <layout type = 'vertical' padding = '8, 8, 8, 8' spacing = '6'> + <widget name = 'EnableTabCheckbox' + type = 'Checkbox' + /> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'RoomSizeText' + type = 'OptionsLabel' + /> + <widget name = 'RoomSizeSlider' + type = 'Slider' + /> + <widget name = 'RoomSizeLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'DampingText' + type = 'OptionsLabel' + /> + <widget name = 'DampingSlider' + type = 'Slider' + /> + <widget name = 'DampingLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'WidthText' + type = 'OptionsLabel' + /> + <widget name = 'WidthSlider' + type = 'Slider' + /> + <widget name = 'WidthLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'LevelText' + type = 'OptionsLabel' + /> + <widget name = 'LevelSlider' + type = 'Slider' + /> + <widget name = 'LevelLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + </layout> + </dialog> + + <dialog name = 'FluidSynthSettings_Misc' overlays = 'Dialog.FluidSynthSettings.TabWidget'> + <layout type = 'vertical' padding = '8, 8, 8, 8' spacing = '6'> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'InterpolationText' + type = 'OptionsLabel' + /> + <widget name = 'Interpolation' + type = 'PopUp' + /> + </layout> + </layout> + </dialog> + <dialog name = 'SaveLoadChooser' overlays = 'screen' inset = '8' shading = 'dim'> <layout type = 'vertical' padding = '8, 8, 8, 8' center = 'true'> <widget name = 'Title' height = 'Globals.Line.Height'/> diff --git a/gui/themes/scummmodern.zip b/gui/themes/scummmodern.zip Binary files differindex 38352bcc2f..dbd84992e6 100644 --- a/gui/themes/scummmodern.zip +++ b/gui/themes/scummmodern.zip diff --git a/gui/themes/scummmodern/THEMERC b/gui/themes/scummmodern/THEMERC index 52eb683ebd..f4304622cb 100644 --- a/gui/themes/scummmodern/THEMERC +++ b/gui/themes/scummmodern/THEMERC @@ -1 +1 @@ -[SCUMMVM_STX0.8.16:ScummVM Modern Theme:No Author] +[SCUMMVM_STX0.8.20:ScummVM Modern Theme:No Author] diff --git a/gui/themes/scummmodern/scummmodern_layout.stx b/gui/themes/scummmodern/scummmodern_layout.stx index d99d7416c2..49c13cf1b0 100644 --- a/gui/themes/scummmodern/scummmodern_layout.stx +++ b/gui/themes/scummmodern/scummmodern_layout.stx @@ -180,17 +180,22 @@ height = 'Globals.Line.Height' /> <widget name = 'List'/> - <layout type = 'horizontal' padding = '0, 0, 16, 0'> - <widget name = 'Up' - type = 'Button' - /> - <space/> - <widget name = 'Cancel' - type = 'Button' - /> - <widget name = 'Choose' - type = 'Button' + <layout type = 'vertical' padding = '0, 0, 16, 0'> + <widget name = 'Hidden' + type = 'Checkbox' /> + <layout type = 'horizontal' padding = '0, 0, 0, 0'> + <widget name = 'Up' + type = 'Button' + /> + <space/> + <widget name = 'Cancel' + type = 'Button' + /> + <widget name = 'Choose' + type = 'Button' + /> + </layout> </layout> </layout> </dialog> @@ -373,6 +378,10 @@ height = 'Globals.Line.Height' /> </layout> + <widget name = 'mcFluidSynthSettings' + width = '200' + height = 'Globals.Button.Height' + /> </layout> </dialog> @@ -808,6 +817,157 @@ </layout> </dialog> + <dialog name = 'FluidSynthSettings' overlays = 'GlobalOptions' shading = 'dim'> + <layout type = 'vertical' padding = '0, 0, 0, 0'> + <widget name = 'TabWidget'/> + <layout type = 'horizontal' padding = '16, 16, 16, 16'> + <space/> + <widget name = 'ResetSettings' + type = 'Button' + /> + <widget name = 'Cancel' + type = 'Button' + /> + <widget name = 'Ok' + type = 'Button' + /> + </layout> + </layout> + </dialog> + + <dialog name = 'FluidSynthSettings_Chorus' overlays = 'Dialog.FluidSynthSettings.TabWidget'> + <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'> + <widget name = 'EnableTabCheckbox' + type = 'Checkbox' + /> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'VoiceCountText' + type = 'OptionsLabel' + /> + <widget name = 'VoiceCountSlider' + type = 'Slider' + /> + <widget name = 'VoiceCountLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'LevelText' + type = 'OptionsLabel' + /> + <widget name = 'LevelSlider' + type = 'Slider' + /> + <widget name = 'LevelLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'SpeedText' + type = 'OptionsLabel' + /> + <widget name = 'SpeedSlider' + type = 'Slider' + /> + <widget name = 'SpeedLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'DepthText' + type = 'OptionsLabel' + /> + <widget name = 'DepthSlider' + type = 'Slider' + /> + <widget name = 'DepthLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'WaveFormTypeText' + type = 'OptionsLabel' + /> + <widget name = 'WaveFormType' + type = 'PopUp' + /> + </layout> + </layout> + </dialog> + + <dialog name = 'FluidSynthSettings_Reverb' overlays = 'Dialog.FluidSynthSettings.TabWidget'> + <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'> + <widget name = 'EnableTabCheckbox' + type = 'Checkbox' + /> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'RoomSizeText' + type = 'OptionsLabel' + /> + <widget name = 'RoomSizeSlider' + type = 'Slider' + /> + <widget name = 'RoomSizeLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'DampingText' + type = 'OptionsLabel' + /> + <widget name = 'DampingSlider' + type = 'Slider' + /> + <widget name = 'DampingLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'WidthText' + type = 'OptionsLabel' + /> + <widget name = 'WidthSlider' + type = 'Slider' + /> + <widget name = 'WidthLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'LevelText' + type = 'OptionsLabel' + /> + <widget name = 'LevelSlider' + type = 'Slider' + /> + <widget name = 'LevelLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + </layout> + </dialog> + + <dialog name = 'FluidSynthSettings_Misc' overlays = 'Dialog.FluidSynthSettings.TabWidget'> + <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'InterpolationText' + type = 'OptionsLabel' + /> + <widget name = 'Interpolation' + type = 'PopUp' + /> + </layout> + </layout> + </dialog> + <dialog name = 'SaveLoadChooser' overlays = 'screen' inset = '8' shading = 'dim'> <layout type = 'vertical' padding = '8, 8, 8, 32' center = 'true'> <layout type = 'horizontal' padding = '0, 0, 0, 0'> diff --git a/gui/themes/scummmodern/scummmodern_layout_lowres.stx b/gui/themes/scummmodern/scummmodern_layout_lowres.stx index 4fd5bdcf40..9658402f82 100644 --- a/gui/themes/scummmodern/scummmodern_layout_lowres.stx +++ b/gui/themes/scummmodern/scummmodern_layout_lowres.stx @@ -103,6 +103,7 @@ <layout type = 'vertical' center = 'true' padding = '4, 4, 2, 2' spacing = '2'> <widget name = 'Version' height = 'Globals.Line.Height' + textalign = 'center' /> <layout type = 'horizontal' spacing = '5' padding = '0, 0, 2, 2'> <widget name = 'SearchDesc' @@ -161,18 +162,22 @@ height = 'Globals.Line.Height' /> <widget name = 'List'/> - <layout type = 'horizontal' padding = '0, 0, 8, 0'> - <widget name = 'Up' - type = 'Button' - /> - <space/> - <widget name = 'Cancel' - type = 'Button' - /> - - <widget name = 'Choose' - type = 'Button' + <layout type = 'vertical' padding = '0, 0, 8, 0'> + <widget name = 'Hidden' + type = 'Checkbox' /> + <layout type = 'horizontal' padding = '0, 0, 0, 0'> + <widget name = 'Up' + type = 'Button' + /> + <space/> + <widget name = 'Cancel' + type = 'Button' + /> + <widget name = 'Choose' + type = 'Button' + /> + </layout> </layout> </layout> </dialog> @@ -319,7 +324,7 @@ </dialog> <dialog name = 'GlobalOptions_MIDI' overlays = 'Dialog.GlobalOptions.TabWidget'> - <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'> + <layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '7'> <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '6' center = 'true'> <widget name = 'auPrefGmPopupDesc' type = 'OptionsLabel' @@ -355,6 +360,10 @@ height = 'Globals.Line.Height' /> </layout> + <widget name = 'mcFluidSynthSettings' + width = '150' + height = 'Globals.Button.Height' + /> </layout> </dialog> @@ -804,6 +813,157 @@ </layout> </dialog> + <dialog name = 'FluidSynthSettings' overlays = 'GlobalOptions' shading = 'dim'> + <layout type = 'vertical' padding = '0, 0, 0, 0'> + <widget name = 'TabWidget'/> + <layout type = 'horizontal' padding = '8, 8, 8, 8'> + <space/> + <widget name = 'ResetSettings' + type = 'Button' + /> + <widget name = 'Cancel' + type = 'Button' + /> + <widget name = 'Ok' + type = 'Button' + /> + </layout> + </layout> + </dialog> + + <dialog name = 'FluidSynthSettings_Chorus' overlays = 'Dialog.FluidSynthSettings.TabWidget'> + <layout type = 'vertical' padding = '8, 8, 8, 8' spacing = '6'> + <widget name = 'EnableTabCheckbox' + type = 'Checkbox' + /> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'VoiceCountText' + type = 'OptionsLabel' + /> + <widget name = 'VoiceCountSlider' + type = 'Slider' + /> + <widget name = 'VoiceCountLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'LevelText' + type = 'OptionsLabel' + /> + <widget name = 'LevelSlider' + type = 'Slider' + /> + <widget name = 'LevelLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'SpeedText' + type = 'OptionsLabel' + /> + <widget name = 'SpeedSlider' + type = 'Slider' + /> + <widget name = 'SpeedLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'DepthText' + type = 'OptionsLabel' + /> + <widget name = 'DepthSlider' + type = 'Slider' + /> + <widget name = 'DepthLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'WaveFormTypeText' + type = 'OptionsLabel' + /> + <widget name = 'WaveFormType' + type = 'PopUp' + /> + </layout> + </layout> + </dialog> + + <dialog name = 'FluidSynthSettings_Reverb' overlays = 'Dialog.FluidSynthSettings.TabWidget'> + <layout type = 'vertical' padding = '8, 8, 8, 8' spacing = '6'> + <widget name = 'EnableTabCheckbox' + type = 'Checkbox' + /> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'RoomSizeText' + type = 'OptionsLabel' + /> + <widget name = 'RoomSizeSlider' + type = 'Slider' + /> + <widget name = 'RoomSizeLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'DampingText' + type = 'OptionsLabel' + /> + <widget name = 'DampingSlider' + type = 'Slider' + /> + <widget name = 'DampingLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'WidthText' + type = 'OptionsLabel' + /> + <widget name = 'WidthSlider' + type = 'Slider' + /> + <widget name = 'WidthLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'LevelText' + type = 'OptionsLabel' + /> + <widget name = 'LevelSlider' + type = 'Slider' + /> + <widget name = 'LevelLabel' + width = '32' + height = 'Globals.Line.Height' + /> + </layout> + </layout> + </dialog> + + <dialog name = 'FluidSynthSettings_Misc' overlays = 'Dialog.FluidSynthSettings.TabWidget'> + <layout type = 'vertical' padding = '8, 8, 8, 8' spacing = '6'> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'InterpolationText' + type = 'OptionsLabel' + /> + <widget name = 'Interpolation' + type = 'PopUp' + /> + </layout> + </layout> + </dialog> + <dialog name = 'SaveLoadChooser' overlays = 'screen' inset = '8' shading = 'dim'> <layout type = 'vertical' padding = '8, 8, 8, 8' center = 'true'> <widget name = 'Title' height = 'Globals.Line.Height'/> diff --git a/gui/themes/translations.dat b/gui/themes/translations.dat Binary files differindex 7b51dec980..07c3b3f3a2 100644 --- a/gui/themes/translations.dat +++ b/gui/themes/translations.dat diff --git a/gui/widget.cpp b/gui/widget.cpp index 4ffb63e945..c3f10a861f 100644 --- a/gui/widget.cpp +++ b/gui/widget.cpp @@ -593,8 +593,8 @@ void SliderWidget::handleMouseUp(int x, int y, int button, int clickCount) { void SliderWidget::handleMouseWheel(int x, int y, int direction) { if (isEnabled() && !_isDragging) { - // Increment or decrement one position - int newValue = posToValue(valueToPos(_value) - 1 * direction); + // Increment or decrement by one + int newValue = _value - direction; if (newValue < _valueMin) newValue = _valueMin; diff --git a/gui/widgets/list.cpp b/gui/widgets/list.cpp index 13784ddf7f..95d39c4f24 100644 --- a/gui/widgets/list.cpp +++ b/gui/widgets/list.cpp @@ -284,7 +284,7 @@ bool ListWidget::handleKeyDown(Common::KeyState state) { bool dirty = false; int oldSelectedItem = _selectedItem; - if (!_editMode && state.keycode <= Common::KEYCODE_z && isprint((unsigned char)state.ascii)) { + if (!_editMode && state.keycode <= Common::KEYCODE_z && Common::isPrint(state.ascii)) { // Quick selection mode: Go to first list item starting with this key // (or a substring accumulated from the last couple key presses). // Only works in a useful fashion if the list entries are sorted. diff --git a/gui/widgets/popup.cpp b/gui/widgets/popup.cpp index 1a552e97c0..829a49c53e 100644 --- a/gui/widgets/popup.cpp +++ b/gui/widgets/popup.cpp @@ -388,24 +388,28 @@ void PopUpWidget::handleMouseDown(int x, int y, int button, int clickCount) { if (newSel != -1 && _selectedItem != newSel) { _selectedItem = newSel; sendCommand(kPopUpItemSelectedCmd, _entries[_selectedItem].tag); + draw(); } } } void PopUpWidget::handleMouseWheel(int x, int y, int direction) { - int newSelection = _selectedItem + direction; + if (isEnabled()) { + int newSelection = _selectedItem + direction; - // Skip separator entries - while ((newSelection >= 0) && (newSelection < (int)_entries.size()) && - _entries[newSelection].name.equals("")) { - newSelection += direction; - } + // Skip separator entries + while ((newSelection >= 0) && (newSelection < (int)_entries.size()) && + _entries[newSelection].name.equals("")) { + newSelection += direction; + } - // Just update the selected item when we're in range - if ((newSelection >= 0) && (newSelection < (int)_entries.size()) && - (newSelection != _selectedItem)) { - _selectedItem = newSelection; - draw(); + // Just update the selected item when we're in range + if ((newSelection >= 0) && (newSelection < (int)_entries.size()) && + (newSelection != _selectedItem)) { + _selectedItem = newSelection; + sendCommand(kPopUpItemSelectedCmd, _entries[_selectedItem].tag); + draw(); + } } } diff --git a/po/POTFILES b/po/POTFILES index 72c6fb1d18..4389904e29 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -25,6 +25,8 @@ engines/dialogs.cpp engines/engine.cpp engines/agi/detection.cpp engines/agi/saveload.cpp +engines/drascula/detection.cpp +engines/drascula/saveload.cpp engines/dreamweb/detection.cpp engines/sci/detection.cpp engines/scumm/dialogs.cpp @@ -40,6 +42,7 @@ engines/agos/animation.cpp engines/gob/inter_playtoons.cpp engines/gob/inter_v2.cpp engines/gob/inter_v5.cpp +engines/groovie/detection.cpp engines/groovie/script.cpp engines/kyra/detection.cpp engines/kyra/lol.cpp @@ -55,7 +58,10 @@ engines/sword2/animation.cpp engines/sword2/sword2.cpp engines/teenagent/resources.cpp engines/tinsel/saveload.cpp +engines/toltecs/detection.cpp +engines/toltecs/menu.cpp engines/parallaction/saveload.cpp +engines/pegasus/pegasus.cpp audio/fmopl.cpp audio/mididrv.cpp diff --git a/po/be_BY.po b/po/be_BY.po new file mode 100644 index 0000000000..9c0f0e0430 --- /dev/null +++ b/po/be_BY.po @@ -0,0 +1,3241 @@ +# Belarusian translation for ScummVM. +# Copyright (C) 2010-2013 ScummVM Team +# This file is distributed under the same license as the ScummVM package. +# Ivan Lukyanov <greencis@mail.ru>, 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: ScummVM 1.6.0git\n" +"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" +"POT-Creation-Date: 2013-02-07 23:11+0000\n" +"PO-Revision-Date: 2012-12-12 22:02+0300\n" +"Last-Translator: Ivan Lukyanov <greencis@mail.ru>\n" +"Language-Team: Ivan Lukyanov <greencis@mail.ru>\n" +"Language: Belarusian\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" +"X-Generator: Poedit 1.5.4\n" + +#: gui/about.cpp:93 +#, c-format +msgid "(built on %s)" +msgstr "(áÐÑàÐÝë %s)" + +#: gui/about.cpp:100 +msgid "Features compiled in:" +msgstr "ÃÚÛîçÐÝëï þ ÑöÛÔ Þßæëö:" + +#: gui/about.cpp:109 +msgid "Available engines:" +msgstr "´ÐáâãßÝëï àãåÐÒöçÚö:" + +#: gui/browser.cpp:67 +#, fuzzy +msgid "Show hidden files" +msgstr "¿ÐÚÐ×Ðæì / ¿àëÑàÐæì ÚÐÝáÞÛì" + +#: gui/browser.cpp:67 +msgid "Show files marked with the hidden attribute" +msgstr "" + +#: gui/browser.cpp:71 +msgid "Go up" +msgstr "ÃÒÕàå" + +#: gui/browser.cpp:71 gui/browser.cpp:73 +msgid "Go to previous directory level" +msgstr "¿ÕàÐÙáæö ÝÐ ÔëàíÚâÞàëî þ×àÞþÝÕÜ ÒëèíÙ" + +#: gui/browser.cpp:73 +msgctxt "lowres" +msgid "Go up" +msgstr "ÃÒÕàå" + +#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238 +#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275 +#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919 +#: gui/themebrowser.cpp:54 engines/engine.cpp:447 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:190 +#: engines/sword1/control.cpp:867 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:48 +#: backends/events/default/default-events.cpp:191 +#: backends/events/default/default-events.cpp:213 +msgid "Cancel" +msgstr "°ÔÜÕÝÐ" + +#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55 +msgid "Choose" +msgstr "°ÑàÐæì" + +#: gui/gui-manager.cpp:115 engines/scumm/help.cpp:125 +#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165 +#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209 +#: backends/keymapper/remap-dialog.cpp:52 +msgid "Close" +msgstr "·ÐÚàëæì" + +#: gui/gui-manager.cpp:118 +msgid "Mouse click" +msgstr "ºÛöÚ Üëèèã" + +#: gui/gui-manager.cpp:122 base/main.cpp:301 +msgid "Display keyboard" +msgstr "¿ÐÚÐ×Ðæì ÚÛÐÒöïâãàã" + +#: gui/gui-manager.cpp:126 base/main.cpp:305 +msgid "Remap keys" +msgstr "¿ÕàÐßàë×ÝÐçëæì ÚÛÐÒöèë" + +#: gui/gui-manager.cpp:129 base/main.cpp:308 +msgid "Toggle FullScreen" +msgstr "¿ÕàÐÚÛîçíÝÝÕ ÝÐ þÒÕáì íÚàÐÝ" + +#: gui/KeysDialog.h:36 gui/KeysDialog.cpp:145 +msgid "Choose an action to map" +msgstr "°ÑïàëæÕ Ô×ÕïÝÝÕ ÔÛï ßàë×ÝÐçíÝÝï" + +#: gui/KeysDialog.cpp:41 +msgid "Map" +msgstr "¿àë×ÝÐçëæì" + +#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 +#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239 +#: gui/saveload-dialog.cpp:920 engines/engine.cpp:366 engines/engine.cpp:377 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192 +#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558 +#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 +#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519 +#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550 +#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:867 +#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419 +#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449 +#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:47 +#: backends/platform/wince/CELauncherDialog.cpp:54 +msgid "OK" +msgstr "OK" + +#: gui/KeysDialog.cpp:49 +msgid "Select an action and click 'Map'" +msgstr "°ÑïàëæÕ Ô×ÕïÝÝÕ ö ÚÛöÚÝöæÕ '¿àë×ÝÐçëæì'" + +#: gui/KeysDialog.cpp:80 gui/KeysDialog.cpp:102 gui/KeysDialog.cpp:141 +#, c-format +msgid "Associated key : %s" +msgstr "¿àë×ÝÐçÐÝÐï ÚÛÐÒöèÐ : %s" + +#: gui/KeysDialog.cpp:82 gui/KeysDialog.cpp:104 gui/KeysDialog.cpp:143 +#, c-format +msgid "Associated key : none" +msgstr "¿àë×ÝÐçÐÝÐï ÚÛÐÒöèÐ : ÝïÜÐ" + +#: gui/KeysDialog.cpp:90 +msgid "Please select an action" +msgstr "ºÐÛö ÛÐáÚÐ, ÐÑïàëæÕ Ô×ÕïÝÝÕ" + +#: gui/KeysDialog.cpp:106 +msgid "Press the key to associate" +msgstr "½ÐæöáÝöæÕ ÚÛÐÒöèã ÔÛï ßàë×ÝÐçíÝÝï" + +#: gui/launcher.cpp:187 +msgid "Game" +msgstr "³ãÛìÝï" + +#: gui/launcher.cpp:191 +msgid "ID:" +msgstr "ID:" + +#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194 +msgid "" +"Short game identifier used for referring to savegames and running the game " +"from the command line" +msgstr "" +"ºÐàÞâÚö öÔíÝâëäöÚÐâÐà, ÒëÚÐàëáâÞþÒÐÝë ÔÛï öÜñÝÐþ ×ÐåÐÒÐÝÝïþ ÓãÛìÝïþ ö ÔÛï " +"×ÐßãáÚã × ÚÐÜÐÝÔÝÐÓÐ àÐÔÚÐ" + +#: gui/launcher.cpp:193 +msgctxt "lowres" +msgid "ID:" +msgstr "ID:" + +#: gui/launcher.cpp:198 +msgid "Name:" +msgstr "½Ð×ÒÐ:" + +#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201 +msgid "Full title of the game" +msgstr "¿ÞþÝÐï ÝÐ×ÒÐ ÓãÛìÝö" + +#: gui/launcher.cpp:200 +msgctxt "lowres" +msgid "Name:" +msgstr "½Ð×Ò:" + +#: gui/launcher.cpp:204 +msgid "Language:" +msgstr "¼ÞÒÐ:" + +#: gui/launcher.cpp:204 gui/launcher.cpp:205 +msgid "" +"Language of the game. This will not turn your Spanish game version into " +"English" +msgstr "" +"¼ÞÒÐ ÓãÛìÝö. ·ÜÕÝÐ ÓíâÐÙ ÝÐÛÐÔë ÝÕ ßÕàÐâÒÞàëæì ÐÝÓÕÛìáÚãî ÓãÛìÝî þ àãáÚãî" + +#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86 +#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209 +#: audio/null.cpp:40 +msgid "<default>" +msgstr "<ßÐ ×ÜÐþçÐÝÝö>" + +#: gui/launcher.cpp:216 +msgid "Platform:" +msgstr "¿ÛÐâäÞàÜÐ:" + +#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219 +msgid "Platform the game was originally designed for" +msgstr "¿ÛÐâäÞàÜÐ, ÔÛï ïÚÞÙ ÓãÛìÝï ÑëÛÐ ßÕàèÐßÐçÐâÚÞÒÐ àÐáßàÐæÐÒÐÝÐ" + +#: gui/launcher.cpp:218 +msgctxt "lowres" +msgid "Platform:" +msgstr "¿ÛÐâäÞàÜÐ:" + +#: gui/launcher.cpp:231 +msgid "Engine" +msgstr "ÀãåÐÒöçÞÚ" + +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 +msgid "Graphics" +msgstr "³àÐäöÚÐ" + +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 +msgid "GFX" +msgstr "³àä" + +#: gui/launcher.cpp:242 +msgid "Override global graphic settings" +msgstr "¿ÕàÐÚàëæì ÓÛÐÑÐÛìÝëï ÝÐÛÐÔë ÓàÐäöÚö" + +#: gui/launcher.cpp:244 +msgctxt "lowres" +msgid "Override global graphic settings" +msgstr "¿ÕàÐÚàëæì ÓÛÐÑÐÛìÝëï ÝÐÛÐÔë ÓàÐäöÚö" + +#: gui/launcher.cpp:251 gui/options.cpp:1095 +msgid "Audio" +msgstr "°þÔëñ" + +#: gui/launcher.cpp:254 +msgid "Override global audio settings" +msgstr "¿ÕàÐÚàëæì ÓÛÐÑÐÛìÝëï ÝÐÛÐÔë ÐþÔëñ" + +#: gui/launcher.cpp:256 +msgctxt "lowres" +msgid "Override global audio settings" +msgstr "¿ÕàÐÚàëæì ÓÛÐÑÐÛìÝëï ÝÐÛÐÔë ÐþÔëñ" + +#: gui/launcher.cpp:265 gui/options.cpp:1100 +msgid "Volume" +msgstr "³ãçÝÐáæì" + +#: gui/launcher.cpp:267 gui/options.cpp:1102 +msgctxt "lowres" +msgid "Volume" +msgstr "³ãçÝ" + +#: gui/launcher.cpp:270 +msgid "Override global volume settings" +msgstr "¿ÕàÐÚàëæì ÓÛÐÑÐÛìÝëï ÝÐÛÐÔë ÓãçÝÐáæö" + +#: gui/launcher.cpp:272 +msgctxt "lowres" +msgid "Override global volume settings" +msgstr "¿ÕàÐÚàëæì ÓÛÐÑÐÛìÝëï ÝÐÛÐÔë ÓãçÝÐáæö" + +#: gui/launcher.cpp:280 gui/options.cpp:1110 +msgid "MIDI" +msgstr "MIDI" + +#: gui/launcher.cpp:283 +msgid "Override global MIDI settings" +msgstr "¿ÕàÐÚàëæì ÓÛÐÑÐÛìÝëï ÝÐÛÐÔë MIDI" + +#: gui/launcher.cpp:285 +msgctxt "lowres" +msgid "Override global MIDI settings" +msgstr "¿ÕàÐÚàëæì ÓÛÐÑÐÛìÝëï ÝÐÛÐÔë MIDI" + +#: gui/launcher.cpp:294 gui/options.cpp:1116 +msgid "MT-32" +msgstr "MT-32" + +#: gui/launcher.cpp:297 +msgid "Override global MT-32 settings" +msgstr "¿ÕàÐÚàëæì ÓÛÐÑÐÛìÝëï ÝÐÛÐÔë MT-32" + +#: gui/launcher.cpp:299 +msgctxt "lowres" +msgid "Override global MT-32 settings" +msgstr "¿ÕàÐÚàëæì ÓÛÐÑÐÛìÝëï ÝÐÛÐÔë MT-32" + +#: gui/launcher.cpp:308 gui/options.cpp:1123 +msgid "Paths" +msgstr "ÈÛïåö" + +#: gui/launcher.cpp:310 gui/options.cpp:1125 +msgctxt "lowres" +msgid "Paths" +msgstr "ÈÛïåö" + +#: gui/launcher.cpp:317 +msgid "Game Path:" +msgstr "ÈÛïå ÔÐ ÓãÛìÝö:" + +#: gui/launcher.cpp:319 +msgctxt "lowres" +msgid "Game Path:" +msgstr "´×Õ ÓãÛìÝï:" + +#: gui/launcher.cpp:324 gui/options.cpp:1149 +msgid "Extra Path:" +msgstr "´ÐÔ. èÛïå:" + +#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327 +msgid "Specifies path to additional data used the game" +msgstr "¿ÐÚÐ×ÒÐÕ èÛïå ÔÐ ÔÐÔÐâÚÞÒëå äÐÙÛÐþ, ÔÐÔ×ÕÝëå ÔÛï ÓãÛìÝö" + +#: gui/launcher.cpp:326 gui/options.cpp:1151 +msgctxt "lowres" +msgid "Extra Path:" +msgstr "´ÐÔ. èÛïå:" + +#: gui/launcher.cpp:333 gui/options.cpp:1133 +msgid "Save Path:" +msgstr "·ÐåÐÒÐÝÝö ÓãÛìÝïþ:" + +#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 +#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136 +msgid "Specifies where your savegames are put" +msgstr "¿ÐÚÐ×ÒÐÕ èÛïå ÔÐ ×ÐåÐÒÐÝÝïþ ÓãÛìÝö" + +#: gui/launcher.cpp:335 gui/options.cpp:1135 +msgctxt "lowres" +msgid "Save Path:" +msgstr "ÈÛïå ×Ðå:" + +#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 +#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152 +#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282 +#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326 +#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429 +#: gui/options.cpp:1441 +msgctxt "path" +msgid "None" +msgstr "½Õ ×ÐÔÐÔ×ÕÝë" + +#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 +#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432 +#: backends/platform/wii/options.cpp:56 +msgid "Default" +msgstr "¿Ð ×ÜÐþçÐÝÝö" + +#: gui/launcher.cpp:504 gui/options.cpp:1435 +msgid "Select SoundFont" +msgstr "°ÑïàëæÕ SoundFont" + +#: gui/launcher.cpp:523 gui/launcher.cpp:677 +msgid "Select directory with game data" +msgstr "°ÑïàëæÕ ÔëàíÚâÞàëî × äÐÙÛÐÜö ÓãÛìÝö" + +#: gui/launcher.cpp:541 +msgid "Select additional game directory" +msgstr "°ÑïàëæÕ ÔÐÔÐâÚÞÒãî ÔëàíÚâÞàëî ÓãÛìÝö" + +#: gui/launcher.cpp:553 +msgid "Select directory for saved games" +msgstr "°ÑïàëæÕ ÔëàíÚâÞàëî ÔÛï ×ÐåÐÒÐÝÝïþ" + +#: gui/launcher.cpp:580 +msgid "This game ID is already taken. Please choose another one." +msgstr "³íâë ID ÓãÛìÝö þÖÞ ÒëÚÐàëáâÞþÒÐÕææÐ. ºÐÛö ÛÐáÚÐ, ÐÑïàëæÕ öÝèë." + +#: gui/launcher.cpp:621 engines/dialogs.cpp:110 +msgid "~Q~uit" +msgstr "~²~ëåÐÔ" + +#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95 +msgid "Quit ScummVM" +msgstr "·ÐÒïàèëæì ScummVM" + +#: gui/launcher.cpp:622 +msgid "A~b~out..." +msgstr "¿àÐ ß~à~ÐÓàÐÜã..." + +#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69 +msgid "About ScummVM" +msgstr "¿àÐ ßàÐÓàÐÜã ScummVM" + +#: gui/launcher.cpp:623 +msgid "~O~ptions..." +msgstr "~½~ÐÛÐÔë..." + +#: gui/launcher.cpp:623 +msgid "Change global ScummVM options" +msgstr "·ÜïÝöæì ÓÛÐÑÐÛìÝëï ÝÐÛÐÔë ScummVM" + +#: gui/launcher.cpp:625 +msgid "~S~tart" +msgstr "¿~ã~áÚ" + +#: gui/launcher.cpp:625 +msgid "Start selected game" +msgstr "·Ðßãáæöæì ÐÑàÐÝãî ÓãÛìÝî" + +#: gui/launcher.cpp:628 +msgid "~L~oad..." +msgstr "~·~ÐÓàã×öæì..." + +#: gui/launcher.cpp:628 +msgid "Load savegame for selected game" +msgstr "·ÐÓàã×öæì ×ÐåÐÒÐÝÝÕ ÔÛï ÐÑàÐÝÐÙ ÓãÛìÝö" + +#: gui/launcher.cpp:633 gui/launcher.cpp:1120 +msgid "~A~dd Game..." +msgstr "~´~ÐÔÐæì ÓãÛìÝî..." + +#: gui/launcher.cpp:633 gui/launcher.cpp:640 +msgid "Hold Shift for Mass Add" +msgstr "ÃâàëÜÛöÒÐÙæÕ ÚÛÐÒöèã Shift ÔÛï âÐÓÞ, ÚÐÑ ÔÐÔÐæì ÝÕÚÐÛìÚö ÓãÛìÝïþ" + +#: gui/launcher.cpp:635 +msgid "~E~dit Game..." +msgstr "½~Ð~ÛÐÔë ÓãÛìÝö..." + +#: gui/launcher.cpp:635 gui/launcher.cpp:642 +msgid "Change game options" +msgstr "·ÜïÝöæì ÝÐÛÐÔë ÓãÛìÝö" + +#: gui/launcher.cpp:637 +msgid "~R~emove Game" +msgstr "²~ë~ÔÐÛöæì ÓãÛìÝî" + +#: gui/launcher.cpp:637 gui/launcher.cpp:644 +msgid "Remove game from the list. The game data files stay intact" +msgstr "²ëÔÐÛöæì ÓãÛìÝî áÐ áßöáã. ½Õ ÒëÔÐÛïÕ ÓãÛìÝî × ÖÞàáâÚÐÓÐ ÔëáÚÐ" + +#: gui/launcher.cpp:640 gui/launcher.cpp:1120 +msgctxt "lowres" +msgid "~A~dd Game..." +msgstr "~´~ÐÔ. ÓãÛìÝî..." + +#: gui/launcher.cpp:642 +msgctxt "lowres" +msgid "~E~dit Game..." +msgstr "½~Ð~Û. ÓãÛìÝö..." + +#: gui/launcher.cpp:644 +msgctxt "lowres" +msgid "~R~emove Game" +msgstr "²~ë~ÔÐÛöæì ÓãÛìÝî" + +#: gui/launcher.cpp:652 +msgid "Search in game list" +msgstr "¿ÞèãÚ ã áßöáÕ ÓãÛìÝïþ" + +#: gui/launcher.cpp:656 gui/launcher.cpp:1167 +msgid "Search:" +msgstr "¿ÞèãÚ:" + +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 +#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 +#: engines/pegasus/pegasus.cpp:345 +msgid "Load game:" +msgstr "·ÐÓàã×öæì ÓãÛìÝî:" + +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 +#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 +#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:345 +#: backends/platform/wince/CEActionsPocket.cpp:267 +#: backends/platform/wince/CEActionsSmartphone.cpp:231 +msgid "Load" +msgstr "·ÐÓàã×öæì" + +#: gui/launcher.cpp:788 +msgid "" +"Do you really want to run the mass game detector? This could potentially add " +"a huge number of games." +msgstr "" +"²ë áÐßàÐþÔë ÖÐÔÐÕæÕ ×Ðßãáæöæì ÔíâíÚâÐà ãáöå ÓãÛìÝïþ? ³íâÐ ßÐâíÝæëïÛìÝÐ ÜÞÖÐ " +"ÔÐÔÐæì ÒïÛöÚãî ÚÞÛìÚÐáæì ÓãÛìÝïþ." + +#: gui/launcher.cpp:789 gui/launcher.cpp:937 +#: backends/events/symbiansdl/symbiansdl-events.cpp:184 +#: backends/platform/wince/CEActionsPocket.cpp:326 +#: backends/platform/wince/CEActionsSmartphone.cpp:287 +#: backends/platform/wince/CELauncherDialog.cpp:83 +msgid "Yes" +msgstr "ÂÐÚ" + +#: gui/launcher.cpp:789 gui/launcher.cpp:937 +#: backends/events/symbiansdl/symbiansdl-events.cpp:184 +#: backends/platform/wince/CEActionsPocket.cpp:326 +#: backends/platform/wince/CEActionsSmartphone.cpp:287 +#: backends/platform/wince/CELauncherDialog.cpp:83 +msgid "No" +msgstr "½Õ" + +#: gui/launcher.cpp:837 +msgid "ScummVM couldn't open the specified directory!" +msgstr "ScummVM ÝÕ ÜÞÖÐ ÐÔÚàëæì Ð×ÝÐçÐÝãî ÔëàíÚâÞàëî!" + +#: gui/launcher.cpp:849 +msgid "ScummVM could not find any game in the specified directory!" +msgstr "ScummVM ÝÕ ÜÞÖÐ ×ÝÐÙáæö ÓãÛìÝî þ Ð×ÝÐçÐÝÐÙ ÔëàíÚâÞàëö!" + +#: gui/launcher.cpp:863 +msgid "Pick the game:" +msgstr "°ÑïàëæÕ ÓãÛìÝî:" + +#: gui/launcher.cpp:937 +msgid "Do you really want to remove this game configuration?" +msgstr "²ë áÐßàÐþÔë ÖÐÔÐÕæÕ ÒëÔÐÛöæì ÝÐÛÐÔë ÔÛï ÓíâÐÙ ÓãÛìÝö?" + +#: gui/launcher.cpp:1001 +msgid "This game does not support loading games from the launcher." +msgstr "³íâÐï ÓãÛìÝï ÝÕ ßÐÔâàëÜÛöÒÐÕ ×ÐÓàã×Úã ×ÐåÐÒÐÝÝïþ ßàÐ× ÓÐÛÞþÝÐÕ ÜÕÝî." + +#: gui/launcher.cpp:1005 +msgid "ScummVM could not find any engine capable of running the selected game!" +msgstr "ScummVM ÝÕ ×ÜÞÓ ×ÝÐÙáæö àãåÐÒöçÞÚ ÔÛï ×ÐßãáÚã ÐÑàÐÝÐÙ ÓãÛìÝö!" + +#: gui/launcher.cpp:1119 +msgctxt "lowres" +msgid "Mass Add..." +msgstr "ÈÜÐâ ÓãÛìÝïþ..." + +#: gui/launcher.cpp:1119 +msgid "Mass Add..." +msgstr "ÈÜÐâ ÓãÛìÝïþ..." + +#: gui/massadd.cpp:78 gui/massadd.cpp:81 +msgid "... progress ..." +msgstr "... èãÚÐî ..." + +#: gui/massadd.cpp:258 +msgid "Scan complete!" +msgstr "¿ÞèãÚ áÚÞÝçÐÝë!" + +#: gui/massadd.cpp:261 +#, c-format +msgid "Discovered %d new games, ignored %d previously added games." +msgstr "·ÝÞÙÔ×ÕÝÐ %d ÝÞÒëå ÓãÛìÝïþ, ßàÐßãèçÐÝÐ %d àÐÝÕÙ ÔÐÔÐÔ×ÕÝëå ÓãÛìÝïþ." + +#: gui/massadd.cpp:265 +#, c-format +msgid "Scanned %d directories ..." +msgstr "¿àÐÓÛÕÔÖÐÝÐ %d ÔëàíÚâÞàëÙ ..." + +#: gui/massadd.cpp:268 +#, c-format +msgid "Discovered %d new games, ignored %d previously added games ..." +msgstr "·ÝÞÙÔ×ÕÝÐ %d ÝÞÒëå ÓãÛìÝïþ, ßàÐßãèçÐÝÐ %d àÐÝÕÙ ÔÐÔÐÔ×ÕÝëå ÓãÛìÝïþ ..." + +#: gui/options.cpp:84 +msgid "Never" +msgstr "½öÚÞÛö" + +#: gui/options.cpp:84 +msgid "every 5 mins" +msgstr "ÚÞÖÝëï 5 åÒöÛöÝ" + +#: gui/options.cpp:84 +msgid "every 10 mins" +msgstr "ÚÞÖÝëï 10 åÒöÛöÝ" + +#: gui/options.cpp:84 +msgid "every 15 mins" +msgstr "ÚÞÖÝëï 15 åÒöÛöÝ" + +#: gui/options.cpp:84 +msgid "every 30 mins" +msgstr "ÚÞÖÝëï 30 åÒöÛöÝ" + +#: gui/options.cpp:86 +msgid "8 kHz" +msgstr "8 Ú³æ" + +#: gui/options.cpp:86 +msgid "11kHz" +msgstr "11 Ú³æ" + +#: gui/options.cpp:86 +msgid "22 kHz" +msgstr "22 Ú³æ" + +#: gui/options.cpp:86 +msgid "44 kHz" +msgstr "44 Ú³æ" + +#: gui/options.cpp:86 +msgid "48 kHz" +msgstr "48 Ú³æ" + +#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581 +#: gui/options.cpp:650 gui/options.cpp:858 +msgctxt "soundfont" +msgid "None" +msgstr "½Õ ×ÐÔÐÔ×ÕÝë" + +#: gui/options.cpp:388 +msgid "Failed to apply some of the graphic options changes:" +msgstr "½Õ ÐâàëÜÐÛÐáï þÖëæì ×ÜÕÝë ÝÕÚÐâÞàëå ÓàÐäöçÝëå ÝÐÛÐÔ:" + +#: gui/options.cpp:400 +msgid "the video mode could not be changed." +msgstr "ÒöÔíÐàíÖëÜ ÝÕ ÜÞÖÐ Ñëæì ×ÜÕÝÕÝë." + +#: gui/options.cpp:406 +msgid "the fullscreen setting could not be changed" +msgstr "ßÞþÝÐíÚàÐÝÝë àíÖëÜ ÝÕ ÜÞÖÐ Ñëæì ×ÜÕÝÕÝë" + +#: gui/options.cpp:412 +msgid "the aspect ratio setting could not be changed" +msgstr "àíÖëÜ ÚÐàíÚâëàÞþÚö áãÐÔÝÞáöÝ ÑÐÚÞþ ÝÕ ÜÞÖÐ Ñëæì ×ÜÕÝÕÝë" + +#: gui/options.cpp:733 +msgid "Graphics mode:" +msgstr "³àÐä. àíÖëÜ:" + +#: gui/options.cpp:747 +msgid "Render mode:" +msgstr "ÀíÖëÜ àÐáâàã:" + +#: gui/options.cpp:747 gui/options.cpp:748 +msgid "Special dithering modes supported by some games" +msgstr "ÁßÕæëïÛìÝëï àíÖëÜë àíÝÔíàëÝÓã, ßÐÔâàëÜÞþÒÐÝëï ÝÕÚÐâÞàëÜö ÓãÛìÝïÜö" + +#: gui/options.cpp:759 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476 +msgid "Fullscreen mode" +msgstr "¿ÞþÝÐíÚàÐÝÝë àíÖëÜ" + +#: gui/options.cpp:762 +msgid "Aspect ratio correction" +msgstr "ºÐàíÚæëï áãÐÔÝÞáöÝ ÑÐÚÞþ" + +#: gui/options.cpp:762 +msgid "Correct aspect ratio for 320x200 games" +msgstr "ºÐàíÚâÐÒÐæì áãÐÔÝÞáöÝë ÑÐÚÞþ ÔÛï ÓãÛìÝïþ × àí×ÐÛîæëïÙ 320x200" + +#: gui/options.cpp:770 +msgid "Preferred Device:" +msgstr "ÃßÐÔÐÑÐÝÐÕ:" + +#: gui/options.cpp:770 +msgid "Music Device:" +msgstr "³ãÚÐÒÐï ßàëÛÐÔÐ:" + +#: gui/options.cpp:770 gui/options.cpp:772 +msgid "Specifies preferred sound device or sound card emulator" +msgstr "·Ð×ÝÐçÐÕ þßÐÔÐÑÐÝãî ÓãÚÐÒãî ßàëÛÐÔã æö íÜãÛïâÐà ÓãÚÐÒÞÙ ÚÐàâë" + +#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773 +msgid "Specifies output sound device or sound card emulator" +msgstr "·Ð×ÝÐçÐÕ ÒëåÞÔÝãî ÓãÚÐÒãî ßàëÛÐÔã æö íÜãÛïâÐà ÓãÚÐÒÞÙ ÚÐàâë" + +#: gui/options.cpp:772 +msgctxt "lowres" +msgid "Preferred Dev.:" +msgstr "ÃßÐÔÐÑÐÝÐÕ:" + +#: gui/options.cpp:772 +msgctxt "lowres" +msgid "Music Device:" +msgstr "³ãÚ. ßàëÛÐÔÐ:" + +#: gui/options.cpp:799 +msgid "AdLib emulator:" +msgstr "ÍÜãÛïâÐà AdLib:" + +#: gui/options.cpp:799 gui/options.cpp:800 +msgid "AdLib is used for music in many games" +msgstr "³ãÚÐÒÐï ÚÐàâÐ AdLib ÒëÚÐàëáâÞþÒÐÕææÐ ÜÝÞÓöÜö ÓãÛìÝïÜö" + +#: gui/options.cpp:810 +msgid "Output rate:" +msgstr "ÇÐèçëÝï ÓãÚã:" + +#: gui/options.cpp:810 gui/options.cpp:811 +msgid "" +"Higher value specifies better sound quality but may be not supported by your " +"soundcard" +msgstr "" +"±ÞÛìèëï ×ÝÐçíÝÝö ×ÐÔÐîæì ÛÕßèãî ïÚÐáæì ÓãÚã, ÐÔÝÐÚ ïÝë ÜÞÓãæì ÝÕ " +"ßÐÔâàëÜÛöÒÐææÐ ÒÐèÐÙ ÓãÚÐÒÞÙ ÚÐàâÐÙ" + +#: gui/options.cpp:821 +msgid "GM Device:" +msgstr "¿àëÛÐÔÐ GM:" + +#: gui/options.cpp:821 +msgid "Specifies default sound device for General MIDI output" +msgstr "·Ð×ÝÐçÐÕ ÒëåÞÔÝãî ÓãÚÐÒãî ßàëÛÐÔã ÔÛï MIDI" + +#: gui/options.cpp:832 +msgid "Don't use General MIDI music" +msgstr "½Õ ÒëÚÐàëáâÞþÒÐæì Üã×ëÚã ÔÛï General MIDI" + +#: gui/options.cpp:843 gui/options.cpp:909 +msgid "Use first available device" +msgstr "²ëÚÐàëáâÞþÒÐæì ßÕàèãî ÔÐáâãßÝãî ßàëÛÐÔã" + +#: gui/options.cpp:855 +msgid "SoundFont:" +msgstr "SoundFont:" + +#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858 +msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" +msgstr "" +"SoundFont'ë ßÐÔâàëÜÛöÒÐîææÐ ÝÕÚÐâÞàëÜö ÓãÚÐÒëÜö ÚÐàâÐÜö, Fluidsynth Ôë " +"Timidity" + +#: gui/options.cpp:857 +msgctxt "lowres" +msgid "SoundFont:" +msgstr "SoundFont:" + +#: gui/options.cpp:863 +msgid "Mixed AdLib/MIDI mode" +msgstr "·ÜÕèÐÝë àíÖëÜ AdLib/MIDI" + +#: gui/options.cpp:863 +msgid "Use both MIDI and AdLib sound generation" +msgstr "²ëÚÐàëáâÞþÒÐæì ö MIDI, ö AdLib ÔÛï ÓÕÝÕàÐæëö ÓãÚã" + +#: gui/options.cpp:866 +msgid "MIDI gain:" +msgstr "Ã×ÜÐæÝÕÝÝÕ MIDI:" + +#: gui/options.cpp:873 +msgid "FluidSynth Settings" +msgstr "" + +#: gui/options.cpp:880 +msgid "MT-32 Device:" +msgstr "½ÐÛ. MT-32:" + +#: gui/options.cpp:880 +msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" +msgstr "" +"¿ÐÚÐ×ÒÐÕ ÓãÚÐÒãî ßàëÛÐÔã ßÐ ×ÜÐþçÐÝÝö ÔÛï ÒëÒÐÔã ÝÐ Roland MT-32/LAPC1/CM32l/" +"CM64" + +#: gui/options.cpp:885 +msgid "True Roland MT-32 (disable GM emulation)" +msgstr "ÁÐßàÐþÔÝë Roland MT-32 (×ÐÑÐàÐÝöæì íÜãÛïæëî GM)" + +#: gui/options.cpp:885 gui/options.cpp:887 +msgid "" +"Check if you want to use your real hardware Roland-compatible sound device " +"connected to your computer" +msgstr "" +"°Ô×ÝÐçæÕ, ÚÐÛö þ ÒÐá ßÐÔÚÛîçÐÝÐ Roland-áãÜïèçÐÛìÝÐï ÓãÚÐÒÐï ßàëÛÐÔÐ ö Òë " +"ÖÐÔÐÕæÕ ïÕ ÒëÚÐàëáâÞþÒÐæì" + +#: gui/options.cpp:887 +msgctxt "lowres" +msgid "True Roland MT-32 (no GM emulation)" +msgstr "ÁÐßàÐþÔÝë Roland MT-32 (×ÐÑÐàÐÝöæì GM)" + +#: gui/options.cpp:890 +#, fuzzy +msgid "Roland GS Mode (disable GM mapping)" +msgstr "ÁÐßàÐþÔÝë Roland MT-32 (×ÐÑÐàÐÝöæì íÜãÛïæëî GM)" + +#: gui/options.cpp:890 +msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" +msgstr "" +"²ëÚÛîçÐÕ áãßÐáâÐþÛÕÝÝÕ General MIDI ÔÛï ÓãÛìÝïþ × ÓãÚÐÒÞÙ ÔÐàÞÖÚÐÙ ÔÛï " +"Roland MT-32" + +#: gui/options.cpp:899 +msgid "Don't use Roland MT-32 music" +msgstr "½Õ ÒëÚÐàëáâÞþÒÐæì Üã×ëÚã ÔÛï MT-32" + +#: gui/options.cpp:926 +msgid "Text and Speech:" +msgstr "ÂíÚáâ ö ÐÓãçÚÐ:" + +#: gui/options.cpp:930 gui/options.cpp:940 +msgid "Speech" +msgstr "°ÓãçÚÐ" + +#: gui/options.cpp:931 gui/options.cpp:941 +msgid "Subtitles" +msgstr "ÁãÑâëâàë" + +#: gui/options.cpp:932 +msgid "Both" +msgstr "°ÑÞÕ" + +#: gui/options.cpp:934 +msgid "Subtitle speed:" +msgstr "ÅãâÚÐáæì âëâàÐþ:" + +#: gui/options.cpp:936 +msgctxt "lowres" +msgid "Text and Speech:" +msgstr "ÂíÚáâ ö ÐÓãçÚÐ:" + +#: gui/options.cpp:940 +msgid "Spch" +msgstr "°Óãç" + +#: gui/options.cpp:941 +msgid "Subs" +msgstr "ÁãÑ" + +#: gui/options.cpp:942 +msgctxt "lowres" +msgid "Both" +msgstr "°ÑÞÕ" + +#: gui/options.cpp:942 +msgid "Show subtitles and play speech" +msgstr "¿ÐÚÐ×ÒÐæì áãÑâëâàë ö ßàÐÙÓàÐÒÐæì ÓÐÒÞàÚã" + +#: gui/options.cpp:944 +msgctxt "lowres" +msgid "Subtitle speed:" +msgstr "ÅãâÚÐáæì âëâàÐþ:" + +#: gui/options.cpp:960 +msgid "Music volume:" +msgstr "³ãçÝ. Üã×ëÚö:" + +#: gui/options.cpp:962 +msgctxt "lowres" +msgid "Music volume:" +msgstr "³ãçÝ. Üã×ëÚö:" + +#: gui/options.cpp:969 +msgid "Mute All" +msgstr "²ëÚÛ. ãáñ" + +#: gui/options.cpp:972 +msgid "SFX volume:" +msgstr "³ãçÝÐáæì SFX:" + +#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975 +msgid "Special sound effects volume" +msgstr "³ãçÝÐáæì áßÕæëïÛìÝëå ÓãÚÐÒëå íäÕÚâÐþ" + +#: gui/options.cpp:974 +msgctxt "lowres" +msgid "SFX volume:" +msgstr "³ãçÝ. SFX:" + +#: gui/options.cpp:982 +msgid "Speech volume:" +msgstr "³ãçÝ. ÐÓãçÚö:" + +#: gui/options.cpp:984 +msgctxt "lowres" +msgid "Speech volume:" +msgstr "³ãçÝ. ÐÓãçÚö:" + +#: gui/options.cpp:1141 +msgid "Theme Path:" +msgstr "ÈÛïå ÔÐ âíÜ:" + +#: gui/options.cpp:1143 +msgctxt "lowres" +msgid "Theme Path:" +msgstr "´×Õ âíÜë:" + +#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152 +msgid "Specifies path to additional data used by all games or ScummVM" +msgstr "" +"¿ÐÚÐ×ÒÐÕ èÛïå ÔÐ ÔÐÔÐâÚÞÒëå äÐÙÛÐþ ÔÐÔ×ÕÝëå, ÒëÚÐàëáâÞþÒÐÝëå ãáöÜö ÓãÛìÝïÜö, " +"ÐÑÞ ScummVM" + +#: gui/options.cpp:1158 +msgid "Plugins Path:" +msgstr "ÈÛïå ÔÐ ßÛÐÓöÝÐþ:" + +#: gui/options.cpp:1160 +msgctxt "lowres" +msgid "Plugins Path:" +msgstr "ÈÛïå ÔÐ ßÛÐÓöÝÐþ:" + +#: gui/options.cpp:1169 +msgid "Misc" +msgstr "ÀÞ×ÝÐÕ" + +#: gui/options.cpp:1171 +msgctxt "lowres" +msgid "Misc" +msgstr "ÀÞ×ÝÐÕ" + +#: gui/options.cpp:1173 +msgid "Theme:" +msgstr "ÂíÜÐ" + +#: gui/options.cpp:1177 +msgid "GUI Renderer:" +msgstr "¼ÐÛïÒÐÛÚÐ GUI:" + +#: gui/options.cpp:1189 +msgid "Autosave:" +msgstr "°þâÐ×ÐåÐÒÐÝÝÕ:" + +#: gui/options.cpp:1191 +msgctxt "lowres" +msgid "Autosave:" +msgstr "°þâÐ×Ðå.:" + +#: gui/options.cpp:1199 +msgid "Keys" +msgstr "ºÛÐÒöèë" + +#: gui/options.cpp:1206 +msgid "GUI Language:" +msgstr "¼ÞÒÐ GUI:" + +#: gui/options.cpp:1206 +msgid "Language of ScummVM GUI" +msgstr "¼ÞÒÐ ÓàÐäöçÝÐÓÐ öÝâíàäÕÙáã ScummVM" + +#: gui/options.cpp:1365 +msgid "You have to restart ScummVM before your changes will take effect." +msgstr "²ë ßÐÒöÝÝë ßÕàÐ×Ðßãáæöæì ScummVM, ÚÐÑ ãÖëæì ×ÜÕÝë." + +#: gui/options.cpp:1378 +msgid "Select directory for savegames" +msgstr "°ÑïàëæÕ ÔëàíÚâÞàëî ÔÛï ×ÐåÐÒÐÝÝïþ" + +#: gui/options.cpp:1385 +msgid "The chosen directory cannot be written to. Please select another one." +msgstr "½Õ ÜÐÓã ßöáÐæì ã ÐÑàÐÝãî ÔëàíÚâÞàëî. ºÐÛö ÛÐáÚÐ, Ð×ÝÐçæÕ öÝèãî." + +#: gui/options.cpp:1394 +msgid "Select directory for GUI themes" +msgstr "°ÑïàëæÕ ÔëàíÚâÞàëî ÔÛï âíÜ GUI" + +#: gui/options.cpp:1404 +msgid "Select directory for extra files" +msgstr "°ÑïàëæÕ ÔëàíÚâÞàëî × ÔÐÔÐâÚÞÒëÜö äÐÙÛÐÜö" + +#: gui/options.cpp:1415 +msgid "Select directory for plugins" +msgstr "°ÑïàëæÕ ÔëàíÚâÞàëî × ßÛÐÓöÝÐÜö" + +#: gui/options.cpp:1468 +msgid "" +"The theme you selected does not support your current language. If you want " +"to use this theme you need to switch to another language first." +msgstr "" +"ÂíÜÐ, ÐÑàÐÝÐï ÒÐÜö, ÝÕ ßÐÔâàëÜÛöÒÐÕ ÑïÓãçãî ÜÞÒã. ºÐÛö Òë ÖÐÔÐÕæÕ " +"ÒëÚÐàëáâÞþÒÐæì Óíâãî âíÜã, ÒÐÜ ÝÕÐÑåÞÔÝÐ áßÐçÐâÚã ßÕàÐÚÛîçëææÐ ÝÐ öÝèãî ÜÞÒã." + +#: gui/saveload-dialog.cpp:166 +msgid "List view" +msgstr "²ëÓÛïÔ áßöáã" + +#: gui/saveload-dialog.cpp:167 +msgid "Grid view" +msgstr "²ëÓÛïÔ áÕâÚö" + +#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358 +msgid "No date saved" +msgstr "´ÐâÐ ÝÕ ×ÐßöáÐÝÐ" + +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359 +msgid "No time saved" +msgstr "ÇÐá ÝÕ ×ÐßöáÐÝë" + +#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360 +msgid "No playtime saved" +msgstr "ÇÐá ÓãÛìÝö ÝÕ ×ÐßöáÐÝë" + +#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275 +msgid "Delete" +msgstr "²ëÔÐÛöæì" + +#: gui/saveload-dialog.cpp:274 +msgid "Do you really want to delete this savegame?" +msgstr "²ë áÐßàÐþÔë ÖÐÔÐÕæÕ ÒëÔÐÛöæì ÓíâÐ ×ÐåÐÒÐÝÝÕ?" + +#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872 +msgid "Date: " +msgstr "´ÐâÐ: " + +#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878 +msgid "Time: " +msgstr "ÇÐá: " + +#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886 +msgid "Playtime: " +msgstr "ÇÐá ÓãÛìÝö: " + +#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494 +msgid "Untitled savestate" +msgstr "·ÐåÐÒÐÝÝÕ ÑÕ× öÜï" + +#: gui/saveload-dialog.cpp:546 +msgid "Next" +msgstr "½ÐáâãßÝë" + +#: gui/saveload-dialog.cpp:549 +msgid "Prev" +msgstr "¿ÐßïàíÔÝö" + +#: gui/saveload-dialog.cpp:736 +msgid "New Save" +msgstr "½ÞÒÐÕ ×ÐåÐÒÐÝÝÕ" + +#: gui/saveload-dialog.cpp:736 +msgid "Create a new save game" +msgstr "ÁâÒÐàëæì ÝÞÒë ×Ðßöá ÓãÛìÝö" + +#: gui/saveload-dialog.cpp:865 +msgid "Name: " +msgstr "½Ð×ÒÐ: " + +#: gui/saveload-dialog.cpp:937 +#, c-format +msgid "Enter a description for slot %d:" +msgstr "ÃÒïÔ×öæÕ ÐßöáÐÝÝÕ áÛÞâÐ %d:" + +#: gui/themebrowser.cpp:44 +msgid "Select a Theme" +msgstr "°ÑïàëæÕ âíÜã" + +#: gui/ThemeEngine.cpp:337 +msgid "Disabled GFX" +msgstr "±Õ× ÓàÐäöÚö" + +#: gui/ThemeEngine.cpp:337 +msgctxt "lowres" +msgid "Disabled GFX" +msgstr "±Õ× ÓàÐäöÚö" + +#: gui/ThemeEngine.cpp:338 +msgid "Standard Renderer (16bpp)" +msgstr "ÁâÐÝÔÐàâÝë àÐáâÐàë×ÐâÐà (16bpp)" + +#: gui/ThemeEngine.cpp:338 +msgid "Standard (16bpp)" +msgstr "ÁâÐÝÔÐàâÝë àÐáâÐàë×ÐâÐà (16bpp)" + +#: gui/ThemeEngine.cpp:340 +msgid "Antialiased Renderer (16bpp)" +msgstr "ÀÐáâÐàë×ÐâÐà áÐ ×ÓÛÐÔÖÒÐÝÝÕÜ (16bpp)" + +#: gui/ThemeEngine.cpp:340 +msgid "Antialiased (16bpp)" +msgstr "ÀÐáâÐàë×ÐâÐà áÐ ×ÓÛÐÔÖÒÐÝÝÕÜ (16bpp)" + +#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332 +msgid "Clear value" +msgstr "°çëáæöæì ×ÝÐçíÝÝÕ" + +#: base/main.cpp:210 +#, c-format +msgid "Engine does not support debug level '%s'" +msgstr "ÀãåÐÒöçÞÚ ÝÕ ßÐÔâàëÜÛöÒÐÕ þ×àÞÒÕÝì ÐÔÛÐÔÚö '%s'" + +#: base/main.cpp:288 +msgid "Menu" +msgstr "¼ÕÝî" + +#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45 +#: backends/platform/wince/CEActionsPocket.cpp:45 +#: backends/platform/wince/CEActionsSmartphone.cpp:46 +msgid "Skip" +msgstr "¿àÐßãáæöæì" + +#: base/main.cpp:294 backends/platform/symbian/src/SymbianActions.cpp:50 +#: backends/platform/wince/CEActionsPocket.cpp:42 +msgid "Pause" +msgstr "¿Ðþ×Ð" + +#: base/main.cpp:297 +msgid "Skip line" +msgstr "¿àÐßãáæöæì àÐÔÞÚ" + +#: base/main.cpp:468 +msgid "Error running game:" +msgstr "¿ÐÜëÛÚÐ ×ÐßãáÚã ÓãÛìÝö:" + +#: base/main.cpp:492 +msgid "Could not find any engine capable of running the selected game" +msgstr "½Õ ÜÐÓã ×ÝÐÙáæö àãåÐÒöçÞÚ ÔÛï ×ÐßãáÚã ÐÑàÐÝÐÙ ÓãÛìÝö" + +#: common/error.cpp:38 +msgid "No error" +msgstr "½ïÜÐ ßÐÜëÛÚö" + +#: common/error.cpp:40 +msgid "Game data not found" +msgstr "½ïÜÐ äÐÙÛÐþ ÓãÛìÝö" + +#: common/error.cpp:42 +msgid "Game id not supported" +msgstr "Game id ÝÕ ßÐÔâàëÜÛöÒÐÕææÐ" + +#: common/error.cpp:44 +msgid "Unsupported color mode" +msgstr "½ÕßÐÔâàëÜÞþÒÐÝë àíÖëÜ ÚÞÛÕàã" + +#: common/error.cpp:47 +msgid "Read permission denied" +msgstr "½ÕÔÐáâÐâÚÞÒÐ ßàÐÒÞþ ÔÛï çëâÐÝÝï" + +#: common/error.cpp:49 +msgid "Write permission denied" +msgstr "½ÕÔÐáâÐâÚÞÒÐ ßàÐÒÞþ ÔÛï ×Ðßöáã" + +#: common/error.cpp:52 +msgid "Path does not exist" +msgstr "ÈÛïå ÝÕ ×ÝÞÙÔ×ÕÝë" + +#: common/error.cpp:54 +msgid "Path not a directory" +msgstr "ÈÛïå ÝÕ ×'ïþÛïÕææÐ ÔëàíÚâÞàëïÙ" + +#: common/error.cpp:56 +msgid "Path not a file" +msgstr "ÈÛïå ÝÕ ×'ïþÛïÕææÐ äÐÙÛÐÜ" + +#: common/error.cpp:59 +msgid "Cannot create file" +msgstr "½Õ ÜÐÓã áâÒÐàëæì äÐÙÛ" + +#: common/error.cpp:61 +msgid "Reading data failed" +msgstr "¿ÐÜëÛÚÐ çëâÐÝÝï ÔÐÔ×ÕÝëå" + +#: common/error.cpp:63 +msgid "Writing data failed" +msgstr "¿ÐÜëÛÚÐ ×Ðßöáã ÔÐÔ×ÕÝëå" + +#: common/error.cpp:66 +msgid "Could not find suitable engine plugin" +msgstr "½Õ ÜÐÓã ×ÝÐÙáæö ßÐÔëåÞÔÝë ßÛÐÓöÝ ÔÛï àãåÐÒöçÚÐ" + +#: common/error.cpp:68 +msgid "Engine plugin does not support save states" +msgstr "ÀãåÐÒöçÞÚ ÝÕ ßÐÔâàëÜÛöÒÐÕ ×ÐåÐÒÐÝÝö" + +#: common/error.cpp:71 +msgid "User canceled" +msgstr "¿ÕàÐßëÝÕÝÐ ÚÐàëáâÐçÞÜ" + +#: common/error.cpp:75 +msgid "Unknown error" +msgstr "½ÕÒïÔÞÜÐï ßÐÜëÛÚÐ" + +#: engines/advancedDetector.cpp:316 +#, c-format +msgid "The game in '%s' seems to be unknown." +msgstr "·ÔÐÕææÐ, èâÞ ÓãÛìÝï '%s' ïèçí ÝÕÒïÔÞÜÐ." + +#: engines/advancedDetector.cpp:317 +msgid "Please, report the following data to the ScummVM team along with name" +msgstr "" +"ºÐÛö ÛÐáÚÐ, ßÕàÐÔÐÙæÕ ÝÐáâãßÝëï ÔÐÔ×ÕÝëï ÚÐÜÐÝÔ×Õ ScummVM àÐ×ÐÜ × ÝÐ×ÒÐÙ" + +#: engines/advancedDetector.cpp:319 +msgid "of the game you tried to add and its version/language/etc.:" +msgstr "ÓãÛìÝö, ïÚãî Òë áßàÐÑãÕæÕ ÔÐÔÐæì, ö Ð×ÝÐçæÕ ïÕ ÒÕàáöî, ÜÞÒã ö Ó.Ô." + +#: engines/dialogs.cpp:84 +msgid "~R~esume" +msgstr "¿àÐæïÓ~Ý~ãæì" + +#: engines/dialogs.cpp:86 +msgid "~L~oad" +msgstr "~·~ÐÓàã×öæì" + +#: engines/dialogs.cpp:90 +msgid "~S~ave" +msgstr "~·~ÐßöáÐæì" + +#: engines/dialogs.cpp:94 +msgid "~O~ptions" +msgstr "~¾~ßæëö" + +#: engines/dialogs.cpp:99 +msgid "~H~elp" +msgstr "~´~ÐßÐÜÞÓÐ" + +#: engines/dialogs.cpp:101 +msgid "~A~bout" +msgstr "¿àÐ ßàÐ~Ó~àÐÜã" + +#: engines/dialogs.cpp:104 engines/dialogs.cpp:180 +msgid "~R~eturn to Launcher" +msgstr "~²~ëÙáæö þ ÓÐÛÞþÝÐÕ ÜÕÝî" + +#: engines/dialogs.cpp:106 engines/dialogs.cpp:182 +msgctxt "lowres" +msgid "~R~eturn to Launcher" +msgstr "~Ã~ ÓÐÛÞþÝÐÕ ÜÕÝî" + +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284 +#: engines/pegasus/pegasus.cpp:369 +msgid "Save game:" +msgstr "·ÐåÐÒÐæì ÓãÛìÝî:" + +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:369 +#: backends/platform/symbian/src/SymbianActions.cpp:44 +#: backends/platform/wince/CEActionsPocket.cpp:43 +#: backends/platform/wince/CEActionsPocket.cpp:267 +#: backends/platform/wince/CEActionsSmartphone.cpp:45 +#: backends/platform/wince/CEActionsSmartphone.cpp:231 +msgid "Save" +msgstr "·ÐåÐÒÐæì" + +#: engines/dialogs.cpp:144 +msgid "" +"Sorry, this engine does not currently provide in-game help. Please consult " +"the README for basic information, and for instructions on how to obtain " +"further assistance." +msgstr "" +"¿àÐÑÐçæÕ, ÐÛÕ Óíâë àãåÐÒöçÞÚ ßÐÚãÛì ÝÕ ßÐÔÐÕ ÔÐßÐÜÞÓö þ ÓãÛìÝö. ºÐÛö ÛÐáÚÐ, " +"×ÒïàÝöæÕáï þ äÐÙÛ README ×Ð ÑÐ×ÐÒÐÙ öÝäÐàÜÐæëïÙ, Ð âÐÚáÐÜÐ öÝáâàãÚæëïÜö ßàÐ " +"âÞÕ, ïÚ ÐâàëÜÐæì ÔÐÛÕÙèãî ÔÐßÐÜÞÓã." + +#: engines/dialogs.cpp:228 +#, c-format +msgid "" +"Gamestate save failed (%s)! Please consult the README for basic information, " +"and for instructions on how to obtain further assistance." +msgstr "" +"½Õ ÐâàëÜÐÛÐáï ×ÐåÐÒÐæì ÓãÛìÝî (%s)! ºÐÛö ÛÐáÚÐ, ×ÒïàÝöæÕáï þ äÐÙÛ README ×Ð " +"ÑÐ×ÐÒÐÙ öÝäÐàÜÐæëïÙ, Ð âÐÚáÐÜÐ öÝáâàãÚæëïÜö ßàÐ âÞÕ, ïÚ ÐâàëÜÐæì ÔÐÛÕÙèãî " +"ÔÐßÐÜÞÓã." + +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 +#: engines/mohawk/dialogs.cpp:170 +msgid "~O~K" +msgstr "~¾~º" + +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 +#: engines/mohawk/dialogs.cpp:171 +msgid "~C~ancel" +msgstr "~°~ÔÜÕÝÐ" + +#: engines/dialogs.cpp:305 +msgid "~K~eys" +msgstr "~º~ÛÐÒöèë" + +#: engines/engine.cpp:240 +msgid "Could not initialize color format." +msgstr "½Õ ÜÐÓã öÝöæëïÛö×ÐÒÐæì äÐàÜÐâ ÚÞÛÕàã." + +#: engines/engine.cpp:248 +msgid "Could not switch to video mode: '" +msgstr "½Õ ÐâàëÜÐÛÐáï ßÕàÐÚÛîçëæì ÒöÔíÐàíÖëÜ: '" + +#: engines/engine.cpp:257 +msgid "Could not apply aspect ratio setting." +msgstr "½Õ ÐâàëÜÐÛÐáï ÒëÚÐàëáâÐæì ÚÐàíÚæëî áãÐÔÝÞáöÝ ÑÐÚÞþ." + +#: engines/engine.cpp:262 +msgid "Could not apply fullscreen setting." +msgstr "½Õ ÜÐÓã þÖëæì ßÞþÝÐíÚàÐÝÝë àíÖëÜ." + +#: engines/engine.cpp:362 +msgid "" +"You appear to be playing this game directly\n" +"from the CD. This is known to cause problems,\n" +"and it is therefore recommended that you copy\n" +"the data files to your hard disk instead.\n" +"See the README file for details." +msgstr "" +"·ÔÐÕææÐ, Òë áßàÐÑãÕæÕ ×Ðßãáæöæì Óíâã ÓãÛìÝî ßàÐÜÐ\n" +"× CD. ³íâÐ ×ÒëçÐÙÝÐ ÒëÚÛöÚÐÕ ßàÐÑÛÕÜë, ö âÐÜã\n" +"Üë àíÚÐÜÕÝÔãÕÜ áÚÐßöïÒÐæì äÐÙÛë ÔÐÔ×ÕÝëå ÓãÛìÝö\n" +"ÝÐ ÖÞàáâÚö ÔëáÚ. ¿ÐÔàÐÑï×ÝÐáæö ÜÞÖÝÐ ×ÝÐÙáæö þ\n" +"äÐÙÛÕ README." + +#: engines/engine.cpp:373 +msgid "" +"This game has audio tracks in its disk. These\n" +"tracks need to be ripped from the disk using\n" +"an appropriate CD audio extracting tool in\n" +"order to listen to the game's music.\n" +"See the README file for details." +msgstr "" +"´ëáÚ ÓíâÐÙ ÓãÛìÝö þâàëÜÞþÒÐÕ ÓãÚÐÒëï ÔÐàÞÖÚö. ¦å\n" +"ÝÕÐÑåÞÔÝÐ ßÕàÐßöáÐæì × ÔëáÚÐ × ÔÐßÐÜÞÓÐÙ\n" +"ÐÔßÐÒÕÔÝÐÙ ßàÐÓàÐÜë ÔÛï ÚÐßöïÒÐÝÝï\n" +"ÐþÔëñÔëáÚÐþ, ö âÞÛìÚö ßÐáÛï ÓíâÐÓÐ þ ÓãÛìÝö\n" +"×'ïÒöææÐ Üã×ëÚÐ. ¿ÐÔàÐÑï×ÝÐáæö ÜÞÖÝÐ ×ÝÐÙáæö þ\n" +"äÐÙÛÕ README." + +#: engines/engine.cpp:431 +#, c-format +msgid "" +"Gamestate load failed (%s)! Please consult the README for basic information, " +"and for instructions on how to obtain further assistance." +msgstr "" +"½Õ ÐâàëÜÐÛÐáï ßàÐçëâÐæì ×ÐåÐÒÐÝÝÕ ÓãÛìÝö (%s)! ºÐÛö ÛÐáÚÐ, ×ÒïàÝöæÕáï þ äÐÙÛ " +"README ×Ð ÑÐ×ÐÒÐÙ öÝäÐàÜÐæëïÙ, Ð âÐÚáÐÜÐ öÝáâàãÚæëïÜö ßàÐ âÞÕ, ïÚ ÐâàëÜÐæì " +"ÔÐÛÕÙèãî ÔÐßÐÜÞÓã." + +#: engines/engine.cpp:444 +msgid "" +"WARNING: The game you are about to start is not yet fully supported by " +"ScummVM. As such, it is likely to be unstable, and any saves you make might " +"not work in future versions of ScummVM." +msgstr "" +"¿°¿ÏÀÍ´¶°½½µ: ³ãÛìÝï, ïÚãî Òë ×ÑöàÐÕæÕáï ×Ðßãáæöæì, ïèçí ÝÕ ßÐÔâàëÜÛöÒÐÕææÐ " +"ScummVM æÐÛÚÐÜ. ÏÝÐ, åãâçíÙ ×Ð þáñ, ÝÕ ÑãÔ×Õ ßàÐæÐÒÐæì áâÐÑöÛìÝÐ, ö " +"×ÐåÐÒÐÝÝö ÓãÛìÝïþ ÜÞÓãæì ÝÕ ßàÐæÐÒÐæì ã ÑãÔãçëå ÒÕàáöïå ScummVM." + +#: engines/engine.cpp:447 +msgid "Start anyway" +msgstr "Ãáñ ÐÔÝÞ ×Ðßãáæöæì" + +#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270 +#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393 +#: engines/toltecs/detection.cpp:173 +msgid "Use original save/load screens" +msgstr "²ëÚÐàëáâÞþÒÐæì ÐàëÓöÝÐÛìÝëï íÚàÐÝë ×Ðßöáã/çëâÐÝÝö ÓãÛìÝö" + +#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271 +#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394 +#: engines/toltecs/detection.cpp:174 +msgid "Use the original save/load screens, instead of the ScummVM ones" +msgstr "" +"²ëÚÐàëáâÞþÒÐæì ÐàëÓöÝÐÛìÝëï íÚàÐÝë ×Ðßöáã ö ×ÐåÐÒÐÝÝö ÓãÛìÝö ×ÐÜÕáâ " +"×àÞÑÛÕÝëå ã ScummVM" + +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 +msgid "Restore game:" +msgstr "Ã×ÝÐÒöæì ÓãÛìÝî:" + +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 +msgid "Restore" +msgstr "Ã×ÝÐÒöæì" + +#: engines/drascula/saveload.cpp:49 +#, fuzzy +msgid "" +"ScummVM found that you have old savefiles for Drascula that should be " +"converted.\n" +"The old save game format is no longer supported, so you will not be able to " +"load your games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" +msgstr "" +"ScummVM ÒëïÒöþ ã ÒÐá ×ÐåÐÒÐÝÝö ÓãÛìÝö Broken Sword 1 ã áâÐàëÜ äÐàÜÐæÕ.\n" +"ÁâÐàë äÐàÜÐâ ÑÞÛìè ÝÕ ßÐÔâàëÜÛöÒÐÕææÐ, ö, ÚÐÑ ×ÐÓàã×öæì ×ÐåÐÒÐÝÝö, ïÝë " +"ßÐÒöÝÝë Ñëæì ßÕàÐÒÕÔ×ÕÝë þ ÝÞÒë äÐàÜÐâ.\n" +"\n" +"½ÐæöáÝöæÕ ¾º, ÚÐÑ ßÕàÐÒÕáæö öå ã ÝÞÒë äÐàÜÐâ ×ÐàÐ×, ã ÐÔÒÐàÞâÝëÜ ÒëßÐÔÚã " +"ÓíâÐ ßÐÒÕÔÐÜÛÕÝÝÕ ×'ïÒöææÐ ×ÝÞþ ßàë ÝÐáâãßÝëÜ ×ÐßãáÚã ÓãÛìÝö.\n" + +#: engines/dreamweb/detection.cpp:57 +msgid "Use bright palette mode" +msgstr "²ëÚÐàëáâÞþÒÐæì àíÖëÜ ïàÚÐÙ ßÐÛöâàë" + +#: engines/dreamweb/detection.cpp:58 +msgid "Display graphics using the game's bright palette" +msgstr "¼ÐÛîÕ ÓàÐäöÚã × ÒëÚÐàëáâÐÝÝÕÜ ïàÚÐÙ ßÐÛöâàë ÓãÛìÝö" + +#: engines/sci/detection.cpp:373 +msgid "EGA undithering" +msgstr "EGA ÑÕ× àÐáâàã" + +#: engines/sci/detection.cpp:374 +msgid "Enable undithering in EGA games" +msgstr "ÃÚÛîçÐÕ àíÖëÜ ÑÕ× àÐáâàÐÒÐÝÝï þ EGA ÓãÛìÝïå" + +#: engines/sci/detection.cpp:383 +msgid "Prefer digital sound effects" +msgstr "°ÔÔÐÒÐæì ßÕàÐÒÐÓã ÛöçÑÐÒëÜ ÓãÚÐÒëÜ íäÕÚâÐÜ" + +#: engines/sci/detection.cpp:384 +msgid "Prefer digital sound effects instead of synthesized ones" +msgstr "°ÔÔÐÒÐæì ßÕàÐÒÐÓã ÛöçÑÐÒëÜ ÓãÚÐÒëÜ íäÕÚâÐÜ ×ÐÜÕáâ áöÝâí×ÐÒÐÝëå" + +#: engines/sci/detection.cpp:403 +msgid "Use IMF/Yamaha FB-01 for MIDI output" +msgstr "²ëÚÐàëáâÞþÒÐæì IMF/Yamaha FB-01 ÔÛï ÒëÒÐÔã MIDI" + +#: engines/sci/detection.cpp:404 +msgid "" +"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " +"output" +msgstr "" +"²ëÚÐàëáâÞþÒÐæì ÓãÚÐÒãî ÚÐàâã IBM Music Feature æö ÜÞÔãÛì áöÝâí×ã Yamaha " +"FB-01 FM ÔÛï MIDI" + +#: engines/sci/detection.cpp:414 +msgid "Use CD audio" +msgstr "²ëÚÐàëáâÞþÒÐæì CD ÐþÔëñ" + +#: engines/sci/detection.cpp:415 +msgid "Use CD audio instead of in-game audio, if available" +msgstr "" +"²ëÚÐàëáâÞþÒÐæì ÓãÚÐÒëï ÔÐàÞÖÚö × CD ×ÐÜÕáâ Üã×ëÚö × äÐÙÛÐþ ÓãÛìÝö (ÚÐÛö " +"ÔÐáâãßÝÐ)" + +#: engines/sci/detection.cpp:425 +msgid "Use Windows cursors" +msgstr "²ëÚÐàëáâÞþÒÐæì ÚãàáÞàë Windows" + +#: engines/sci/detection.cpp:426 +msgid "" +"Use the Windows cursors (smaller and monochrome) instead of the DOS ones" +msgstr "" +"²ëÚÐàëáâÞþÒÐæì ÚãàáÞàë Windows (ÜÕÝèëï ßÐ ßÐÜÕàë ö ÐÔÝÐÚÐÛïàÞÒëï) ×ÐÜÕáâ " +"ÚãàáÞàÐþ DOS" + +#: engines/sci/detection.cpp:436 +msgid "Use silver cursors" +msgstr "²ëÚÐàëáâÞþÒÐæì áàíÑÝëï ÚãàáÞàë" + +#: engines/sci/detection.cpp:437 +msgid "" +"Use the alternate set of silver cursors, instead of the normal golden ones" +msgstr "" +"²ëÚÐàëáâÞþÒÐæì ÐÛìâíàÝÐâëþÝë ÝÐÑÞà áàíÑÝëå ÚãàáÞàÐþ ×ÐÜÕáâ ×ÒëçÐÙÝëå ×ÐÛÐâëå" + +#: engines/scumm/dialogs.cpp:175 +#, c-format +msgid "Insert Disk %c and Press Button to Continue." +msgstr "ÃáâÐþæÕ ÔëáÚ %c ö ÝÐæöáÝöæÕ ÚÛÐÒöèã, ÚÐÑ ßàÐæïÓÝãæì." + +#: engines/scumm/dialogs.cpp:176 +#, c-format +msgid "Unable to Find %s, (%c%d) Press Button." +msgstr "½Õ ÐâàëÜÐÛÐáï ×ÝÐÙáæö %s, (%c%d) ½ÐæöáÝöæÕ ÚÛÐÒöèã." + +#: engines/scumm/dialogs.cpp:177 +#, c-format +msgid "Error reading disk %c, (%c%d) Press Button." +msgstr "¿ÐÜëÛÚÐ çëâÐÝÝï ÔëáÚÐ %c, (%c%d) ½ÐæöáÝöæÕ ÚÛÐÒöèã." + +#: engines/scumm/dialogs.cpp:178 +msgid "Game Paused. Press SPACE to Continue." +msgstr "³ãÛìÝï áßëÝÕÝÐ. ½ÐæöáÝöæÕ ßàÐÑÕÛ, ÚÐÑ ßàÐæïÓÝãæì." + +#. I18N: You may specify 'Yes' symbol at the end of the line, like this: +#. "Moechten Sie wirklich neu starten? (J/N)J" +#. Will react to J as 'Yes' +#: engines/scumm/dialogs.cpp:182 +msgid "Are you sure you want to restart? (Y/N)" +msgstr "²ë þßíþÝÕÝë, èâÞ ÖÐÔÐÕæÕ ßÐçÐæì ö×ÝÞþ? (Y/N)" + +#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment +#: engines/scumm/dialogs.cpp:184 +msgid "Are you sure you want to quit? (Y/N)" +msgstr "²ë þßíþÝÕÝë, èâÞ ÖÐÔÐÕæÕ ÒëÙáæö? (Y/N)" + +#: engines/scumm/dialogs.cpp:189 +msgid "Play" +msgstr "³ãÛïæì" + +#: engines/scumm/dialogs.cpp:191 engines/scumm/help.cpp:82 +#: engines/scumm/help.cpp:84 +#: backends/platform/symbian/src/SymbianActions.cpp:52 +#: backends/platform/wince/CEActionsPocket.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:52 +#: backends/events/default/default-events.cpp:213 +msgid "Quit" +msgstr "²ëåÐÔ" + +#: engines/scumm/dialogs.cpp:193 +msgid "Insert save/load game disk" +msgstr "ÃáâÐþæÕ ÔëáÚ × ×ÐåÐÒÐÝÝïÜö" + +#: engines/scumm/dialogs.cpp:194 +msgid "You must enter a name" +msgstr "²ë ßÐÒöÝÝë þÒÕáæö öÜï" + +#: engines/scumm/dialogs.cpp:195 +msgid "The game was NOT saved (disk full?)" +msgstr "³ãÛìÝï ½µ ±Ë»° ×ÐßöáÐÝÐ (ÔëáÚ ßÞþÝë?)" + +#: engines/scumm/dialogs.cpp:196 +msgid "The game was NOT loaded" +msgstr "³ãÛìÝï ½µ ±Ë»° ×ÐÓàãÖÐÝÐ" + +#: engines/scumm/dialogs.cpp:197 +#, c-format +msgid "Saving '%s'" +msgstr "·ÐåÞþÒÐî '%s'" + +#: engines/scumm/dialogs.cpp:198 +#, c-format +msgid "Loading '%s'" +msgstr "·ÐÓàãÖÐî '%s'" + +#: engines/scumm/dialogs.cpp:199 +msgid "Name your SAVE game" +msgstr "½Ð×ÐÒöæÕ ×ÐåÐÒÐÝÝÕ ÓãÛìÝö" + +#: engines/scumm/dialogs.cpp:200 +msgid "Select a game to LOAD" +msgstr "°ÑïàëæÕ ÓãÛìÝî ÔÛï ×ÐÓàã×Úö" + +#: engines/scumm/dialogs.cpp:201 +msgid "Game title)" +msgstr "½Ð×ÒÐ ÓãÛìÝö)" + +#. I18N: Previous page button +#: engines/scumm/dialogs.cpp:287 +msgid "~P~revious" +msgstr "~¿~Ðßïà" + +#. I18N: Next page button +#: engines/scumm/dialogs.cpp:289 +msgid "~N~ext" +msgstr "~½~Ðáâ" + +#: engines/scumm/dialogs.cpp:290 +#: backends/platform/ds/arm9/source/dsoptions.cpp:56 +msgid "~C~lose" +msgstr "~·~ÐÚàëæì" + +#: engines/scumm/dialogs.cpp:597 +msgid "Speech Only" +msgstr "ÂÞÛìÚö ÐÓãçÚÐ" + +#: engines/scumm/dialogs.cpp:598 +msgid "Speech and Subtitles" +msgstr "°ÓãçÚÐ ö áãÑâëâàë" + +#: engines/scumm/dialogs.cpp:599 +msgid "Subtitles Only" +msgstr "ÂÞÛìÚö áãÑâëâàë" + +#: engines/scumm/dialogs.cpp:607 +msgctxt "lowres" +msgid "Speech & Subs" +msgstr "°ÓãçÚÐ ö âíÚáâ" + +#: engines/scumm/dialogs.cpp:653 +msgid "Select a Proficiency Level." +msgstr "°ÑïàëæÕ þ×àÞÒÕÝì áÚÛÐÔÐÝÐáæö." + +#: engines/scumm/dialogs.cpp:655 +msgid "Refer to your Loom(TM) manual for help." +msgstr "·Ð ÔÐßÐÜÞÓÐÙ ×ÒïàÝöæÕáï ÔÐ öÝáâàãÚæëö Loom(TM)." + +#: engines/scumm/dialogs.cpp:658 +msgid "Standard" +msgstr "ÁâÐÝÔÐàâÝë" + +#: engines/scumm/dialogs.cpp:659 +msgid "Practice" +msgstr "¿àÐÚâëÚÐÝâ" + +#: engines/scumm/dialogs.cpp:660 +msgid "Expert" +msgstr "ÍÚáßÕàâ" + +#: engines/scumm/help.cpp:73 +msgid "Common keyboard commands:" +msgstr "°ÓãÛìÝëï ÚÛÐÒöïâãàÝëï ÚÐÜÐÝÔë:" + +#: engines/scumm/help.cpp:74 +msgid "Save / Load dialog" +msgstr "´ëïÛÞÓ ×Ðßöáã / çëâÐÝÝï" + +#: engines/scumm/help.cpp:76 +msgid "Skip line of text" +msgstr "¿àÐßãáæöæì àÐÔÞÚ" + +#: engines/scumm/help.cpp:77 +msgid "Esc" +msgstr "Esc" + +#: engines/scumm/help.cpp:77 +msgid "Skip cutscene" +msgstr "¿àÐßãáæöæì ×ÐáâÐþÚã" + +#: engines/scumm/help.cpp:78 +msgid "Space" +msgstr "¿àÐÑÕÛ" + +#: engines/scumm/help.cpp:78 +msgid "Pause game" +msgstr "¿Ðþ×Ð ÓãÛìÝö" + +#: engines/scumm/help.cpp:79 engines/scumm/help.cpp:84 +#: engines/scumm/help.cpp:95 engines/scumm/help.cpp:96 +#: engines/scumm/help.cpp:97 engines/scumm/help.cpp:98 +#: engines/scumm/help.cpp:99 engines/scumm/help.cpp:100 +#: engines/scumm/help.cpp:101 engines/scumm/help.cpp:102 +msgid "Ctrl" +msgstr "Ctrl" + +#: engines/scumm/help.cpp:79 +msgid "Load game state 1-10" +msgstr "·ÐÓàã×öæì ÓãÛìÝî 1-10" + +#: engines/scumm/help.cpp:80 engines/scumm/help.cpp:84 +#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:100 +#: engines/scumm/help.cpp:101 engines/scumm/help.cpp:102 +msgid "Alt" +msgstr "Alt" + +#: engines/scumm/help.cpp:80 +msgid "Save game state 1-10" +msgstr "·ÐåÐÒÐæì ÓãÛìÝî 1-10" + +#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89 +msgid "Enter" +msgstr "ÃÒÞÔ" + +#: engines/scumm/help.cpp:86 +msgid "Toggle fullscreen" +msgstr "¿ÕàÐÚÛîçëæì ÝÐ þÒÕáì íÚàÐÝ" + +#: engines/scumm/help.cpp:87 +msgid "Music volume up / down" +msgstr "³ãçÝÐáæì Üã×ëÚö ßÐÒïÛöçëæì / ßÐÜÕÝèëæì" + +#: engines/scumm/help.cpp:88 +msgid "Text speed slower / faster" +msgstr "ÅãâÚÐáæì âíÚáâã åãâçíÙ / ßÐÒÞÛìÝÕÙ" + +#: engines/scumm/help.cpp:89 +msgid "Simulate left mouse button" +msgstr "ÍÜãÛïæëï ÛÕÒÐÙ ÚÛÐÒöèë Üëèë" + +#: engines/scumm/help.cpp:90 +msgid "Tab" +msgstr "Tab" + +#: engines/scumm/help.cpp:90 +msgid "Simulate right mouse button" +msgstr "ÍÜãÛïæëï ßàÐÒÐÙ ÚÛÐÒöèë Üëèë" + +#: engines/scumm/help.cpp:93 +msgid "Special keyboard commands:" +msgstr "ÁßÕæëïÛìÝëï ÚÛÐÒöïâãàÝëï ÚÐÜÐÝÔë:" + +#: engines/scumm/help.cpp:94 +msgid "Show / Hide console" +msgstr "¿ÐÚÐ×Ðæì / ¿àëÑàÐæì ÚÐÝáÞÛì" + +#: engines/scumm/help.cpp:95 +msgid "Start the debugger" +msgstr "·ÐßãáÚ ÐÔÛÐÔçëÚÐ" + +#: engines/scumm/help.cpp:96 +msgid "Show memory consumption" +msgstr "¿ÐÚÐ×Ðæì áßÐÖëÒÐÝÝÕ ßÐÜïæö" + +#: engines/scumm/help.cpp:97 +msgid "Run in fast mode (*)" +msgstr "·Ðßãáæöæì åãâÚö àíÖëÜ (*)" + +#: engines/scumm/help.cpp:98 +msgid "Run in really fast mode (*)" +msgstr "·Ðßãáæöæì ÒÕÛìÜö åãâÚö àíÖëÜ (*)" + +#: engines/scumm/help.cpp:99 +msgid "Toggle mouse capture" +msgstr "¿ÕàÐÚÛîçíÝÝÕ ßÕàÐåÞßã Üëèë" + +#: engines/scumm/help.cpp:100 +msgid "Switch between graphics filters" +msgstr "¿ÕàÐÚÛîçíÝÝÕ ßÐÜöÖ ÓàÐäöçÝëÜö äöÛìâàÐÜö" + +#: engines/scumm/help.cpp:101 +msgid "Increase / Decrease scale factor" +msgstr "¿ÐÒïÛöçëæì/ßÐÜÕÝèëæì ÜÐèâÐÑ" + +#: engines/scumm/help.cpp:102 +msgid "Toggle aspect-ratio correction" +msgstr "¿ÕàÐÚÛîçíÝÝÕ ÚÐàíÚæëö áãÐÔÝÞáöÝ ÑÐÚÞþ" + +#: engines/scumm/help.cpp:107 +msgid "* Note that using ctrl-f and" +msgstr "* ²ëÚÐàëáâÐÝÝÕ ctrl-f ö" + +#: engines/scumm/help.cpp:108 +msgid " ctrl-g are not recommended" +msgstr " ctrl-g ÝÕ àíÚÐÜÕÝÔãÕææÐ," + +#: engines/scumm/help.cpp:109 +msgid " since they may cause crashes" +msgstr " ÑÞ ïÝë ÜÞÓãæì ßàëÒÕáæö ÔÐ" + +#: engines/scumm/help.cpp:110 +msgid " or incorrect game behavior." +msgstr " ÝïßàÐÒöÛìÝÐÙ àÐÑÞâë ÓãÛìÝö." + +#: engines/scumm/help.cpp:114 +msgid "Spinning drafts on the keyboard:" +msgstr "·ÜïÝïÝëï çÐàÝÐÒöÚö ÝÐ ÚÛÐÒöïâãàë:" + +#: engines/scumm/help.cpp:116 +msgid "Main game controls:" +msgstr "°áÝÞþÝÐÕ ÚöàÐÒÐÝÝÕ ÓãÛìÝñÙ:" + +#: engines/scumm/help.cpp:121 engines/scumm/help.cpp:136 +#: engines/scumm/help.cpp:161 +msgid "Push" +msgstr "¿åÐæì" + +#: engines/scumm/help.cpp:122 engines/scumm/help.cpp:137 +#: engines/scumm/help.cpp:162 +msgid "Pull" +msgstr "ÆïÓÝãæì" + +#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138 +#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197 +#: engines/scumm/help.cpp:207 +msgid "Give" +msgstr "´Ðæì" + +#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139 +#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190 +#: engines/scumm/help.cpp:208 +msgid "Open" +msgstr "°ÔÚàëæì" + +#: engines/scumm/help.cpp:126 +msgid "Go to" +msgstr "¦áæö" + +#: engines/scumm/help.cpp:127 +msgid "Get" +msgstr "Ã×ïæì" + +#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152 +#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:198 +#: engines/scumm/help.cpp:213 engines/scumm/help.cpp:224 +#: engines/scumm/help.cpp:250 +msgid "Use" +msgstr "²ëÚÐàëáâÐæì" + +#: engines/scumm/help.cpp:129 engines/scumm/help.cpp:141 +msgid "Read" +msgstr "ÇëâÐæì" + +#: engines/scumm/help.cpp:130 engines/scumm/help.cpp:147 +msgid "New kid" +msgstr "½ÞÒë ßÕàá" + +#: engines/scumm/help.cpp:131 engines/scumm/help.cpp:153 +#: engines/scumm/help.cpp:171 +msgid "Turn on" +msgstr "ÃÚÛîçëæì" + +#: engines/scumm/help.cpp:132 engines/scumm/help.cpp:154 +#: engines/scumm/help.cpp:172 +msgid "Turn off" +msgstr "²ëÚÛîçëæì" + +#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167 +#: engines/scumm/help.cpp:194 +msgid "Walk to" +msgstr "¦áæö ÔÐ" + +#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168 +#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210 +#: engines/scumm/help.cpp:227 +msgid "Pick up" +msgstr "¿ÐÔÝïæì" + +#: engines/scumm/help.cpp:144 engines/scumm/help.cpp:169 +msgid "What is" +msgstr "ÈâÞ âÐÚÞÕ" + +#: engines/scumm/help.cpp:146 +msgid "Unlock" +msgstr "°ÔÚàëæì" + +#: engines/scumm/help.cpp:149 +msgid "Put on" +msgstr "¿ÐÚÛÐáæö" + +#: engines/scumm/help.cpp:150 +msgid "Take off" +msgstr "¿ÐÔÝïæì" + +#: engines/scumm/help.cpp:156 +msgid "Fix" +msgstr "²ëßàÐÒöæì" + +#: engines/scumm/help.cpp:158 +msgid "Switch" +msgstr "¿ÕàÐÚÛîçëæì" + +#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228 +msgid "Look" +msgstr "³ÛïÔ×Õæì" + +#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223 +msgid "Talk" +msgstr "³ÐÒÐàëæì" + +#: engines/scumm/help.cpp:174 +msgid "Travel" +msgstr "¿ÐÔÐàÞÖÝöçÐæì" + +#: engines/scumm/help.cpp:175 +msgid "To Henry / To Indy" +msgstr "³ÕÝàë/¦ÝÔë" + +#. I18N: These are different musical notes +#: engines/scumm/help.cpp:179 +msgid "play C minor on distaff" +msgstr "öÓàÐæì ÔÞ ÜöÝÞà ÝÐ ÚÐÛÐþàÞæÕ" + +#: engines/scumm/help.cpp:180 +msgid "play D on distaff" +msgstr "öÓàÐæì àí ÝÐ ÚÐÛÐþàÞæÕ" + +#: engines/scumm/help.cpp:181 +msgid "play E on distaff" +msgstr "öÓàÐæì Üö ÝÐ ÚÐÛÐþàÞæÕ" + +#: engines/scumm/help.cpp:182 +msgid "play F on distaff" +msgstr "öÓàÐæì äÐ ÝÐ ÚÐÛÐþàÞæÕ" + +#: engines/scumm/help.cpp:183 +msgid "play G on distaff" +msgstr "öÓàÐæì áÞÛì ÝÐ ÚÐÛÐþàÞæÕ" + +#: engines/scumm/help.cpp:184 +msgid "play A on distaff" +msgstr "öÓàÐæì Ûï ÝÐ ÚÐÛÐþàÞæÕ" + +#: engines/scumm/help.cpp:185 +msgid "play B on distaff" +msgstr "öÓàÐæì áö ÝÐ ÚÐÛÐþàÞæÕ" + +#: engines/scumm/help.cpp:186 +msgid "play C major on distaff" +msgstr "öÓàÐæì ÔÞ ÜÐÖÞà ÝÐ ÚÐÛÐþàÞæÕ" + +#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214 +msgid "puSh" +msgstr "ßåÐæì" + +#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215 +msgid "pull (Yank)" +msgstr "æïÓÝãæì (çÐßÛïæì)" + +#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212 +#: engines/scumm/help.cpp:248 +msgid "Talk to" +msgstr "³ÐÒÐàëæì ×" + +#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211 +msgid "Look at" +msgstr "³ÛïÔ×Õæì ÝÐ" + +#: engines/scumm/help.cpp:200 +msgid "turn oN" +msgstr "ãÚÛîçëæì" + +#: engines/scumm/help.cpp:201 +msgid "turn oFf" +msgstr "ÒëÚÛîçëæì" + +#: engines/scumm/help.cpp:217 +msgid "KeyUp" +msgstr "ÃÒÕàå" + +#: engines/scumm/help.cpp:217 +msgid "Highlight prev dialogue" +msgstr "¿ÐÔáÒïâÛöæì ßÐßïàíÔÝö ÔëïÛÞÓ" + +#: engines/scumm/help.cpp:218 +msgid "KeyDown" +msgstr "ÃÝö×" + +#: engines/scumm/help.cpp:218 +msgid "Highlight next dialogue" +msgstr "¿ÐÔáÒïâÛöæì ÝÐáâãßÝë ÔëïÛÞÓ" + +#: engines/scumm/help.cpp:222 +msgid "Walk" +msgstr "¦áæö" + +#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234 +#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249 +msgid "Inventory" +msgstr "¦ÝÒÕÝâÐà" + +#: engines/scumm/help.cpp:226 +msgid "Object" +msgstr "°Ñ'ÕÚâ" + +#: engines/scumm/help.cpp:229 +msgid "Black and White / Color" +msgstr "ÇÞàÝÐ-ÑÕÛë / ºÐÛïàÞÒë" + +#: engines/scumm/help.cpp:232 +msgid "Eyes" +msgstr "²Þçë" + +#: engines/scumm/help.cpp:233 +msgid "Tongue" +msgstr "Ï×ëÚ" + +#: engines/scumm/help.cpp:235 +msgid "Punch" +msgstr "ÃÔÐà" + +#: engines/scumm/help.cpp:236 +msgid "Kick" +msgstr "½ÐÓÞÙ" + +#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247 +msgid "Examine" +msgstr "¿àÐÒÕàëæì" + +#: engines/scumm/help.cpp:240 +msgid "Regular cursor" +msgstr "·ÒëçÐÙÝë ÚãàáÞà" + +#. I18N: Comm is a communication device +#: engines/scumm/help.cpp:243 +msgid "Comm" +msgstr "ºÐÜ" + +#: engines/scumm/help.cpp:246 +msgid "Save / Load / Options" +msgstr "·ÐÓàã×öæì / ·ÐåÐÒÐæì / ½ÐÛÐÔë" + +#: engines/scumm/help.cpp:255 +msgid "Other game controls:" +msgstr "°áâÐâÝïÕ ÚöàÐÒÐÝÝÕ ÓãÛìÝñÙ:" + +#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267 +msgid "Inventory:" +msgstr "¦ÝÒÕÝâÐà:" + +#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274 +msgid "Scroll list up" +msgstr "¿àÐÚàãæöæì áßöá ãÒÕàå" + +#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275 +msgid "Scroll list down" +msgstr "¿àÐÚàãæöæì áßöá ãÝö×" + +#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268 +msgid "Upper left item" +msgstr "²ÕàåÝö ÛÕÒë ßàÐÔÜÕâ" + +#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270 +msgid "Lower left item" +msgstr "½öÖÝö ÛÕÒë ßàÐÔÜÕâ" + +#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271 +msgid "Upper right item" +msgstr "²ÕàåÝö ßàÐÒë ßàÐÔÜÕâ" + +#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273 +msgid "Lower right item" +msgstr "½öÖÝö ßàÐÒë ßàÐÔÜÕâ" + +#: engines/scumm/help.cpp:269 +msgid "Middle left item" +msgstr "ÁïàíÔÝö ÛÕÒë ßàÐÔÜÕâ" + +#: engines/scumm/help.cpp:272 +msgid "Middle right item" +msgstr "ÁïàíÔÝö ßàÐÒë ßàÐÔÜÕâ" + +#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284 +msgid "Switching characters:" +msgstr "·ÜÕÝÐ ÓÕàÞï:" + +#: engines/scumm/help.cpp:281 +msgid "Second kid" +msgstr "´àãÓö ÓÕàÞÙ" + +#: engines/scumm/help.cpp:282 +msgid "Third kid" +msgstr "Âàíæö ÓÕàÞÙ" + +#: engines/scumm/help.cpp:294 +msgid "Fighting controls (numpad):" +msgstr "ºöàÐÒÐÝÝÕ ÑÞÕÜ (ÛöçÑÐÒëï ÚÛÐÒöèë)" + +#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296 +#: engines/scumm/help.cpp:297 +msgid "Step back" +msgstr "ºàÞÚ ÝÐ×ÐÔ" + +#: engines/scumm/help.cpp:298 +msgid "Block high" +msgstr "°ÑÐàÞÝÐ ×ÒÕàåã" + +#: engines/scumm/help.cpp:299 +msgid "Block middle" +msgstr "°ÑÐàÞÝÐ ßÐáïàíÔ×öÝÕ" + +#: engines/scumm/help.cpp:300 +msgid "Block low" +msgstr "°ÑÐàÞÝÐ ×Ýö×ã" + +#: engines/scumm/help.cpp:301 +msgid "Punch high" +msgstr "ÃÔÐà ×ÒÕàåã" + +#: engines/scumm/help.cpp:302 +msgid "Punch middle" +msgstr "ÃÔÐà ßÐáïàíÔ×öÝÕ" + +#: engines/scumm/help.cpp:303 +msgid "Punch low" +msgstr "ÃÔÐà ×Ýö×ã" + +#: engines/scumm/help.cpp:306 +msgid "These are for Indy on left." +msgstr "³íâÐ ÚÐÛö ¦ÝÔë ×ÛÕÒÐ." + +#: engines/scumm/help.cpp:307 +msgid "When Indy is on the right," +msgstr "ºÐÛö ¦ÝÔë áßàÐÒÐ," + +#: engines/scumm/help.cpp:308 +msgid "7, 4, and 1 are switched with" +msgstr "7, 4 ö 1 ×ÜïÝïîææÐ ×" + +#: engines/scumm/help.cpp:309 +msgid "9, 6, and 3, respectively." +msgstr "9, 6 ö 3 ÐÔßÐÒÕÔÝÐ." + +#: engines/scumm/help.cpp:316 +msgid "Biplane controls (numpad):" +msgstr "ºöàÐÒÐÝÝÕ áÐÜÐÛñâÐÜ (ÛöçÑÐÒëï ÚÛÐÒöèë)" + +#: engines/scumm/help.cpp:317 +msgid "Fly to upper left" +msgstr "»ïæÕæì ÝÐÛÕÒÐ-þÒÕàå" + +#: engines/scumm/help.cpp:318 +msgid "Fly to left" +msgstr "»ïæÕæì ÝÐÛÕÒÐ" + +#: engines/scumm/help.cpp:319 +msgid "Fly to lower left" +msgstr "»ïæÕæì ÝÐÛÕÒÐ-þÝö×" + +#: engines/scumm/help.cpp:320 +msgid "Fly upwards" +msgstr "»ïæÕæì ãÒÕàå" + +#: engines/scumm/help.cpp:321 +msgid "Fly straight" +msgstr "»ïæÕæì ßàÐÜÐ" + +#: engines/scumm/help.cpp:322 +msgid "Fly down" +msgstr "»ïæÕæì ãÝö×" + +#: engines/scumm/help.cpp:323 +msgid "Fly to upper right" +msgstr "»ïæÕæì ÝÐßàÐÒÐ-þÒÕàå" + +#: engines/scumm/help.cpp:324 +msgid "Fly to right" +msgstr "»ïæÕæì ÝÐßàÐÒÐ" + +#: engines/scumm/help.cpp:325 +msgid "Fly to lower right" +msgstr "»ïæÕæì ÝÐßàÐÒÐ-þÝö×" + +#: engines/scumm/scumm.cpp:1776 +#, c-format +msgid "" +"Native MIDI support requires the Roland Upgrade from LucasArts,\n" +"but %s is missing. Using AdLib instead." +msgstr "" +"ÀíÖëÜ \"àÞÔÝÐÓÐ\" MIDI ßÐâàÐÑãÕ ÐÑÝÐþÛÕÝÝÕ Roland Upgrade ÐÔ\n" +"LucasArts, ÐÛÕ ÝÕ åÐßÐÕ %s. ¿ÕàÐÚÛîçÐîáï ÝÐ AdLib." + +#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220 +#, c-format +msgid "" +"Failed to save game state to file:\n" +"\n" +"%s" +msgstr "" +"½Õ ÐâàëÜÐÛÐáï ×ÐßöáÐæì ÓãÛìÝî þ äÐÙÛ:\n" +"\n" +"%s" + +#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185 +#, c-format +msgid "" +"Failed to load game state from file:\n" +"\n" +"%s" +msgstr "" +"½Õ ÐâàëÜÐÛÐáï ×ÐÓàã×öæì ÓãÛìÝî × äÐÙÛÐ:\n" +"\n" +"%s" + +#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228 +#, c-format +msgid "" +"Successfully saved game state in file:\n" +"\n" +"%s" +msgstr "" +"³ãÛìÝï ßÐáßïåÞÒÐ ×ÐåÐÒÐÝÐ þ äÐÙÛ:\n" +"\n" +"%s" + +#: engines/scumm/scumm.cpp:2537 +msgid "" +"Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " +"play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " +"directory inside the Tentacle game directory." +msgstr "" +"·ÐàÐ× ßÐÒöÝÝÐ ×ÐßãáæöææÐ ÓãÛìÝï Maniac Mansion. °ÛÕ ScummVM ßÐÚãÛì ÓíâÐÓÐ ÝÕ " +"þÜÕÕ. ºÐÑ ×ÓãÛïæì, ÝÐæöáÝöæÕ '½ÞÒÐï ÓãÛìÝï' ã áâÐàâÐÒëÜ ÜÕÝî ScummVM, Ð " +"×ÐâëÜ ÐÑïàëæÕ ÔëàíÚâÞàëî Maniac ã ÔëàíÚâÞàëö × ÓãÛìÝñÙ Tentacle." + +#. I18N: Option for fast scene switching +#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167 +msgid "~Z~ip Mode Activated" +msgstr "ÀíÖëÜ åãâÚÐÓÐ ßÕàÐåÞÔã ÐÚâëÒÐÒÐÝë" + +#: engines/mohawk/dialogs.cpp:93 +msgid "~T~ransitions Enabled" +msgstr "¿ÕàÐåÞÔë ÐÚâëÒÐÒÐÝë" + +#. I18N: Drop book page +#: engines/mohawk/dialogs.cpp:95 +msgid "~D~rop Page" +msgstr "²ëÚöÝãæì áâÐàÞÝÚã" + +#: engines/mohawk/dialogs.cpp:99 +msgid "~S~how Map" +msgstr "¿ÞÚÐ×Ðâì ÚÐàâã" + +#: engines/mohawk/dialogs.cpp:105 +msgid "~M~ain Menu" +msgstr "³ÐÛÞþÝÐÕ ÜÕÝî" + +#: engines/mohawk/dialogs.cpp:168 +msgid "~W~ater Effect Enabled" +msgstr "ÍäÕÚâë ÒÐÔë þÚÛîçÐÝë" + +#: engines/agos/animation.cpp:557 +#, c-format +msgid "Cutscene file '%s' not found!" +msgstr "ÄÐÙÛ ×ÐáâÐþÚö '%s' ÝÕ ×ÝÞÙÔ×ÕÝë!" + +#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 +#: engines/tinsel/saveload.cpp:532 +msgid "Failed to load game state from file." +msgstr "½Õ ÐâàëÜÐÛÐáï ×ÐÓàã×öæì ×ÐåÐÒÐÝãî ÓãÛìÝî × äÐÙÛÐ." + +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545 +msgid "Failed to save game state to file." +msgstr "½Õ ÐâàëÜÐÛÐáï ×ÐåÐÒÐæì ÓãÛìÝî þ äÐÙÛ." + +#: engines/gob/inter_v5.cpp:107 +msgid "Failed to delete file." +msgstr "½Õ ÐâàëÜÐÛÐáï ÒëÔÐÛöæì äÐÙÛ." + +#: engines/groovie/detection.cpp:312 +#, fuzzy +msgid "Fast movie speed" +msgstr "ÅãâÚö àíÖëÜ" + +#: engines/groovie/detection.cpp:313 +msgid "Play movies at an increased speed" +msgstr "" + +#: engines/groovie/script.cpp:420 +msgid "Failed to save game" +msgstr "½Õ ÐâàëÜÐÛÐáï ×ÐåÐÒÐæì ÓãÛìÝî" + +#. I18N: Studio audience adds an applause and cheering sounds whenever +#. Malcolm makes a joke. +#: engines/kyra/detection.cpp:62 +msgid "Studio audience" +msgstr "ÁâãÔëÙÝÐï ÐþÔëâÞàëï" + +#: engines/kyra/detection.cpp:63 +msgid "Enable studio audience" +msgstr "ÃÚÛîçëæì ÓãÚö ÐþÔëâÞàëö þ áâãÔëö" + +#. I18N: This option allows the user to skip text and cutscenes. +#: engines/kyra/detection.cpp:73 +msgid "Skip support" +msgstr "¿ÐÔâàëÜÚÐ ßàÞßãáÚÐþ" + +#: engines/kyra/detection.cpp:74 +msgid "Allow text and cutscenes to be skipped" +msgstr "ÃÚÛîçÐÕ ÜÐÓçëÜÐáæì ßàÐßãáÚÐæì âíÚáâë ö ×ÐáâÐþÚö" + +#. I18N: Helium mode makes people sound like they've inhaled Helium. +#: engines/kyra/detection.cpp:84 +msgid "Helium mode" +msgstr "ÀíÖëÜ ÓÕÛöï" + +#: engines/kyra/detection.cpp:85 +msgid "Enable helium mode" +msgstr "ÃÚÛîçëæì àíÖëÜ ÓÕÛöï" + +#. I18N: When enabled, this option makes scrolling smoother when +#. changing from one screen to another. +#: engines/kyra/detection.cpp:99 +msgid "Smooth scrolling" +msgstr "¿ÛëþÝÐï ßàÐÓÞàâÚÐ" + +#: engines/kyra/detection.cpp:100 +msgid "Enable smooth scrolling when walking" +msgstr "ÃÚÛîçëæì ßÛëþÝãî ßàÐÓÞàâÚã ßÐÔçÐá åÐÔë" + +#. I18N: When enabled, this option changes the cursor when it floats to the +#. edge of the screen to a directional arrow. The player can then click to +#. walk towards that direction. +#: engines/kyra/detection.cpp:112 +msgid "Floating cursors" +msgstr "¿ÛëÒãçëï ÚãàáÞàë" + +#: engines/kyra/detection.cpp:113 +msgid "Enable floating cursors" +msgstr "ÃÚÛîçëæì ßÛëÒãçëï ÚãàáÞàë" + +#. I18N: HP stands for Hit Points +#: engines/kyra/detection.cpp:127 +msgid "HP bar graphs" +msgstr "¿ÐÛÞáÚö ×ÔÐàÞþï" + +#: engines/kyra/detection.cpp:128 +msgid "Enable hit point bar graphs" +msgstr "ÃÚÛîçëæì ÐÔÛîáâàÐÒÐÝÝÕ ßÐÛÞáÐÚ ×ÔÐàÞþï" + +#: engines/kyra/lol.cpp:478 +msgid "Attack 1" +msgstr "°âÐÚÐ 1" + +#: engines/kyra/lol.cpp:479 +msgid "Attack 2" +msgstr "°âÐÚÐ 2" + +#: engines/kyra/lol.cpp:480 +msgid "Attack 3" +msgstr "°âÐÚÐ 3" + +#: engines/kyra/lol.cpp:481 +msgid "Move Forward" +msgstr "¦áæö ÝÐßÕàÐÔ" + +#: engines/kyra/lol.cpp:482 +msgid "Move Back" +msgstr "¦áæö ÝÐ×ÐÔ" + +#: engines/kyra/lol.cpp:483 +msgid "Slide Left" +msgstr "ÁÛö×ÓÐæì ÝÐÛÕÒÐ" + +#: engines/kyra/lol.cpp:484 +msgid "Slide Right" +msgstr "ÁÛö×ÓÐæì ÝÐßàÐÒÐ" + +#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2412 +msgid "Turn Left" +msgstr "¿ÐÒÐàÞâ ÝÐÛÕÒÐ" + +#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2413 +msgid "Turn Right" +msgstr "¿ÐÒÐàÞâ ÝÐßàÐÒÐ" + +#: engines/kyra/lol.cpp:487 +msgid "Rest" +msgstr "°ÔßÐçëæì" + +#: engines/kyra/lol.cpp:488 +msgid "Options" +msgstr "¾ßæëö" + +#: engines/kyra/lol.cpp:489 +msgid "Choose Spell" +msgstr "°ÑàÐæì ×ÐÓÐÒÞà" + +#: engines/kyra/sound_midi.cpp:477 +msgid "" +"You appear to be using a General MIDI device,\n" +"but your game only supports Roland MT32 MIDI.\n" +"We try to map the Roland MT32 instruments to\n" +"General MIDI ones. It is still possible that\n" +"some tracks sound incorrect." +msgstr "" +"·ÔÐÕææÐ, Òë áßàÐÑãÕæÕ ÒëÚÐàëáâÞþÒÐæì ßàëÛÐÔã\n" +"General MIDI, ÐÛÕ ÓíâÐï ÓãÛìÝï ßÐÔâàëÜÛöÒÐÕ âÞÛìÚö\n" +"Roland MT32 MIDI. ¼ë ßÐáßàÐÑãÕÜ ßÐÔÐÑàÐæì General\n" +"MIDI ßàëÛÐÔë, ßÐÔÞÑÝëï ÝÐ Roland MT32, ÐÛÕ\n" +"ÜÞÖÐ âÐÚ ÐâàëÜÐææÐ, èâÞ ÝÕÚÐâÞàëï âàíÚö ÑãÔãæì\n" +"áëÓàÐÝë ÝïßàÐÒöÛìÝÐ." + +#: engines/queen/queen.cpp:59 +msgid "Alternative intro" +msgstr "°ÛìâíàÝÐâëþÝë þáâãß" + +#: engines/queen/queen.cpp:60 +msgid "Use an alternative game intro (CD version only)" +msgstr "²ëÚÐàëáâÞþÒÐæì ÐÛìâíàÝÐâëþÝë þáâãß (âÞÛìÚö ÔÛï CD ÒÕàáöö ÓãÛìÝö)" + +#: engines/sky/compact.cpp:130 +msgid "" +"Unable to find \"sky.cpt\" file!\n" +"Please download it from www.scummvm.org" +msgstr "" +"°ÔáãâÝöçÐÕ äÐÙÛ sky.cpt!\n" +"ºÐÛö ÛÐáÚÐ, ×ÐßÐÜßãÙæÕ ïÓÞ × www.scummvm.org" + +#: engines/sky/compact.cpp:141 +msgid "" +"The \"sky.cpt\" file has an incorrect size.\n" +"Please (re)download it from www.scummvm.org" +msgstr "" +"ÄÐÙÛ sky.cpt ÜÐÕ ÝïßàÐÒöÛìÝë ßÐÜÕà.\n" +"ºÐÛö ÛÐáÚÐ, ×ÐßÐÜßãÙæÕ ïÓÞ ÝÐÝÞÒÐ × www.scummvm.org" + +#: engines/sky/detection.cpp:44 +msgid "Floppy intro" +msgstr "Ãáâãß × ÔëáÚÕâ" + +#: engines/sky/detection.cpp:45 +msgid "Use the floppy version's intro (CD version only)" +msgstr "²ëÚÐàëáâÞþÒÐæì ãáâãß × ÓÝãâÚöå ÔëáÚÐþ (âÞÛìÚö ÔÛï CD ÒÕàáöö ÓãÛìÝö)" + +#: engines/sword1/animation.cpp:519 +#, c-format +msgid "PSX stream cutscene '%s' cannot be played in paletted mode" +msgstr "·ÐáâÐþÚÐ PSX '%s' ÝÕ ÜÞÖÐ Ñëæì ßàÐÙÓàÐÝÐ þ àíÖëÜÕ × ßÐÛöâàÐÙ" + +#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439 +msgid "DXA cutscenes found but ScummVM has been built without zlib support" +msgstr "" +"·ÝÞÙÔ×ÕÝë ×ÐáâÐþÚö þ äÐàÜÐæÕ DXA, ÐÛÕ ScummVM Ñëþ áÐÑàÐÝë ÑÕ× ßÐÔâàëÜÚö zlib" + +#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449 +msgid "MPEG2 cutscenes are no longer supported" +msgstr "·ÐáâÐþÚö þ äÐàÜÐæÕ MPEG2 ÑÞÛìè ÝÕ ßÐÔâàëÜÛöÒÐîææÐ" + +#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457 +#, c-format +msgid "Cutscene '%s' not found" +msgstr "·ÐáâÐþÚÐ '%s' ÝÕ ×ÝÞÙÔ×ÕÝÐ" + +#: engines/sword1/control.cpp:865 +msgid "" +"ScummVM found that you have old savefiles for Broken Sword 1 that should be " +"converted.\n" +"The old save game format is no longer supported, so you will not be able to " +"load your games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" +msgstr "" +"ScummVM ÒëïÒöþ ã ÒÐá ×ÐåÐÒÐÝÝö ÓãÛìÝö Broken Sword 1 ã áâÐàëÜ äÐàÜÐæÕ.\n" +"ÁâÐàë äÐàÜÐâ ÑÞÛìè ÝÕ ßÐÔâàëÜÛöÒÐÕææÐ, ö, ÚÐÑ ×ÐÓàã×öæì ×ÐåÐÒÐÝÝö, ïÝë " +"ßÐÒöÝÝë Ñëæì ßÕàÐÒÕÔ×ÕÝë þ ÝÞÒë äÐàÜÐâ.\n" +"\n" +"½ÐæöáÝöæÕ ¾º, ÚÐÑ ßÕàÐÒÕáæö öå ã ÝÞÒë äÐàÜÐâ ×ÐàÐ×, ã ÐÔÒÐàÞâÝëÜ ÒëßÐÔÚã " +"ÓíâÐ ßÐÒÕÔÐÜÛÕÝÝÕ ×'ïÒöææÐ ×ÝÞþ ßàë ÝÐáâãßÝëÜ ×ÐßãáÚã ÓãÛìÝö.\n" + +#: engines/sword1/control.cpp:1234 +#, c-format +msgid "" +"Target new save game already exists!\n" +"Would you like to keep the old save game (%s) or the new one (%s)?\n" +msgstr "" +"·ÐåÐÒÐÝÝÕ ÓãÛìÝö × âÐÚöÜ öÜÕÜ ãÖÞ öáÝãÕ!\n" +"²ë ÖÐÔÐÕæÕ ßÐÚöÝãæì áâÐàãî ÝÐ×Òã (%s) æö ×àÐÑöæì ÝÞÒãî (%s)?\n" + +#: engines/sword1/control.cpp:1237 +msgid "Keep the old one" +msgstr "¿ÐÚöÝãæì áâÐàÞÕ" + +#: engines/sword1/control.cpp:1237 +msgid "Keep the new one" +msgstr "·àÐÑöæì ÝÞÒÐÕ" + +#: engines/sword1/logic.cpp:1633 +msgid "This is the end of the Broken Sword 1 Demo" +msgstr "³íâÐ ×ÐÒïàèíÝÝÕ ÔíÜÐ Broken Sword 1" + +#: engines/sword2/animation.cpp:419 +msgid "" +"PSX cutscenes found but ScummVM has been built without RGB color support" +msgstr "" +"·ÝÞÙÔ×ÕÝë ×ÐáâÐþÚö þ äÐàÜÐæÕ PSX, ÐÛÕ ScummVM Ñëþ áÐÑàÐÝë ÑÕ× ßÐÔâàëÜÚö RGB " +"ÚÞÛÕàÐþ" + +#: engines/sword2/sword2.cpp:79 +msgid "Show object labels" +msgstr "¿ÐÚÐ×ÒÐæì ÝÐ×Òë ÐÑ'ÕÚâÐþ" + +#: engines/sword2/sword2.cpp:80 +msgid "Show labels for objects on mouse hover" +msgstr "¿ÐÚÐ×ÒÐÕ ÝÐ×Òë ÐÑ'ÕÚâÐþ ßàë ÝÐÒïÔ×ÕÝÝö ÚãàáÞàÐ Üëèë" + +#: engines/teenagent/resources.cpp:94 +msgid "" +"You're missing the 'teenagent.dat' file. Get it from the ScummVM website" +msgstr "" +"à ÒÐá ÐÔáãâÝöçÐÕ äÐÙÛ 'teenagent.dat'. ·ÐßÐÜßãÙæÕ ïÓÞ × ÒíÑ-áÐÙâÐ ScummVM" + +#: engines/teenagent/resources.cpp:115 +msgid "" +"The teenagent.dat file is compressed and zlib hasn't been included in this " +"executable. Please decompress it" +msgstr "" +"ÄÐÙÛ teenagent.dat ×ÖÐâë, ÐÛÕ zlib ÝÕ þÚÛîçÐÝÐ þ Óíâã ßàÐÓàÐÜã. ºÐÛö ÛÐáÚÐ, " +"àÐáßÐÚãÙæÕ ïÓÞ" + +#: engines/parallaction/saveload.cpp:133 +#, c-format +msgid "" +"Can't save game in slot %i\n" +"\n" +msgstr "" +"½Õ ÜÐÓã ×ÐåÐÒÐæì ÓãÛìÝî þ ßÐ×öæëî %i\n" +"\n" + +#: engines/parallaction/saveload.cpp:204 +msgid "Loading game..." +msgstr "·ÐÓàãÖÐî ÓãÛìÝî..." + +#: engines/parallaction/saveload.cpp:219 +msgid "Saving game..." +msgstr "·ÐåÞþÒÐî ÓãÛìÝî..." + +#: engines/parallaction/saveload.cpp:272 +msgid "" +"ScummVM found that you have old savefiles for Nippon Safes that should be " +"renamed.\n" +"The old names are no longer supported, so you will not be able to load your " +"games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked next time.\n" +msgstr "" +"ScummVM ×ÝÐÙèÞþ ã ÒÐá áâÐàëï ×ÐåÐÒÐÝÝö ÓãÛìÝö Nippon Safes, ïÚöï ÝÕÐÑåÞÔÝÐ " +"ßÕàÐÝÐ×ÒÐæì. ÁâÐàëï ÝÐ×Òë ÑÞÛìè ÝÕ ßÐÔâàëÜÛöÒÐîææÐ, ö âÐÜã Òë ÝÕ ×ÜÞÖÐæÕ " +"×ÐÓàã×öæì ×ÐåÐÒÐÝÝö, ÚÐÛö ÝÕ ßÕàÐÝÐ×ÐÒÕæÕ öå.\n" +"\n" +"½ÐæöáÝöæÕ ¾º, ÚÐÑ ßÕàÐÝÐ×ÒÐæì öå ×ÐàÐ×, ã ÐÔÒÐàÞâÝëÜ ÒëßÐÔÚã ÓíâÐ Ö " +"ßÐÒÕÔÐÜÛÕÝÝÕ ×'ïÒöææÐ ßàë ÝÐáâãßÝëÜ ×ÐßãáÚã ÓãÛìÝö.\n" + +#: engines/parallaction/saveload.cpp:319 +msgid "ScummVM successfully converted all your savefiles." +msgstr "ScummVM ßÐáßïåÞÒÐ ßÕàÐþâÒÐàëþ ãáÕ ÒÐèë ×ÐåÐÒÐÝÝö ÓãÛìÝïþ." + +#: engines/parallaction/saveload.cpp:321 +msgid "" +"ScummVM printed some warnings in your console window and can't guarantee all " +"your files have been converted.\n" +"\n" +"Please report to the team." +msgstr "" +"ScummVM ÝÐßöáÐþ ÝÕÚÐÛìÚö ßÐßïàíÔÖÐÝÝïþ ã ÐÚÝÞ ÚÐÝáÞÛö ö ÝÕ ×ÜÞÓ ßÕàÐþâÒÐàëæì " +"ãáÕ äÐÙÛë.\n" +"\n" +"ºÐÛö ÛÐáÚÐ, ßÐÒÕÔÐÜöæÕ ßàÐ ÓíâÐ ÚÐÜÐÝÔ×Õ ScummVM." + +#: engines/pegasus/pegasus.cpp:675 +msgid "Invalid save file name" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2410 +msgid "Up/Zoom In/Move Forward/Open Doors" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2411 +#, fuzzy +msgid "Down/Zoom Out" +msgstr "¿ÐÒïÛ. ÜÐèâÐÑ" + +#: engines/pegasus/pegasus.cpp:2414 +msgid "Display/Hide Inventory Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2415 +msgid "Display/Hide Biochip Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2416 +msgid "Action/Select" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2417 +msgid "Toggle Center Data Display" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2418 +msgid "Display/Hide Info Screen" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2419 +msgid "Display/Hide Pause Menu" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2420 +msgid "???" +msgstr "" + +#: audio/fmopl.cpp:49 +msgid "MAME OPL emulator" +msgstr "ÍÜãÛïâÐà MAME OPL" + +#: audio/fmopl.cpp:51 +msgid "DOSBox OPL emulator" +msgstr "ÍÜãÛïâÐà DOSBox OPL" + +#: audio/mididrv.cpp:209 +#, c-format +msgid "" +"The selected audio device '%s' was not found (e.g. might be turned off or " +"disconnected)." +msgstr "" +"°ÑàÐÝÐï ÓãÚÐÒÐï ßàëÛÐÔÐ '%s' ÝÕ ÑëÛÐ ×ÝÞÙÔ×ÕÝÐ (ÜÐÓçëÜÐ, ïÝÐ ÒëÚÛîçÐÝÐ æö ÝÕ " +"ßÐÔÚÛîçÐÝÐ)." + +#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257 +#: audio/mididrv.cpp:272 +msgid "Attempting to fall back to the next available device..." +msgstr "ÁßàÐÑãî ÒëÚÐàëáâÐæì öÝèãî ÔÐáâãßÝãî ßàëÛÐÔã..." + +#: audio/mididrv.cpp:221 +#, c-format +msgid "" +"The selected audio device '%s' cannot be used. See log file for more " +"information." +msgstr "" +"°ÑàÐÝÐï ÓãÚÐÒÐï ßàëÛÐÔÐ '%s' ÝÕ ÜÞÖÐ Ñëæì áÚÐàëáâÐÝÐ. ³ÛïÔ×öæÕ äÐÙÛ " +"ßàÐâÐÚÞÛã ÔÛï ÑÞÛìè ßÐÔàÐÑï×ÝÐÙ öÝäÐàÜÐæëö." + +#: audio/mididrv.cpp:257 +#, c-format +msgid "" +"The preferred audio device '%s' was not found (e.g. might be turned off or " +"disconnected)." +msgstr "" +"¿ÕàÐÒÐÖÝÐï ÓãÚÐÒÐï ßàëÛÐÔÐ '%s' ÝÕ ÑëÛÐ ×ÝÞÙÔ×ÕÝÐ (ÜÐÓçëÜÐ, ïÝÐ ÒëÚÛîçÐÝÐ æö " +"ÝÕ ßÐÔÚÛîçÐÝÐ)." + +#: audio/mididrv.cpp:272 +#, c-format +msgid "" +"The preferred audio device '%s' cannot be used. See log file for more " +"information." +msgstr "" +"¿ÕàÐÒÐÖÝÐï ÓãÚÐÒÐï ßàëÛÐÔÐ '%s' ÝÕ ÜÞÖÐ Ñëæì áÚÐàëáâÐÝÐ. ³ÛïÔ×öæÕ äÐÙÛ " +"ßàÐâÐÚÞÛã ÔÛï ÑÞÛìè ßÐÔàÐÑï×ÝÐÙ öÝäÐàÜÐæëö." + +#: audio/null.h:43 +msgid "No music" +msgstr "±Õ× Üã×ëÚö" + +#: audio/mods/paula.cpp:189 +msgid "Amiga Audio Emulator" +msgstr "ÍÜãÛïâÐà ÓãÚã Amiga" + +#: audio/softsynth/adlib.cpp:2284 +msgid "AdLib Emulator" +msgstr "ÍÜãÛïâÐà AdLib" + +#: audio/softsynth/appleiigs.cpp:33 +msgid "Apple II GS Emulator (NOT IMPLEMENTED)" +msgstr "ÍÜãÛïâÐà Apple II GS (ÐÔáãâÝöçÐÕ)" + +#: audio/softsynth/sid.cpp:1430 +msgid "C64 Audio Emulator" +msgstr "ÍÜãÛïâÐà ÓãÚã C64" + +#: audio/softsynth/mt32.cpp:205 +msgid "Initializing MT-32 Emulator" +msgstr "½ÐÛÐÔÖÒÐî íÜãÛïâÐà MT-32" + +#: audio/softsynth/mt32.cpp:431 +msgid "MT-32 Emulator" +msgstr "ÍÜãÛïâÐà MT-32" + +#: audio/softsynth/pcspk.cpp:139 +msgid "PC Speaker Emulator" +msgstr "ÍÜãÛïâÐà PC áßöÚÕàÐ" + +#: audio/softsynth/pcspk.cpp:158 +msgid "IBM PCjr Emulator" +msgstr "ÍÜãÛïâÐà IBM PCjr" + +#: backends/keymapper/remap-dialog.cpp:47 +msgid "Keymap:" +msgstr "ÂÐÑÛöæÐ ÚÛÐÒöè:" + +#: backends/keymapper/remap-dialog.cpp:66 +msgid " (Effective)" +msgstr " (´×ÕÙáÝÐï)" + +#: backends/keymapper/remap-dialog.cpp:106 +msgid " (Active)" +msgstr " (°ÚâëþÝÐï)" + +#: backends/keymapper/remap-dialog.cpp:106 +msgid " (Blocked)" +msgstr " (·ÐÑÛÐÚÐÒÐÝÐ)" + +#: backends/keymapper/remap-dialog.cpp:119 +msgid " (Global)" +msgstr " (³ÛÐÑÐÛìÝÐï)" + +#: backends/keymapper/remap-dialog.cpp:127 +msgid " (Game)" +msgstr " (³ãÛìÝö)" + +#: backends/midi/windows.cpp:164 +msgid "Windows MIDI" +msgstr "Windows MIDI" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:57 +msgid "ScummVM Main Menu" +msgstr "³ÐÛÞþÝÐÕ ÜÕÝî ScummVM" + +#: 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 "ºöàÐÒÐÝÝÕ ÑÐïÜö þ Indy" + +#: 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 "·àãèíÝÝÕ ÔÞâëÚÐþ ßÐ ÒÞáö X" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:75 +msgid "Touch Y Offset" +msgstr "·àãèíÝÝÕ ÔÞâëÚÐþ ßÐ ÒÞáö Y" + +#: 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:300 +msgid "Mouse-click-and-drag mode enabled." +msgstr "ÀíÖëÜ Üëèë ÝÐæöáÝãæì-ö-æïÓÝãæì ãÚÛîçÐÝë." + +#: backends/platform/iphone/osys_events.cpp:302 +msgid "Mouse-click-and-drag mode disabled." +msgstr "ÀíÖëÜ Üëèë ÝÐæöáÝãæì-ö-æïÓÝãæì ÒëÚÛîçÐÝë." + +#: backends/platform/iphone/osys_events.cpp:313 +msgid "Touchpad mode enabled." +msgstr "ÀíÖëÜ âÐçßÐÔÐ þÚÛîçÐÝë." + +#: backends/platform/iphone/osys_events.cpp:315 +msgid "Touchpad mode disabled." +msgstr "ÀíÖëÜ âÐçßÐÔÐ ÒëÚÛîçÐÝë." + +#: backends/platform/maemo/maemo.cpp:209 +msgid "Click Mode" +msgstr "ÀíÖëÜ ßáâàëçÚö" + +#: backends/platform/maemo/maemo.cpp:215 +#: backends/platform/symbian/src/SymbianActions.cpp:42 +#: backends/platform/wince/CEActionsPocket.cpp:60 +#: backends/platform/wince/CEActionsSmartphone.cpp:43 +#: backends/platform/bada/form.cpp:281 +msgid "Left Click" +msgstr "»ÕÒÐï ßáâàëçÚÐ" + +#: backends/platform/maemo/maemo.cpp:218 +msgid "Middle Click" +msgstr "ÁïàíÔÝïï ßáâàëçÚÐ" + +#: backends/platform/maemo/maemo.cpp:221 +#: backends/platform/symbian/src/SymbianActions.cpp:43 +#: backends/platform/wince/CEActionsSmartphone.cpp:44 +#: backends/platform/bada/form.cpp:273 +msgid "Right Click" +msgstr "¿àÐÒÐï ßáâàëçÚÐ" + +#: backends/platform/sdl/macosx/appmenu_osx.mm:77 +msgid "Hide ScummVM" +msgstr "ÁåÐÒÐæì ScummVM" + +#: backends/platform/sdl/macosx/appmenu_osx.mm:82 +msgid "Hide Others" +msgstr "ÁåÐÒÐæì ÐáâÐâÝöï" + +#: backends/platform/sdl/macosx/appmenu_osx.mm:87 +msgid "Show All" +msgstr "¿ÐÚÐ×Ðæì ãáñ" + +#: backends/platform/sdl/macosx/appmenu_osx.mm:109 +#: backends/platform/sdl/macosx/appmenu_osx.mm:120 +msgid "Window" +msgstr "°ÚÝÞ" + +#: backends/platform/sdl/macosx/appmenu_osx.mm:114 +msgid "Minimize" +msgstr "¿àëÑàÐæì ã Dock" + +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45 +msgid "Normal (no scaling)" +msgstr "±Õ× ßÐÒÕÛöçíÝÝï" + +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:64 +msgctxt "lowres" +msgid "Normal (no scaling)" +msgstr "±Õ× ßÐÒÕÛöçíÝÝï" + +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537 +msgid "Enabled aspect ratio correction" +msgstr "ºÐàíÚæëï áãÐÔÝÞáöÝ ÑÐÚÞþ ãÚÛîçÐÝÐ" + +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542 +msgid "Disabled aspect ratio correction" +msgstr "ºÐàíÚæëï áãÐÔÝÞáöÝ ÑÐÚÞþ ÒëÚÛîçÐÝÐ" + +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196 +msgid "Active graphics filter:" +msgstr "°ÚâëþÝë ÓàÐäöçÝë äöÛìâà:" + +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481 +msgid "Windowed mode" +msgstr "°ÚÞÝÝë àíÖëÜ" + +#: backends/graphics/opengl/opengl-graphics.cpp:135 +msgid "OpenGL Normal" +msgstr "OpenGL ÑÕ× ßÐÒÕÛöçíÝÝï" + +#: backends/graphics/opengl/opengl-graphics.cpp:136 +msgid "OpenGL Conserve" +msgstr "OpenGL × ×ÐåÐÒÐÝÝÕÜ" + +#: backends/graphics/opengl/opengl-graphics.cpp:137 +msgid "OpenGL Original" +msgstr "OpenGL ßÕàèÐßÐçÐâÚÞÒë" + +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415 +msgid "Current display mode" +msgstr "±ïÓãçë ÒöÔíÐàíÖëÜ" + +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428 +msgid "Current scale" +msgstr "±ïÓãçë ÜÐèâÐÑ" + +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562 +msgid "Active filter mode: Linear" +msgstr "°ÚâëþÝë àíÖëÜ äöÛìâàÐ: »öÝÕÙÝë" + +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564 +msgid "Active filter mode: Nearest" +msgstr "°ÚâëþÝë àíÖëÜ äöÛìâàÐ: ½ÐÙÑÛö×Úö" + +#: backends/platform/symbian/src/SymbianActions.cpp:38 +#: backends/platform/wince/CEActionsSmartphone.cpp:39 +msgid "Up" +msgstr "ÃÒÕàå" + +#: backends/platform/symbian/src/SymbianActions.cpp:39 +#: backends/platform/wince/CEActionsSmartphone.cpp:40 +msgid "Down" +msgstr "ÃÝö×" + +#: backends/platform/symbian/src/SymbianActions.cpp:40 +#: backends/platform/wince/CEActionsSmartphone.cpp:41 +msgid "Left" +msgstr "½ÐÛÕÒÐ" + +#: backends/platform/symbian/src/SymbianActions.cpp:41 +#: backends/platform/wince/CEActionsSmartphone.cpp:42 +msgid "Right" +msgstr "½ÐßàÐÒÐ" + +#: backends/platform/symbian/src/SymbianActions.cpp:46 +#: backends/platform/wince/CEActionsSmartphone.cpp:47 +msgid "Zone" +msgstr "·ÞÝÐ" + +#: backends/platform/symbian/src/SymbianActions.cpp:47 +#: backends/platform/wince/CEActionsPocket.cpp:54 +#: backends/platform/wince/CEActionsSmartphone.cpp:48 +msgid "Multi Function" +msgstr "¼ãÛìâëäãÝÚæëï" + +#: backends/platform/symbian/src/SymbianActions.cpp:48 +msgid "Swap character" +msgstr "·ÜïÝöæì ÓÕàÞï" + +#: backends/platform/symbian/src/SymbianActions.cpp:49 +msgid "Skip text" +msgstr "¿àÐßãáæöæì âíÚáâ" + +#: backends/platform/symbian/src/SymbianActions.cpp:51 +msgid "Fast mode" +msgstr "ÅãâÚö àíÖëÜ" + +#: backends/platform/symbian/src/SymbianActions.cpp:53 +msgid "Debugger" +msgstr "°ÔÛÐÔçëÚ" + +#: backends/platform/symbian/src/SymbianActions.cpp:54 +msgid "Global menu" +msgstr "³ÛÐÑÐÛìÝÐÕ ÜÕÝî" + +#: backends/platform/symbian/src/SymbianActions.cpp:55 +msgid "Virtual keyboard" +msgstr "²öàâãÐÛìÝÐï ÚÛÐÒöïâãàÐ" + +#: backends/platform/symbian/src/SymbianActions.cpp:56 +msgid "Key mapper" +msgstr "¿àë×ÝÐçíÝÝÕ ÚÛÐÒöè" + +#: backends/events/symbiansdl/symbiansdl-events.cpp:184 +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:143 +msgid "DVD Mounted successfully" +msgstr "DVD ßÐÔÚÛîçÐÝë ßÐáßïåÞÒÐ" + +#: backends/platform/wii/options.cpp:146 +msgid "Error while mounting the DVD" +msgstr "¿ÐÜëÛÚÐ ßàë ßÐÔÚÛîçíÝÝö DVD" + +#: backends/platform/wii/options.cpp:148 +msgid "DVD not mounted" +msgstr "DVD ÝÕ ßÐÔÚÛîçÐÝë" + +#: backends/platform/wii/options.cpp:161 +msgid "Network up, share mounted" +msgstr "ÁÕâÚÐ ßàÐæãÕ, âíçÚÐ ßÐÔÚÛîçÐÝÐ" + +#: backends/platform/wii/options.cpp:163 +msgid "Network up" +msgstr "ÁÕâÚÐ ßàÐæãÕ" + +#: backends/platform/wii/options.cpp:166 +msgid ", error while mounting the share" +msgstr ", ßÐÜëÛÚÐ ßàë ßÐÔÚÛîçíÝÝö âíçÚö" + +#: backends/platform/wii/options.cpp:168 +msgid ", share not mounted" +msgstr ", âíçÚÐ ÝÕ ßÐÔÚÛîçÐÝÐ" + +#: backends/platform/wii/options.cpp:174 +msgid "Network down" +msgstr "ÁÕâÚÐ ÒëÚÛîçÐÝÐ" + +#: backends/platform/wii/options.cpp:178 +msgid "Initializing network" +msgstr "½ÐÛÐÔÖÒÐî áÕâÚã" + +#: backends/platform/wii/options.cpp:182 +msgid "Timeout while initializing network" +msgstr "ÇÐá ßÐÔÚÛîçíÝÝï ÔÐ áÕâÚö ÜöÝãþ" + +#: backends/platform/wii/options.cpp:186 +#, c-format +msgid "Network not initialized (%d)" +msgstr "ÁÕâÚÐ ÝÕ ÝÐÛÐÔ×öÛÐáï (%d)" + +#: backends/platform/wince/CEActionsPocket.cpp:46 +msgid "Hide Toolbar" +msgstr "ÁåÐÒÐæì ßÐÝíÛì öÝáâàãÜÕÝâÐþ" + +#: backends/platform/wince/CEActionsPocket.cpp:47 +msgid "Show Keyboard" +msgstr "¿ÐÚÐ×Ðæì ÚÛÐÒöïâãàã" + +#: backends/platform/wince/CEActionsPocket.cpp:48 +msgid "Sound on/off" +msgstr "³ãÚ ãÚÛ/ÒëÚÛ" + +#: backends/platform/wince/CEActionsPocket.cpp:49 +msgid "Right click" +msgstr "¿àÐÒÐï ßáâàëçÚÐ" + +#: backends/platform/wince/CEActionsPocket.cpp:50 +msgid "Show/Hide Cursor" +msgstr "¿ÐÚÐ×Ðæì/¿àëÑàÐæì ÚãàáÞà" + +#: backends/platform/wince/CEActionsPocket.cpp:51 +msgid "Free look" +msgstr "²ÞÛìÝë ÐÓÛïÔ" + +#: backends/platform/wince/CEActionsPocket.cpp:52 +msgid "Zoom up" +msgstr "¿ÐÒïÛ. ÜÐèâÐÑ" + +#: backends/platform/wince/CEActionsPocket.cpp:53 +msgid "Zoom down" +msgstr "¿ÐÜÕÝè. ÜÐèâÐÑ" + +#: backends/platform/wince/CEActionsPocket.cpp:55 +#: backends/platform/wince/CEActionsSmartphone.cpp:49 +msgid "Bind Keys" +msgstr "¿àë×ÝÐçëæì ÚÛÐÒöèë" + +#: backends/platform/wince/CEActionsPocket.cpp:56 +msgid "Cursor Up" +msgstr "ºãàáÞà ãÒÕàå" + +#: backends/platform/wince/CEActionsPocket.cpp:57 +msgid "Cursor Down" +msgstr "ºãàáÞà ãÝö×" + +#: backends/platform/wince/CEActionsPocket.cpp:58 +msgid "Cursor Left" +msgstr "ºãàáÞà ÝÐÛÕÒÐ" + +#: backends/platform/wince/CEActionsPocket.cpp:59 +msgid "Cursor Right" +msgstr "ºãàáÞà ÝÐßàÐÒÐ" + +#: backends/platform/wince/CEActionsPocket.cpp:267 +#: backends/platform/wince/CEActionsSmartphone.cpp:231 +msgid "Do you want to load or save the game?" +msgstr "²ë ÖÐÔÐÕæÕ ×ÐÓàã×öæì ÐÑÞ ×ÐåÐÒÐæì ÓãÛìÝî?" + +#: backends/platform/wince/CEActionsPocket.cpp:326 +#: backends/platform/wince/CEActionsSmartphone.cpp:287 +msgid " Are you sure you want to quit ? " +msgstr " ²ë þßíþÝÕÝë, èâÞ ÖÐÔÐÕæÕ ÒëÙáæö? " + +#: backends/platform/wince/CEActionsSmartphone.cpp:50 +msgid "Keyboard" +msgstr "ºÛÐÒöïâãàÐ" + +#: backends/platform/wince/CEActionsSmartphone.cpp:51 +msgid "Rotate" +msgstr "¿ÐÒïàÝãæì" + +#: backends/platform/wince/CELauncherDialog.cpp:56 +msgid "Using SDL driver " +msgstr "²ëÚÐàëáâÞþÒÐî ÔàÐÙÒÕà SDL " + +#: backends/platform/wince/CELauncherDialog.cpp:60 +msgid "Display " +msgstr "¿ÐÚÐ×Ðæì " + +#: backends/platform/wince/CELauncherDialog.cpp:83 +msgid "Do you want to perform an automatic scan ?" +msgstr "²ë ÖÐÔÐÕæÕ ×àÐÑöæì ÐþâÐÜÐâëçÝë ßÞèãÚ?" + +#: backends/platform/wince/wince-sdl.cpp:515 +msgid "Map right click action" +msgstr "¿àë×ÝÐçëæì Ô×ÕïÝÝÕ ßÐ ßàÐÒÐÙ ßáâàëçæë" + +#: backends/platform/wince/wince-sdl.cpp:519 +msgid "You must map a key to the 'Right Click' action to play this game" +msgstr "" +"²ë ßÐÒöÝÝë ßàë×ÝÐçëæì ÚÛÐÒöèã ÝÐ Ô×ÕïÝÝÕ 'Right Click' ÔÛï ÓíâÐÙ ÓãÛìÝö" + +#: backends/platform/wince/wince-sdl.cpp:528 +msgid "Map hide toolbar action" +msgstr "¿àë×ÝÐçëæì Ô×ÕïÝÝÕ 'áåÐÒÐæì ßÐÝíÛì öÝáâàãÜÕÝâÐþ'" + +#: backends/platform/wince/wince-sdl.cpp:532 +msgid "You must map a key to the 'Hide toolbar' action to play this game" +msgstr "" +"²ë ßÐÒöÝÝë ßàë×ÝÐçëæì ÚÛÐÒöèã ÝÐ Ô×ÕïÝÝÕ 'Hide toolbar' ÔÛï ÓíâÐÙ ÓãÛìÝö" + +#: backends/platform/wince/wince-sdl.cpp:541 +msgid "Map Zoom Up action (optional)" +msgstr "¿àë×ÝÐçëæì Ô×ÕïÝÝÕ ¿ÐÒïÛöçëæì ¼ÐèâÐÑ (ÝÕÐÑÐÒï×ÚÞÒÐ)" + +#: backends/platform/wince/wince-sdl.cpp:544 +msgid "Map Zoom Down action (optional)" +msgstr "¿àë×ÝÐçëæì Ô×ÕïÝÝÕ ¿ÐÜÕÝèëæì ¼ÐèâÐÑ (ÝÕÐÑÐÒï×ÚÞÒÐ)" + +#: backends/platform/wince/wince-sdl.cpp:552 +msgid "" +"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory" +msgstr "" +"½Õ ×ÐÑãÔ×ìæÕáï ßàë×ÝÐçëæì ÚÛÐÒöèã ÔÛï Ô×ÕïÝÝï 'Hide Toolbar', ÚÐÑ ãÑÐçëæì " +"ãÒÕáì öÝÒÕÝâÐà ã ÓãÛìÝö" + +#: backends/events/default/default-events.cpp:191 +msgid "Do you really want to return to the Launcher?" +msgstr "²ë áÐßàÐþÔë ÖÐÔÐÕæÕ ÒïàÝãææÐ þ ÓÐÛÞþÝÐÕ ÜÕÝî?" + +#: backends/events/default/default-events.cpp:191 +msgid "Launcher" +msgstr "³ÐÛÞþÝÐÕ ÜÕÝî" + +#: backends/events/default/default-events.cpp:213 +msgid "Do you really want to quit?" +msgstr "²ë áÐßàÐþÔë ÖÐÔÐÕæÕ ÒëÙáæö?" + +#: backends/events/gph/gph-events.cpp:386 +#: backends/events/gph/gph-events.cpp:429 +#: backends/events/openpandora/op-events.cpp:168 +msgid "Touchscreen 'Tap Mode' - Left Click" +msgstr "ÀíÖëÜ 'ÔÞâëÚÐþ' âÐçáÚàëÝÐ - »ÕÒë ÚÛöÚ" + +#: backends/events/gph/gph-events.cpp:388 +#: backends/events/gph/gph-events.cpp:431 +#: backends/events/openpandora/op-events.cpp:170 +msgid "Touchscreen 'Tap Mode' - Right Click" +msgstr "ÀíÖëÜ 'ÔÞâëÚÐþ' âÐçáÚàëÝÐ - ¿àÐÒë ÚÛöÚ" + +#: backends/events/gph/gph-events.cpp:390 +#: backends/events/gph/gph-events.cpp:433 +#: backends/events/openpandora/op-events.cpp:172 +msgid "Touchscreen 'Tap Mode' - Hover (No Click)" +msgstr "ÀíÖëÜ 'ÔÞâëÚÐþ' âÐçáÚàëÝÐ - ¿àÐÛñâ (ÑÕ× ÚÛöÚã)" + +#: backends/events/gph/gph-events.cpp:410 +msgid "Maximum Volume" +msgstr "¼ÐÚáöÜÐÛìÝÐï ÓãçÝÐáæì" + +#: backends/events/gph/gph-events.cpp:412 +msgid "Increasing Volume" +msgstr "¿ÐÒÕÛöçíÝÝÕ ÓãçÝÐáæö" + +#: backends/events/gph/gph-events.cpp:418 +msgid "Minimal Volume" +msgstr "¼öÝöÜÐÛìÝÐï ÓãçÝÐáæì" + +#: backends/events/gph/gph-events.cpp:420 +msgid "Decreasing Volume" +msgstr "¿ÐÜïÝèíÝÝÕ ÓãçÝÐáæö" + +#: backends/events/openpandora/op-events.cpp:174 +#, fuzzy +msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)" +msgstr "ÀíÖëÜ 'ÔÞâëÚÐþ' âÐçáÚàëÝÐ - ¿àÐÛñâ (ÑÕ× ÚÛöÚã)" + +#: backends/updates/macosx/macosx-updates.mm:67 +msgid "Check for Updates..." +msgstr "¿àÐÒïàÐî ÐÑÝÐþÛÕÝÝö..." + +#: backends/platform/bada/form.cpp:269 +msgid "Right Click Once" +msgstr "°ÔÝÐ ßàÐÒÐï ßáâàëçÚÐ" + +#: backends/platform/bada/form.cpp:277 +msgid "Move Only" +msgstr "ÂÞÛìÚö ßÕàÐÜïáæöæì" + +#: backends/platform/bada/form.cpp:291 +msgid "Escape Key" +msgstr "ºÛÐÒöèÐ ESC" + +#: backends/platform/bada/form.cpp:296 +msgid "Game Menu" +msgstr "¼ÕÝî ÓãÛìÝö" + +#: backends/platform/bada/form.cpp:301 +msgid "Show Keypad" +msgstr "¿ÐÚÐ×Ðæì ÚÛÐÒöïâãàã" + +#: backends/platform/bada/form.cpp:309 +msgid "Control Mouse" +msgstr "ºöàÐÒÐÝÝÕ Üëèèã" + +#: backends/events/maemosdl/maemosdl-events.cpp:192 +msgid "Clicking Enabled" +msgstr "¿áâàëçÚö þÚÛîçÐÝë" + +#: backends/events/maemosdl/maemosdl-events.cpp:192 +msgid "Clicking Disabled" +msgstr "¿áâàëçÚö ÒëÚÛîçÐÝë" + +#~ msgid "Enable Roland GS Mode" +#~ msgstr "ÃÚÛîçëæì àíÖëÜ Roland GS" + +#~ msgid "Hercules Green" +#~ msgstr "Hercules ·ÕÛñÝëÙ" + +#~ msgid "Hercules Amber" +#~ msgstr "Hercules ÏÝâÐàÝëÙ" + +#~ msgctxt "lowres" +#~ msgid "Hercules Green" +#~ msgstr "Hercules ·ÕÛñÝëÙ" + +#~ msgctxt "lowres" +#~ msgid "Hercules Amber" +#~ msgstr "Hercules ÏÝâÐàÝëÙ" + +#~ msgid "Save game failed!" +#~ msgstr "½Õ ãÔÐÛÞáì áÞåàÐÝØâì ØÓàã!" + +#~ msgctxt "lowres" +#~ msgid "Add Game..." +#~ msgstr "´ÞÑ. ØÓàã" + +#~ msgid "Add Game..." +#~ msgstr "´ÞÑÐÒØâì ØÓàã..." + +#~ msgid "Discovered %d new games." +#~ msgstr "½ÐÙÔÕÝÞ %d ÝÞÒëå ØÓà." + +#~ msgid "Command line argument not processed" +#~ msgstr "¿ÐàÐÜÕâàë ÚÞÜÐÝÔÝÞÙ áâàÞÚØ ÝÕ ÞÑàÐÑÞâÐÝë" + +#~ msgid "FM Towns Emulator" +#~ msgstr "ÍÜãÛïâÞà FM Towns" + +#~ msgid "Invalid Path" +#~ msgstr "½ÕÒÕàÝëÙ ßãâì" diff --git a/po/ca_ES.po b/po/ca_ES.po index da2586a2af..e655b807ec 100644 --- a/po/ca_ES.po +++ b/po/ca_ES.po @@ -1,5 +1,5 @@ # Catalan translation for ScummVM. -# Copyright (C) 2007-2012 ScummVM Team +# Copyright (C) 2007-2013 ScummVM Team # This file is distributed under the same license as the ScummVM package. # Jordi Vilalta Prat <jvprat@jvprat.com>, 2007-2011. # @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.6.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-08-27 15:46+0200\n" +"POT-Creation-Date: 2013-02-07 23:11+0000\n" "PO-Revision-Date: 2012-08-26 20:32+0100\n" "Last-Translator: Jordi Vilalta Prat <jvprat@jvprat.com>\n" "Language-Team: Catalan <scummvm-devel@lists.sf.net>\n" @@ -16,45 +16,55 @@ msgstr "" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -#: gui/about.cpp:91 +#: gui/about.cpp:93 #, c-format msgid "(built on %s)" msgstr "(compilat el %s)" -#: gui/about.cpp:98 +#: gui/about.cpp:100 msgid "Features compiled in:" msgstr "Característiques compilades:" -#: gui/about.cpp:107 +#: gui/about.cpp:109 msgid "Available engines:" msgstr "Motors disponibles:" -#: gui/browser.cpp:66 +#: gui/browser.cpp:67 +#, fuzzy +msgid "Show hidden files" +msgstr "Mostra / Oculta la consola" + +#: gui/browser.cpp:67 +msgid "Show files marked with the hidden attribute" +msgstr "" + +#: gui/browser.cpp:71 msgid "Go up" msgstr "Amunt" -#: gui/browser.cpp:66 gui/browser.cpp:68 +#: gui/browser.cpp:71 gui/browser.cpp:73 msgid "Go to previous directory level" msgstr "Torna al nivell de directoris anterior" -#: gui/browser.cpp:68 +#: gui/browser.cpp:73 msgctxt "lowres" msgid "Go up" msgstr "Amunt" -#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 -#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 -#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:847 -#: gui/themebrowser.cpp:54 engines/engine.cpp:442 -#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 +#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238 +#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275 +#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919 +#: gui/themebrowser.cpp:54 engines/engine.cpp:447 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:190 +#: engines/sword1/control.cpp:867 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" msgstr "Cancel·la" -#: gui/browser.cpp:70 gui/chooser.cpp:46 gui/themebrowser.cpp:55 +#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55 msgid "Choose" msgstr "Escull" @@ -69,15 +79,15 @@ msgstr "Tanca" msgid "Mouse click" msgstr "Clic del ratolí" -#: gui/gui-manager.cpp:122 base/main.cpp:300 +#: gui/gui-manager.cpp:122 base/main.cpp:301 msgid "Display keyboard" msgstr "Mostra el teclat" -#: gui/gui-manager.cpp:126 base/main.cpp:304 +#: gui/gui-manager.cpp:126 base/main.cpp:305 msgid "Remap keys" msgstr "Assigna les tecles" -#: gui/gui-manager.cpp:129 base/main.cpp:307 +#: gui/gui-manager.cpp:129 base/main.cpp:308 msgid "Toggle FullScreen" msgstr "Commuta la pantalla completa" @@ -90,17 +100,18 @@ msgid "Map" msgstr "Assigna" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 -#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: gui/saveload-dialog.cpp:848 engines/engine.cpp:361 engines/engine.cpp:372 -#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 -#: engines/agos/animation.cpp:558 engines/groovie/script.cpp:420 -#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 -#: engines/sword1/animation.cpp:519 engines/sword1/animation.cpp:540 -#: engines/sword1/animation.cpp:550 engines/sword1/animation.cpp:557 -#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 -#: engines/sword2/animation.cpp:419 engines/sword2/animation.cpp:439 -#: engines/sword2/animation.cpp:449 engines/sword2/animation.cpp:458 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 +#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239 +#: gui/saveload-dialog.cpp:920 engines/engine.cpp:366 engines/engine.cpp:377 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192 +#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558 +#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 +#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519 +#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550 +#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:867 +#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419 +#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449 +#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "D'acord" @@ -173,8 +184,8 @@ msgstr "" "Idioma del joc. Això no convertirà la vostra versió Espanyola del joc a " "Anglès" -#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:80 -#: gui/options.cpp:730 gui/options.cpp:743 gui/options.cpp:1199 +#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86 +#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209 #: audio/null.cpp:40 msgid "<default>" msgstr "<per defecte>" @@ -196,11 +207,11 @@ msgstr "Platafor.:" msgid "Engine" msgstr "Motor" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "Graphics" msgstr "Gràfics" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "GFX" msgstr "GFX" @@ -213,7 +224,7 @@ msgctxt "lowres" msgid "Override global graphic settings" msgstr "Canviar les opcions de gràfics" -#: gui/launcher.cpp:251 gui/options.cpp:1085 +#: gui/launcher.cpp:251 gui/options.cpp:1095 msgid "Audio" msgstr "Àudio" @@ -226,11 +237,11 @@ msgctxt "lowres" msgid "Override global audio settings" msgstr "Canviar les opcions d'àudio" -#: gui/launcher.cpp:265 gui/options.cpp:1090 +#: gui/launcher.cpp:265 gui/options.cpp:1100 msgid "Volume" msgstr "Volum" -#: gui/launcher.cpp:267 gui/options.cpp:1092 +#: gui/launcher.cpp:267 gui/options.cpp:1102 msgctxt "lowres" msgid "Volume" msgstr "Volum" @@ -244,7 +255,7 @@ msgctxt "lowres" msgid "Override global volume settings" msgstr "Canviar les opcions de volum" -#: gui/launcher.cpp:280 gui/options.cpp:1100 +#: gui/launcher.cpp:280 gui/options.cpp:1110 msgid "MIDI" msgstr "MIDI" @@ -257,7 +268,7 @@ msgctxt "lowres" msgid "Override global MIDI settings" msgstr "Canviar les opcions de MIDI" -#: gui/launcher.cpp:294 gui/options.cpp:1106 +#: gui/launcher.cpp:294 gui/options.cpp:1116 msgid "MT-32" msgstr "MT-32" @@ -270,11 +281,11 @@ msgctxt "lowres" msgid "Override global MT-32 settings" msgstr "Canviar les opcions de MT-32" -#: gui/launcher.cpp:308 gui/options.cpp:1113 +#: gui/launcher.cpp:308 gui/options.cpp:1123 msgid "Paths" msgstr "Camins" -#: gui/launcher.cpp:310 gui/options.cpp:1115 +#: gui/launcher.cpp:310 gui/options.cpp:1125 msgctxt "lowres" msgid "Paths" msgstr "Camins" @@ -288,7 +299,7 @@ msgctxt "lowres" msgid "Game Path:" msgstr "Camí joc:" -#: gui/launcher.cpp:324 gui/options.cpp:1139 +#: gui/launcher.cpp:324 gui/options.cpp:1149 msgid "Extra Path:" msgstr "Camí extra:" @@ -296,42 +307,42 @@ msgstr "Camí extra:" msgid "Specifies path to additional data used the game" msgstr "Especifica el camí de dades addicionals utilitzades pel joc" -#: gui/launcher.cpp:326 gui/options.cpp:1141 +#: gui/launcher.cpp:326 gui/options.cpp:1151 msgctxt "lowres" msgid "Extra Path:" msgstr "Camí extra:" -#: gui/launcher.cpp:333 gui/options.cpp:1123 +#: gui/launcher.cpp:333 gui/options.cpp:1133 msgid "Save Path:" msgstr "Camí de partides:" #: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 -#: gui/options.cpp:1123 gui/options.cpp:1125 gui/options.cpp:1126 +#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136 msgid "Specifies where your savegames are put" msgstr "Especifica on es desaran les partides" -#: gui/launcher.cpp:335 gui/options.cpp:1125 +#: gui/launcher.cpp:335 gui/options.cpp:1135 msgctxt "lowres" msgid "Save Path:" msgstr "Partides:" #: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 -#: gui/launcher.cpp:565 gui/options.cpp:1134 gui/options.cpp:1142 -#: gui/options.cpp:1151 gui/options.cpp:1258 gui/options.cpp:1264 -#: gui/options.cpp:1272 gui/options.cpp:1302 gui/options.cpp:1308 -#: gui/options.cpp:1315 gui/options.cpp:1408 gui/options.cpp:1411 -#: gui/options.cpp:1423 +#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152 +#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282 +#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326 +#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429 +#: gui/options.cpp:1441 msgctxt "path" msgid "None" msgstr "Cap" #: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 -#: gui/options.cpp:1252 gui/options.cpp:1296 gui/options.cpp:1414 +#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Per defecte" -#: gui/launcher.cpp:504 gui/options.cpp:1417 +#: gui/launcher.cpp:504 gui/options.cpp:1435 msgid "Select SoundFont" msgstr "Seleccioneu el fitxer SoundFont" @@ -356,7 +367,7 @@ msgstr "" msgid "~Q~uit" msgstr "~T~anca" -#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:96 +#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95 msgid "Quit ScummVM" msgstr "Surt de ScummVM" @@ -364,7 +375,7 @@ msgstr "Surt de ScummVM" msgid "A~b~out..." msgstr "~Q~uant a..." -#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:70 +#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69 msgid "About ScummVM" msgstr "Quant a ScummVM" @@ -443,12 +454,14 @@ msgstr "Cerca:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 +#: engines/pegasus/pegasus.cpp:345 msgid "Load game:" msgstr "Carrega partida:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:345 +#: backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Carrega" @@ -535,133 +548,133 @@ msgid "Discovered %d new games, ignored %d previously added games ..." msgstr "" "S'han trobat %d jocs nous, s'han ignorat %d jocs afegits anteriorment ..." -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "Never" msgstr "Mai" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 5 mins" msgstr "cada 5 minuts" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 10 mins" msgstr "cada 10 minuts" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 15 mins" msgstr "cada 15 minuts" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 30 mins" msgstr "cada 30 minuts" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "8 kHz" msgstr "8 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "11kHz" msgstr "11kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "22 kHz" msgstr "22 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "44 kHz" msgstr "44 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:248 gui/options.cpp:474 gui/options.cpp:575 -#: gui/options.cpp:644 gui/options.cpp:852 +#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581 +#: gui/options.cpp:650 gui/options.cpp:858 msgctxt "soundfont" msgid "None" msgstr "Cap" -#: gui/options.cpp:382 +#: gui/options.cpp:388 msgid "Failed to apply some of the graphic options changes:" msgstr "No s'han pogut aplicar alguns canvis de les opcions gràfiques:" -#: gui/options.cpp:394 +#: gui/options.cpp:400 msgid "the video mode could not be changed." msgstr "no s'ha pogut canviar el mode de vídeo" -#: gui/options.cpp:400 +#: gui/options.cpp:406 msgid "the fullscreen setting could not be changed" msgstr "no s'ha pogut canviar l'ajust de pantalla completa" -#: gui/options.cpp:406 +#: gui/options.cpp:412 msgid "the aspect ratio setting could not be changed" msgstr "no s'ha pogut canviar l'ajust de la correcció d'aspecte" -#: gui/options.cpp:727 +#: gui/options.cpp:733 msgid "Graphics mode:" msgstr "Mode gràfic:" -#: gui/options.cpp:741 +#: gui/options.cpp:747 msgid "Render mode:" msgstr "Mode de pintat:" -#: gui/options.cpp:741 gui/options.cpp:742 +#: gui/options.cpp:747 gui/options.cpp:748 msgid "Special dithering modes supported by some games" msgstr "Modes de tramat especials suportats per alguns jocs" -#: gui/options.cpp:753 +#: gui/options.cpp:759 #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476 msgid "Fullscreen mode" msgstr "Mode pantalla completa" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Aspect ratio correction" msgstr "Correcció de la relació d'aspecte" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Correct aspect ratio for 320x200 games" msgstr "Corregeix la relació d'aspecte per jocs de 320x200" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Preferred Device:" msgstr "Disp. preferit:" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Music Device:" msgstr "Disp. de música:" -#: gui/options.cpp:764 gui/options.cpp:766 +#: gui/options.cpp:770 gui/options.cpp:772 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:764 gui/options.cpp:766 gui/options.cpp:767 +#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773 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:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Preferred Dev.:" msgstr "Disp. preferit:" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Music Device:" msgstr "Disp. de música:" -#: gui/options.cpp:793 +#: gui/options.cpp:799 msgid "AdLib emulator:" msgstr "Emulador AdLib:" -#: gui/options.cpp:793 gui/options.cpp:794 +#: gui/options.cpp:799 gui/options.cpp:800 msgid "AdLib is used for music in many games" msgstr "AdLib s'utilitza per la música de molts jocs" -#: gui/options.cpp:804 +#: gui/options.cpp:810 msgid "Output rate:" msgstr "Freq. sortida:" -#: gui/options.cpp:804 gui/options.cpp:805 +#: gui/options.cpp:810 gui/options.cpp:811 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -669,63 +682,67 @@ 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:815 +#: gui/options.cpp:821 msgid "GM Device:" msgstr "Dispositiu GM:" -#: gui/options.cpp:815 +#: gui/options.cpp:821 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:826 +#: gui/options.cpp:832 msgid "Don't use General MIDI music" msgstr "No utilitzis música General MIDI" -#: gui/options.cpp:837 gui/options.cpp:899 +#: gui/options.cpp:843 gui/options.cpp:909 msgid "Use first available device" msgstr "Utilitza el primer dispositiu disponible" -#: gui/options.cpp:849 +#: gui/options.cpp:855 msgid "SoundFont:" msgstr "Fitxer SoundFont:" -#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 +#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "Algunes targes de so, Fluidsynth i Timidity suporten SoundFont" -#: gui/options.cpp:851 +#: gui/options.cpp:857 msgctxt "lowres" msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Mixed AdLib/MIDI mode" msgstr "Mode combinat AdLib/MIDI" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Use both MIDI and AdLib sound generation" msgstr "Utilitza MIDI i la generació de so AdLib alhora" -#: gui/options.cpp:860 +#: gui/options.cpp:866 msgid "MIDI gain:" msgstr "Guany MIDI:" -#: gui/options.cpp:870 +#: gui/options.cpp:873 +msgid "FluidSynth Settings" +msgstr "" + +#: gui/options.cpp:880 msgid "MT-32 Device:" msgstr "Disposit. MT-32:" -#: gui/options.cpp:870 +#: gui/options.cpp:880 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:875 +#: gui/options.cpp:885 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Roland MT-32 real (desactiva l'emulació GM)" -#: gui/options.cpp:875 gui/options.cpp:877 +#: gui/options.cpp:885 gui/options.cpp:887 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -733,196 +750,197 @@ msgstr "" "Marqueu si voleu utilitzar el vostre dispositiu hardware real de so " "compatible amb Roland connectat al vostre ordinador" -#: gui/options.cpp:877 +#: gui/options.cpp:887 msgctxt "lowres" msgid "True Roland MT-32 (no GM emulation)" msgstr "Roland MT-32 real (sense emulació GM)" -#: gui/options.cpp:880 -msgid "Enable Roland GS Mode" -msgstr "Activa el Mode Roland GS" +#: gui/options.cpp:890 +#, fuzzy +msgid "Roland GS Mode (disable GM mapping)" +msgstr "Roland MT-32 real (desactiva l'emulació GM)" -#: gui/options.cpp:880 +#: gui/options.cpp:890 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:889 +#: gui/options.cpp:899 msgid "Don't use Roland MT-32 music" msgstr "No utilitzis música de Roland MT-32" -#: gui/options.cpp:916 +#: gui/options.cpp:926 msgid "Text and Speech:" msgstr "Text i Veus:" -#: gui/options.cpp:920 gui/options.cpp:930 +#: gui/options.cpp:930 gui/options.cpp:940 msgid "Speech" msgstr "Veus" -#: gui/options.cpp:921 gui/options.cpp:931 +#: gui/options.cpp:931 gui/options.cpp:941 msgid "Subtitles" msgstr "Subtítols" -#: gui/options.cpp:922 +#: gui/options.cpp:932 msgid "Both" msgstr "Ambdós" -#: gui/options.cpp:924 +#: gui/options.cpp:934 msgid "Subtitle speed:" msgstr "Velocitat de subt.:" -#: gui/options.cpp:926 +#: gui/options.cpp:936 msgctxt "lowres" msgid "Text and Speech:" msgstr "Text i Veus:" -#: gui/options.cpp:930 +#: gui/options.cpp:940 msgid "Spch" msgstr "Veus" -#: gui/options.cpp:931 +#: gui/options.cpp:941 msgid "Subs" msgstr "Subt" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgctxt "lowres" msgid "Both" msgstr "Ambdós" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgid "Show subtitles and play speech" msgstr "Mostra els subtítols i reprodueix la veu" -#: gui/options.cpp:934 +#: gui/options.cpp:944 msgctxt "lowres" msgid "Subtitle speed:" msgstr "Veloc. de subt.:" -#: gui/options.cpp:950 +#: gui/options.cpp:960 msgid "Music volume:" msgstr "Volum de música:" -#: gui/options.cpp:952 +#: gui/options.cpp:962 msgctxt "lowres" msgid "Music volume:" msgstr "Volum de música:" -#: gui/options.cpp:959 +#: gui/options.cpp:969 msgid "Mute All" msgstr "Silenciar tot" -#: gui/options.cpp:962 +#: gui/options.cpp:972 msgid "SFX volume:" msgstr "Volum d'efectes:" -#: gui/options.cpp:962 gui/options.cpp:964 gui/options.cpp:965 +#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975 msgid "Special sound effects volume" msgstr "Volum dels sons d'efectes especials" -#: gui/options.cpp:964 +#: gui/options.cpp:974 msgctxt "lowres" msgid "SFX volume:" msgstr "Volum d'efectes:" -#: gui/options.cpp:972 +#: gui/options.cpp:982 msgid "Speech volume:" msgstr "Volum de veus:" -#: gui/options.cpp:974 +#: gui/options.cpp:984 msgctxt "lowres" msgid "Speech volume:" msgstr "Volum de veus:" -#: gui/options.cpp:1131 +#: gui/options.cpp:1141 msgid "Theme Path:" msgstr "Camí dels temes:" -#: gui/options.cpp:1133 +#: gui/options.cpp:1143 msgctxt "lowres" msgid "Theme Path:" msgstr "Camí temes:" -#: gui/options.cpp:1139 gui/options.cpp:1141 gui/options.cpp:1142 +#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152 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:1148 +#: gui/options.cpp:1158 msgid "Plugins Path:" msgstr "Camí dels connectors:" -#: gui/options.cpp:1150 +#: gui/options.cpp:1160 msgctxt "lowres" msgid "Plugins Path:" msgstr "Camí de connectors:" -#: gui/options.cpp:1159 +#: gui/options.cpp:1169 msgid "Misc" msgstr "Misc" -#: gui/options.cpp:1161 +#: gui/options.cpp:1171 msgctxt "lowres" msgid "Misc" msgstr "Misc" -#: gui/options.cpp:1163 +#: gui/options.cpp:1173 msgid "Theme:" msgstr "Tema:" -#: gui/options.cpp:1167 +#: gui/options.cpp:1177 msgid "GUI Renderer:" msgstr "Pintat GUI:" -#: gui/options.cpp:1179 +#: gui/options.cpp:1189 msgid "Autosave:" msgstr "Desat automàtic:" -#: gui/options.cpp:1181 +#: gui/options.cpp:1191 msgctxt "lowres" msgid "Autosave:" msgstr "Auto-desat:" -#: gui/options.cpp:1189 +#: gui/options.cpp:1199 msgid "Keys" msgstr "Tecles" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "GUI Language:" msgstr "Idioma GUI:" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "Language of ScummVM GUI" msgstr "Idioma de la interfície d'usuari de ScummVM" -#: gui/options.cpp:1347 +#: gui/options.cpp:1365 msgid "You have to restart ScummVM before your changes will take effect." msgstr "Heu de reiniciar ScummVM perquè tots els canvis tinguin efecte." -#: gui/options.cpp:1360 +#: gui/options.cpp:1378 msgid "Select directory for savegames" msgstr "Seleccioneu el directori de les partides desades" -#: gui/options.cpp:1367 +#: gui/options.cpp:1385 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:1376 +#: gui/options.cpp:1394 msgid "Select directory for GUI themes" msgstr "Seleccioneu el directori dels temes" -#: gui/options.cpp:1386 +#: gui/options.cpp:1404 msgid "Select directory for extra files" msgstr "Seleccioneu el directori dels fitxers extra" -#: gui/options.cpp:1397 +#: gui/options.cpp:1415 msgid "Select directory for plugins" msgstr "Seleccioneu el directori dels connectors" -#: gui/options.cpp:1450 +#: gui/options.cpp:1468 msgid "" "The theme you selected does not support your current language. If you want " "to use this theme you need to switch to another language first." @@ -930,71 +948,71 @@ msgstr "" "El tema que heu seleccionat no suporta l'idioma actual. Si voleu utilitzar " "aquest tema primer haureu de canviar a un altre idioma." -#: gui/saveload-dialog.cpp:158 +#: gui/saveload-dialog.cpp:166 msgid "List view" msgstr "Vista de llistat" -#: gui/saveload-dialog.cpp:159 +#: gui/saveload-dialog.cpp:167 msgid "Grid view" msgstr "Vista de quadrícula" -#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 +#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358 msgid "No date saved" msgstr "No hi ha data desada" -#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359 msgid "No time saved" msgstr "No hi ha hora desada" -#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 +#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360 msgid "No playtime saved" msgstr "No hi ha temps de joc desat" -#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275 msgid "Delete" msgstr "Suprimeix" -#: gui/saveload-dialog.cpp:266 +#: gui/saveload-dialog.cpp:274 msgid "Do you really want to delete this savegame?" msgstr "Realment voleu suprimir aquesta partida?" -#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:800 +#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872 msgid "Date: " msgstr "Data: " -#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:806 +#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878 msgid "Time: " msgstr "Hora: " -#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:814 +#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886 msgid "Playtime: " msgstr "Temps de joc: " -#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 +#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494 msgid "Untitled savestate" msgstr "Partida sense títol" -#: gui/saveload-dialog.cpp:517 +#: gui/saveload-dialog.cpp:546 msgid "Next" msgstr "Següent" -#: gui/saveload-dialog.cpp:520 +#: gui/saveload-dialog.cpp:549 msgid "Prev" msgstr "Anterior" -#: gui/saveload-dialog.cpp:688 +#: gui/saveload-dialog.cpp:736 msgid "New Save" msgstr "Nova partida desada" -#: gui/saveload-dialog.cpp:688 +#: gui/saveload-dialog.cpp:736 msgid "Create a new save game" msgstr "Crea una nova partida desada" -#: gui/saveload-dialog.cpp:793 +#: gui/saveload-dialog.cpp:865 msgid "Name: " msgstr "Nom: " -#: gui/saveload-dialog.cpp:865 +#: gui/saveload-dialog.cpp:937 #, c-format msgid "Enter a description for slot %d:" msgstr "Entreu la descripció per l'espai %d:" @@ -1032,35 +1050,35 @@ msgstr "Amb antialias (16bpp)" msgid "Clear value" msgstr "Neteja el valor" -#: base/main.cpp:209 +#: base/main.cpp:210 #, c-format msgid "Engine does not support debug level '%s'" msgstr "El motor no suporta el nivell de depuració '%s'" -#: base/main.cpp:287 +#: base/main.cpp:288 msgid "Menu" msgstr "Menú" -#: base/main.cpp:290 backends/platform/symbian/src/SymbianActions.cpp:45 +#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:45 #: backends/platform/wince/CEActionsSmartphone.cpp:46 msgid "Skip" msgstr "Salta" -#: base/main.cpp:293 backends/platform/symbian/src/SymbianActions.cpp:50 +#: base/main.cpp:294 backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:42 msgid "Pause" msgstr "Pausa" -#: base/main.cpp:296 +#: base/main.cpp:297 msgid "Skip line" msgstr "Salta la línia" -#: base/main.cpp:467 +#: base/main.cpp:468 msgid "Error running game:" msgstr "Error al executar el joc:" -#: base/main.cpp:491 +#: base/main.cpp:492 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" @@ -1176,13 +1194,16 @@ msgid "~R~eturn to Launcher" msgstr "~R~etorna al Llançador" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284 +#: engines/pegasus/pegasus.cpp:369 msgid "Save game:" msgstr "Desa la partida:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:369 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1210,12 +1231,12 @@ msgstr "" "informació bàsica i les instruccions sobre com obtenir més assistència." #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 -#: engines/mohawk/dialogs.cpp:174 +#: engines/mohawk/dialogs.cpp:170 msgid "~O~K" msgstr "~D~'acord" #: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 -#: engines/mohawk/dialogs.cpp:175 +#: engines/mohawk/dialogs.cpp:171 msgid "~C~ancel" msgstr "~C~ancel·la" @@ -1223,23 +1244,23 @@ msgstr "~C~ancel·la" msgid "~K~eys" msgstr "~T~ecles" -#: engines/engine.cpp:235 +#: engines/engine.cpp:240 msgid "Could not initialize color format." msgstr "No s'ha pogut iniciar el format de color." -#: engines/engine.cpp:243 +#: engines/engine.cpp:248 msgid "Could not switch to video mode: '" msgstr "No s'ha pogut canviar al mode de vídeo: '" -#: engines/engine.cpp:252 +#: engines/engine.cpp:257 msgid "Could not apply aspect ratio setting." msgstr "No s'ha pogut aplicar la configuració de la relació d'aspecte." -#: engines/engine.cpp:257 +#: engines/engine.cpp:262 msgid "Could not apply fullscreen setting." msgstr "No s'ha pogut aplicar l'ajust de pantalla completa." -#: engines/engine.cpp:357 +#: engines/engine.cpp:362 msgid "" "You appear to be playing this game directly\n" "from the CD. This is known to cause problems,\n" @@ -1253,7 +1274,7 @@ msgstr "" "els fitxers de dades al disc dur.\n" "Consulteu el fitxer README per a més detalls." -#: engines/engine.cpp:368 +#: engines/engine.cpp:373 msgid "" "This game has audio tracks in its disk. These\n" "tracks need to be ripped from the disk using\n" @@ -1267,7 +1288,7 @@ msgstr "" "tal de poder sentir la música del joc.\n" "Consulteu el fitxer README per a més detalls." -#: engines/engine.cpp:426 +#: engines/engine.cpp:431 #, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " @@ -1276,7 +1297,7 @@ msgstr "" "No s'ha pogut carregar la partida (%s)! Consulteu el fitxer README per a la " "informació bàsica i les instruccions sobre com obtenir més assistència." -#: engines/engine.cpp:439 +#: engines/engine.cpp:444 msgid "" "WARNING: The game you are about to start is not yet fully supported by " "ScummVM. As such, it is likely to be unstable, and any saves you make might " @@ -1286,29 +1307,52 @@ msgstr "" "pel ScummVM. Com a tal, probablement serà inestable, i pot ser que les " "partides que deseu no funcionin en versions futures de ScummVM." -#: engines/engine.cpp:442 +#: engines/engine.cpp:447 msgid "Start anyway" msgstr "Inicia de totes maneres" -#: engines/agi/detection.cpp:142 engines/dreamweb/detection.cpp:47 -#: engines/sci/detection.cpp:390 +#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270 +#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393 +#: engines/toltecs/detection.cpp:173 msgid "Use original save/load screens" msgstr "Utilitza les pantalles originals de desat/càrrega" -#: engines/agi/detection.cpp:143 engines/dreamweb/detection.cpp:48 -#: engines/sci/detection.cpp:391 +#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271 +#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394 +#: engines/toltecs/detection.cpp:174 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" "Utilitza les pantalles originals de desat/càrrega, en lloc de les de ScummVM" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore game:" msgstr "Recupera la partida:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore" msgstr "Restaura" +#: engines/drascula/saveload.cpp:49 +#, fuzzy +msgid "" +"ScummVM found that you have old savefiles for Drascula that should be " +"converted.\n" +"The old save game format is no longer supported, so you will not be able to " +"load your games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" +msgstr "" +"El ScummVM ha trobat que teniu partides desades antigues de Broken Sword 1 " +"que s'haurien de convertir.\n" +"El format de les partides desades antigues no està suportat, per la qual " +"cosa no podreu carregar aquestes partides si no les convertiu.\n" +"\n" +"Premeu D'Acord per convertir-les ara, en cas contrari se us tornarà a " +"demanar la propera vegada que engegueu el joc.\n" + #: engines/dreamweb/detection.cpp:57 msgid "Use bright palette mode" msgstr "Utilitza el mode de paleta brillant" @@ -1317,27 +1361,27 @@ msgstr "Utilitza el mode de paleta brillant" msgid "Display graphics using the game's bright palette" msgstr "Mostra els gràfics utilitzant la paleta brillant del joc" -#: engines/sci/detection.cpp:370 +#: engines/sci/detection.cpp:373 msgid "EGA undithering" msgstr "Elimina el tramat d'EGA" -#: engines/sci/detection.cpp:371 +#: engines/sci/detection.cpp:374 msgid "Enable undithering in EGA games" msgstr "Activa l'eliminació del tramat en els jocs EGA" -#: engines/sci/detection.cpp:380 +#: engines/sci/detection.cpp:383 msgid "Prefer digital sound effects" msgstr "Prefereix efectes de so digitals" -#: engines/sci/detection.cpp:381 +#: engines/sci/detection.cpp:384 msgid "Prefer digital sound effects instead of synthesized ones" msgstr "Prefereix els efectes de so digitals en lloc dels sintetitzats" -#: engines/sci/detection.cpp:400 +#: engines/sci/detection.cpp:403 msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "Utilitza IMF/Yamaha FB-01 per la sortida MIDI" -#: engines/sci/detection.cpp:401 +#: engines/sci/detection.cpp:404 msgid "" "Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" @@ -1345,31 +1389,31 @@ msgstr "" "Utilitza una tarja IBM Music Feature o un mòdul sintetitzador Yamaha FB-01 " "FM per la sortida MIDI" -#: engines/sci/detection.cpp:411 +#: engines/sci/detection.cpp:414 msgid "Use CD audio" msgstr "Utilitza l'àudio del CD" -#: engines/sci/detection.cpp:412 +#: engines/sci/detection.cpp:415 msgid "Use CD audio instead of in-game audio, if available" msgstr "" "Utilitza l'àudio del CD en lloc de l'àudio intern del joc, si està disponible" -#: engines/sci/detection.cpp:422 +#: engines/sci/detection.cpp:425 msgid "Use Windows cursors" msgstr "Utilitza els cursors de Windows" -#: engines/sci/detection.cpp:423 +#: engines/sci/detection.cpp:426 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "" "Utilitza els cursors de Windows (més petits i en blanc i negre) en lloc dels " "de DOS" -#: engines/sci/detection.cpp:433 +#: engines/sci/detection.cpp:436 msgid "Use silver cursors" msgstr "Utilitza cursors platejats" -#: engines/sci/detection.cpp:434 +#: engines/sci/detection.cpp:437 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "" @@ -2023,7 +2067,7 @@ msgstr "Vola a la dreta" msgid "Fly to lower right" msgstr "Vola avall i a la dreta" -#: engines/scumm/scumm.cpp:1773 +#: engines/scumm/scumm.cpp:1776 #, c-format msgid "" "Native MIDI support requires the Roland Upgrade from LucasArts,\n" @@ -2032,7 +2076,7 @@ msgstr "" "El suport de MIDI natiu requereix l'actualització Roland de LucasArts,\n" "però no s'ha trobat %s. S'utilitzarà AdLib." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 +#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2043,7 +2087,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 +#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2054,7 +2098,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 +#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2065,7 +2109,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2512 +#: engines/scumm/scumm.cpp:2537 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2076,7 +2120,7 @@ msgstr "" "seleccioneu el directori 'Maniac' de dins del directori del joc Tentacle." #. I18N: Option for fast scene switching -#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171 +#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167 msgid "~Z~ip Mode Activated" msgstr "Mode ~Z~ip activat" @@ -2097,7 +2141,7 @@ msgstr "~M~ostra el mapa" msgid "~M~ain Menu" msgstr "~M~enú Principal" -#: engines/mohawk/dialogs.cpp:172 +#: engines/mohawk/dialogs.cpp:168 msgid "~W~ater Effect Enabled" msgstr "~E~fecte de l'aigua activat" @@ -2119,6 +2163,15 @@ msgstr "No s'ha pogut desar l'estat del joc al fitxer." msgid "Failed to delete file." msgstr "No s'ha pogut esborrar el fitxer." +#: engines/groovie/detection.cpp:312 +#, fuzzy +msgid "Fast movie speed" +msgstr "Mode ràpid" + +#: engines/groovie/detection.cpp:313 +msgid "Play movies at an increased speed" +msgstr "" + #: engines/groovie/script.cpp:420 msgid "Failed to save game" msgstr "No s'ha pogut desar l'estat del joc" @@ -2209,11 +2262,11 @@ msgstr "Mou a l'esquerra" msgid "Slide Right" msgstr "Mou a la dreta" -#: engines/kyra/lol.cpp:485 +#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2412 msgid "Turn Left" msgstr "Gira a l'esquerra" -#: engines/kyra/lol.cpp:486 +#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2413 msgid "Turn Right" msgstr "Gira a la dreta" @@ -2229,7 +2282,7 @@ msgstr "Opcions" msgid "Choose Spell" msgstr "Escull l'encanteri" -#: engines/kyra/sound_midi.cpp:475 +#: engines/kyra/sound_midi.cpp:477 msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2296,7 +2349,7 @@ msgstr "Les escenes MPEG2 ja no estan suportades" msgid "Cutscene '%s' not found" msgstr "No s'ha trobat l'escena '%s'" -#: engines/sword1/control.cpp:863 +#: engines/sword1/control.cpp:865 msgid "" "ScummVM found that you have old savefiles for Broken Sword 1 that should be " "converted.\n" @@ -2314,7 +2367,7 @@ msgstr "" "Premeu D'Acord per convertir-les ara, en cas contrari se us tornarà a " "demanar la propera vegada que engegueu el joc.\n" -#: engines/sword1/control.cpp:1232 +#: engines/sword1/control.cpp:1234 #, c-format msgid "" "Target new save game already exists!\n" @@ -2323,11 +2376,11 @@ msgstr "" "La nova partida guardada d'aquest joc ja existeix!\n" "Voleu conservar la partida guardada antiga (%s) o la nova (%s)?\n" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the old one" msgstr "Mantingues el vell" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the new one" msgstr "Mantingues el nou" @@ -2350,12 +2403,12 @@ msgstr "Mostra les etiquetes dels objectes" msgid "Show labels for objects on mouse hover" msgstr "Mostra etiquetes al posar el ratolí sobre els objectes" -#: engines/teenagent/resources.cpp:68 +#: engines/teenagent/resources.cpp:94 msgid "" "You're missing the 'teenagent.dat' file. Get it from the ScummVM website" msgstr "Us falta el fitxer 'teenagent.dat'. Obteniu-lo a la pàgina de ScummVM" -#: engines/teenagent/resources.cpp:89 +#: engines/teenagent/resources.cpp:115 msgid "" "The teenagent.dat file is compressed and zlib hasn't been included in this " "executable. Please decompress it" @@ -2413,6 +2466,47 @@ msgstr "" "\n" "Informeu-ne a l'equip." +#: engines/pegasus/pegasus.cpp:675 +msgid "Invalid save file name" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2410 +msgid "Up/Zoom In/Move Forward/Open Doors" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2411 +#, fuzzy +msgid "Down/Zoom Out" +msgstr "Amplia" + +#: engines/pegasus/pegasus.cpp:2414 +msgid "Display/Hide Inventory Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2415 +msgid "Display/Hide Biochip Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2416 +msgid "Action/Select" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2417 +msgid "Toggle Center Data Display" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2418 +msgid "Display/Hide Info Screen" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2419 +msgid "Display/Hide Pause Menu" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2420 +msgid "???" +msgstr "" + #: audio/fmopl.cpp:49 msgid "MAME OPL emulator" msgstr "Emulador OPL de MAME" @@ -2470,7 +2564,7 @@ msgstr "Sense música" msgid "Amiga Audio Emulator" msgstr "Emulador d'àudio Amiga" -#: audio/softsynth/adlib.cpp:1593 +#: audio/softsynth/adlib.cpp:2284 msgid "AdLib Emulator" msgstr "Emulador d'AdLib" @@ -2482,11 +2576,11 @@ msgstr "Emulador d'Apple II GS (NO IMPLEMENTAT)" msgid "C64 Audio Emulator" msgstr "Emulador d'àudio C64" -#: audio/softsynth/mt32.cpp:293 +#: audio/softsynth/mt32.cpp:205 msgid "Initializing MT-32 Emulator" msgstr "Iniciant l'Emulador de MT-32" -#: audio/softsynth/mt32.cpp:512 +#: audio/softsynth/mt32.cpp:431 msgid "MT-32 Emulator" msgstr "Emulador de MT-32" @@ -2637,24 +2731,24 @@ msgstr "Clic central" msgid "Right Click" msgstr "Clic dret" -#: backends/platform/sdl/macosx/appmenu_osx.mm:78 +#: backends/platform/sdl/macosx/appmenu_osx.mm:77 msgid "Hide ScummVM" msgstr "Amaga ScummVM" -#: backends/platform/sdl/macosx/appmenu_osx.mm:83 +#: backends/platform/sdl/macosx/appmenu_osx.mm:82 msgid "Hide Others" msgstr "Oculta els altres" -#: backends/platform/sdl/macosx/appmenu_osx.mm:88 +#: backends/platform/sdl/macosx/appmenu_osx.mm:87 msgid "Show All" msgstr "Mostra-ho tot" -#: backends/platform/sdl/macosx/appmenu_osx.mm:110 -#: backends/platform/sdl/macosx/appmenu_osx.mm:121 +#: backends/platform/sdl/macosx/appmenu_osx.mm:109 +#: backends/platform/sdl/macosx/appmenu_osx.mm:120 msgid "Window" msgstr "Finestra" -#: backends/platform/sdl/macosx/appmenu_osx.mm:115 +#: backends/platform/sdl/macosx/appmenu_osx.mm:114 msgid "Minimize" msgstr "Minimitza" @@ -2668,12 +2762,12 @@ msgid "Normal (no scaling)" msgstr "Normal (no escalat)" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537 msgid "Enabled aspect ratio correction" msgstr "S'ha activat la correcció de la relació d'aspecte" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542 msgid "Disabled aspect ratio correction" msgstr "S'ha desactivat la correcció de la relació d'aspecte" @@ -2682,7 +2776,7 @@ msgid "Active graphics filter:" msgstr "Filtre de gràfics actiu:" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481 msgid "Windowed mode" msgstr "Mode de finestra" @@ -2706,11 +2800,11 @@ msgstr "Mode de vídeo actual" msgid "Current scale" msgstr "Escala actual" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:558 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562 msgid "Active filter mode: Linear" msgstr "Mode de filtre actiu: Lineal" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:560 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564 msgid "Active filter mode: Nearest" msgstr "Mode de filtre actiu: Pròxim" @@ -3036,19 +3130,19 @@ msgstr "Estàs segur de voler sortir?" #: backends/events/gph/gph-events.cpp:386 #: backends/events/gph/gph-events.cpp:429 -#: backends/events/openpandora/op-events.cpp:139 +#: backends/events/openpandora/op-events.cpp:168 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "'Mode Toc' de pantalla tàctil - Clic esquerre" #: backends/events/gph/gph-events.cpp:388 #: backends/events/gph/gph-events.cpp:431 -#: backends/events/openpandora/op-events.cpp:141 +#: backends/events/openpandora/op-events.cpp:170 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "'Mode Toc' de pantalla tàctil - Clic dret" #: backends/events/gph/gph-events.cpp:390 #: backends/events/gph/gph-events.cpp:433 -#: backends/events/openpandora/op-events.cpp:143 +#: backends/events/openpandora/op-events.cpp:172 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "'Mode Toc' de pantalla tàctil - Flotant (sense clic)" @@ -3068,7 +3162,12 @@ msgstr "Volum mínim" msgid "Decreasing Volume" msgstr "Baixant el volum" -#: backends/updates/macosx/macosx-updates.mm:65 +#: backends/events/openpandora/op-events.cpp:174 +#, fuzzy +msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)" +msgstr "'Mode Toc' de pantalla tàctil - Flotant (sense clic)" + +#: backends/updates/macosx/macosx-updates.mm:67 msgid "Check for Updates..." msgstr "Comprova les actualitzacions..." @@ -3103,3 +3202,6 @@ msgstr "Clicat activat" #: backends/events/maemosdl/maemosdl-events.cpp:192 msgid "Clicking Disabled" msgstr "Clicat desactivat" + +#~ msgid "Enable Roland GS Mode" +#~ msgstr "Activa el Mode Roland GS" diff --git a/po/cs_CZ.po b/po/cs_CZ.po index 107be45398..9fb4934cb6 100644 --- a/po/cs_CZ.po +++ b/po/cs_CZ.po @@ -1,64 +1,72 @@ # Czech translation for ScummVM. -# Copyright (C) 2001-2011 ScummVM Team +# Copyright (C) 2001-2013 ScummVM Team # This file is distributed under the same license as the ScummVM package. -# Zbynìk Schwarz <zbynek.schwarz@gmail.com>, 2011. +# Zbynìk Schwarz <zbynek.schwarz@gmail.com>, 2011-2013. # msgid "" msgstr "" "Project-Id-Version: ScummVM 1.4.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-08-12 14:57+0200\n" -"PO-Revision-Date: 2012-07-08 18:03+0100\n" +"POT-Creation-Date: 2013-02-07 23:11+0000\n" +"PO-Revision-Date: 2013-02-07 10:36+0100\n" "Last-Translator: Zbynìk Schwarz <zbynek.schwarz@gmail.com>\n" "Language-Team: \n" "Language: Cesky\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-2\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" -"X-Poedit-Language: Czech\n" -"X-Poedit-Country: CZECH REPUBLIC\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Poedit-SourceCharset: iso-8859-2\n" +"X-Generator: Poedit 1.5.5\n" -#: gui/about.cpp:91 +#: gui/about.cpp:93 #, c-format msgid "(built on %s)" msgstr "(sestaveno %s)" -#: gui/about.cpp:98 +#: gui/about.cpp:100 msgid "Features compiled in:" msgstr "Zakompilované funkce:" -#: gui/about.cpp:107 +#: gui/about.cpp:109 msgid "Available engines:" msgstr "Dostupná jádra:" -#: gui/browser.cpp:66 +#: gui/browser.cpp:67 +msgid "Show hidden files" +msgstr "Zobrazit skryté soubory" + +#: gui/browser.cpp:67 +msgid "Show files marked with the hidden attribute" +msgstr "Zobrazit soubory s vlastností skryté" + +#: gui/browser.cpp:71 msgid "Go up" msgstr "Jít nahoru" -#: gui/browser.cpp:66 gui/browser.cpp:68 +#: gui/browser.cpp:71 gui/browser.cpp:73 msgid "Go to previous directory level" msgstr "Jít na pøedchozí úroveò adresáøe" -#: gui/browser.cpp:68 +#: gui/browser.cpp:73 msgctxt "lowres" msgid "Go up" msgstr "Jít nahoru" -#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 -#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 -#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 -#: gui/themebrowser.cpp:54 engines/engine.cpp:442 -#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 +#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238 +#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275 +#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919 +#: gui/themebrowser.cpp:54 engines/engine.cpp:447 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:190 +#: engines/sword1/control.cpp:867 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" msgstr "Zru¹it" -#: gui/browser.cpp:70 gui/chooser.cpp:46 gui/themebrowser.cpp:55 +#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55 msgid "Choose" msgstr "Zvolit" @@ -73,15 +81,15 @@ msgstr "Zavøít" msgid "Mouse click" msgstr "Kliknutí my¹í" -#: gui/gui-manager.cpp:122 base/main.cpp:300 +#: gui/gui-manager.cpp:122 base/main.cpp:301 msgid "Display keyboard" msgstr "Zobrazit klávesnici" -#: gui/gui-manager.cpp:126 base/main.cpp:304 +#: gui/gui-manager.cpp:126 base/main.cpp:305 msgid "Remap keys" msgstr "Pøemapovat klávesy" -#: gui/gui-manager.cpp:129 base/main.cpp:307 +#: gui/gui-manager.cpp:129 base/main.cpp:308 msgid "Toggle FullScreen" msgstr "Pøepnout celou obrazovku" @@ -94,17 +102,18 @@ msgid "Map" msgstr "Mapovat" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 -#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 -#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 -#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 -#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 -#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 -#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 -#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 -#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 -#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 +#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239 +#: gui/saveload-dialog.cpp:920 engines/engine.cpp:366 engines/engine.cpp:377 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192 +#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558 +#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 +#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519 +#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550 +#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:867 +#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419 +#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449 +#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -175,8 +184,8 @@ msgid "" "English" msgstr "Jazyk hry. Toto z Va¹í ©panìlské verze neudìlá Anglickou" -#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:80 -#: gui/options.cpp:730 gui/options.cpp:743 gui/options.cpp:1199 +#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86 +#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209 #: audio/null.cpp:40 msgid "<default>" msgstr "<výchozí>" @@ -198,11 +207,11 @@ msgstr "Platforma:" msgid "Engine" msgstr "Jádro" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "Graphics" msgstr "Obraz" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "GFX" msgstr "GFX" @@ -215,7 +224,7 @@ msgctxt "lowres" msgid "Override global graphic settings" msgstr "Potlaèit globální nastavení obrazu" -#: gui/launcher.cpp:251 gui/options.cpp:1085 +#: gui/launcher.cpp:251 gui/options.cpp:1095 msgid "Audio" msgstr "Zvuk" @@ -228,11 +237,11 @@ msgctxt "lowres" msgid "Override global audio settings" msgstr "Potlaèit globální nastavení zvuku" -#: gui/launcher.cpp:265 gui/options.cpp:1090 +#: gui/launcher.cpp:265 gui/options.cpp:1100 msgid "Volume" msgstr "Hlasitost" -#: gui/launcher.cpp:267 gui/options.cpp:1092 +#: gui/launcher.cpp:267 gui/options.cpp:1102 msgctxt "lowres" msgid "Volume" msgstr "Hlasitost" @@ -246,7 +255,7 @@ msgctxt "lowres" msgid "Override global volume settings" msgstr "Potlaèit globální nastavení hlasitosti" -#: gui/launcher.cpp:280 gui/options.cpp:1100 +#: gui/launcher.cpp:280 gui/options.cpp:1110 msgid "MIDI" msgstr "MIDI" @@ -259,7 +268,7 @@ msgctxt "lowres" msgid "Override global MIDI settings" msgstr "Potlaèit globální nastavení MIDI" -#: gui/launcher.cpp:294 gui/options.cpp:1106 +#: gui/launcher.cpp:294 gui/options.cpp:1116 msgid "MT-32" msgstr "MT-32" @@ -272,11 +281,11 @@ msgctxt "lowres" msgid "Override global MT-32 settings" msgstr "Potlaèit globální nastavení MT-32" -#: gui/launcher.cpp:308 gui/options.cpp:1113 +#: gui/launcher.cpp:308 gui/options.cpp:1123 msgid "Paths" msgstr "Cesty" -#: gui/launcher.cpp:310 gui/options.cpp:1115 +#: gui/launcher.cpp:310 gui/options.cpp:1125 msgctxt "lowres" msgid "Paths" msgstr "Cesty" @@ -290,7 +299,7 @@ msgctxt "lowres" msgid "Game Path:" msgstr "Cesta Hry:" -#: gui/launcher.cpp:324 gui/options.cpp:1139 +#: gui/launcher.cpp:324 gui/options.cpp:1149 msgid "Extra Path:" msgstr "Dodateèná Cesta:" @@ -298,42 +307,42 @@ msgstr "Dodateèná Cesta:" msgid "Specifies path to additional data used the game" msgstr "Stanoví cestu pro dodateèná data pou¾itá ve høe" -#: gui/launcher.cpp:326 gui/options.cpp:1141 +#: gui/launcher.cpp:326 gui/options.cpp:1151 msgctxt "lowres" msgid "Extra Path:" msgstr "Dodateèná Cesta:" -#: gui/launcher.cpp:333 gui/options.cpp:1123 +#: gui/launcher.cpp:333 gui/options.cpp:1133 msgid "Save Path:" msgstr "Cesta pro ulo¾ení:" #: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 -#: gui/options.cpp:1123 gui/options.cpp:1125 gui/options.cpp:1126 +#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136 msgid "Specifies where your savegames are put" msgstr "Stanovuje, kam jsou umístìny va¹e ulo¾ené hry" -#: gui/launcher.cpp:335 gui/options.cpp:1125 +#: gui/launcher.cpp:335 gui/options.cpp:1135 msgctxt "lowres" msgid "Save Path:" msgstr "Cesta pro ulo¾ení:" #: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 -#: gui/launcher.cpp:565 gui/options.cpp:1134 gui/options.cpp:1142 -#: gui/options.cpp:1151 gui/options.cpp:1258 gui/options.cpp:1264 -#: gui/options.cpp:1272 gui/options.cpp:1302 gui/options.cpp:1308 -#: gui/options.cpp:1315 gui/options.cpp:1408 gui/options.cpp:1411 -#: gui/options.cpp:1423 +#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152 +#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282 +#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326 +#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429 +#: gui/options.cpp:1441 msgctxt "path" msgid "None" msgstr "®ádné" #: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 -#: gui/options.cpp:1252 gui/options.cpp:1296 gui/options.cpp:1414 +#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Výchozí" -#: gui/launcher.cpp:504 gui/options.cpp:1417 +#: gui/launcher.cpp:504 gui/options.cpp:1435 msgid "Select SoundFont" msgstr "Vybrat SoundFont" @@ -357,7 +366,7 @@ msgstr "Toto ID hry je u¾ zabrané. Vyberte si, prosím, jiné." msgid "~Q~uit" msgstr "~U~konèit" -#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:96 +#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95 msgid "Quit ScummVM" msgstr "Ukonèit ScummVM" @@ -365,7 +374,7 @@ msgstr "Ukonèit ScummVM" msgid "A~b~out..." msgstr "~O~ Programu..." -#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:70 +#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69 msgid "About ScummVM" msgstr "O ScummVM" @@ -442,12 +451,14 @@ msgstr "Hledat:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 +#: engines/pegasus/pegasus.cpp:345 msgid "Load game:" msgstr "Nahrát hru:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:345 +#: backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Nahrát" @@ -532,133 +543,133 @@ msgstr "Prohledáno %d adresáøù..." msgid "Discovered %d new games, ignored %d previously added games ..." msgstr "Objeveno %d nových her, ignorováno %d døíve pøidaných her ..." -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "Never" msgstr "Nikdy" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 5 mins" msgstr "Ka¾dých 5 min" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 10 mins" msgstr "Ka¾dých 10 min" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 15 mins" msgstr "Ka¾dých 15 min" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 30 mins" msgstr "Ka¾dých 30 min" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "8 kHz" msgstr "8 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "11kHz" msgstr "11kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "22 kHz" msgstr "22 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "44 kHz" msgstr "44 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:248 gui/options.cpp:474 gui/options.cpp:575 -#: gui/options.cpp:644 gui/options.cpp:852 +#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581 +#: gui/options.cpp:650 gui/options.cpp:858 msgctxt "soundfont" msgid "None" msgstr "®ádné" -#: gui/options.cpp:382 +#: gui/options.cpp:388 msgid "Failed to apply some of the graphic options changes:" msgstr "Nelze pou¾ít nìkteré zmìny mo¾ností grafiky:" -#: gui/options.cpp:394 +#: gui/options.cpp:400 msgid "the video mode could not be changed." msgstr "re¾im obrazu nemohl být zmìnìn." -#: gui/options.cpp:400 +#: gui/options.cpp:406 msgid "the fullscreen setting could not be changed" msgstr "nastavení celé obrazovky nemohlo být zmìnìno" -#: gui/options.cpp:406 +#: gui/options.cpp:412 msgid "the aspect ratio setting could not be changed" msgstr "nastavení pomìru stran nemohlo být zmìnìno" -#: gui/options.cpp:727 +#: gui/options.cpp:733 msgid "Graphics mode:" msgstr "Re¾im obrazu:" -#: gui/options.cpp:741 +#: gui/options.cpp:747 msgid "Render mode:" msgstr "Re¾im vykreslení:" -#: gui/options.cpp:741 gui/options.cpp:742 +#: gui/options.cpp:747 gui/options.cpp:748 msgid "Special dithering modes supported by some games" msgstr "Speciální re¾imy chvìní podporované nìkterými hrami" -#: gui/options.cpp:753 +#: gui/options.cpp:759 #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476 msgid "Fullscreen mode" msgstr "Re¾im celé obrazovky" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Aspect ratio correction" msgstr "Korekce pomìru stran" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Correct aspect ratio for 320x200 games" msgstr "Korigovat pomìr stran pro hry 320x200" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Preferred Device:" msgstr "Prioritní Zaøízení:" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Music Device:" msgstr "Hudební zaøízení" -#: gui/options.cpp:764 gui/options.cpp:766 +#: gui/options.cpp:770 gui/options.cpp:772 msgid "Specifies preferred sound device or sound card emulator" msgstr "Stanoví prioritní zvukové zaøízení nebo emulátor zvukové karty" -#: gui/options.cpp:764 gui/options.cpp:766 gui/options.cpp:767 +#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773 msgid "Specifies output sound device or sound card emulator" msgstr "Stanoví výstupní zvukové zaøízení nebo emulátor zvukové karty" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Preferred Dev.:" msgstr "Prioritní Zaø.:" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Music Device:" msgstr "Hudební zaøízení" -#: gui/options.cpp:793 +#: gui/options.cpp:799 msgid "AdLib emulator:" msgstr "AdLib emulátor" -#: gui/options.cpp:793 gui/options.cpp:794 +#: gui/options.cpp:799 gui/options.cpp:800 msgid "AdLib is used for music in many games" msgstr "AdLib se pou¾ívá pro hudbu v mnoha hrách" -#: gui/options.cpp:804 +#: gui/options.cpp:810 msgid "Output rate:" msgstr "Výstup. frekvence:" -#: gui/options.cpp:804 gui/options.cpp:805 +#: gui/options.cpp:810 gui/options.cpp:811 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -666,62 +677,66 @@ msgstr "" "Vy¹¹í hodnota zpùsobí lep¹í kvalitu zvuku, ale nemusí být podporována Va¹i " "zvukovou kartou" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "GM Device:" msgstr "GM Zaøízení:" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "Specifies default sound device for General MIDI output" msgstr "Stanoví výchozí zvukové zaøízení pro výstup General MIDI" -#: gui/options.cpp:826 +#: gui/options.cpp:832 msgid "Don't use General MIDI music" msgstr "Nepou¾ívat hudbu General MIDI" -#: gui/options.cpp:837 gui/options.cpp:899 +#: gui/options.cpp:843 gui/options.cpp:909 msgid "Use first available device" msgstr "Pou¾ít první dostupné zaøízení" -#: gui/options.cpp:849 +#: gui/options.cpp:855 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 +#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "SoundFont je podporován nìkterými zvukovými kartami, Fluidsynth a Timidity" -#: gui/options.cpp:851 +#: gui/options.cpp:857 msgctxt "lowres" msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Mixed AdLib/MIDI mode" msgstr "Smí¹ený re¾im AdLib/MIDI" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Use both MIDI and AdLib sound generation" msgstr "Pou¾ít obì zvukové generace MIDI a AdLib" -#: gui/options.cpp:860 +#: gui/options.cpp:866 msgid "MIDI gain:" msgstr "Zesílení MIDI:" -#: gui/options.cpp:870 +#: gui/options.cpp:873 +msgid "FluidSynth Settings" +msgstr "Nastavení FluidSynth" + +#: gui/options.cpp:880 msgid "MT-32 Device:" msgstr "Zaøízení MT-32:" -#: gui/options.cpp:870 +#: gui/options.cpp:880 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" "Stanoví výchozí zvukové výstupní zaøízení pro Roland MT-32/LAPC1/CM32l/CM64" -#: gui/options.cpp:875 +#: gui/options.cpp:885 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Opravdový Roland MT-32 (vypne GM emulaci)" -#: gui/options.cpp:875 gui/options.cpp:877 +#: gui/options.cpp:885 gui/options.cpp:887 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -729,190 +744,190 @@ msgstr "" "Za¹krtnìte, pokud chcete pou¾ít pravé hardwarové zaøízení kompatibilní s " "Roland, pøipojené k va¹emu poèítaèi" -#: gui/options.cpp:877 +#: gui/options.cpp:887 msgctxt "lowres" msgid "True Roland MT-32 (no GM emulation)" msgstr "Opravdový Roland MT-32 (¾ádná GM emulace)" -#: gui/options.cpp:880 -msgid "Enable Roland GS Mode" -msgstr "Zapnout re¾im Roland GS" +#: gui/options.cpp:890 +msgid "Roland GS Mode (disable GM mapping)" +msgstr "Re¾im Roland GS (vypne mapování GM)" -#: gui/options.cpp:880 +#: gui/options.cpp:890 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "Vypne mapování General MIDI pro hry s Roland MT-32 zvukovým doprovodem" -#: gui/options.cpp:889 +#: gui/options.cpp:899 msgid "Don't use Roland MT-32 music" msgstr "Nepou¾ívat hudbu Roland MT-32" -#: gui/options.cpp:916 +#: gui/options.cpp:926 msgid "Text and Speech:" msgstr "Text a Øeè" -#: gui/options.cpp:920 gui/options.cpp:930 +#: gui/options.cpp:930 gui/options.cpp:940 msgid "Speech" msgstr "Øeè" -#: gui/options.cpp:921 gui/options.cpp:931 +#: gui/options.cpp:931 gui/options.cpp:941 msgid "Subtitles" msgstr "Titulky" -#: gui/options.cpp:922 +#: gui/options.cpp:932 msgid "Both" msgstr "Oba" -#: gui/options.cpp:924 +#: gui/options.cpp:934 msgid "Subtitle speed:" msgstr "Rychlost titulkù:" -#: gui/options.cpp:926 +#: gui/options.cpp:936 msgctxt "lowres" msgid "Text and Speech:" msgstr "Text a Øeè:" -#: gui/options.cpp:930 +#: gui/options.cpp:940 msgid "Spch" msgstr "Øeè" -#: gui/options.cpp:931 +#: gui/options.cpp:941 msgid "Subs" msgstr "Titl" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgctxt "lowres" msgid "Both" msgstr "Oba" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgid "Show subtitles and play speech" msgstr "Zobrazit titulky a pøehrávat øeè" -#: gui/options.cpp:934 +#: gui/options.cpp:944 msgctxt "lowres" msgid "Subtitle speed:" msgstr "Rychlost titulkù" -#: gui/options.cpp:950 +#: gui/options.cpp:960 msgid "Music volume:" msgstr "Hlasitost hudby" -#: gui/options.cpp:952 +#: gui/options.cpp:962 msgctxt "lowres" msgid "Music volume:" msgstr "Hlasitost hudby" -#: gui/options.cpp:959 +#: gui/options.cpp:969 msgid "Mute All" msgstr "Ztlumit V¹e" -#: gui/options.cpp:962 +#: gui/options.cpp:972 msgid "SFX volume:" msgstr "Hlasitost zvukù" -#: gui/options.cpp:962 gui/options.cpp:964 gui/options.cpp:965 +#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975 msgid "Special sound effects volume" msgstr "Hlasitost speciálních zvukových efektù" -#: gui/options.cpp:964 +#: gui/options.cpp:974 msgctxt "lowres" msgid "SFX volume:" msgstr "Hlasitost zvukù" -#: gui/options.cpp:972 +#: gui/options.cpp:982 msgid "Speech volume:" msgstr "Hlasitost øeèi" -#: gui/options.cpp:974 +#: gui/options.cpp:984 msgctxt "lowres" msgid "Speech volume:" msgstr "Hlasitost øeèi" -#: gui/options.cpp:1131 +#: gui/options.cpp:1141 msgid "Theme Path:" msgstr "Cesta ke Vzhledu:" -#: gui/options.cpp:1133 +#: gui/options.cpp:1143 msgctxt "lowres" msgid "Theme Path:" msgstr "Cesta ke Vzhledu:" -#: gui/options.cpp:1139 gui/options.cpp:1141 gui/options.cpp:1142 +#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "Stanoví cestu k dodateèným datùm pou¾ívaná v¹emi hrami nebo ScummVM" -#: gui/options.cpp:1148 +#: gui/options.cpp:1158 msgid "Plugins Path:" msgstr "Cesta k Pluginùm:" -#: gui/options.cpp:1150 +#: gui/options.cpp:1160 msgctxt "lowres" msgid "Plugins Path:" msgstr "Cesta k Pluginùm:" -#: gui/options.cpp:1159 +#: gui/options.cpp:1169 msgid "Misc" msgstr "Rùzné" -#: gui/options.cpp:1161 +#: gui/options.cpp:1171 msgctxt "lowres" msgid "Misc" msgstr "Rùzné" -#: gui/options.cpp:1163 +#: gui/options.cpp:1173 msgid "Theme:" msgstr "Vzhled:" -#: gui/options.cpp:1167 +#: gui/options.cpp:1177 msgid "GUI Renderer:" msgstr "GUI Vykreslovaè:" -#: gui/options.cpp:1179 +#: gui/options.cpp:1189 msgid "Autosave:" msgstr "Autoukládání:" -#: gui/options.cpp:1181 +#: gui/options.cpp:1191 msgctxt "lowres" msgid "Autosave:" msgstr "Autoukládání:" -#: gui/options.cpp:1189 +#: gui/options.cpp:1199 msgid "Keys" msgstr "Klávesy" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "GUI Language:" msgstr "Jazyk GUI" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "Language of ScummVM GUI" msgstr "Jazyk GUI ScummVM" -#: gui/options.cpp:1347 +#: gui/options.cpp:1365 msgid "You have to restart ScummVM before your changes will take effect." msgstr "Pro pou¾ití tìchto nastavení musíte restartovat ScummVM." -#: gui/options.cpp:1360 +#: gui/options.cpp:1378 msgid "Select directory for savegames" msgstr "Vybrat adresáø pro ulo¾ené hry" -#: gui/options.cpp:1367 +#: gui/options.cpp:1385 msgid "The chosen directory cannot be written to. Please select another one." msgstr "Do zvoleného adresáøe nelze zapisovat. Vyberte, prosím, jiný." -#: gui/options.cpp:1376 +#: gui/options.cpp:1394 msgid "Select directory for GUI themes" msgstr "Vyberte adresáø pro vhledy GUI" -#: gui/options.cpp:1386 +#: gui/options.cpp:1404 msgid "Select directory for extra files" msgstr "Vyberte adresáø pro dodateèné soubory" -#: gui/options.cpp:1397 +#: gui/options.cpp:1415 msgid "Select directory for plugins" msgstr "Vyberte adresáø pro zásuvné moduly" -#: gui/options.cpp:1450 +#: gui/options.cpp:1468 msgid "" "The theme you selected does not support your current language. If you want " "to use this theme you need to switch to another language first." @@ -920,77 +935,74 @@ msgstr "" "Vzhled, který jste zvolili, nepodporuje Vá¹ souèasný jazyk. Pokud chcete " "tento vzhled pou¾ít, musíte nejdøíve pøepnout na jiný jazyk." -#: gui/saveload-dialog.cpp:158 +#: gui/saveload-dialog.cpp:166 msgid "List view" -msgstr "" +msgstr "Seznam" -#: gui/saveload-dialog.cpp:159 +#: gui/saveload-dialog.cpp:167 msgid "Grid view" -msgstr "" +msgstr "Møí¾ka" -#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 +#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358 msgid "No date saved" msgstr "Neulo¾ena ¾ádná data" -#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359 msgid "No time saved" msgstr "®ádný ulo¾ený èas" -#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 +#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360 msgid "No playtime saved" msgstr "®ádná ulo¾ená doba hraní" -#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275 msgid "Delete" msgstr "Smazat" -#: gui/saveload-dialog.cpp:266 +#: gui/saveload-dialog.cpp:274 msgid "Do you really want to delete this savegame?" msgstr "Opravdu chcete tuto ulo¾enou hru vymazat" -#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 +#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872 msgid "Date: " msgstr "Datum:" -#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 +#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878 msgid "Time: " msgstr "Èas:" -#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 +#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886 msgid "Playtime: " msgstr "Doba hraní:" -#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 +#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494 msgid "Untitled savestate" msgstr "Bezejmenný ulo¾ený stav" -#: gui/saveload-dialog.cpp:517 +#: gui/saveload-dialog.cpp:546 msgid "Next" -msgstr "" +msgstr "Dal¹í" -#: gui/saveload-dialog.cpp:520 +#: gui/saveload-dialog.cpp:549 msgid "Prev" -msgstr "" +msgstr "Pøedchozí" -#: gui/saveload-dialog.cpp:684 -#, fuzzy +#: gui/saveload-dialog.cpp:736 msgid "New Save" -msgstr "Ulo¾it" +msgstr "Nová ulo¾ená pozice" -#: gui/saveload-dialog.cpp:684 -#, fuzzy +#: gui/saveload-dialog.cpp:736 msgid "Create a new save game" -msgstr "Nelze ulo¾it hru." +msgstr "Vytvoøit novou ulo¾enou hru." -#: gui/saveload-dialog.cpp:789 -#, fuzzy +#: gui/saveload-dialog.cpp:865 msgid "Name: " -msgstr "Jméno" +msgstr "Název:" -#: gui/saveload-dialog.cpp:861 +#: gui/saveload-dialog.cpp:937 #, c-format msgid "Enter a description for slot %d:" -msgstr "" +msgstr "Zadejte popis pro pozici %d:" #: gui/themebrowser.cpp:44 msgid "Select a Theme" @@ -1025,35 +1037,35 @@ msgstr "S vyhlazenými hranami (16bpp)" msgid "Clear value" msgstr "Vyèistit hodnotu" -#: base/main.cpp:209 +#: base/main.cpp:210 #, c-format msgid "Engine does not support debug level '%s'" msgstr "Jádro nepodporuje úroveò ladìní '%s'" -#: base/main.cpp:287 +#: base/main.cpp:288 msgid "Menu" msgstr "Menu" -#: base/main.cpp:290 backends/platform/symbian/src/SymbianActions.cpp:45 +#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:45 #: backends/platform/wince/CEActionsSmartphone.cpp:46 msgid "Skip" msgstr "Pøeskoèit" -#: base/main.cpp:293 backends/platform/symbian/src/SymbianActions.cpp:50 +#: base/main.cpp:294 backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:42 msgid "Pause" msgstr "Pauza" -#: base/main.cpp:296 +#: base/main.cpp:297 msgid "Skip line" msgstr "Pøeskoèit øádek" -#: base/main.cpp:467 +#: base/main.cpp:468 msgid "Error running game:" msgstr "Chyba pøi spu¹tìní hry:" -#: base/main.cpp:491 +#: base/main.cpp:492 msgid "Could not find any engine capable of running the selected game" msgstr "Nelze nalézt ¾ádné jádro schopné vybranou hru spustit" @@ -1168,13 +1180,16 @@ msgid "~R~eturn to Launcher" msgstr "~N~ávrat do Spou¹tìèe" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284 +#: engines/pegasus/pegasus.cpp:369 msgid "Save game:" msgstr "Ulo¾it hru:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:369 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1203,12 +1218,12 @@ msgstr "" "informace a pokyny k získání dal¹í podpory." #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 -#: engines/mohawk/dialogs.cpp:174 +#: engines/mohawk/dialogs.cpp:170 msgid "~O~K" msgstr "~O~K" #: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 -#: engines/mohawk/dialogs.cpp:175 +#: engines/mohawk/dialogs.cpp:171 msgid "~C~ancel" msgstr "~Z~ru¹it" @@ -1216,23 +1231,23 @@ msgstr "~Z~ru¹it" msgid "~K~eys" msgstr "~K~lávesy" -#: engines/engine.cpp:235 +#: engines/engine.cpp:240 msgid "Could not initialize color format." msgstr "Nelze zavést barevný formát." -#: engines/engine.cpp:243 +#: engines/engine.cpp:248 msgid "Could not switch to video mode: '" msgstr "Nelze pøepnout na re¾im obrazu: '" -#: engines/engine.cpp:252 +#: engines/engine.cpp:257 msgid "Could not apply aspect ratio setting." msgstr "Nelze pou¾ít nastavení pomìru stran." -#: engines/engine.cpp:257 +#: engines/engine.cpp:262 msgid "Could not apply fullscreen setting." msgstr "Nelze pou¾ít nastavení celé obrazovky." -#: engines/engine.cpp:357 +#: engines/engine.cpp:362 msgid "" "You appear to be playing this game directly\n" "from the CD. This is known to cause problems,\n" @@ -1246,7 +1261,7 @@ msgstr "" "datové soubory na Vá¹ pevný disk.\n" "Pro podrobnosti si pøeètìte README." -#: engines/engine.cpp:368 +#: engines/engine.cpp:373 msgid "" "This game has audio tracks in its disk. These\n" "tracks need to be ripped from the disk using\n" @@ -1260,7 +1275,7 @@ msgstr "" "abyste mohli poslouchat hudbu ve høe.\n" "Pro podrobnosti si pøeètìte README." -#: engines/engine.cpp:426 +#: engines/engine.cpp:431 #, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " @@ -1269,7 +1284,7 @@ msgstr "" "Naètení stavu hry selhalo (%s)! Prosím pøeètìte si dokumentaci pro základní " "informace a pokyny k získání dal¹í podpory." -#: engines/engine.cpp:439 +#: engines/engine.cpp:444 msgid "" "WARNING: The game you are about to start is not yet fully supported by " "ScummVM. As such, it is likely to be unstable, and any saves you make might " @@ -1279,28 +1294,50 @@ msgstr "" "ScummVM. Proto je mo¾né, ¾e bude nestabilní a jakékoli ulo¾ené hry nemusí " "fungovat v budoucích verzích ScummVM." -#: engines/engine.cpp:442 +#: engines/engine.cpp:447 msgid "Start anyway" msgstr "Pøesto spustit" -#: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 -#: engines/sci/detection.cpp:390 +#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270 +#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393 +#: engines/toltecs/detection.cpp:173 msgid "Use original save/load screens" msgstr "Pou¾ít pùvodní obrazovky naètení/ulo¾ení" -#: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 -#: engines/sci/detection.cpp:391 +#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271 +#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394 +#: engines/toltecs/detection.cpp:174 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "Pou¾ít pùvodní obrazovky naètení/ulo¾ení místo ze ScummVM" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore game:" msgstr "Obnovit hru" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore" msgstr "Obnovit" +#: engines/drascula/saveload.cpp:49 +msgid "" +"ScummVM found that you have old savefiles for Drascula that should be " +"converted.\n" +"The old save game format is no longer supported, so you will not be able to " +"load your games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" +msgstr "" +"ScummVM zjistil, ¾e máte staré ulo¾ené pozice pro Drascula, které by mìly " +"být pøevedeny.\n" +"Starý formát ulo¾ených her ji¾ není podporován, tak¾e pokud je nepøevedete, " +"nebudete moci va¹e hry naèíst.\n" +"\n" +"Stisknìte OK, abyste je pøevedli teï, jinak budete po¾ádáni znovu, pøi " +"spu¹tìní této hry.\n" + #: engines/dreamweb/detection.cpp:57 msgid "Use bright palette mode" msgstr "Pou¾ít re¾im jasné palety" @@ -1309,27 +1346,27 @@ msgstr "Pou¾ít re¾im jasné palety" msgid "Display graphics using the game's bright palette" msgstr "Zobrazit grafiku pomocí jasné palety hry" -#: engines/sci/detection.cpp:370 +#: engines/sci/detection.cpp:373 msgid "EGA undithering" msgstr "Nerozkládání EGA" -#: engines/sci/detection.cpp:371 +#: engines/sci/detection.cpp:374 msgid "Enable undithering in EGA games" msgstr "Povolit nerozkládání v EGA hrách" -#: engines/sci/detection.cpp:380 +#: engines/sci/detection.cpp:383 msgid "Prefer digital sound effects" msgstr "Upøednostòovat digitální zvukové efekty" -#: engines/sci/detection.cpp:381 +#: engines/sci/detection.cpp:384 msgid "Prefer digital sound effects instead of synthesized ones" msgstr "Upøednostòovat digitální zvukové efekty pøed syntetizovanými" -#: engines/sci/detection.cpp:400 +#: engines/sci/detection.cpp:403 msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "Pou¾ít IMF/Yamaha FB-01 pro výstup MIDI" -#: engines/sci/detection.cpp:401 +#: engines/sci/detection.cpp:404 msgid "" "Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" @@ -1337,28 +1374,28 @@ msgstr "" "Pou¾ít kartu IBM Music Feature nebo modul syntetizátoru Yamaha FB-01 FM pro " "výstup MIDI" -#: engines/sci/detection.cpp:411 +#: engines/sci/detection.cpp:414 msgid "Use CD audio" msgstr "Pou¾ít zvuky na CD" -#: engines/sci/detection.cpp:412 +#: engines/sci/detection.cpp:415 msgid "Use CD audio instead of in-game audio, if available" msgstr "Pou¾ít zvuky na CD místo ve høe, pokud je dostupné" -#: engines/sci/detection.cpp:422 +#: engines/sci/detection.cpp:425 msgid "Use Windows cursors" msgstr "Pou¾ít kurzory Windows" -#: engines/sci/detection.cpp:423 +#: engines/sci/detection.cpp:426 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "Pou¾ít kurzory Windows (men¹í a èernobílé) místo kurzorù z DOS" -#: engines/sci/detection.cpp:433 +#: engines/sci/detection.cpp:436 msgid "Use silver cursors" msgstr "Pou¾ít støíbrné kurzory" -#: engines/sci/detection.cpp:434 +#: engines/sci/detection.cpp:437 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "Pou¾ít alternativní sadu støíbrných kurzorù místo standardních zlatých" @@ -2010,7 +2047,7 @@ msgstr "Letìt doprava" msgid "Fly to lower right" msgstr "Letìt doprava dolù" -#: engines/scumm/scumm.cpp:1773 +#: engines/scumm/scumm.cpp:1776 #, c-format msgid "" "Native MIDI support requires the Roland Upgrade from LucasArts,\n" @@ -2019,7 +2056,7 @@ msgstr "" "Pøirozená podpora MIDI vy¾aduje Aktualizaci Roland od LucasArts,\n" "ale %s chybí. Místo toho je pou¾it AdLib." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 +#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2030,7 +2067,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 +#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2041,7 +2078,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 +#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2052,7 +2089,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2512 +#: engines/scumm/scumm.cpp:2537 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2063,7 +2100,7 @@ msgstr "" "vyberte adresáø 'Maniac' uvnitø herního adresáøe Tentacle." #. I18N: Option for fast scene switching -#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171 +#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167 msgid "~Z~ip Mode Activated" msgstr "~R~e¾im Svi¹tìní Aktivován" @@ -2084,11 +2121,11 @@ msgstr "~Z~obrazit Mapu" msgid "~M~ain Menu" msgstr "~H~lavní Menu" -#: engines/mohawk/dialogs.cpp:172 +#: engines/mohawk/dialogs.cpp:168 msgid "~W~ater Effect Enabled" msgstr "~E~fekt Vody Zapnut" -#: engines/agos/animation.cpp:560 +#: engines/agos/animation.cpp:557 #, c-format msgid "Cutscene file '%s' not found!" msgstr "Soubor videa '%s' nenalezen'" @@ -2106,6 +2143,14 @@ msgstr "Nelze ulo¾it stav hry do souboru." msgid "Failed to delete file." msgstr "Nelze smazat soubor." +#: engines/groovie/detection.cpp:312 +msgid "Fast movie speed" +msgstr "Zvý¹ená rychlost videa" + +#: engines/groovie/detection.cpp:313 +msgid "Play movies at an increased speed" +msgstr "Pøehrát videa se zvý¹enou rychlostí" + #: engines/groovie/script.cpp:420 msgid "Failed to save game" msgstr "Nelze ulo¾it hru." @@ -2196,11 +2241,11 @@ msgstr "Pøesunout se Doleva" msgid "Slide Right" msgstr "Pøesunout se Doprava" -#: engines/kyra/lol.cpp:485 +#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2412 msgid "Turn Left" msgstr "Otoèit se doleva" -#: engines/kyra/lol.cpp:486 +#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2413 msgid "Turn Right" msgstr "Otoèit se doprava" @@ -2216,7 +2261,7 @@ msgstr "Volby" msgid "Choose Spell" msgstr "Zvolit Kouzlo" -#: engines/kyra/sound_midi.cpp:475 +#: engines/kyra/sound_midi.cpp:477 msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2232,12 +2277,11 @@ msgstr "" #: engines/queen/queen.cpp:59 msgid "Alternative intro" -msgstr "" +msgstr "Alternativní úvod" #: engines/queen/queen.cpp:60 -#, fuzzy msgid "Use an alternative game intro (CD version only)" -msgstr "Pou¾ít verzi úvodu z diskety (Pouze verze CD)" +msgstr "Pou¾ít jinou verzi úvodu (Pouze verze CD)" #: engines/sky/compact.cpp:130 msgid "" @@ -2263,25 +2307,25 @@ msgstr "Úvod z diskety" msgid "Use the floppy version's intro (CD version only)" msgstr "Pou¾ít verzi úvodu z diskety (Pouze verze CD)" -#: engines/sword1/animation.cpp:539 +#: engines/sword1/animation.cpp:519 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "Proud videa PSX '%s' nemù¾e být pøehrán v re¾imu palety" -#: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 +#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439 msgid "DXA cutscenes found but ScummVM has been built without zlib support" msgstr "Videa DXA nalezena, ale ScummVM byl sestaven bez podpory zlib" -#: engines/sword1/animation.cpp:570 engines/sword2/animation.cpp:465 +#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449 msgid "MPEG2 cutscenes are no longer supported" msgstr "Videa MPGE2 ji¾ nejsou podporována" -#: engines/sword1/animation.cpp:576 engines/sword2/animation.cpp:473 +#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457 #, c-format msgid "Cutscene '%s' not found" msgstr "Video '%s' nenalezeno" -#: engines/sword1/control.cpp:863 +#: engines/sword1/control.cpp:865 msgid "" "ScummVM found that you have old savefiles for Broken Sword 1 that should be " "converted.\n" @@ -2299,7 +2343,7 @@ msgstr "" "Stisknìte OK, abyste je pøevedli teï, jinak budete po¾ádáni znovu, pøi " "spu¹tìní této hry.\n" -#: engines/sword1/control.cpp:1232 +#: engines/sword1/control.cpp:1234 #, c-format msgid "" "Target new save game already exists!\n" @@ -2308,11 +2352,11 @@ msgstr "" "Nová cílová ulo¾ená hra ji¾ existuje!\n" "Chtìli byste ponechat starou ulo¾enou hru (%s), nebo novou (%s)?\n" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the old one" msgstr "Ponechat starou" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the new one" msgstr "Ponechat novou" @@ -2320,7 +2364,7 @@ msgstr "Ponechat novou" msgid "This is the end of the Broken Sword 1 Demo" msgstr "Toto je konec Dema Broken Sword 1" -#: engines/sword2/animation.cpp:435 +#: engines/sword2/animation.cpp:419 msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "Videa PSX nalezena, ale ScummVM byl sestaven bez podpory barev RGB" @@ -2333,16 +2377,18 @@ msgstr "Zobrazit jmenovky objektù" msgid "Show labels for objects on mouse hover" msgstr "Zobrazit jmenovky objektù pøi najetí my¹i" -#: engines/teenagent/resources.cpp:68 +#: engines/teenagent/resources.cpp:94 msgid "" "You're missing the 'teenagent.dat' file. Get it from the ScummVM website" -msgstr "" +msgstr "Chybí vám soubor 'teenagent.dat'. Mù¾ete ho získat ze stránky ScummVM." -#: engines/teenagent/resources.cpp:89 +#: engines/teenagent/resources.cpp:115 msgid "" "The teenagent.dat file is compressed and zlib hasn't been included in this " "executable. Please decompress it" msgstr "" +"Soubor teenagent.dat je komprimován a zlib není souèástí spustitelného " +"souboru. Prosím dekomprimujte ho" #: engines/parallaction/saveload.cpp:133 #, c-format @@ -2393,6 +2439,47 @@ msgstr "" "\n" "Prosím nahlaste to týmu" +#: engines/pegasus/pegasus.cpp:675 +msgid "Invalid save file name" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2410 +msgid "Up/Zoom In/Move Forward/Open Doors" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2411 +#, fuzzy +msgid "Down/Zoom Out" +msgstr "Pøiblí¾ení nahoru" + +#: engines/pegasus/pegasus.cpp:2414 +msgid "Display/Hide Inventory Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2415 +msgid "Display/Hide Biochip Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2416 +msgid "Action/Select" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2417 +msgid "Toggle Center Data Display" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2418 +msgid "Display/Hide Info Screen" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2419 +msgid "Display/Hide Pause Menu" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2420 +msgid "???" +msgstr "" + #: audio/fmopl.cpp:49 msgid "MAME OPL emulator" msgstr "MAME OPL Emulátor" @@ -2450,7 +2537,7 @@ msgstr "Bez hudby" msgid "Amiga Audio Emulator" msgstr "Emulátor zvuku Amiga" -#: audio/softsynth/adlib.cpp:1593 +#: audio/softsynth/adlib.cpp:2284 msgid "AdLib Emulator" msgstr "AdLib Emulátor" @@ -2462,11 +2549,11 @@ msgstr "Apple II GS Emulátor (NENÍ ZAVEDEN)" msgid "C64 Audio Emulator" msgstr "Emulátor zvuku C64" -#: audio/softsynth/mt32.cpp:293 +#: audio/softsynth/mt32.cpp:205 msgid "Initializing MT-32 Emulator" msgstr "Zavádím MT-32 Emulátor" -#: audio/softsynth/mt32.cpp:512 +#: audio/softsynth/mt32.cpp:431 msgid "MT-32 Emulator" msgstr "MT-32 Emulátor" @@ -2617,24 +2704,24 @@ msgstr "Kliknutí prostøedním tlaèítkem" msgid "Right Click" msgstr "Pravé kliknutí" -#: backends/platform/sdl/macosx/appmenu_osx.mm:78 +#: backends/platform/sdl/macosx/appmenu_osx.mm:77 msgid "Hide ScummVM" msgstr "Skrýt ScummVM" -#: backends/platform/sdl/macosx/appmenu_osx.mm:83 +#: backends/platform/sdl/macosx/appmenu_osx.mm:82 msgid "Hide Others" msgstr "Skrýt Ostatní" -#: backends/platform/sdl/macosx/appmenu_osx.mm:88 +#: backends/platform/sdl/macosx/appmenu_osx.mm:87 msgid "Show All" msgstr "Zobrazit V¹e" -#: backends/platform/sdl/macosx/appmenu_osx.mm:110 -#: backends/platform/sdl/macosx/appmenu_osx.mm:121 +#: backends/platform/sdl/macosx/appmenu_osx.mm:109 +#: backends/platform/sdl/macosx/appmenu_osx.mm:120 msgid "Window" msgstr "Okno" -#: backends/platform/sdl/macosx/appmenu_osx.mm:115 +#: backends/platform/sdl/macosx/appmenu_osx.mm:114 msgid "Minimize" msgstr "Minimalizovat" @@ -2648,12 +2735,12 @@ msgid "Normal (no scaling)" msgstr "Normální (bez zmìny velikosti)" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537 msgid "Enabled aspect ratio correction" msgstr "Povolena korekce pomìru stran" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542 msgid "Disabled aspect ratio correction" msgstr "Zakázána korekce pomìru stran" @@ -2662,7 +2749,7 @@ msgid "Active graphics filter:" msgstr "Aktivní grafický filtr:" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481 msgid "Windowed mode" msgstr "Re¾im do okna" @@ -2686,11 +2773,11 @@ msgstr "Souèasný re¾im obrazu" msgid "Current scale" msgstr "Souèasná velikost" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:558 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562 msgid "Active filter mode: Linear" msgstr "Aktivní re¾im filtru: Lineární" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:560 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564 msgid "Active filter mode: Nearest" msgstr "Aktivní re¾im filtru: Nejbli¾¹í" @@ -3018,19 +3105,19 @@ msgstr "Opravdu chcete skonèit?" #: backends/events/gph/gph-events.cpp:386 #: backends/events/gph/gph-events.cpp:429 -#: backends/events/openpandora/op-events.cpp:139 +#: backends/events/openpandora/op-events.cpp:168 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "'Re¾im «uknutí' Dotykové Obrazovky - Levé Kliknutí" #: backends/events/gph/gph-events.cpp:388 #: backends/events/gph/gph-events.cpp:431 -#: backends/events/openpandora/op-events.cpp:141 +#: backends/events/openpandora/op-events.cpp:170 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "'Re¾im «uknutí' Dotykové Obrazovky - Pravé Kliknutí" #: backends/events/gph/gph-events.cpp:390 #: backends/events/gph/gph-events.cpp:433 -#: backends/events/openpandora/op-events.cpp:143 +#: backends/events/openpandora/op-events.cpp:172 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "'Re¾im «uknutí' Dotykové Obrazovky - Najetí (Bez Kliknutí)" @@ -3050,7 +3137,11 @@ msgstr "Minimální Hlasitost" msgid "Decreasing Volume" msgstr "Sni¾uji Hlasitost" -#: backends/updates/macosx/macosx-updates.mm:65 +#: backends/events/openpandora/op-events.cpp:174 +msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)" +msgstr "'Re¾im «uknutí' Dotykové Obrazovky - Najetí (Dpad kliká)" + +#: backends/updates/macosx/macosx-updates.mm:67 msgid "Check for Updates..." msgstr "Zkontrolovat Aktualizace..." @@ -3086,6 +3177,9 @@ msgstr "Kliknutí Povoleno" msgid "Clicking Disabled" msgstr "Kliknutí Zakázáno" +#~ msgid "Enable Roland GS Mode" +#~ msgstr "Zapnout re¾im Roland GS" + #~ msgid "Hercules Green" #~ msgstr "Hercules Zelená" diff --git a/po/da_DA.po b/po/da_DA.po index b30ef1bf02..bdb774a52b 100644 --- a/po/da_DA.po +++ b/po/da_DA.po @@ -1,4 +1,5 @@ -# Copyright (C) 2010-2012 ScummVM Team +# Dansk translation for ScummVM +# Copyright (C) 2010-2013 ScummVM Team # This file is distributed under the same license as the ScummVM package. # Steffen Nyeland <steffen@nyeland.dk>, 2010. # @@ -6,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-08-12 14:57+0200\n" +"POT-Creation-Date: 2013-02-07 23:11+0000\n" "PO-Revision-Date: 2012-07-09 20:27+0100\n" "Last-Translator: Steffen Nyeland <steffen@nyeland.dk>\n" "Language-Team: Steffen Nyeland <steffen@nyeland.dk>\n" @@ -18,45 +19,55 @@ msgstr "" "X-Poedit-Language: Danish\n" "X-Poedit-Country: DENMARK\n" -#: gui/about.cpp:91 +#: gui/about.cpp:93 #, c-format msgid "(built on %s)" msgstr "(bygget den %s)" -#: gui/about.cpp:98 +#: gui/about.cpp:100 msgid "Features compiled in:" msgstr "Funktioner kompileret ind:" -#: gui/about.cpp:107 +#: gui/about.cpp:109 msgid "Available engines:" msgstr "Tilgængelige \"motorer\":" -#: gui/browser.cpp:66 +#: gui/browser.cpp:67 +#, fuzzy +msgid "Show hidden files" +msgstr "Vis / Skjul konsol" + +#: gui/browser.cpp:67 +msgid "Show files marked with the hidden attribute" +msgstr "" + +#: gui/browser.cpp:71 msgid "Go up" msgstr "Gå op" -#: gui/browser.cpp:66 gui/browser.cpp:68 +#: gui/browser.cpp:71 gui/browser.cpp:73 msgid "Go to previous directory level" msgstr "Gå til forrige biblioteks niveau" -#: gui/browser.cpp:68 +#: gui/browser.cpp:73 msgctxt "lowres" msgid "Go up" msgstr "Gå op" -#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 -#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 -#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 -#: gui/themebrowser.cpp:54 engines/engine.cpp:442 -#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 +#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238 +#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275 +#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919 +#: gui/themebrowser.cpp:54 engines/engine.cpp:447 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:190 +#: engines/sword1/control.cpp:867 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" msgstr "Fortryd" -#: gui/browser.cpp:70 gui/chooser.cpp:46 gui/themebrowser.cpp:55 +#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55 msgid "Choose" msgstr "Vælg" @@ -71,15 +82,15 @@ msgstr "Luk" msgid "Mouse click" msgstr "Muse klik" -#: gui/gui-manager.cpp:122 base/main.cpp:300 +#: gui/gui-manager.cpp:122 base/main.cpp:301 msgid "Display keyboard" msgstr "Vis tastatur" -#: gui/gui-manager.cpp:126 base/main.cpp:304 +#: gui/gui-manager.cpp:126 base/main.cpp:305 msgid "Remap keys" msgstr "Kortlæg taster" -#: gui/gui-manager.cpp:129 base/main.cpp:307 +#: gui/gui-manager.cpp:129 base/main.cpp:308 msgid "Toggle FullScreen" msgstr "Skift fuldskærm" @@ -92,17 +103,18 @@ msgid "Map" msgstr "Kortlæg" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 -#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 -#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 -#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 -#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 -#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 -#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 -#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 -#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 -#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 +#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239 +#: gui/saveload-dialog.cpp:920 engines/engine.cpp:366 engines/engine.cpp:377 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192 +#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558 +#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 +#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519 +#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550 +#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:867 +#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419 +#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449 +#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -175,8 +187,8 @@ msgstr "" "Spillets sprog. Dette vil ikke ændre din spanske version af spillet til " "engelsk" -#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:80 -#: gui/options.cpp:730 gui/options.cpp:743 gui/options.cpp:1199 +#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86 +#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209 #: audio/null.cpp:40 msgid "<default>" msgstr "<standard>" @@ -198,11 +210,11 @@ msgstr "Platform:" msgid "Engine" msgstr "Motor" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "Graphics" msgstr "Grafik" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "GFX" msgstr "GFX" @@ -215,7 +227,7 @@ msgctxt "lowres" msgid "Override global graphic settings" msgstr "Overstyr globale grafik indstillinger" -#: gui/launcher.cpp:251 gui/options.cpp:1085 +#: gui/launcher.cpp:251 gui/options.cpp:1095 msgid "Audio" msgstr "Lyd" @@ -228,11 +240,11 @@ msgctxt "lowres" msgid "Override global audio settings" msgstr "Overstyr globale lyd indstillinger" -#: gui/launcher.cpp:265 gui/options.cpp:1090 +#: gui/launcher.cpp:265 gui/options.cpp:1100 msgid "Volume" msgstr "Lydstyrke" -#: gui/launcher.cpp:267 gui/options.cpp:1092 +#: gui/launcher.cpp:267 gui/options.cpp:1102 msgctxt "lowres" msgid "Volume" msgstr "Lydstyrke" @@ -246,7 +258,7 @@ msgctxt "lowres" msgid "Override global volume settings" msgstr "Overstyr globale lydstyrke indstillinger" -#: gui/launcher.cpp:280 gui/options.cpp:1100 +#: gui/launcher.cpp:280 gui/options.cpp:1110 msgid "MIDI" msgstr "MIDI" @@ -259,7 +271,7 @@ msgctxt "lowres" msgid "Override global MIDI settings" msgstr "Overstyr globale MIDI indstillinger" -#: gui/launcher.cpp:294 gui/options.cpp:1106 +#: gui/launcher.cpp:294 gui/options.cpp:1116 msgid "MT-32" msgstr "MT-32" @@ -272,11 +284,11 @@ msgctxt "lowres" msgid "Override global MT-32 settings" msgstr "Overstyr globale MT-32 indstillinger" -#: gui/launcher.cpp:308 gui/options.cpp:1113 +#: gui/launcher.cpp:308 gui/options.cpp:1123 msgid "Paths" msgstr "Stier" -#: gui/launcher.cpp:310 gui/options.cpp:1115 +#: gui/launcher.cpp:310 gui/options.cpp:1125 msgctxt "lowres" msgid "Paths" msgstr "Stier" @@ -290,7 +302,7 @@ msgctxt "lowres" msgid "Game Path:" msgstr "Spil sti:" -#: gui/launcher.cpp:324 gui/options.cpp:1139 +#: gui/launcher.cpp:324 gui/options.cpp:1149 msgid "Extra Path:" msgstr "Ekstra sti:" @@ -298,42 +310,42 @@ msgstr "Ekstra sti:" msgid "Specifies path to additional data used the game" msgstr "Angiver sti til ekstra data der bruges i spillet" -#: gui/launcher.cpp:326 gui/options.cpp:1141 +#: gui/launcher.cpp:326 gui/options.cpp:1151 msgctxt "lowres" msgid "Extra Path:" msgstr "Ekstra sti:" -#: gui/launcher.cpp:333 gui/options.cpp:1123 +#: gui/launcher.cpp:333 gui/options.cpp:1133 msgid "Save Path:" msgstr "Gemme sti:" #: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 -#: gui/options.cpp:1123 gui/options.cpp:1125 gui/options.cpp:1126 +#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136 msgid "Specifies where your savegames are put" msgstr "Angiver hvor dine gemmer bliver lagt" -#: gui/launcher.cpp:335 gui/options.cpp:1125 +#: gui/launcher.cpp:335 gui/options.cpp:1135 msgctxt "lowres" msgid "Save Path:" msgstr "Gemme sti:" #: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 -#: gui/launcher.cpp:565 gui/options.cpp:1134 gui/options.cpp:1142 -#: gui/options.cpp:1151 gui/options.cpp:1258 gui/options.cpp:1264 -#: gui/options.cpp:1272 gui/options.cpp:1302 gui/options.cpp:1308 -#: gui/options.cpp:1315 gui/options.cpp:1408 gui/options.cpp:1411 -#: gui/options.cpp:1423 +#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152 +#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282 +#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326 +#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429 +#: gui/options.cpp:1441 msgctxt "path" msgid "None" msgstr "Ingen" #: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 -#: gui/options.cpp:1252 gui/options.cpp:1296 gui/options.cpp:1414 +#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Standard" -#: gui/launcher.cpp:504 gui/options.cpp:1417 +#: gui/launcher.cpp:504 gui/options.cpp:1435 msgid "Select SoundFont" msgstr "Vælg SoundFont" @@ -357,7 +369,7 @@ msgstr "Dette spil ID er allerede i brug. Vælg venligst et andet." msgid "~Q~uit" msgstr "~A~fslut" -#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:96 +#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95 msgid "Quit ScummVM" msgstr "Slut ScummVM" @@ -365,7 +377,7 @@ msgstr "Slut ScummVM" msgid "A~b~out..." msgstr "~O~m..." -#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:70 +#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69 msgid "About ScummVM" msgstr "Om ScummVM" @@ -442,12 +454,14 @@ msgstr "Søg:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 +#: engines/pegasus/pegasus.cpp:345 msgid "Load game:" msgstr "Indlæs spil:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:345 +#: backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Indlæs" @@ -533,133 +547,133 @@ msgstr "Gennemset %d biblioteker ..." msgid "Discovered %d new games, ignored %d previously added games ..." msgstr "Fundet %d nye spil, ignorer %d tidligere tilføjede spil ..." -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "Never" msgstr "Aldrig" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 5 mins" msgstr "hvert 5. minut" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 10 mins" msgstr "hvert 10. minut" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 15 mins" msgstr "hvert 15. minut" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 30 mins" msgstr "hvert 30. minut" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "8 kHz" msgstr "8 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "11kHz" msgstr "11 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "22 kHz" msgstr "22 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "44 kHz" msgstr "44 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:248 gui/options.cpp:474 gui/options.cpp:575 -#: gui/options.cpp:644 gui/options.cpp:852 +#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581 +#: gui/options.cpp:650 gui/options.cpp:858 msgctxt "soundfont" msgid "None" msgstr "Ingen" -#: gui/options.cpp:382 +#: gui/options.cpp:388 msgid "Failed to apply some of the graphic options changes:" msgstr "Anvendelse af ændringer for grafiske indstillinger fejlede:" -#: gui/options.cpp:394 +#: gui/options.cpp:400 msgid "the video mode could not be changed." msgstr "videotilstanden kunne ikke ændres." -#: gui/options.cpp:400 +#: gui/options.cpp:406 msgid "the fullscreen setting could not be changed" msgstr "fuld skærm indstillingen kunne ikke ændres" -#: gui/options.cpp:406 +#: gui/options.cpp:412 msgid "the aspect ratio setting could not be changed" msgstr "billedformat indstillingen ikke kunne ændres" -#: gui/options.cpp:727 +#: gui/options.cpp:733 msgid "Graphics mode:" msgstr "Grafik tilstand:" -#: gui/options.cpp:741 +#: gui/options.cpp:747 msgid "Render mode:" msgstr "Rendere tilstand:" -#: gui/options.cpp:741 gui/options.cpp:742 +#: gui/options.cpp:747 gui/options.cpp:748 msgid "Special dithering modes supported by some games" msgstr "Speciel farvereduceringstilstand understøttet a nogle spil" -#: gui/options.cpp:753 +#: gui/options.cpp:759 #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476 msgid "Fullscreen mode" msgstr "Fuldskærms tilstand" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Aspect ratio correction" msgstr "Billedformat korrektion" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Correct aspect ratio for 320x200 games" msgstr "Korrekt billedformat til 320x200 spil" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Preferred Device:" msgstr "Foretruk. enhed:" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Music Device:" msgstr "Musik enhed:" -#: gui/options.cpp:764 gui/options.cpp:766 +#: gui/options.cpp:770 gui/options.cpp:772 msgid "Specifies preferred sound device or sound card emulator" msgstr "Angiver foretukket lyd enhed eller lydkort emulator" -#: gui/options.cpp:764 gui/options.cpp:766 gui/options.cpp:767 +#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773 msgid "Specifies output sound device or sound card emulator" msgstr "Angiver lyd udgangsenhed eller lydkorts emulator" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Preferred Dev.:" msgstr "Foretruk. enh.:" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Music Device:" msgstr "Musik enhed:" -#: gui/options.cpp:793 +#: gui/options.cpp:799 msgid "AdLib emulator:" msgstr "AdLib emulator:" -#: gui/options.cpp:793 gui/options.cpp:794 +#: gui/options.cpp:799 gui/options.cpp:800 msgid "AdLib is used for music in many games" msgstr "AdLib bliver brugt til musik i mange spil" -#: gui/options.cpp:804 +#: gui/options.cpp:810 msgid "Output rate:" msgstr "Udgangsfrekvens:" -#: gui/options.cpp:804 gui/options.cpp:805 +#: gui/options.cpp:810 gui/options.cpp:811 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -667,60 +681,64 @@ msgstr "" "Højere værdi angiver bedre lyd kvalitet, men understøttes måske ikke af dit " "lydkort" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "GM Device:" msgstr "GM enhed:" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "Specifies default sound device for General MIDI output" msgstr "Angiver standard lyd enhed for Generel MIDI-udgang" -#: gui/options.cpp:826 +#: gui/options.cpp:832 msgid "Don't use General MIDI music" msgstr "Brug ikke Generel MIDI musik" -#: gui/options.cpp:837 gui/options.cpp:899 +#: gui/options.cpp:843 gui/options.cpp:909 msgid "Use first available device" msgstr "Brug første tilgængelig enhed" -#: gui/options.cpp:849 +#: gui/options.cpp:855 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 +#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "SoundFont er understøttet af nogle lydkort, Fluidsynth og Timidity" -#: gui/options.cpp:851 +#: gui/options.cpp:857 msgctxt "lowres" msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Mixed AdLib/MIDI mode" msgstr "Blandet AdLib/MIDI tilstand" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Use both MIDI and AdLib sound generation" msgstr "Brug både MIDI og AdLib lyd generering" -#: gui/options.cpp:860 +#: gui/options.cpp:866 msgid "MIDI gain:" msgstr "MIDI lydstyrke:" -#: gui/options.cpp:870 +#: gui/options.cpp:873 +msgid "FluidSynth Settings" +msgstr "" + +#: gui/options.cpp:880 msgid "MT-32 Device:" msgstr "MT-32 enhed:" -#: gui/options.cpp:870 +#: gui/options.cpp:880 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "Angiver standard lyd enhed for Roland MT-32/LAPC1/CM32I/CM64 udgang" -#: gui/options.cpp:875 +#: gui/options.cpp:885 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Ægte Roland MT-32 (undlad GM emulering)" -#: gui/options.cpp:875 gui/options.cpp:877 +#: gui/options.cpp:885 gui/options.cpp:887 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -728,190 +746,191 @@ msgstr "" "Kontroller om du vil bruge din rigtige hardware Roland-kompatible lyd enhed " "tilsluttet til din computer" -#: gui/options.cpp:877 +#: gui/options.cpp:887 msgctxt "lowres" msgid "True Roland MT-32 (no GM emulation)" msgstr "Ægte Roland MT-32 (ingen GM emulering)" -#: gui/options.cpp:880 -msgid "Enable Roland GS Mode" -msgstr "Aktivér Roland GS tilstand" +#: gui/options.cpp:890 +#, fuzzy +msgid "Roland GS Mode (disable GM mapping)" +msgstr "Ægte Roland MT-32 (undlad GM emulering)" -#: gui/options.cpp:880 +#: gui/options.cpp:890 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "Sluk for Generel MIDI kortlægning for spil med Roland MT-32 lydspor" -#: gui/options.cpp:889 +#: gui/options.cpp:899 msgid "Don't use Roland MT-32 music" msgstr "Brug ikke Roland MT-32 musik" -#: gui/options.cpp:916 +#: gui/options.cpp:926 msgid "Text and Speech:" msgstr "Tekst og tale:" -#: gui/options.cpp:920 gui/options.cpp:930 +#: gui/options.cpp:930 gui/options.cpp:940 msgid "Speech" msgstr "Tale" -#: gui/options.cpp:921 gui/options.cpp:931 +#: gui/options.cpp:931 gui/options.cpp:941 msgid "Subtitles" msgstr "Undertekster" -#: gui/options.cpp:922 +#: gui/options.cpp:932 msgid "Both" msgstr "Begge" -#: gui/options.cpp:924 +#: gui/options.cpp:934 msgid "Subtitle speed:" msgstr "Tekst hastighed:" -#: gui/options.cpp:926 +#: gui/options.cpp:936 msgctxt "lowres" msgid "Text and Speech:" msgstr "Tekst og tale:" -#: gui/options.cpp:930 +#: gui/options.cpp:940 msgid "Spch" msgstr "Tale" -#: gui/options.cpp:931 +#: gui/options.cpp:941 msgid "Subs" msgstr "Tekst" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgctxt "lowres" msgid "Both" msgstr "Begge" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgid "Show subtitles and play speech" msgstr "Vis undertekster og afspil tale" -#: gui/options.cpp:934 +#: gui/options.cpp:944 msgctxt "lowres" msgid "Subtitle speed:" msgstr "Tekst hastighed:" -#: gui/options.cpp:950 +#: gui/options.cpp:960 msgid "Music volume:" msgstr "Musik lydstyrke:" -#: gui/options.cpp:952 +#: gui/options.cpp:962 msgctxt "lowres" msgid "Music volume:" msgstr "Musik lydstyrke:" -#: gui/options.cpp:959 +#: gui/options.cpp:969 msgid "Mute All" msgstr "Mute alle" -#: gui/options.cpp:962 +#: gui/options.cpp:972 msgid "SFX volume:" msgstr "SFX lydstyrke:" -#: gui/options.cpp:962 gui/options.cpp:964 gui/options.cpp:965 +#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975 msgid "Special sound effects volume" msgstr "Lydstyrke for specielle lydeffekter" -#: gui/options.cpp:964 +#: gui/options.cpp:974 msgctxt "lowres" msgid "SFX volume:" msgstr "SFX lydstyrke:" -#: gui/options.cpp:972 +#: gui/options.cpp:982 msgid "Speech volume:" msgstr "Tale lydstyrke:" -#: gui/options.cpp:974 +#: gui/options.cpp:984 msgctxt "lowres" msgid "Speech volume:" msgstr "Tale lydstyrke:" -#: gui/options.cpp:1131 +#: gui/options.cpp:1141 msgid "Theme Path:" msgstr "Tema sti:" -#: gui/options.cpp:1133 +#: gui/options.cpp:1143 msgctxt "lowres" msgid "Theme Path:" msgstr "Tema sti:" -#: gui/options.cpp:1139 gui/options.cpp:1141 gui/options.cpp:1142 +#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "Angiver sti til ekstra data brugt af alle spil eller ScummVM" -#: gui/options.cpp:1148 +#: gui/options.cpp:1158 msgid "Plugins Path:" msgstr "Plugin sti:" -#: gui/options.cpp:1150 +#: gui/options.cpp:1160 msgctxt "lowres" msgid "Plugins Path:" msgstr "Plugin sti:" -#: gui/options.cpp:1159 +#: gui/options.cpp:1169 msgid "Misc" msgstr "Andet" -#: gui/options.cpp:1161 +#: gui/options.cpp:1171 msgctxt "lowres" msgid "Misc" msgstr "Andet" -#: gui/options.cpp:1163 +#: gui/options.cpp:1173 msgid "Theme:" msgstr "Tema:" -#: gui/options.cpp:1167 +#: gui/options.cpp:1177 msgid "GUI Renderer:" msgstr "GUI renderer:" -#: gui/options.cpp:1179 +#: gui/options.cpp:1189 msgid "Autosave:" msgstr "Auto gemme:" -#: gui/options.cpp:1181 +#: gui/options.cpp:1191 msgctxt "lowres" msgid "Autosave:" msgstr "Auto gemme:" -#: gui/options.cpp:1189 +#: gui/options.cpp:1199 msgid "Keys" msgstr "Taster" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "GUI Language:" msgstr "Sprog:" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "Language of ScummVM GUI" msgstr "Sprog for brugerfladen i ScummVM" -#: gui/options.cpp:1347 +#: gui/options.cpp:1365 msgid "You have to restart ScummVM before your changes will take effect." msgstr "Du skal genstarte ScummVM før dine ændringer har effekt." -#: gui/options.cpp:1360 +#: gui/options.cpp:1378 msgid "Select directory for savegames" msgstr "Vælg bibliotek til gemmer" -#: gui/options.cpp:1367 +#: gui/options.cpp:1385 msgid "The chosen directory cannot be written to. Please select another one." msgstr "Der kan ikke skrives til det valgte bibliotek. Vælg venligst et andet." -#: gui/options.cpp:1376 +#: gui/options.cpp:1394 msgid "Select directory for GUI themes" msgstr "Vælg bibliotek for GUI temaer" -#: gui/options.cpp:1386 +#: gui/options.cpp:1404 msgid "Select directory for extra files" msgstr "Vælg bibliotek for ekstra filer" -#: gui/options.cpp:1397 +#: gui/options.cpp:1415 msgid "Select directory for plugins" msgstr "Vælg bibliotek for plugins" -#: gui/options.cpp:1450 +#: gui/options.cpp:1468 msgid "" "The theme you selected does not support your current language. If you want " "to use this theme you need to switch to another language first." @@ -919,74 +938,74 @@ msgstr "" "Temaet du valgte understøtter ikke dit aktuelle sprog. Hvis du ønsker at " "bruge dette tema, skal du skifte til et andet sprog først." -#: gui/saveload-dialog.cpp:158 +#: gui/saveload-dialog.cpp:166 msgid "List view" msgstr "" -#: gui/saveload-dialog.cpp:159 +#: gui/saveload-dialog.cpp:167 msgid "Grid view" msgstr "" -#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 +#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358 msgid "No date saved" msgstr "Ingen dato gemt" -#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359 msgid "No time saved" msgstr "Intet tidspunkt gemt" -#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 +#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360 msgid "No playtime saved" msgstr "Ingen spilletid gemt" -#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275 msgid "Delete" msgstr "Slet" -#: gui/saveload-dialog.cpp:266 +#: gui/saveload-dialog.cpp:274 msgid "Do you really want to delete this savegame?" msgstr "Vil du virkelig slette denne gemmer?" -#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 +#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872 msgid "Date: " msgstr "Dato:" -#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 +#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878 msgid "Time: " msgstr "Tid:" -#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 +#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886 msgid "Playtime: " msgstr "Spilletid:" -#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 +#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494 msgid "Untitled savestate" msgstr "Unavngivet gemmetilstand" -#: gui/saveload-dialog.cpp:517 +#: gui/saveload-dialog.cpp:546 msgid "Next" msgstr "" -#: gui/saveload-dialog.cpp:520 +#: gui/saveload-dialog.cpp:549 msgid "Prev" msgstr "" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 #, fuzzy msgid "New Save" msgstr "Gem" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 #, fuzzy msgid "Create a new save game" msgstr "Mislykkedes at gemme spil" -#: gui/saveload-dialog.cpp:789 +#: gui/saveload-dialog.cpp:865 #, fuzzy msgid "Name: " msgstr "Navn:" -#: gui/saveload-dialog.cpp:861 +#: gui/saveload-dialog.cpp:937 #, c-format msgid "Enter a description for slot %d:" msgstr "" @@ -1024,35 +1043,35 @@ msgstr "Antialias (16bpp)" msgid "Clear value" msgstr "Slet værdi" -#: base/main.cpp:209 +#: base/main.cpp:210 #, c-format msgid "Engine does not support debug level '%s'" msgstr "Motor understøtter ikke fejlfindingsniveau '%s'" -#: base/main.cpp:287 +#: base/main.cpp:288 msgid "Menu" msgstr "Menu" -#: base/main.cpp:290 backends/platform/symbian/src/SymbianActions.cpp:45 +#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:45 #: backends/platform/wince/CEActionsSmartphone.cpp:46 msgid "Skip" msgstr "Spring over" -#: base/main.cpp:293 backends/platform/symbian/src/SymbianActions.cpp:50 +#: base/main.cpp:294 backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:42 msgid "Pause" msgstr "Pause" -#: base/main.cpp:296 +#: base/main.cpp:297 msgid "Skip line" msgstr "Spring linje over" -#: base/main.cpp:467 +#: base/main.cpp:468 msgid "Error running game:" msgstr "Fejl ved kørsel af spil:" -#: base/main.cpp:491 +#: base/main.cpp:492 msgid "Could not find any engine capable of running the selected game" msgstr "Kunne ikke finde nogen motor istand til at afvikle det valgte spil" @@ -1168,13 +1187,16 @@ msgid "~R~eturn to Launcher" msgstr "~R~etur til oversigt" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284 +#: engines/pegasus/pegasus.cpp:369 msgid "Save game:" msgstr "Gemmer:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:369 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1203,12 +1225,12 @@ msgstr "" "oplysninger, og for at få instruktioner om, hvordan man får yderligere hjælp." #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 -#: engines/mohawk/dialogs.cpp:174 +#: engines/mohawk/dialogs.cpp:170 msgid "~O~K" msgstr "~O~K" #: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 -#: engines/mohawk/dialogs.cpp:175 +#: engines/mohawk/dialogs.cpp:171 msgid "~C~ancel" msgstr "~F~ortryd" @@ -1216,23 +1238,23 @@ msgstr "~F~ortryd" msgid "~K~eys" msgstr "~T~aster" -#: engines/engine.cpp:235 +#: engines/engine.cpp:240 msgid "Could not initialize color format." msgstr "Kunne ikke initialisere farveformat." -#: engines/engine.cpp:243 +#: engines/engine.cpp:248 msgid "Could not switch to video mode: '" msgstr "Kunne ikke skifte til videotilstand: '" -#: engines/engine.cpp:252 +#: engines/engine.cpp:257 msgid "Could not apply aspect ratio setting." msgstr "Kunne ikke anvende billedformat korrektion indstilling." -#: engines/engine.cpp:257 +#: engines/engine.cpp:262 msgid "Could not apply fullscreen setting." msgstr "Kunne ikke anvende fuldskærm indstilling." -#: engines/engine.cpp:357 +#: engines/engine.cpp:362 msgid "" "You appear to be playing this game directly\n" "from the CD. This is known to cause problems,\n" @@ -1246,7 +1268,7 @@ msgstr "" "datafiler til din harddisk i stedet.\n" "Se README fil for detaljer." -#: engines/engine.cpp:368 +#: engines/engine.cpp:373 msgid "" "This game has audio tracks in its disk. These\n" "tracks need to be ripped from the disk using\n" @@ -1260,7 +1282,7 @@ msgstr "" "for at lytte til spillets musik.\n" "Se README fil for detaljer." -#: engines/engine.cpp:426 +#: engines/engine.cpp:431 #, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " @@ -1270,7 +1292,7 @@ msgstr "" "grundlæggende oplysninger, og for at få instruktioner om, hvordan man får " "yderligere hjælp." -#: engines/engine.cpp:439 +#: engines/engine.cpp:444 msgid "" "WARNING: The game you are about to start is not yet fully supported by " "ScummVM. As such, it is likely to be unstable, and any saves you make might " @@ -1280,28 +1302,51 @@ msgstr "" "ScummVM. Således, er det sandsynligt, at det er ustabilt, og alle gemmer du " "foretager fungerer muligvis ikke i fremtidige versioner af ScummVM." -#: engines/engine.cpp:442 +#: engines/engine.cpp:447 msgid "Start anyway" msgstr "Start alligevel" -#: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 -#: engines/sci/detection.cpp:390 +#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270 +#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393 +#: engines/toltecs/detection.cpp:173 msgid "Use original save/load screens" msgstr "Brug original gem/indlæs skærme" -#: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 -#: engines/sci/detection.cpp:391 +#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271 +#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394 +#: engines/toltecs/detection.cpp:174 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "Brug de originale gem/indlæs skærme, istedet for dem fra ScummVM" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore game:" msgstr "Gendan spil:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore" msgstr "Gendan" +#: engines/drascula/saveload.cpp:49 +#, fuzzy +msgid "" +"ScummVM found that you have old savefiles for Drascula that should be " +"converted.\n" +"The old save game format is no longer supported, so you will not be able to " +"load your games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" +msgstr "" +"ScummVM har konstateret, at du har gamle gemmer for Broken Sword 1, der skal " +"konverteres.\n" +"Det gamle gemte spil format understøttes ikke længere, så vil du ikke være i " +"stand til at indlæse dine spil, hvis du ikke konvertere dem.\n" +"\n" +"Tryk på OK for at konvertere dem nu, ellers vil du blive spurgt igen, næste " +"gang du starter spillet.\n" + #: engines/dreamweb/detection.cpp:57 msgid "Use bright palette mode" msgstr "Brug lys palet tilstand" @@ -1310,27 +1355,27 @@ msgstr "Brug lys palet tilstand" msgid "Display graphics using the game's bright palette" msgstr "Vis grafik ved hjælp af spillets lyse palette" -#: engines/sci/detection.cpp:370 +#: engines/sci/detection.cpp:373 msgid "EGA undithering" msgstr "EGA farveforøgelse" -#: engines/sci/detection.cpp:371 +#: engines/sci/detection.cpp:374 msgid "Enable undithering in EGA games" msgstr "Aktiver farveforøgelse i EGA spil" -#: engines/sci/detection.cpp:380 +#: engines/sci/detection.cpp:383 msgid "Prefer digital sound effects" msgstr "Foretræk digitale lydeffekter" -#: engines/sci/detection.cpp:381 +#: engines/sci/detection.cpp:384 msgid "Prefer digital sound effects instead of synthesized ones" msgstr "Foretræk digitale lydeffekter i stedet for syntetiserede" -#: engines/sci/detection.cpp:400 +#: engines/sci/detection.cpp:403 msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "Brug IMF/Yamaha FB-01 til MIDI-udgang" -#: engines/sci/detection.cpp:401 +#: engines/sci/detection.cpp:404 msgid "" "Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" @@ -1338,28 +1383,28 @@ msgstr "" "Bruge et IBM Musik Feature-kort eller et Yamaha FB-01 FM synth modul til " "MIDI-udgang" -#: engines/sci/detection.cpp:411 +#: engines/sci/detection.cpp:414 msgid "Use CD audio" msgstr "Brug CD lyd" -#: engines/sci/detection.cpp:412 +#: engines/sci/detection.cpp:415 msgid "Use CD audio instead of in-game audio, if available" msgstr "Brug cd-lyd i stedet for lyd fra spillet, hvis tilgængelige" -#: engines/sci/detection.cpp:422 +#: engines/sci/detection.cpp:425 msgid "Use Windows cursors" msgstr "Brug Windows markør" -#: engines/sci/detection.cpp:423 +#: engines/sci/detection.cpp:426 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "Brug Windows-markører (mindre og monokrome) i stedet for dem fra DOS" -#: engines/sci/detection.cpp:433 +#: engines/sci/detection.cpp:436 msgid "Use silver cursors" msgstr "Brug sølv markør" -#: engines/sci/detection.cpp:434 +#: engines/sci/detection.cpp:437 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "" @@ -2012,7 +2057,7 @@ msgstr "Flyv til højre" msgid "Fly to lower right" msgstr "Flyv nederst til højre" -#: engines/scumm/scumm.cpp:1773 +#: engines/scumm/scumm.cpp:1776 #, c-format msgid "" "Native MIDI support requires the Roland Upgrade from LucasArts,\n" @@ -2021,7 +2066,7 @@ msgstr "" "Indbygget MIDI understøttelse kræver Roland opgradering fra LucasArts,\n" "men %s mangler. Bruger AdLib i stedet." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 +#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2032,7 +2077,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 +#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2043,7 +2088,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 +#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2054,7 +2099,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2512 +#: engines/scumm/scumm.cpp:2537 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2065,7 +2110,7 @@ msgstr "" "vælg 'Maniac' mappen inde i Tentacle spillets mappe." #. I18N: Option for fast scene switching -#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171 +#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167 msgid "~Z~ip Mode Activated" msgstr "~Z~ip tilstand aktiveret" @@ -2086,11 +2131,11 @@ msgstr "Vi~s~ kort" msgid "~M~ain Menu" msgstr "Hoved~m~enu" -#: engines/mohawk/dialogs.cpp:172 +#: engines/mohawk/dialogs.cpp:168 msgid "~W~ater Effect Enabled" msgstr "~V~andeffekter aktiveret" -#: engines/agos/animation.cpp:560 +#: engines/agos/animation.cpp:557 #, c-format msgid "Cutscene file '%s' not found!" msgstr "Filmsekvens fil '%s' ikke fundet!" @@ -2108,6 +2153,15 @@ msgstr "Mislykkedes at gemme spil tilstand til fil." msgid "Failed to delete file." msgstr "Mislykkedes at slette fil." +#: engines/groovie/detection.cpp:312 +#, fuzzy +msgid "Fast movie speed" +msgstr "Hurtig tilstand" + +#: engines/groovie/detection.cpp:313 +msgid "Play movies at an increased speed" +msgstr "" + #: engines/groovie/script.cpp:420 msgid "Failed to save game" msgstr "Mislykkedes at gemme spil" @@ -2198,11 +2252,11 @@ msgstr "Flyt til venstre" msgid "Slide Right" msgstr "Flyt til højre" -#: engines/kyra/lol.cpp:485 +#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2412 msgid "Turn Left" msgstr "Drej til venstre" -#: engines/kyra/lol.cpp:486 +#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2413 msgid "Turn Right" msgstr "Drej til højre" @@ -2218,7 +2272,7 @@ msgstr "Indstillinger" msgid "Choose Spell" msgstr "Vælg magi" -#: engines/kyra/sound_midi.cpp:475 +#: engines/kyra/sound_midi.cpp:477 msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2265,26 +2319,26 @@ msgstr "Diskette intro" msgid "Use the floppy version's intro (CD version only)" msgstr "Brug diskette versionens intro (kun CD version)" -#: engines/sword1/animation.cpp:539 +#: engines/sword1/animation.cpp:519 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "PSX stream filmsekvens '%s' kan ikke afspilles i palette tilstand" -#: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 +#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439 msgid "DXA cutscenes found but ScummVM has been built without zlib support" msgstr "" "DXA filmsekvenser fundet, men ScummVM er bygget uden zlib understøttelse" -#: engines/sword1/animation.cpp:570 engines/sword2/animation.cpp:465 +#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449 msgid "MPEG2 cutscenes are no longer supported" msgstr "MPEG2 filmsekvenser understøttes ikke længere" -#: engines/sword1/animation.cpp:576 engines/sword2/animation.cpp:473 +#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457 #, c-format msgid "Cutscene '%s' not found" msgstr "Filmsekvens '%s' ikke fundet" -#: engines/sword1/control.cpp:863 +#: engines/sword1/control.cpp:865 msgid "" "ScummVM found that you have old savefiles for Broken Sword 1 that should be " "converted.\n" @@ -2302,7 +2356,7 @@ msgstr "" "Tryk på OK for at konvertere dem nu, ellers vil du blive spurgt igen, næste " "gang du starter spillet.\n" -#: engines/sword1/control.cpp:1232 +#: engines/sword1/control.cpp:1234 #, c-format msgid "" "Target new save game already exists!\n" @@ -2311,11 +2365,11 @@ msgstr "" "Nyt gemt spil findes allerede!\n" "Vil du gerne beholde det gamle gemte spil (%s) eller det nye (%s)?\n" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the old one" msgstr "Behold den gamle" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the new one" msgstr "Behold den nye" @@ -2323,7 +2377,7 @@ msgstr "Behold den nye" msgid "This is the end of the Broken Sword 1 Demo" msgstr "Dette er slutningen af Broken Sword 1 demoen" -#: engines/sword2/animation.cpp:435 +#: engines/sword2/animation.cpp:419 msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" @@ -2337,12 +2391,12 @@ msgstr "Vis labels på genstande" msgid "Show labels for objects on mouse hover" msgstr "Vis labels for genstande musen er henover" -#: engines/teenagent/resources.cpp:68 +#: engines/teenagent/resources.cpp:94 msgid "" "You're missing the 'teenagent.dat' file. Get it from the ScummVM website" msgstr "" -#: engines/teenagent/resources.cpp:89 +#: engines/teenagent/resources.cpp:115 msgid "" "The teenagent.dat file is compressed and zlib hasn't been included in this " "executable. Please decompress it" @@ -2397,6 +2451,47 @@ msgstr "" "\n" "Venligst rapportér til holdet." +#: engines/pegasus/pegasus.cpp:675 +msgid "Invalid save file name" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2410 +msgid "Up/Zoom In/Move Forward/Open Doors" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2411 +#, fuzzy +msgid "Down/Zoom Out" +msgstr "Formindsk" + +#: engines/pegasus/pegasus.cpp:2414 +msgid "Display/Hide Inventory Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2415 +msgid "Display/Hide Biochip Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2416 +msgid "Action/Select" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2417 +msgid "Toggle Center Data Display" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2418 +msgid "Display/Hide Info Screen" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2419 +msgid "Display/Hide Pause Menu" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2420 +msgid "???" +msgstr "" + #: audio/fmopl.cpp:49 msgid "MAME OPL emulator" msgstr "MAME OPL emulator" @@ -2453,7 +2548,7 @@ msgstr "Ingen musik" msgid "Amiga Audio Emulator" msgstr "Amiga lyd emulator" -#: audio/softsynth/adlib.cpp:1593 +#: audio/softsynth/adlib.cpp:2284 msgid "AdLib Emulator" msgstr "AdLib emulator" @@ -2465,11 +2560,11 @@ msgstr "Apple II GS emulator (IKKE IMPLEMENTERET)" msgid "C64 Audio Emulator" msgstr "C64 lyd emulator" -#: audio/softsynth/mt32.cpp:293 +#: audio/softsynth/mt32.cpp:205 msgid "Initializing MT-32 Emulator" msgstr "Initialisere MT-32 emulator" -#: audio/softsynth/mt32.cpp:512 +#: audio/softsynth/mt32.cpp:431 msgid "MT-32 Emulator" msgstr "MT-32 emulator" @@ -2620,24 +2715,24 @@ msgstr "Miderste klik" msgid "Right Click" msgstr "Højre klik" -#: backends/platform/sdl/macosx/appmenu_osx.mm:78 +#: backends/platform/sdl/macosx/appmenu_osx.mm:77 msgid "Hide ScummVM" msgstr "Skjul ScummVM" -#: backends/platform/sdl/macosx/appmenu_osx.mm:83 +#: backends/platform/sdl/macosx/appmenu_osx.mm:82 msgid "Hide Others" msgstr "Skjul andre" -#: backends/platform/sdl/macosx/appmenu_osx.mm:88 +#: backends/platform/sdl/macosx/appmenu_osx.mm:87 msgid "Show All" msgstr "Vis alle" -#: backends/platform/sdl/macosx/appmenu_osx.mm:110 -#: backends/platform/sdl/macosx/appmenu_osx.mm:121 +#: backends/platform/sdl/macosx/appmenu_osx.mm:109 +#: backends/platform/sdl/macosx/appmenu_osx.mm:120 msgid "Window" msgstr "Vindue" -#: backends/platform/sdl/macosx/appmenu_osx.mm:115 +#: backends/platform/sdl/macosx/appmenu_osx.mm:114 msgid "Minimize" msgstr "Minimer" @@ -2651,12 +2746,12 @@ msgid "Normal (no scaling)" msgstr "Normal (ingen skalering)" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537 msgid "Enabled aspect ratio correction" msgstr "Aktivér billedformat korrektion" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542 msgid "Disabled aspect ratio correction" msgstr "Deaktivér billedformat korrektion" @@ -2665,7 +2760,7 @@ msgid "Active graphics filter:" msgstr "Aktive grafik filtre:" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481 msgid "Windowed mode" msgstr "Vindue tilstand" @@ -2689,11 +2784,11 @@ msgstr "Aktuel videotilstand" msgid "Current scale" msgstr "Aktuel skalering" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:558 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562 msgid "Active filter mode: Linear" msgstr "Aktiv filter tilstand: Linær" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:560 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564 msgid "Active filter mode: Nearest" msgstr "Aktiv filter tilstand: Nærmest" @@ -3020,19 +3115,19 @@ msgstr "Vil du virkelig afslutte?" #: backends/events/gph/gph-events.cpp:386 #: backends/events/gph/gph-events.cpp:429 -#: backends/events/openpandora/op-events.cpp:139 +#: backends/events/openpandora/op-events.cpp:168 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "Touchscreen 'Tap Mode' - Venstre Klik" #: backends/events/gph/gph-events.cpp:388 #: backends/events/gph/gph-events.cpp:431 -#: backends/events/openpandora/op-events.cpp:141 +#: backends/events/openpandora/op-events.cpp:170 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "Touchscreen 'Tap Mode' - Højre Klik" #: backends/events/gph/gph-events.cpp:390 #: backends/events/gph/gph-events.cpp:433 -#: backends/events/openpandora/op-events.cpp:143 +#: backends/events/openpandora/op-events.cpp:172 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "Touchscreen 'Tap Mode' - Henover (Ingen Klik)" @@ -3052,7 +3147,12 @@ msgstr "Minimal lydstyrke" msgid "Decreasing Volume" msgstr "Sænker lydstyrke" -#: backends/updates/macosx/macosx-updates.mm:65 +#: backends/events/openpandora/op-events.cpp:174 +#, fuzzy +msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)" +msgstr "Touchscreen 'Tap Mode' - Henover (Ingen Klik)" + +#: backends/updates/macosx/macosx-updates.mm:67 msgid "Check for Updates..." msgstr "Søg efter opdateringer..." @@ -3088,6 +3188,9 @@ msgstr "Klik aktiveret" msgid "Clicking Disabled" msgstr "Klik deaktiveret" +#~ msgid "Enable Roland GS Mode" +#~ msgstr "Aktivér Roland GS tilstand" + #~ msgid "Hercules Green" #~ msgstr "Hercules grøn" diff --git a/po/de_DE.po b/po/de_DE.po index a18bfb7ca6..4676292e90 100644 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -1,5 +1,5 @@ # German translation for ScummVM. -# Copyright (C) 2010-2012 ScummVM Team +# Copyright (C) 2010-2013 ScummVM Team # This file is distributed under the same license as the ScummVM package. # Simon Sawatzki <SimSaw@gmx.de>, Lothar Serra Mari <Lothar@Windowsbase.de>, 2012. # @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.5.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-08-12 14:57+0200\n" +"POT-Creation-Date: 2013-02-07 23:11+0000\n" "PO-Revision-Date: 2012-07-14 22:49+0100\n" "Last-Translator: Simon Sawatzki <SimSaw@gmx.de>\n" "Language-Team: Simon Sawatzki <SimSaw@gmx.de> (Lead), Lothar Serra Mari " @@ -18,45 +18,55 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: gui/about.cpp:91 +#: gui/about.cpp:93 #, c-format msgid "(built on %s)" msgstr "(erstellt am %s)" -#: gui/about.cpp:98 +#: gui/about.cpp:100 msgid "Features compiled in:" msgstr "Verwendete Funktionen:" -#: gui/about.cpp:107 +#: gui/about.cpp:109 msgid "Available engines:" msgstr "Verfügbare Spiele-Engines:" -#: gui/browser.cpp:66 +#: gui/browser.cpp:67 +#, fuzzy +msgid "Show hidden files" +msgstr "Konsole zeigen/verbergen" + +#: gui/browser.cpp:67 +msgid "Show files marked with the hidden attribute" +msgstr "" + +#: gui/browser.cpp:71 msgid "Go up" msgstr "Pfad hoch" -#: gui/browser.cpp:66 gui/browser.cpp:68 +#: gui/browser.cpp:71 gui/browser.cpp:73 msgid "Go to previous directory level" msgstr "Zu höherer Pfadebene wechseln" -#: gui/browser.cpp:68 +#: gui/browser.cpp:73 msgctxt "lowres" msgid "Go up" msgstr "Pfad hoch" -#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 -#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 -#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 -#: gui/themebrowser.cpp:54 engines/engine.cpp:442 -#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 +#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238 +#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275 +#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919 +#: gui/themebrowser.cpp:54 engines/engine.cpp:447 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:190 +#: engines/sword1/control.cpp:867 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" msgstr "Abbrechen" -#: gui/browser.cpp:70 gui/chooser.cpp:46 gui/themebrowser.cpp:55 +#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55 msgid "Choose" msgstr "Auswählen" @@ -71,15 +81,15 @@ msgstr "Schließen" msgid "Mouse click" msgstr "Mausklick" -#: gui/gui-manager.cpp:122 base/main.cpp:300 +#: gui/gui-manager.cpp:122 base/main.cpp:301 msgid "Display keyboard" msgstr "Tastatur anzeigen" -#: gui/gui-manager.cpp:126 base/main.cpp:304 +#: gui/gui-manager.cpp:126 base/main.cpp:305 msgid "Remap keys" msgstr "Tasten neu zuweisen" -#: gui/gui-manager.cpp:129 base/main.cpp:307 +#: gui/gui-manager.cpp:129 base/main.cpp:308 msgid "Toggle FullScreen" msgstr "Vollbild EIN/AUS" @@ -92,17 +102,18 @@ msgid "Map" msgstr "Zuweisen" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 -#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 -#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 -#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 -#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 -#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 -#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 -#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 -#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 -#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 +#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239 +#: gui/saveload-dialog.cpp:920 engines/engine.cpp:366 engines/engine.cpp:377 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192 +#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558 +#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 +#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519 +#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550 +#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:867 +#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419 +#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449 +#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -175,8 +186,8 @@ msgstr "" "Sprache des Spiels. Diese Funktion wird nicht eine spanische Version des " "Spiels in eine deutsche verwandeln." -#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:80 -#: gui/options.cpp:730 gui/options.cpp:743 gui/options.cpp:1199 +#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86 +#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209 #: audio/null.cpp:40 msgid "<default>" msgstr "<Standard>" @@ -198,11 +209,11 @@ msgstr "Plattform:" msgid "Engine" msgstr "Engine" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "Graphics" msgstr "Grafik" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "GFX" msgstr "GFX" @@ -215,7 +226,7 @@ msgctxt "lowres" msgid "Override global graphic settings" msgstr "Globale Grafikeinstellungen übergehen" -#: gui/launcher.cpp:251 gui/options.cpp:1085 +#: gui/launcher.cpp:251 gui/options.cpp:1095 msgid "Audio" msgstr "Audio" @@ -228,11 +239,11 @@ msgctxt "lowres" msgid "Override global audio settings" msgstr "Globale Audioeinstellungen übergehen" -#: gui/launcher.cpp:265 gui/options.cpp:1090 +#: gui/launcher.cpp:265 gui/options.cpp:1100 msgid "Volume" msgstr "Lautstärke" -#: gui/launcher.cpp:267 gui/options.cpp:1092 +#: gui/launcher.cpp:267 gui/options.cpp:1102 msgctxt "lowres" msgid "Volume" msgstr "Lautst." @@ -246,7 +257,7 @@ msgctxt "lowres" msgid "Override global volume settings" msgstr "Globale Lautstärkeeinstellungen übergehen" -#: gui/launcher.cpp:280 gui/options.cpp:1100 +#: gui/launcher.cpp:280 gui/options.cpp:1110 msgid "MIDI" msgstr "MIDI" @@ -259,7 +270,7 @@ msgctxt "lowres" msgid "Override global MIDI settings" msgstr "Globale MIDI-Einstellungen übergehen" -#: gui/launcher.cpp:294 gui/options.cpp:1106 +#: gui/launcher.cpp:294 gui/options.cpp:1116 msgid "MT-32" msgstr "MT-32" @@ -272,11 +283,11 @@ msgctxt "lowres" msgid "Override global MT-32 settings" msgstr "Globale MT-32-Einstellungen übergehen" -#: gui/launcher.cpp:308 gui/options.cpp:1113 +#: gui/launcher.cpp:308 gui/options.cpp:1123 msgid "Paths" msgstr "Pfade" -#: gui/launcher.cpp:310 gui/options.cpp:1115 +#: gui/launcher.cpp:310 gui/options.cpp:1125 msgctxt "lowres" msgid "Paths" msgstr "Pfade" @@ -290,7 +301,7 @@ msgctxt "lowres" msgid "Game Path:" msgstr "Spielpfad:" -#: gui/launcher.cpp:324 gui/options.cpp:1139 +#: gui/launcher.cpp:324 gui/options.cpp:1149 msgid "Extra Path:" msgstr "Extrapfad:" @@ -298,42 +309,42 @@ msgstr "Extrapfad:" msgid "Specifies path to additional data used the game" msgstr "Legt das Verzeichnis für zusätzliche Spieldateien fest." -#: gui/launcher.cpp:326 gui/options.cpp:1141 +#: gui/launcher.cpp:326 gui/options.cpp:1151 msgctxt "lowres" msgid "Extra Path:" msgstr "Extrapfad:" -#: gui/launcher.cpp:333 gui/options.cpp:1123 +#: gui/launcher.cpp:333 gui/options.cpp:1133 msgid "Save Path:" msgstr "Spielstände:" #: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 -#: gui/options.cpp:1123 gui/options.cpp:1125 gui/options.cpp:1126 +#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136 msgid "Specifies where your savegames are put" msgstr "Legt fest, wo die Spielstände abgelegt werden." -#: gui/launcher.cpp:335 gui/options.cpp:1125 +#: gui/launcher.cpp:335 gui/options.cpp:1135 msgctxt "lowres" msgid "Save Path:" msgstr "Speichern:" #: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 -#: gui/launcher.cpp:565 gui/options.cpp:1134 gui/options.cpp:1142 -#: gui/options.cpp:1151 gui/options.cpp:1258 gui/options.cpp:1264 -#: gui/options.cpp:1272 gui/options.cpp:1302 gui/options.cpp:1308 -#: gui/options.cpp:1315 gui/options.cpp:1408 gui/options.cpp:1411 -#: gui/options.cpp:1423 +#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152 +#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282 +#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326 +#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429 +#: gui/options.cpp:1441 msgctxt "path" msgid "None" msgstr "Keiner" #: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 -#: gui/options.cpp:1252 gui/options.cpp:1296 gui/options.cpp:1414 +#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Standard" -#: gui/launcher.cpp:504 gui/options.cpp:1417 +#: gui/launcher.cpp:504 gui/options.cpp:1435 msgid "Select SoundFont" msgstr "SoundFont auswählen" @@ -357,7 +368,7 @@ msgstr "Diese Spielkennung ist schon vergeben. Bitte eine andere wählen." msgid "~Q~uit" msgstr "~B~eenden" -#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:96 +#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95 msgid "Quit ScummVM" msgstr "ScummVM beenden" @@ -365,7 +376,7 @@ msgstr "ScummVM beenden" msgid "A~b~out..." msgstr "Übe~r~" -#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:70 +#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69 msgid "About ScummVM" msgstr "Über ScummVM" @@ -444,12 +455,14 @@ msgstr "Suchen:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 +#: engines/pegasus/pegasus.cpp:345 msgid "Load game:" msgstr "Spiel laden:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:345 +#: backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Laden" @@ -535,136 +548,136 @@ msgstr "%d Ordner durchsucht..." msgid "Discovered %d new games, ignored %d previously added games ..." msgstr "%d neue Spiele gefunden, %d bereits hinzugefügte Spiele ignoriert..." -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "Never" msgstr "Niemals" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 5 mins" msgstr "alle 5 Minuten" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 10 mins" msgstr "alle 10 Minuten" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 15 mins" msgstr "alle 15 Minuten" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 30 mins" msgstr "alle 30 Minuten" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "8 kHz" msgstr "8 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "11kHz" msgstr "11 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "22 kHz" msgstr "22 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "44 kHz" msgstr "44 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:248 gui/options.cpp:474 gui/options.cpp:575 -#: gui/options.cpp:644 gui/options.cpp:852 +#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581 +#: gui/options.cpp:650 gui/options.cpp:858 msgctxt "soundfont" msgid "None" msgstr "-" -#: gui/options.cpp:382 +#: gui/options.cpp:388 msgid "Failed to apply some of the graphic options changes:" msgstr "Fehler bei einigen Änderungen in Grafikoptionen:" -#: gui/options.cpp:394 +#: gui/options.cpp:400 msgid "the video mode could not be changed." msgstr "Grafikmodus konnte nicht geändert werden." -#: gui/options.cpp:400 +#: gui/options.cpp:406 msgid "the fullscreen setting could not be changed" msgstr "Vollbildeinstellung konnte nicht geändert werden." -#: gui/options.cpp:406 +#: gui/options.cpp:412 msgid "the aspect ratio setting could not be changed" msgstr "" "Einstellung für Seitenverhältniskorrektur konnte nicht geändert werden." -#: gui/options.cpp:727 +#: gui/options.cpp:733 msgid "Graphics mode:" msgstr "Grafikmodus:" -#: gui/options.cpp:741 +#: gui/options.cpp:747 msgid "Render mode:" msgstr "Render-Modus:" -#: gui/options.cpp:741 gui/options.cpp:742 +#: gui/options.cpp:747 gui/options.cpp:748 msgid "Special dithering modes supported by some games" msgstr "" "Spezielle Farbmischungsmethoden werden von manchen Spielen unterstützt." -#: gui/options.cpp:753 +#: gui/options.cpp:759 #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476 msgid "Fullscreen mode" msgstr "Vollbildmodus" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Aspect ratio correction" msgstr "Seitenverhältnis korrigieren" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Correct aspect ratio for 320x200 games" msgstr "Seitenverhältnis für Spiele mit der Auflösung 320x200 korrigieren" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Preferred Device:" msgstr "Standard-Gerät:" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Music Device:" msgstr "Musikgerät:" -#: gui/options.cpp:764 gui/options.cpp:766 +#: gui/options.cpp:770 gui/options.cpp:772 msgid "Specifies preferred sound device or sound card emulator" msgstr "" "Legt das bevorzugte Tonwiedergabe-Gerät oder den Soundkarten-Emulator fest." -#: gui/options.cpp:764 gui/options.cpp:766 gui/options.cpp:767 +#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773 msgid "Specifies output sound device or sound card emulator" msgstr "Legt das Musikwiedergabe-Gerät oder den Soundkarten-Emulator fest." -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Preferred Dev.:" msgstr "Standard-Gerät:" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Music Device:" msgstr "Musikgerät:" -#: gui/options.cpp:793 +#: gui/options.cpp:799 msgid "AdLib emulator:" msgstr "AdLib-Emulator" -#: gui/options.cpp:793 gui/options.cpp:794 +#: gui/options.cpp:799 gui/options.cpp:800 msgid "AdLib is used for music in many games" msgstr "AdLib wird für die Musik in vielen Spielen verwendet." -#: gui/options.cpp:804 +#: gui/options.cpp:810 msgid "Output rate:" msgstr "Ausgabefrequenz:" -#: gui/options.cpp:804 gui/options.cpp:805 +#: gui/options.cpp:810 gui/options.cpp:811 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -672,64 +685,68 @@ msgstr "" "Höhere Werte bewirken eine bessere Soundqualität, werden aber möglicherweise " "nicht von jeder Soundkarte unterstützt." -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "GM Device:" msgstr "GM-Gerät:" -#: gui/options.cpp:815 +#: gui/options.cpp:821 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:826 +#: gui/options.cpp:832 msgid "Don't use General MIDI music" msgstr "Keine General-MIDI-Musik" -#: gui/options.cpp:837 gui/options.cpp:899 +#: gui/options.cpp:843 gui/options.cpp:909 msgid "Use first available device" msgstr "Erstes verfügbares Gerät" -#: gui/options.cpp:849 +#: gui/options.cpp:855 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 +#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858 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:851 +#: gui/options.cpp:857 msgctxt "lowres" msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Mixed AdLib/MIDI mode" msgstr "AdLib-/MIDI-Modus" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Use both MIDI and AdLib sound generation" msgstr "Benutzt MIDI und AdLib zur Sounderzeugung." -#: gui/options.cpp:860 +#: gui/options.cpp:866 msgid "MIDI gain:" msgstr "MIDI-Lautstärke:" -#: gui/options.cpp:870 +#: gui/options.cpp:873 +msgid "FluidSynth Settings" +msgstr "" + +#: gui/options.cpp:880 msgid "MT-32 Device:" msgstr "MT-32-Gerät:" -#: gui/options.cpp:870 +#: gui/options.cpp:880 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:875 +#: gui/options.cpp:885 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Echte Roland-MT-32-Emulation (GM-Emulation deaktiviert)" -#: gui/options.cpp:875 gui/options.cpp:877 +#: gui/options.cpp:885 gui/options.cpp:887 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -737,197 +754,198 @@ 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:877 +#: gui/options.cpp:887 msgctxt "lowres" msgid "True Roland MT-32 (no GM emulation)" msgstr "Echte Roland-MT-32-Emulation (kein GM)" -#: gui/options.cpp:880 -msgid "Enable Roland GS Mode" -msgstr "Roland-GS-Modus" +#: gui/options.cpp:890 +#, fuzzy +msgid "Roland GS Mode (disable GM mapping)" +msgstr "Echte Roland-MT-32-Emulation (GM-Emulation deaktiviert)" -#: gui/options.cpp:880 +#: gui/options.cpp:890 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:889 +#: gui/options.cpp:899 msgid "Don't use Roland MT-32 music" msgstr "Keine Roland-MT-32-Musik" -#: gui/options.cpp:916 +#: gui/options.cpp:926 msgid "Text and Speech:" msgstr "Sprache und Text:" -#: gui/options.cpp:920 gui/options.cpp:930 +#: gui/options.cpp:930 gui/options.cpp:940 msgid "Speech" msgstr "Sprache" -#: gui/options.cpp:921 gui/options.cpp:931 +#: gui/options.cpp:931 gui/options.cpp:941 msgid "Subtitles" msgstr "Untertitel" -#: gui/options.cpp:922 +#: gui/options.cpp:932 msgid "Both" msgstr "Beides" -#: gui/options.cpp:924 +#: gui/options.cpp:934 msgid "Subtitle speed:" msgstr "Untertitel-Tempo:" -#: gui/options.cpp:926 +#: gui/options.cpp:936 msgctxt "lowres" msgid "Text and Speech:" msgstr "Sprache + Text:" -#: gui/options.cpp:930 +#: gui/options.cpp:940 msgid "Spch" msgstr "Spr." -#: gui/options.cpp:931 +#: gui/options.cpp:941 msgid "Subs" msgstr "Text" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgctxt "lowres" msgid "Both" msgstr "S+T" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgid "Show subtitles and play speech" msgstr "Untertitel anzeigen und Sprachausgabe aktivieren" -#: gui/options.cpp:934 +#: gui/options.cpp:944 msgctxt "lowres" msgid "Subtitle speed:" msgstr "Text-Tempo:" -#: gui/options.cpp:950 +#: gui/options.cpp:960 msgid "Music volume:" msgstr "Musiklautstärke:" -#: gui/options.cpp:952 +#: gui/options.cpp:962 msgctxt "lowres" msgid "Music volume:" msgstr "Musiklautstärke:" -#: gui/options.cpp:959 +#: gui/options.cpp:969 msgid "Mute All" msgstr "Alles aus" -#: gui/options.cpp:962 +#: gui/options.cpp:972 msgid "SFX volume:" msgstr "Effektlautstärke:" -#: gui/options.cpp:962 gui/options.cpp:964 gui/options.cpp:965 +#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975 msgid "Special sound effects volume" msgstr "Lautstärke spezieller Soundeffekte" -#: gui/options.cpp:964 +#: gui/options.cpp:974 msgctxt "lowres" msgid "SFX volume:" msgstr "Effektlautst.:" -#: gui/options.cpp:972 +#: gui/options.cpp:982 msgid "Speech volume:" msgstr "Sprachlautstärke:" -#: gui/options.cpp:974 +#: gui/options.cpp:984 msgctxt "lowres" msgid "Speech volume:" msgstr "Sprachlautst.:" -#: gui/options.cpp:1131 +#: gui/options.cpp:1141 msgid "Theme Path:" msgstr "Themenpfad:" -#: gui/options.cpp:1133 +#: gui/options.cpp:1143 msgctxt "lowres" msgid "Theme Path:" msgstr "Themenpfad:" -#: gui/options.cpp:1139 gui/options.cpp:1141 gui/options.cpp:1142 +#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152 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:1148 +#: gui/options.cpp:1158 msgid "Plugins Path:" msgstr "Plugin-Pfad:" -#: gui/options.cpp:1150 +#: gui/options.cpp:1160 msgctxt "lowres" msgid "Plugins Path:" msgstr "Plugin-Pfad:" -#: gui/options.cpp:1159 +#: gui/options.cpp:1169 msgid "Misc" msgstr "Sonstiges" -#: gui/options.cpp:1161 +#: gui/options.cpp:1171 msgctxt "lowres" msgid "Misc" msgstr "Andere" -#: gui/options.cpp:1163 +#: gui/options.cpp:1173 msgid "Theme:" msgstr "Thema:" -#: gui/options.cpp:1167 +#: gui/options.cpp:1177 msgid "GUI Renderer:" msgstr "GUI-Renderer:" -#: gui/options.cpp:1179 +#: gui/options.cpp:1189 msgid "Autosave:" msgstr "Autom. Speichern:" -#: gui/options.cpp:1181 +#: gui/options.cpp:1191 msgctxt "lowres" msgid "Autosave:" msgstr "Speich.(auto)" -#: gui/options.cpp:1189 +#: gui/options.cpp:1199 msgid "Keys" msgstr "Tasten" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "GUI Language:" msgstr "Sprache:" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "Language of ScummVM GUI" msgstr "Sprache der ScummVM-Oberfläche" -#: gui/options.cpp:1347 +#: gui/options.cpp:1365 msgid "You have to restart ScummVM before your changes will take effect." msgstr "Sie müssen ScummVM neu starten, damit die Änderungen wirksam werden." -#: gui/options.cpp:1360 +#: gui/options.cpp:1378 msgid "Select directory for savegames" msgstr "Verzeichnis für Spielstände auswählen" -#: gui/options.cpp:1367 +#: gui/options.cpp:1385 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:1376 +#: gui/options.cpp:1394 msgid "Select directory for GUI themes" msgstr "Verzeichnis für Oberflächen-Themen" -#: gui/options.cpp:1386 +#: gui/options.cpp:1404 msgid "Select directory for extra files" msgstr "Verzeichnis für zusätzliche Dateien auswählen" -#: gui/options.cpp:1397 +#: gui/options.cpp:1415 msgid "Select directory for plugins" msgstr "Verzeichnis für Erweiterungen auswählen" # Nicht übersetzen, da diese Nachricht nur für nicht-lateinische Sprachen relevant ist. -#: gui/options.cpp:1450 +#: gui/options.cpp:1468 msgid "" "The theme you selected does not support your current language. If you want " "to use this theme you need to switch to another language first." @@ -936,74 +954,74 @@ msgstr "" "dieses Thema benutzen wollen, müssen Sie erst zu einer anderen Sprache " "wechseln." -#: gui/saveload-dialog.cpp:158 +#: gui/saveload-dialog.cpp:166 msgid "List view" msgstr "" -#: gui/saveload-dialog.cpp:159 +#: gui/saveload-dialog.cpp:167 msgid "Grid view" msgstr "" -#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 +#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358 msgid "No date saved" msgstr "Kein Datum gespeichert" -#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359 msgid "No time saved" msgstr "Keine Zeit gespeichert" -#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 +#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360 msgid "No playtime saved" msgstr "Keine Spielzeit gespeichert" -#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275 msgid "Delete" msgstr "Löschen" -#: gui/saveload-dialog.cpp:266 +#: gui/saveload-dialog.cpp:274 msgid "Do you really want to delete this savegame?" msgstr "Diesen Spielstand wirklich löschen?" -#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 +#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872 msgid "Date: " msgstr "Datum: " -#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 +#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878 msgid "Time: " msgstr "Zeit: " -#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 +#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886 msgid "Playtime: " msgstr "Spieldauer: " -#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 +#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494 msgid "Untitled savestate" msgstr "Unbenannt" -#: gui/saveload-dialog.cpp:517 +#: gui/saveload-dialog.cpp:546 msgid "Next" msgstr "" -#: gui/saveload-dialog.cpp:520 +#: gui/saveload-dialog.cpp:549 msgid "Prev" msgstr "" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 #, fuzzy msgid "New Save" msgstr "Speichern" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 #, fuzzy msgid "Create a new save game" msgstr "Konnte Spielstand nicht speichern." -#: gui/saveload-dialog.cpp:789 +#: gui/saveload-dialog.cpp:865 #, fuzzy msgid "Name: " msgstr "Name:" -#: gui/saveload-dialog.cpp:861 +#: gui/saveload-dialog.cpp:937 #, c-format msgid "Enter a description for slot %d:" msgstr "" @@ -1041,35 +1059,35 @@ msgstr "Kantenglättung (16bpp)" msgid "Clear value" msgstr "Wert löschen" -#: base/main.cpp:209 +#: base/main.cpp:210 #, c-format msgid "Engine does not support debug level '%s'" msgstr "Engine unterstützt den Debug-Level \"%s\" nicht." -#: base/main.cpp:287 +#: base/main.cpp:288 msgid "Menu" msgstr "Menü" -#: base/main.cpp:290 backends/platform/symbian/src/SymbianActions.cpp:45 +#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:45 #: backends/platform/wince/CEActionsSmartphone.cpp:46 msgid "Skip" msgstr "Überspringen" -#: base/main.cpp:293 backends/platform/symbian/src/SymbianActions.cpp:50 +#: base/main.cpp:294 backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:42 msgid "Pause" msgstr "Pause" -#: base/main.cpp:296 +#: base/main.cpp:297 msgid "Skip line" msgstr "Zeile überspringen" -#: base/main.cpp:467 +#: base/main.cpp:468 msgid "Error running game:" msgstr "Fehler beim Ausführen des Spiels:" -#: base/main.cpp:491 +#: base/main.cpp:492 msgid "Could not find any engine capable of running the selected game" msgstr "Konnte keine Spiel-Engine finden, die dieses Spiel starten kann." @@ -1188,13 +1206,16 @@ msgid "~R~eturn to Launcher" msgstr "Zur Spiele~l~iste" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284 +#: engines/pegasus/pegasus.cpp:369 msgid "Save game:" msgstr "Speichern:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:369 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1222,12 +1243,12 @@ msgstr "" "Datei für grundlegende Informationen und Anweisungen zu weiterer Hilfe." #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 -#: engines/mohawk/dialogs.cpp:174 +#: engines/mohawk/dialogs.cpp:170 msgid "~O~K" msgstr "~O~K" #: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 -#: engines/mohawk/dialogs.cpp:175 +#: engines/mohawk/dialogs.cpp:171 msgid "~C~ancel" msgstr "~A~bbrechen" @@ -1235,23 +1256,23 @@ msgstr "~A~bbrechen" msgid "~K~eys" msgstr "~T~asten" -#: engines/engine.cpp:235 +#: engines/engine.cpp:240 msgid "Could not initialize color format." msgstr "Konnte Farbenformat nicht initialisieren." -#: engines/engine.cpp:243 +#: engines/engine.cpp:248 msgid "Could not switch to video mode: '" msgstr "Konnte nicht zu Grafikmodus wechseln: '" -#: engines/engine.cpp:252 +#: engines/engine.cpp:257 msgid "Could not apply aspect ratio setting." msgstr "Konnte Einstellung für Seitenverhältniskorrektur nicht anwenden." -#: engines/engine.cpp:257 +#: engines/engine.cpp:262 msgid "Could not apply fullscreen setting." msgstr "Konnte Einstellung für Vollbildmodus nicht anwenden." -#: engines/engine.cpp:357 +#: engines/engine.cpp:362 msgid "" "You appear to be playing this game directly\n" "from the CD. This is known to cause problems,\n" @@ -1267,7 +1288,7 @@ msgstr "" "Lesen Sie die Liesmich-Datei für\n" "weitere Informationen." -#: engines/engine.cpp:368 +#: engines/engine.cpp:373 msgid "" "This game has audio tracks in its disk. These\n" "tracks need to be ripped from the disk using\n" @@ -1282,7 +1303,7 @@ msgstr "" "Spiel hören zu können. Lesen Sie die\n" "Liesmich-Datei für weitere Informationen." -#: engines/engine.cpp:426 +#: engines/engine.cpp:431 #, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " @@ -1291,7 +1312,7 @@ msgstr "" "Laden des Spielstands %s fehlgeschlagen! Bitte lesen Sie die Liesmich-Datei " "für grundlegende Informationen und Anweisungen zu weiterer Hilfe." -#: engines/engine.cpp:439 +#: engines/engine.cpp:444 msgid "" "WARNING: The game you are about to start is not yet fully supported by " "ScummVM. As such, it is likely to be unstable, and any saves you make might " @@ -1302,29 +1323,52 @@ msgstr "" "und jegliche Spielstände, die Sie erstellen, könnten in zukünftigen " "Versionen von ScummVM nicht mehr funktionieren." -#: engines/engine.cpp:442 +#: engines/engine.cpp:447 msgid "Start anyway" msgstr "Trotzdem starten" -#: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 -#: engines/sci/detection.cpp:390 +#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270 +#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393 +#: engines/toltecs/detection.cpp:173 msgid "Use original save/load screens" msgstr "Originale Spielstand-Menüs" -#: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 -#: engines/sci/detection.cpp:391 +#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271 +#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394 +#: engines/toltecs/detection.cpp:174 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" "Verwendet die originalen Menüs zum Speichern und Laden statt der von ScummVM." -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore game:" msgstr "Spiel laden:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore" msgstr "Laden" +#: engines/drascula/saveload.cpp:49 +#, fuzzy +msgid "" +"ScummVM found that you have old savefiles for Drascula that should be " +"converted.\n" +"The old save game format is no longer supported, so you will not be able to " +"load your games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" +msgstr "" +"ScummVM hat erkannt, dass Sie alte Spielstände von Baphomets Fluch 1 haben, " +"die umgewandelt werden sollten.\n" +"Das alte Speicherformat wird nicht mehr unterstützt, also können Sie diese " +"Spielstände unkonvertiert nicht laden.\n" +"\n" +"Klicken Sie auf OK, um diese jetzt umzuwandeln, sonst werden Sie erneut " +"gefragt, wenn Sie nächstes Mal dieses Spiel starten.\n" + #: engines/dreamweb/detection.cpp:57 msgid "Use bright palette mode" msgstr "Modus für helle Palette verwenden" @@ -1333,27 +1377,27 @@ msgstr "Modus für helle Palette verwenden" msgid "Display graphics using the game's bright palette" msgstr "Zeigt Grafiken über helle Spielpalette an." -#: engines/sci/detection.cpp:370 +#: engines/sci/detection.cpp:373 msgid "EGA undithering" msgstr "Antifehlerdiffusion für EGA" -#: engines/sci/detection.cpp:371 +#: engines/sci/detection.cpp:374 msgid "Enable undithering in EGA games" msgstr "Aktiviert die Aufhebung der Fehlerdiffusion in EGA-Spielen." -#: engines/sci/detection.cpp:380 +#: engines/sci/detection.cpp:383 msgid "Prefer digital sound effects" msgstr "Digitale Sound-Effekte bevorzugen" -#: engines/sci/detection.cpp:381 +#: engines/sci/detection.cpp:384 msgid "Prefer digital sound effects instead of synthesized ones" msgstr "Bevorzugt digitale Sound-Effekte statt synthethisierter." -#: engines/sci/detection.cpp:400 +#: engines/sci/detection.cpp:403 msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "IMF/Yamaha FB-01 für MIDI-Ausgabe verwenden" -#: engines/sci/detection.cpp:401 +#: engines/sci/detection.cpp:404 msgid "" "Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" @@ -1361,30 +1405,30 @@ msgstr "" "Verwendet eine Music-Feature-Karte von IBM oder ein Yamaha-FB-01-FM-" "Synthetisierungsmodul für die MIDI-Ausgabe." -#: engines/sci/detection.cpp:411 +#: engines/sci/detection.cpp:414 msgid "Use CD audio" msgstr "CD-Ton verwenden" -#: engines/sci/detection.cpp:412 +#: engines/sci/detection.cpp:415 msgid "Use CD audio instead of in-game audio, if available" msgstr "Verwendet CD-Ton anstatt des Tons im Spiel, sofern verfügbar." -#: engines/sci/detection.cpp:422 +#: engines/sci/detection.cpp:425 msgid "Use Windows cursors" msgstr "Windows-Mauszeiger verwenden" -#: engines/sci/detection.cpp:423 +#: engines/sci/detection.cpp:426 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "" "Verwendet die Windows-Mauszeiger (kleiner und schwarz-weiß) anstatt der von " "DOS." -#: engines/sci/detection.cpp:433 +#: engines/sci/detection.cpp:436 msgid "Use silver cursors" msgstr "Silberne Mauszeiger verwenden" -#: engines/sci/detection.cpp:434 +#: engines/sci/detection.cpp:437 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "" @@ -2038,7 +2082,7 @@ msgstr "Nach rechts fliegen" msgid "Fly to lower right" msgstr "Nach unten rechts fliegen" -#: engines/scumm/scumm.cpp:1773 +#: engines/scumm/scumm.cpp:1776 #, c-format msgid "" "Native MIDI support requires the Roland Upgrade from LucasArts,\n" @@ -2048,7 +2092,7 @@ msgstr "" "Roland-Upgrade von LucasArts, aber %s\n" "fehlt. Stattdessen wird AdLib verwendet." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 +#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2059,7 +2103,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 +#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2070,7 +2114,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 +#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2081,7 +2125,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2512 +#: engines/scumm/scumm.cpp:2537 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2093,7 +2137,7 @@ msgstr "" "Verzeichnis dieses Spiels aus." #. I18N: Option for fast scene switching -#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171 +#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167 msgid "~Z~ip Mode Activated" msgstr "Schneller ~R~aumwechsel aktiviert" @@ -2114,11 +2158,11 @@ msgstr "~K~arte anzeigen" msgid "~M~ain Menu" msgstr "Haupt~m~enü" -#: engines/mohawk/dialogs.cpp:172 +#: engines/mohawk/dialogs.cpp:168 msgid "~W~ater Effect Enabled" msgstr "~W~assereffekt aktiviert" -#: engines/agos/animation.cpp:560 +#: engines/agos/animation.cpp:557 #, c-format msgid "Cutscene file '%s' not found!" msgstr "Zwischensequenz \"%s\" nicht gefunden!" @@ -2136,6 +2180,15 @@ msgstr "Konnte Spielstand nicht in Datei speichern." msgid "Failed to delete file." msgstr "Konnte Datei nicht löschen." +#: engines/groovie/detection.cpp:312 +#, fuzzy +msgid "Fast movie speed" +msgstr "Schneller Modus" + +#: engines/groovie/detection.cpp:313 +msgid "Play movies at an increased speed" +msgstr "" + #: engines/groovie/script.cpp:420 msgid "Failed to save game" msgstr "Konnte Spielstand nicht speichern." @@ -2226,11 +2279,11 @@ msgstr "Nach links rutschen" msgid "Slide Right" msgstr "Nach rechts rutschen" -#: engines/kyra/lol.cpp:485 +#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2412 msgid "Turn Left" msgstr "Nach links drehen" -#: engines/kyra/lol.cpp:486 +#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2413 msgid "Turn Right" msgstr "Nach rechts drehen" @@ -2246,7 +2299,7 @@ msgstr "Optionen" msgid "Choose Spell" msgstr "Zauberspruch auswählen" -#: engines/kyra/sound_midi.cpp:475 +#: engines/kyra/sound_midi.cpp:477 msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2297,28 +2350,28 @@ msgstr "Disketten-Vorspann" msgid "Use the floppy version's intro (CD version only)" msgstr "Verwendet den Vorspann der Diskettenversion (nur bei CD-Version)." -#: engines/sword1/animation.cpp:539 +#: engines/sword1/animation.cpp:519 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "" "PSX-Zwischensequenz \"%s\" kann in Palettenmodus nicht wiedergegeben werden." -#: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 +#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439 msgid "DXA cutscenes found but ScummVM has been built without zlib support" msgstr "" "DXA-Zwischensequenzen gefunden, aber ScummVM wurde ohne Zlib-Unterstützung " "erstellt." -#: engines/sword1/animation.cpp:570 engines/sword2/animation.cpp:465 +#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449 msgid "MPEG2 cutscenes are no longer supported" msgstr "MPEG2-Zwischensequenzen werden nicht mehr unterstützt." -#: engines/sword1/animation.cpp:576 engines/sword2/animation.cpp:473 +#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457 #, c-format msgid "Cutscene '%s' not found" msgstr "Zwischensequenz \"%s\" gefunden" -#: engines/sword1/control.cpp:863 +#: engines/sword1/control.cpp:865 msgid "" "ScummVM found that you have old savefiles for Broken Sword 1 that should be " "converted.\n" @@ -2336,7 +2389,7 @@ msgstr "" "Klicken Sie auf OK, um diese jetzt umzuwandeln, sonst werden Sie erneut " "gefragt, wenn Sie nächstes Mal dieses Spiel starten.\n" -#: engines/sword1/control.cpp:1232 +#: engines/sword1/control.cpp:1234 #, c-format msgid "" "Target new save game already exists!\n" @@ -2345,11 +2398,11 @@ msgstr "" "Die für den neuen Spielstand vorgesehene Datei existiert bereits!\n" "Möchten Sie den alten Speicherstand (%s) oder den neuen (%s) behalten?\n" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the old one" msgstr "Den alten behalten" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the new one" msgstr "Den neuen behalten" @@ -2357,7 +2410,7 @@ msgstr "Den neuen behalten" msgid "This is the end of the Broken Sword 1 Demo" msgstr "Das ist das Ende der Demo von Broken Sword 1 (Baphomets Fluch 1)." -#: engines/sword2/animation.cpp:435 +#: engines/sword2/animation.cpp:419 msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" @@ -2372,12 +2425,12 @@ msgstr "Objektnamen zeigen" msgid "Show labels for objects on mouse hover" msgstr "Zeigt Objektbeschriftungen bei Mausberührung an." -#: engines/teenagent/resources.cpp:68 +#: engines/teenagent/resources.cpp:94 msgid "" "You're missing the 'teenagent.dat' file. Get it from the ScummVM website" msgstr "" -#: engines/teenagent/resources.cpp:89 +#: engines/teenagent/resources.cpp:115 msgid "" "The teenagent.dat file is compressed and zlib hasn't been included in this " "executable. Please decompress it" @@ -2433,6 +2486,47 @@ msgstr "" "\n" "Bitte berichten Sie dies dem Team auf Englisch." +#: engines/pegasus/pegasus.cpp:675 +msgid "Invalid save file name" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2410 +msgid "Up/Zoom In/Move Forward/Open Doors" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2411 +#, fuzzy +msgid "Down/Zoom Out" +msgstr "Herauszoomen" + +#: engines/pegasus/pegasus.cpp:2414 +msgid "Display/Hide Inventory Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2415 +msgid "Display/Hide Biochip Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2416 +msgid "Action/Select" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2417 +msgid "Toggle Center Data Display" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2418 +msgid "Display/Hide Info Screen" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2419 +msgid "Display/Hide Pause Menu" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2420 +msgid "???" +msgstr "" + #: audio/fmopl.cpp:49 msgid "MAME OPL emulator" msgstr "MAME-OPL-Emulator" @@ -2490,7 +2584,7 @@ msgstr "Keine Musik" msgid "Amiga Audio Emulator" msgstr "Amiga-Audio-Emulator" -#: audio/softsynth/adlib.cpp:1593 +#: audio/softsynth/adlib.cpp:2284 msgid "AdLib Emulator" msgstr "AdLib-Emulator" @@ -2502,11 +2596,11 @@ msgstr "Apple-II-GS-Emulator (NICHT INTEGRIERT)" msgid "C64 Audio Emulator" msgstr "C64-Audio-Emulator" -#: audio/softsynth/mt32.cpp:293 +#: audio/softsynth/mt32.cpp:205 msgid "Initializing MT-32 Emulator" msgstr "MT-32-Emulator wird gestartet" -#: audio/softsynth/mt32.cpp:512 +#: audio/softsynth/mt32.cpp:431 msgid "MT-32 Emulator" msgstr "MT-32-Emulation" @@ -2657,24 +2751,24 @@ msgstr "Mittelklick" msgid "Right Click" msgstr "Rechtsklick" -#: backends/platform/sdl/macosx/appmenu_osx.mm:78 +#: backends/platform/sdl/macosx/appmenu_osx.mm:77 msgid "Hide ScummVM" msgstr "ScummVM ausblenden" -#: backends/platform/sdl/macosx/appmenu_osx.mm:83 +#: backends/platform/sdl/macosx/appmenu_osx.mm:82 msgid "Hide Others" msgstr "Andere ausblenden" -#: backends/platform/sdl/macosx/appmenu_osx.mm:88 +#: backends/platform/sdl/macosx/appmenu_osx.mm:87 msgid "Show All" msgstr "Alle einblenden" -#: backends/platform/sdl/macosx/appmenu_osx.mm:110 -#: backends/platform/sdl/macosx/appmenu_osx.mm:121 +#: backends/platform/sdl/macosx/appmenu_osx.mm:109 +#: backends/platform/sdl/macosx/appmenu_osx.mm:120 msgid "Window" msgstr "Fenster" -#: backends/platform/sdl/macosx/appmenu_osx.mm:115 +#: backends/platform/sdl/macosx/appmenu_osx.mm:114 msgid "Minimize" msgstr "Im Dock ablegen" @@ -2688,12 +2782,12 @@ msgid "Normal (no scaling)" msgstr "Normal ohn.Skalieren" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537 msgid "Enabled aspect ratio correction" msgstr "Seitenverhältniskorrektur an" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542 msgid "Disabled aspect ratio correction" msgstr "Seitenverhältniskorrektur aus" @@ -2702,7 +2796,7 @@ msgid "Active graphics filter:" msgstr "Aktiver Grafikfilter:" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481 msgid "Windowed mode" msgstr "Fenstermodus" @@ -2726,11 +2820,11 @@ msgstr "Aktueller Grafikmodus" msgid "Current scale" msgstr "Aktueller Vergrößerungsfaktor" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:558 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562 msgid "Active filter mode: Linear" msgstr "Aktiver Filtermodus: linear" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:560 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564 msgid "Active filter mode: Nearest" msgstr "Aktiver Filtermodus: nächste Nachbarn" @@ -3058,19 +3152,19 @@ msgstr "Möchten Sie wirklich beenden?" #: backends/events/gph/gph-events.cpp:386 #: backends/events/gph/gph-events.cpp:429 -#: backends/events/openpandora/op-events.cpp:139 +#: backends/events/openpandora/op-events.cpp:168 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "Berührungsbildschirm-Tipp-Modus - Linksklick" #: backends/events/gph/gph-events.cpp:388 #: backends/events/gph/gph-events.cpp:431 -#: backends/events/openpandora/op-events.cpp:141 +#: backends/events/openpandora/op-events.cpp:170 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "Berührungsbildschirm-Tipp-Modus - Rechtsklick" #: backends/events/gph/gph-events.cpp:390 #: backends/events/gph/gph-events.cpp:433 -#: backends/events/openpandora/op-events.cpp:143 +#: backends/events/openpandora/op-events.cpp:172 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "Berührungsbildschirm-Tipp-Modus - schweben (kein Klick)" @@ -3090,7 +3184,12 @@ msgstr "Niedrigste Lautstärke" msgid "Decreasing Volume" msgstr "Lautstärke niedriger" -#: backends/updates/macosx/macosx-updates.mm:65 +#: backends/events/openpandora/op-events.cpp:174 +#, fuzzy +msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)" +msgstr "Berührungsbildschirm-Tipp-Modus - schweben (kein Klick)" + +#: backends/updates/macosx/macosx-updates.mm:67 msgid "Check for Updates..." msgstr "Suche nach Aktualisierungen..." @@ -3126,6 +3225,9 @@ msgstr "Klicken aktiviert" msgid "Clicking Disabled" msgstr "Klicken deaktiviert" +#~ msgid "Enable Roland GS Mode" +#~ msgstr "Roland-GS-Modus" + #~ msgid "Hercules Green" #~ msgstr "Hercules-Grün" diff --git a/po/es_ES.po b/po/es_ES.po index 9f767dacfa..e71ea86cba 100644 --- a/po/es_ES.po +++ b/po/es_ES.po @@ -1,5 +1,5 @@ # Spanish translation for ScummVM. -# Copyright (C) 2010-2012 ScummVM Team +# Copyright (C) 2010-2013 ScummVM Team # This file is distributed under the same license as the ScummVM package. # Tomás Maidagan, 2011. # @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.4.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-08-12 14:57+0200\n" +"POT-Creation-Date: 2013-02-07 23:11+0000\n" "PO-Revision-Date: 2012-07-08 18:19+0100\n" "Last-Translator: Tomás Maidagan\n" "Language-Team: \n" @@ -16,45 +16,55 @@ msgstr "" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -#: gui/about.cpp:91 +#: gui/about.cpp:93 #, c-format msgid "(built on %s)" msgstr "(compilado el %s)" -#: gui/about.cpp:98 +#: gui/about.cpp:100 msgid "Features compiled in:" msgstr "Características incluidas:" -#: gui/about.cpp:107 +#: gui/about.cpp:109 msgid "Available engines:" msgstr "Motores disponibles:" -#: gui/browser.cpp:66 +#: gui/browser.cpp:67 +#, fuzzy +msgid "Show hidden files" +msgstr "Mostrar / Ocultar consola" + +#: gui/browser.cpp:67 +msgid "Show files marked with the hidden attribute" +msgstr "" + +#: gui/browser.cpp:71 msgid "Go up" msgstr "Arriba" -#: gui/browser.cpp:66 gui/browser.cpp:68 +#: gui/browser.cpp:71 gui/browser.cpp:73 msgid "Go to previous directory level" msgstr "Ir al directorio anterior" -#: gui/browser.cpp:68 +#: gui/browser.cpp:73 msgctxt "lowres" msgid "Go up" msgstr "Arriba" -#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 -#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 -#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 -#: gui/themebrowser.cpp:54 engines/engine.cpp:442 -#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 +#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238 +#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275 +#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919 +#: gui/themebrowser.cpp:54 engines/engine.cpp:447 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:190 +#: engines/sword1/control.cpp:867 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" msgstr "Cancelar" -#: gui/browser.cpp:70 gui/chooser.cpp:46 gui/themebrowser.cpp:55 +#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55 msgid "Choose" msgstr "Aceptar" @@ -69,15 +79,15 @@ msgstr "Cerrar" msgid "Mouse click" msgstr "Clic de ratón" -#: gui/gui-manager.cpp:122 base/main.cpp:300 +#: gui/gui-manager.cpp:122 base/main.cpp:301 msgid "Display keyboard" msgstr "Mostrar el teclado" -#: gui/gui-manager.cpp:126 base/main.cpp:304 +#: gui/gui-manager.cpp:126 base/main.cpp:305 msgid "Remap keys" msgstr "Asignar teclas" -#: gui/gui-manager.cpp:129 base/main.cpp:307 +#: gui/gui-manager.cpp:129 base/main.cpp:308 msgid "Toggle FullScreen" msgstr "Activar pantalla completa" @@ -90,17 +100,18 @@ msgid "Map" msgstr "Asignar" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 -#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 -#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 -#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 -#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 -#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 -#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 -#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 -#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 -#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 +#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239 +#: gui/saveload-dialog.cpp:920 engines/engine.cpp:366 engines/engine.cpp:377 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192 +#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558 +#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 +#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519 +#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550 +#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:867 +#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419 +#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449 +#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "Aceptar" @@ -173,8 +184,8 @@ msgstr "" "Idioma del juego. No sirve para pasar al inglés la versión española de un " "juego" -#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:80 -#: gui/options.cpp:730 gui/options.cpp:743 gui/options.cpp:1199 +#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86 +#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209 #: audio/null.cpp:40 msgid "<default>" msgstr "<por defecto>" @@ -196,11 +207,11 @@ msgstr "Plat.:" msgid "Engine" msgstr "Motor" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "Graphics" msgstr "Gráficos" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "GFX" msgstr "GFX" @@ -213,7 +224,7 @@ msgctxt "lowres" msgid "Override global graphic settings" msgstr "Opciones gráficas específicas" -#: gui/launcher.cpp:251 gui/options.cpp:1085 +#: gui/launcher.cpp:251 gui/options.cpp:1095 msgid "Audio" msgstr "Sonido" @@ -226,11 +237,11 @@ msgctxt "lowres" msgid "Override global audio settings" msgstr "Opciones de sonido específicas" -#: gui/launcher.cpp:265 gui/options.cpp:1090 +#: gui/launcher.cpp:265 gui/options.cpp:1100 msgid "Volume" msgstr "Volumen" -#: gui/launcher.cpp:267 gui/options.cpp:1092 +#: gui/launcher.cpp:267 gui/options.cpp:1102 msgctxt "lowres" msgid "Volume" msgstr "Volumen" @@ -244,7 +255,7 @@ msgctxt "lowres" msgid "Override global volume settings" msgstr "Opciones de volumen específicas" -#: gui/launcher.cpp:280 gui/options.cpp:1100 +#: gui/launcher.cpp:280 gui/options.cpp:1110 msgid "MIDI" msgstr "MIDI" @@ -257,7 +268,7 @@ msgctxt "lowres" msgid "Override global MIDI settings" msgstr "Opciones de MIDI específicas" -#: gui/launcher.cpp:294 gui/options.cpp:1106 +#: gui/launcher.cpp:294 gui/options.cpp:1116 msgid "MT-32" msgstr "MT-32" @@ -270,11 +281,11 @@ msgctxt "lowres" msgid "Override global MT-32 settings" msgstr "Opciones de MT-32 específicas" -#: gui/launcher.cpp:308 gui/options.cpp:1113 +#: gui/launcher.cpp:308 gui/options.cpp:1123 msgid "Paths" msgstr "Rutas" -#: gui/launcher.cpp:310 gui/options.cpp:1115 +#: gui/launcher.cpp:310 gui/options.cpp:1125 msgctxt "lowres" msgid "Paths" msgstr "Rutas" @@ -288,7 +299,7 @@ msgctxt "lowres" msgid "Game Path:" msgstr "Juego:" -#: gui/launcher.cpp:324 gui/options.cpp:1139 +#: gui/launcher.cpp:324 gui/options.cpp:1149 msgid "Extra Path:" msgstr "Adicional:" @@ -296,42 +307,42 @@ msgstr "Adicional:" msgid "Specifies path to additional data used the game" msgstr "Especifica un directorio para datos adicionales del juego" -#: gui/launcher.cpp:326 gui/options.cpp:1141 +#: gui/launcher.cpp:326 gui/options.cpp:1151 msgctxt "lowres" msgid "Extra Path:" msgstr "Adicional:" -#: gui/launcher.cpp:333 gui/options.cpp:1123 +#: gui/launcher.cpp:333 gui/options.cpp:1133 msgid "Save Path:" msgstr "Partidas:" #: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 -#: gui/options.cpp:1123 gui/options.cpp:1125 gui/options.cpp:1126 +#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136 msgid "Specifies where your savegames are put" msgstr "Especifica dónde guardar tus partidas" -#: gui/launcher.cpp:335 gui/options.cpp:1125 +#: gui/launcher.cpp:335 gui/options.cpp:1135 msgctxt "lowres" msgid "Save Path:" msgstr "Partidas:" #: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 -#: gui/launcher.cpp:565 gui/options.cpp:1134 gui/options.cpp:1142 -#: gui/options.cpp:1151 gui/options.cpp:1258 gui/options.cpp:1264 -#: gui/options.cpp:1272 gui/options.cpp:1302 gui/options.cpp:1308 -#: gui/options.cpp:1315 gui/options.cpp:1408 gui/options.cpp:1411 -#: gui/options.cpp:1423 +#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152 +#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282 +#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326 +#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429 +#: gui/options.cpp:1441 msgctxt "path" msgid "None" msgstr "Ninguna" #: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 -#: gui/options.cpp:1252 gui/options.cpp:1296 gui/options.cpp:1414 +#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Por defecto" -#: gui/launcher.cpp:504 gui/options.cpp:1417 +#: gui/launcher.cpp:504 gui/options.cpp:1435 msgid "Select SoundFont" msgstr "Selecciona un SoundFont" @@ -355,7 +366,7 @@ msgstr "Esta ID ya está siendo usada. Por favor, elige otra." msgid "~Q~uit" msgstr "~S~alir" -#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:96 +#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95 msgid "Quit ScummVM" msgstr "Salir de ScummVM" @@ -363,7 +374,7 @@ msgstr "Salir de ScummVM" msgid "A~b~out..." msgstr "Acerca ~d~e" -#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:70 +#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69 msgid "About ScummVM" msgstr "Acerca de ScummVM" @@ -440,12 +451,14 @@ msgstr "Buscar:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 +#: engines/pegasus/pegasus.cpp:345 msgid "Load game:" msgstr "Cargar juego:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:345 +#: backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Cargar" @@ -531,136 +544,136 @@ msgstr "Se ha buscado en %d directorios..." msgid "Discovered %d new games, ignored %d previously added games ..." msgstr "%d juegos nuevos encontrados. %d juegos ignorados (ya añadidos)..." -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "Never" msgstr "Nunca" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 5 mins" msgstr "cada 5 minutos" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 10 mins" msgstr "cada 10 minutos" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 15 mins" msgstr "cada 15 minutos" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 30 mins" msgstr "cada 30 minutos" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "8 kHz" msgstr "8 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "11kHz" msgstr "11kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "22 kHz" msgstr "22 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "44 kHz" msgstr "44 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:248 gui/options.cpp:474 gui/options.cpp:575 -#: gui/options.cpp:644 gui/options.cpp:852 +#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581 +#: gui/options.cpp:650 gui/options.cpp:858 msgctxt "soundfont" msgid "None" msgstr "Ninguno" -#: gui/options.cpp:382 +#: gui/options.cpp:388 msgid "Failed to apply some of the graphic options changes:" msgstr "Fallo al aplicar algunos cambios en las opciones gráficas:" -#: gui/options.cpp:394 +#: gui/options.cpp:400 msgid "the video mode could not be changed." msgstr "no se ha podido cambiar el modo de vídeo." -#: gui/options.cpp:400 +#: gui/options.cpp:406 msgid "the fullscreen setting could not be changed" msgstr "no se ha podido cambiar el ajuste de pantalla completa" -#: gui/options.cpp:406 +#: gui/options.cpp:412 msgid "the aspect ratio setting could not be changed" msgstr "no se ha podido cambiar el ajuste de corrección de aspecto" -#: gui/options.cpp:727 +#: gui/options.cpp:733 msgid "Graphics mode:" msgstr "Modo gráfico:" -#: gui/options.cpp:741 +#: gui/options.cpp:747 msgid "Render mode:" msgstr "Renderizado:" -#: gui/options.cpp:741 gui/options.cpp:742 +#: gui/options.cpp:747 gui/options.cpp:748 msgid "Special dithering modes supported by some games" msgstr "Modos especiales de expansión compatibles con algunos juegos" -#: gui/options.cpp:753 +#: gui/options.cpp:759 #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476 msgid "Fullscreen mode" msgstr "Pantalla completa" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Aspect ratio correction" msgstr "Corrección de aspecto" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Correct aspect ratio for 320x200 games" msgstr "Corregir relación de aspecto en juegos 320x200" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Preferred Device:" msgstr "Disp. preferido:" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Music Device:" msgstr "Disp. de música:" -#: gui/options.cpp:764 gui/options.cpp:766 +#: gui/options.cpp:770 gui/options.cpp:772 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:764 gui/options.cpp:766 gui/options.cpp:767 +#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773 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:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Preferred Dev.:" msgstr "Disp. preferido:" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Music Device:" msgstr "Disp. de música:" -#: gui/options.cpp:793 +#: gui/options.cpp:799 msgid "AdLib emulator:" msgstr "Emul. de AdLib:" -#: gui/options.cpp:793 gui/options.cpp:794 +#: gui/options.cpp:799 gui/options.cpp:800 msgid "AdLib is used for music in many games" msgstr "AdLib se usa para la música en muchos juegos" -#: gui/options.cpp:804 +#: gui/options.cpp:810 msgid "Output rate:" msgstr "Frec. de salida:" -#: gui/options.cpp:804 gui/options.cpp:805 +#: gui/options.cpp:810 gui/options.cpp:811 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -668,64 +681,68 @@ msgstr "" "Los valores más altos ofrecen mayor calidad, pero puede que tu tarjeta de " "sonido no sea compatible" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "GM Device:" msgstr "Dispositivo GM:" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "Specifies default sound device for General MIDI output" msgstr "Especifica el dispositivo de salida General MIDI por defecto" -#: gui/options.cpp:826 +#: gui/options.cpp:832 msgid "Don't use General MIDI music" msgstr "No usar música General MIDI" -#: gui/options.cpp:837 gui/options.cpp:899 +#: gui/options.cpp:843 gui/options.cpp:909 msgid "Use first available device" msgstr "Utilizar el primer dispositivo disponible" -#: gui/options.cpp:849 +#: gui/options.cpp:855 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 +#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "SoundFont es compatible con algunas tarjetas de sonido, con Fluidsynth y con " "Timidity" -#: gui/options.cpp:851 +#: gui/options.cpp:857 msgctxt "lowres" msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Mixed AdLib/MIDI mode" msgstr "Modo AdLib/MIDI" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Use both MIDI and AdLib sound generation" msgstr "Usar tanto MIDI como AdLib en la generación de sonido" -#: gui/options.cpp:860 +#: gui/options.cpp:866 msgid "MIDI gain:" msgstr "Ganancia MIDI:" -#: gui/options.cpp:870 +#: gui/options.cpp:873 +msgid "FluidSynth Settings" +msgstr "" + +#: gui/options.cpp:880 msgid "MT-32 Device:" msgstr "Disp. MT-32:" -#: gui/options.cpp:870 +#: gui/options.cpp:880 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:875 +#: gui/options.cpp:885 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Roland MT-32 auténtica (desactivar emulación GM)" -#: gui/options.cpp:875 gui/options.cpp:877 +#: gui/options.cpp:885 gui/options.cpp:887 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -733,191 +750,192 @@ msgstr "" "Marcar si se quiere usar un dispositivo de sonido real conectado al " "ordenador y compatible con Roland" -#: gui/options.cpp:877 +#: gui/options.cpp:887 msgctxt "lowres" msgid "True Roland MT-32 (no GM emulation)" msgstr "Roland MT-32 real (sin emulación GM)" -#: gui/options.cpp:880 -msgid "Enable Roland GS Mode" -msgstr "Activar modo Roland GS" +#: gui/options.cpp:890 +#, fuzzy +msgid "Roland GS Mode (disable GM mapping)" +msgstr "Roland MT-32 auténtica (desactivar emulación GM)" -#: gui/options.cpp:880 +#: gui/options.cpp:890 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:889 +#: gui/options.cpp:899 msgid "Don't use Roland MT-32 music" msgstr "No usar música Roland MT-32" -#: gui/options.cpp:916 +#: gui/options.cpp:926 msgid "Text and Speech:" msgstr "Texto y voces:" -#: gui/options.cpp:920 gui/options.cpp:930 +#: gui/options.cpp:930 gui/options.cpp:940 msgid "Speech" msgstr "Voces" -#: gui/options.cpp:921 gui/options.cpp:931 +#: gui/options.cpp:931 gui/options.cpp:941 msgid "Subtitles" msgstr "Subtítulos" -#: gui/options.cpp:922 +#: gui/options.cpp:932 msgid "Both" msgstr "Ambos" -#: gui/options.cpp:924 +#: gui/options.cpp:934 msgid "Subtitle speed:" msgstr "Vel. de subtítulos:" -#: gui/options.cpp:926 +#: gui/options.cpp:936 msgctxt "lowres" msgid "Text and Speech:" msgstr "Texto y voces:" -#: gui/options.cpp:930 +#: gui/options.cpp:940 msgid "Spch" msgstr "Voz" -#: gui/options.cpp:931 +#: gui/options.cpp:941 msgid "Subs" msgstr "Subt" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgctxt "lowres" msgid "Both" msgstr "V&S" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgid "Show subtitles and play speech" msgstr "Reproducir voces y subtítulos" -#: gui/options.cpp:934 +#: gui/options.cpp:944 msgctxt "lowres" msgid "Subtitle speed:" msgstr "Vel. de subt.:" -#: gui/options.cpp:950 +#: gui/options.cpp:960 msgid "Music volume:" msgstr "Música:" -#: gui/options.cpp:952 +#: gui/options.cpp:962 msgctxt "lowres" msgid "Music volume:" msgstr "Música:" -#: gui/options.cpp:959 +#: gui/options.cpp:969 msgid "Mute All" msgstr "Silenciar" -#: gui/options.cpp:962 +#: gui/options.cpp:972 msgid "SFX volume:" msgstr "Efectos:" -#: gui/options.cpp:962 gui/options.cpp:964 gui/options.cpp:965 +#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975 msgid "Special sound effects volume" msgstr "Volumen de los efectos de sonido" -#: gui/options.cpp:964 +#: gui/options.cpp:974 msgctxt "lowres" msgid "SFX volume:" msgstr "Efectos:" -#: gui/options.cpp:972 +#: gui/options.cpp:982 msgid "Speech volume:" msgstr "Voces:" -#: gui/options.cpp:974 +#: gui/options.cpp:984 msgctxt "lowres" msgid "Speech volume:" msgstr "Voces:" -#: gui/options.cpp:1131 +#: gui/options.cpp:1141 msgid "Theme Path:" msgstr "Temas:" -#: gui/options.cpp:1133 +#: gui/options.cpp:1143 msgctxt "lowres" msgid "Theme Path:" msgstr "Temas:" -#: gui/options.cpp:1139 gui/options.cpp:1141 gui/options.cpp:1142 +#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152 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:1148 +#: gui/options.cpp:1158 msgid "Plugins Path:" msgstr "Plugins:" -#: gui/options.cpp:1150 +#: gui/options.cpp:1160 msgctxt "lowres" msgid "Plugins Path:" msgstr "Plugins:" -#: gui/options.cpp:1159 +#: gui/options.cpp:1169 msgid "Misc" msgstr "Otras" -#: gui/options.cpp:1161 +#: gui/options.cpp:1171 msgctxt "lowres" msgid "Misc" msgstr "Otras" -#: gui/options.cpp:1163 +#: gui/options.cpp:1173 msgid "Theme:" msgstr "Tema:" -#: gui/options.cpp:1167 +#: gui/options.cpp:1177 msgid "GUI Renderer:" msgstr "Interfaz:" -#: gui/options.cpp:1179 +#: gui/options.cpp:1189 msgid "Autosave:" msgstr "Autoguardado:" -#: gui/options.cpp:1181 +#: gui/options.cpp:1191 msgctxt "lowres" msgid "Autosave:" msgstr "Autoguardado:" -#: gui/options.cpp:1189 +#: gui/options.cpp:1199 msgid "Keys" msgstr "Teclas" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "GUI Language:" msgstr "Idioma:" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "Language of ScummVM GUI" msgstr "Idioma de la interfaz de ScummVM" -#: gui/options.cpp:1347 +#: gui/options.cpp:1365 msgid "You have to restart ScummVM before your changes will take effect." msgstr "Tienes que reiniciar ScummVM para aplicar los cambios." -#: gui/options.cpp:1360 +#: gui/options.cpp:1378 msgid "Select directory for savegames" msgstr "Selecciona el directorio de guardado" -#: gui/options.cpp:1367 +#: gui/options.cpp:1385 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:1376 +#: gui/options.cpp:1394 msgid "Select directory for GUI themes" msgstr "Selecciona el directorio de temas" -#: gui/options.cpp:1386 +#: gui/options.cpp:1404 msgid "Select directory for extra files" msgstr "Selecciona el directorio adicional" -#: gui/options.cpp:1397 +#: gui/options.cpp:1415 msgid "Select directory for plugins" msgstr "Selecciona el directorio de plugins" -#: gui/options.cpp:1450 +#: gui/options.cpp:1468 msgid "" "The theme you selected does not support your current language. If you want " "to use this theme you need to switch to another language first." @@ -925,74 +943,74 @@ msgstr "" "El tema seleccionado no es compatible con el idioma actual. Si quieres usar " "este tema debes cambiar a otro idioma primero." -#: gui/saveload-dialog.cpp:158 +#: gui/saveload-dialog.cpp:166 msgid "List view" msgstr "" -#: gui/saveload-dialog.cpp:159 +#: gui/saveload-dialog.cpp:167 msgid "Grid view" msgstr "" -#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 +#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358 msgid "No date saved" msgstr "No hay fecha guardada" -#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359 msgid "No time saved" msgstr "No hay hora guardada" -#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 +#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360 msgid "No playtime saved" msgstr "No hay tiempo guardado" -#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275 msgid "Delete" msgstr "Borrar" -#: gui/saveload-dialog.cpp:266 +#: gui/saveload-dialog.cpp:274 msgid "Do you really want to delete this savegame?" msgstr "¿Seguro que quieres borrar esta partida?" -#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 +#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872 msgid "Date: " msgstr "Fecha: " -#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 +#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878 msgid "Time: " msgstr "Hora: " -#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 +#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886 msgid "Playtime: " msgstr "Tiempo: " -#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 +#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494 msgid "Untitled savestate" msgstr "Partida sin nombre" -#: gui/saveload-dialog.cpp:517 +#: gui/saveload-dialog.cpp:546 msgid "Next" msgstr "" -#: gui/saveload-dialog.cpp:520 +#: gui/saveload-dialog.cpp:549 msgid "Prev" msgstr "" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 #, fuzzy msgid "New Save" msgstr "Guardar" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 #, fuzzy msgid "Create a new save game" msgstr "Fallo al guardar la partida" -#: gui/saveload-dialog.cpp:789 +#: gui/saveload-dialog.cpp:865 #, fuzzy msgid "Name: " msgstr "Nombre:" -#: gui/saveload-dialog.cpp:861 +#: gui/saveload-dialog.cpp:937 #, c-format msgid "Enter a description for slot %d:" msgstr "" @@ -1030,35 +1048,35 @@ msgstr "Suavizado (16bpp)" msgid "Clear value" msgstr "Eliminar valor" -#: base/main.cpp:209 +#: base/main.cpp:210 #, c-format msgid "Engine does not support debug level '%s'" msgstr "El motor no es compatible con el nivel de debug '%s'" -#: base/main.cpp:287 +#: base/main.cpp:288 msgid "Menu" msgstr "Menú" -#: base/main.cpp:290 backends/platform/symbian/src/SymbianActions.cpp:45 +#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:45 #: backends/platform/wince/CEActionsSmartphone.cpp:46 msgid "Skip" msgstr "Saltar" -#: base/main.cpp:293 backends/platform/symbian/src/SymbianActions.cpp:50 +#: base/main.cpp:294 backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:42 msgid "Pause" msgstr "Pausar" -#: base/main.cpp:296 +#: base/main.cpp:297 msgid "Skip line" msgstr "Saltar frase" -#: base/main.cpp:467 +#: base/main.cpp:468 msgid "Error running game:" msgstr "Error al ejecutar el juego:" -#: base/main.cpp:491 +#: base/main.cpp:492 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" @@ -1173,13 +1191,16 @@ msgid "~R~eturn to Launcher" msgstr "~V~olver al lanzador" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284 +#: engines/pegasus/pegasus.cpp:369 msgid "Save game:" msgstr "Guardar partida" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:369 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1209,12 +1230,12 @@ msgstr "" "obtener más ayuda." #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 -#: engines/mohawk/dialogs.cpp:174 +#: engines/mohawk/dialogs.cpp:170 msgid "~O~K" msgstr "~S~í" #: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 -#: engines/mohawk/dialogs.cpp:175 +#: engines/mohawk/dialogs.cpp:171 msgid "~C~ancel" msgstr "~C~ancelar" @@ -1222,23 +1243,23 @@ msgstr "~C~ancelar" msgid "~K~eys" msgstr "~T~eclas" -#: engines/engine.cpp:235 +#: engines/engine.cpp:240 msgid "Could not initialize color format." msgstr "No se ha podido iniciar el formato de color." -#: engines/engine.cpp:243 +#: engines/engine.cpp:248 msgid "Could not switch to video mode: '" msgstr "No se ha podido cambiar al modo de video: '" -#: engines/engine.cpp:252 +#: engines/engine.cpp:257 msgid "Could not apply aspect ratio setting." msgstr "No se ha podido aplicar el ajuste de corrección de aspecto" -#: engines/engine.cpp:257 +#: engines/engine.cpp:262 msgid "Could not apply fullscreen setting." msgstr "No se ha podido aplicar el ajuste de pantalla completa." -#: engines/engine.cpp:357 +#: engines/engine.cpp:362 msgid "" "You appear to be playing this game directly\n" "from the CD. This is known to cause problems,\n" @@ -1252,7 +1273,7 @@ msgstr "" "copiar los archivos del juego al disco duro.\n" "Consulta el archivo README para más detalles." -#: engines/engine.cpp:368 +#: engines/engine.cpp:373 msgid "" "This game has audio tracks in its disk. These\n" "tracks need to be ripped from the disk using\n" @@ -1266,7 +1287,7 @@ msgstr "" "poder escuchar la música del juego.\n" "Consulta el archivo README para más detalles." -#: engines/engine.cpp:426 +#: engines/engine.cpp:431 #, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " @@ -1276,7 +1297,7 @@ msgstr "" "README para encontrar información básica e instrucciones sobre cómo obtener " "más ayuda." -#: engines/engine.cpp:439 +#: engines/engine.cpp:444 msgid "" "WARNING: The game you are about to start is not yet fully supported by " "ScummVM. As such, it is likely to be unstable, and any saves you make might " @@ -1286,29 +1307,52 @@ msgstr "" "ScummVM. Por lo tanto, puede que sea inestable, y que las partidas que " "guardes no funcionen en versiones futuras de ScummVM." -#: engines/engine.cpp:442 +#: engines/engine.cpp:447 msgid "Start anyway" msgstr "Jugar aun así" -#: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 -#: engines/sci/detection.cpp:390 +#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270 +#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393 +#: engines/toltecs/detection.cpp:173 msgid "Use original save/load screens" msgstr "Usar pantallas de guardar/cargar originales" -#: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 -#: engines/sci/detection.cpp:391 +#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271 +#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394 +#: engines/toltecs/detection.cpp:174 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" "Utilizar las pantallas de guardar/cargar originales, en vez de las de ScummVM" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore game:" msgstr "Cargar partida:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore" msgstr "Cargar" +#: engines/drascula/saveload.cpp:49 +#, fuzzy +msgid "" +"ScummVM found that you have old savefiles for Drascula that should be " +"converted.\n" +"The old save game format is no longer supported, so you will not be able to " +"load your games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" +msgstr "" +"ScummVM ha detectado que tienes partidas guardadas antiguas de Broken Sword " +"1, que deben ser actualizadas.\n" +"El formato antiguo ya no es compatible, así que no podrás cargar tus " +"partidos si no las actualizas.\n" +"\n" +"Pulsa Aceptar para actualizarlas, si no lo haces este mensaje volverá a " +"aparecer la próxima vez.\n" + #: engines/dreamweb/detection.cpp:57 msgid "Use bright palette mode" msgstr "Usar paleta original" @@ -1317,27 +1361,27 @@ msgstr "Usar paleta original" msgid "Display graphics using the game's bright palette" msgstr "Utilizar los niveles de brillo originales del juego" -#: engines/sci/detection.cpp:370 +#: engines/sci/detection.cpp:373 msgid "EGA undithering" msgstr "Difuminado EGA" -#: engines/sci/detection.cpp:371 +#: engines/sci/detection.cpp:374 msgid "Enable undithering in EGA games" msgstr "Activar difuminado en los juegos EGA" -#: engines/sci/detection.cpp:380 +#: engines/sci/detection.cpp:383 msgid "Prefer digital sound effects" msgstr "Preferir efectos de sonido digitales" -#: engines/sci/detection.cpp:381 +#: engines/sci/detection.cpp:384 msgid "Prefer digital sound effects instead of synthesized ones" msgstr "Preferir efectos de sonido digitales en vez de los sintetizados" -#: engines/sci/detection.cpp:400 +#: engines/sci/detection.cpp:403 msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "Usar IMF/Yamaha FB-01 para la salida MIDI" -#: engines/sci/detection.cpp:401 +#: engines/sci/detection.cpp:404 msgid "" "Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" @@ -1345,29 +1389,29 @@ msgstr "" "Usa una tarjeta IBM Music o un módulo sintetizador Yamaha FB-01 FM para la " "salida MIDI" -#: engines/sci/detection.cpp:411 +#: engines/sci/detection.cpp:414 msgid "Use CD audio" msgstr "Usar CD audio" -#: engines/sci/detection.cpp:412 +#: engines/sci/detection.cpp:415 msgid "Use CD audio instead of in-game audio, if available" msgstr "Usa CD audio en vez del sonido interno del juego, si está disponible" -#: engines/sci/detection.cpp:422 +#: engines/sci/detection.cpp:425 msgid "Use Windows cursors" msgstr "Usar cursores de Windows" -#: engines/sci/detection.cpp:423 +#: engines/sci/detection.cpp:426 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "" "Usar los cursores de Windows (más pequeños y monocromos) en vez de los de DOS" -#: engines/sci/detection.cpp:433 +#: engines/sci/detection.cpp:436 msgid "Use silver cursors" msgstr "Usar cursores plateados" -#: engines/sci/detection.cpp:434 +#: engines/sci/detection.cpp:437 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "" @@ -2020,7 +2064,7 @@ msgstr "Volar a la derecha" msgid "Fly to lower right" msgstr "Volar abajo y a la derecha" -#: engines/scumm/scumm.cpp:1773 +#: engines/scumm/scumm.cpp:1776 #, c-format msgid "" "Native MIDI support requires the Roland Upgrade from LucasArts,\n" @@ -2029,7 +2073,7 @@ msgstr "" "El soporte MIDI nativo requiere la actualización Roland de LucasArts,\n" "pero %s no está disponible. Se usará AdLib." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 +#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2040,7 +2084,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 +#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2051,7 +2095,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 +#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2062,7 +2106,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2512 +#: engines/scumm/scumm.cpp:2537 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2073,7 +2117,7 @@ msgstr "" "selecciona el directorio 'Maniac', dentro del directorio de DOTT." #. I18N: Option for fast scene switching -#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171 +#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167 msgid "~Z~ip Mode Activated" msgstr "Modo ~Z~ip activado" @@ -2094,11 +2138,11 @@ msgstr "~M~ostrar el mapa" msgid "~M~ain Menu" msgstr "~M~enú principal" -#: engines/mohawk/dialogs.cpp:172 +#: engines/mohawk/dialogs.cpp:168 msgid "~W~ater Effect Enabled" msgstr "Efecto ag~u~a activado" -#: engines/agos/animation.cpp:560 +#: engines/agos/animation.cpp:557 #, c-format msgid "Cutscene file '%s' not found!" msgstr "No se ha encontrado el vídeo '%s'" @@ -2116,6 +2160,15 @@ msgstr "Fallo al guardar el estado del juego en el archivo." msgid "Failed to delete file." msgstr "Fallo al borrar el archivo." +#: engines/groovie/detection.cpp:312 +#, fuzzy +msgid "Fast movie speed" +msgstr "Modo rápido" + +#: engines/groovie/detection.cpp:313 +msgid "Play movies at an increased speed" +msgstr "" + #: engines/groovie/script.cpp:420 msgid "Failed to save game" msgstr "Fallo al guardar la partida" @@ -2206,11 +2259,11 @@ msgstr "Deslizarse a la izquierda" msgid "Slide Right" msgstr "Deslizarse a la derecha" -#: engines/kyra/lol.cpp:485 +#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2412 msgid "Turn Left" msgstr "Girar a la izquierda" -#: engines/kyra/lol.cpp:486 +#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2413 msgid "Turn Right" msgstr "Girar a la derecha" @@ -2226,7 +2279,7 @@ msgstr "Opciones" msgid "Choose Spell" msgstr "Elegir hechizo" -#: engines/kyra/sound_midi.cpp:475 +#: engines/kyra/sound_midi.cpp:477 msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2275,26 +2328,26 @@ msgid "Use the floppy version's intro (CD version only)" msgstr "" "Usa la introducción de la versión en disquete (solo para la versión CD)" -#: engines/sword1/animation.cpp:539 +#: engines/sword1/animation.cpp:519 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "El vídeo de PSX '%s' no se puede reproducir en modo paleta" -#: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 +#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439 msgid "DXA cutscenes found but ScummVM has been built without zlib support" msgstr "" "Se han encontrado vídeos DXA, pero se ha compilado ScummVM sin soporte zlib" -#: engines/sword1/animation.cpp:570 engines/sword2/animation.cpp:465 +#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449 msgid "MPEG2 cutscenes are no longer supported" msgstr "Los vídeos MPEG2 ya no son compatibles" -#: engines/sword1/animation.cpp:576 engines/sword2/animation.cpp:473 +#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457 #, c-format msgid "Cutscene '%s' not found" msgstr "No se ha encontrado el vídeo '%s'" -#: engines/sword1/control.cpp:863 +#: engines/sword1/control.cpp:865 msgid "" "ScummVM found that you have old savefiles for Broken Sword 1 that should be " "converted.\n" @@ -2312,7 +2365,7 @@ msgstr "" "Pulsa Aceptar para actualizarlas, si no lo haces este mensaje volverá a " "aparecer la próxima vez.\n" -#: engines/sword1/control.cpp:1232 +#: engines/sword1/control.cpp:1234 #, c-format msgid "" "Target new save game already exists!\n" @@ -2321,11 +2374,11 @@ msgstr "" "¡La partida guardada ya existe!\n" "¿Quieres conservar la partida guardada antigua (%s) o la nueva (%s)?\n" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the old one" msgstr "Conservar la antigua" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the new one" msgstr "Conservar la nueva" @@ -2333,7 +2386,7 @@ msgstr "Conservar la nueva" msgid "This is the end of the Broken Sword 1 Demo" msgstr "Este es el final de la demo de Broken Sword 1" -#: engines/sword2/animation.cpp:435 +#: engines/sword2/animation.cpp:419 msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" @@ -2348,12 +2401,12 @@ msgstr "Mostrar etiquetas de objetos" msgid "Show labels for objects on mouse hover" msgstr "Muestra las etiquetas de los objetos al pasar el ratón" -#: engines/teenagent/resources.cpp:68 +#: engines/teenagent/resources.cpp:94 msgid "" "You're missing the 'teenagent.dat' file. Get it from the ScummVM website" msgstr "" -#: engines/teenagent/resources.cpp:89 +#: engines/teenagent/resources.cpp:115 msgid "" "The teenagent.dat file is compressed and zlib hasn't been included in this " "executable. Please decompress it" @@ -2409,6 +2462,47 @@ msgstr "" "\n" "Por favor, contacta con el equipo." +#: engines/pegasus/pegasus.cpp:675 +msgid "Invalid save file name" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2410 +msgid "Up/Zoom In/Move Forward/Open Doors" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2411 +#, fuzzy +msgid "Down/Zoom Out" +msgstr "Aumentar zoom" + +#: engines/pegasus/pegasus.cpp:2414 +msgid "Display/Hide Inventory Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2415 +msgid "Display/Hide Biochip Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2416 +msgid "Action/Select" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2417 +msgid "Toggle Center Data Display" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2418 +msgid "Display/Hide Info Screen" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2419 +msgid "Display/Hide Pause Menu" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2420 +msgid "???" +msgstr "" + #: audio/fmopl.cpp:49 msgid "MAME OPL emulator" msgstr "Emulador OPL de MAME" @@ -2466,7 +2560,7 @@ msgstr "Sin música" msgid "Amiga Audio Emulator" msgstr "Emulador de Amiga Audio" -#: audio/softsynth/adlib.cpp:1593 +#: audio/softsynth/adlib.cpp:2284 msgid "AdLib Emulator" msgstr "Emulador de AdLib" @@ -2478,11 +2572,11 @@ msgstr "Emulador de Apple II GS (NO IMPLEMENTADO)" msgid "C64 Audio Emulator" msgstr "Emulador de C64 Audio" -#: audio/softsynth/mt32.cpp:293 +#: audio/softsynth/mt32.cpp:205 msgid "Initializing MT-32 Emulator" msgstr "Iniciando el emulador de MT-32" -#: audio/softsynth/mt32.cpp:512 +#: audio/softsynth/mt32.cpp:431 msgid "MT-32 Emulator" msgstr "Emulador de MT-32" @@ -2633,24 +2727,24 @@ msgstr "Clic central" msgid "Right Click" msgstr "Clic derecho" -#: backends/platform/sdl/macosx/appmenu_osx.mm:78 +#: backends/platform/sdl/macosx/appmenu_osx.mm:77 msgid "Hide ScummVM" msgstr "Ocultar ScummVM" -#: backends/platform/sdl/macosx/appmenu_osx.mm:83 +#: backends/platform/sdl/macosx/appmenu_osx.mm:82 msgid "Hide Others" msgstr "Ocultar otros" -#: backends/platform/sdl/macosx/appmenu_osx.mm:88 +#: backends/platform/sdl/macosx/appmenu_osx.mm:87 msgid "Show All" msgstr "Mostrar todo" -#: backends/platform/sdl/macosx/appmenu_osx.mm:110 -#: backends/platform/sdl/macosx/appmenu_osx.mm:121 +#: backends/platform/sdl/macosx/appmenu_osx.mm:109 +#: backends/platform/sdl/macosx/appmenu_osx.mm:120 msgid "Window" msgstr "Ventana" -#: backends/platform/sdl/macosx/appmenu_osx.mm:115 +#: backends/platform/sdl/macosx/appmenu_osx.mm:114 msgid "Minimize" msgstr "Minimizar" @@ -2664,12 +2758,12 @@ msgid "Normal (no scaling)" msgstr "Normal" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537 msgid "Enabled aspect ratio correction" msgstr "Activar la corrección de aspecto" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542 msgid "Disabled aspect ratio correction" msgstr "Desactivar la corrección de aspecto" @@ -2678,7 +2772,7 @@ msgid "Active graphics filter:" msgstr "Filtro de gráficos activo:" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481 msgid "Windowed mode" msgstr "Modo ventana" @@ -2702,11 +2796,11 @@ msgstr "Modo de vídeo actual" msgid "Current scale" msgstr "Escala actual" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:558 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562 msgid "Active filter mode: Linear" msgstr "Modo de filtro activo: lineal" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:560 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564 msgid "Active filter mode: Nearest" msgstr "Modo de filtro activo: el más cercano" @@ -3033,19 +3127,19 @@ msgstr "¿Realmente quieres salir?" #: backends/events/gph/gph-events.cpp:386 #: backends/events/gph/gph-events.cpp:429 -#: backends/events/openpandora/op-events.cpp:139 +#: backends/events/openpandora/op-events.cpp:168 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "'Modo toque' de pantalla táctil - Clic izquierdo" #: backends/events/gph/gph-events.cpp:388 #: backends/events/gph/gph-events.cpp:431 -#: backends/events/openpandora/op-events.cpp:141 +#: backends/events/openpandora/op-events.cpp:170 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "'Modo toque' de pantalla táctil - Clic derecho" #: backends/events/gph/gph-events.cpp:390 #: backends/events/gph/gph-events.cpp:433 -#: backends/events/openpandora/op-events.cpp:143 +#: backends/events/openpandora/op-events.cpp:172 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "'Modo toque' de pantalla táctil - Flotante (sin clic)" @@ -3065,7 +3159,12 @@ msgstr "Volumen mínimo" msgid "Decreasing Volume" msgstr "Bajando el volumen" -#: backends/updates/macosx/macosx-updates.mm:65 +#: backends/events/openpandora/op-events.cpp:174 +#, fuzzy +msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)" +msgstr "'Modo toque' de pantalla táctil - Flotante (sin clic)" + +#: backends/updates/macosx/macosx-updates.mm:67 msgid "Check for Updates..." msgstr "Buscar actualizaciones..." @@ -3101,6 +3200,9 @@ msgstr "Clic activado" msgid "Clicking Disabled" msgstr "Clic desactivado" +#~ msgid "Enable Roland GS Mode" +#~ msgstr "Activar modo Roland GS" + #~ msgid "Hercules Green" #~ msgstr "Hercules verde" @@ -1,5 +1,5 @@ # Basque translation for ScummVM. -# Copyright (C) 2011 ScummVM Team +# Copyright (C) 2012-2013 ScummVM Team # This file is distributed under the same license as the ScummVM package. # Mikel Iturbe Urretxa <mikel@hamahiru.org>, 2012. # @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.5.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-08-12 14:57+0200\n" +"POT-Creation-Date: 2013-02-07 23:11+0000\n" "PO-Revision-Date: 2011-12-15 14:53+0100\n" "Last-Translator: Mikel Iturbe Urretxa <mikel@hamahiru.org>\n" "Language-Team: Librezale <librezale@librezale.org>\n" @@ -16,45 +16,55 @@ msgstr "" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -#: gui/about.cpp:91 +#: gui/about.cpp:93 #, c-format msgid "(built on %s)" msgstr "(%s-(e)an konpilatua)" -#: gui/about.cpp:98 +#: gui/about.cpp:100 msgid "Features compiled in:" msgstr "Ezaugarri erantsiak:" -#: gui/about.cpp:107 +#: gui/about.cpp:109 msgid "Available engines:" msgstr "Motore erabilgarriak:" -#: gui/browser.cpp:66 +#: gui/browser.cpp:67 +#, fuzzy +msgid "Show hidden files" +msgstr "Kontsola erakutsi / ezkutatu" + +#: gui/browser.cpp:67 +msgid "Show files marked with the hidden attribute" +msgstr "" + +#: gui/browser.cpp:71 msgid "Go up" msgstr "Joan gora" -#: gui/browser.cpp:66 gui/browser.cpp:68 +#: gui/browser.cpp:71 gui/browser.cpp:73 msgid "Go to previous directory level" msgstr "Igo aurreko direktorio-mailara" -#: gui/browser.cpp:68 +#: gui/browser.cpp:73 msgctxt "lowres" msgid "Go up" msgstr "Joan gora" -#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 -#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 -#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 -#: gui/themebrowser.cpp:54 engines/engine.cpp:442 -#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 +#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238 +#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275 +#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919 +#: gui/themebrowser.cpp:54 engines/engine.cpp:447 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:190 +#: engines/sword1/control.cpp:867 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" msgstr "Utzi" -#: gui/browser.cpp:70 gui/chooser.cpp:46 gui/themebrowser.cpp:55 +#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55 msgid "Choose" msgstr "Aukeratu" @@ -69,15 +79,15 @@ msgstr "Itxi" msgid "Mouse click" msgstr "Sagu-klika" -#: gui/gui-manager.cpp:122 base/main.cpp:300 +#: gui/gui-manager.cpp:122 base/main.cpp:301 msgid "Display keyboard" msgstr "Teklatua erakutsi" -#: gui/gui-manager.cpp:126 base/main.cpp:304 +#: gui/gui-manager.cpp:126 base/main.cpp:305 msgid "Remap keys" msgstr "Teklak esleitu" -#: gui/gui-manager.cpp:129 base/main.cpp:307 +#: gui/gui-manager.cpp:129 base/main.cpp:308 msgid "Toggle FullScreen" msgstr "Txandakatu pantaila osoa" @@ -90,17 +100,18 @@ msgid "Map" msgstr "Esleitu" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 -#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 -#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 -#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 -#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 -#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 -#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 -#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 -#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 -#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 +#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239 +#: gui/saveload-dialog.cpp:920 engines/engine.cpp:366 engines/engine.cpp:377 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192 +#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558 +#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 +#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519 +#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550 +#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:867 +#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419 +#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449 +#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "Ados" @@ -172,8 +183,8 @@ msgid "" msgstr "" "Jokoaren hizkuntza. Honek ez du zure ingelesezko bertsioa frantsesera pasako" -#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:80 -#: gui/options.cpp:730 gui/options.cpp:743 gui/options.cpp:1199 +#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86 +#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209 #: audio/null.cpp:40 msgid "<default>" msgstr "<lehenetsia>" @@ -196,11 +207,11 @@ msgstr "Plataforma:" msgid "Engine" msgstr "Aztertu" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "Graphics" msgstr "Grafikoak" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "GFX" msgstr "GFX" @@ -213,7 +224,7 @@ msgctxt "lowres" msgid "Override global graphic settings" msgstr "Ezarpen grafiko globalak baliogabetu" -#: gui/launcher.cpp:251 gui/options.cpp:1085 +#: gui/launcher.cpp:251 gui/options.cpp:1095 msgid "Audio" msgstr "Soinua" @@ -226,11 +237,11 @@ msgctxt "lowres" msgid "Override global audio settings" msgstr "Soinu ezarpen globalak baliogabetu" -#: gui/launcher.cpp:265 gui/options.cpp:1090 +#: gui/launcher.cpp:265 gui/options.cpp:1100 msgid "Volume" msgstr "Bolumena" -#: gui/launcher.cpp:267 gui/options.cpp:1092 +#: gui/launcher.cpp:267 gui/options.cpp:1102 msgctxt "lowres" msgid "Volume" msgstr "Bolumena" @@ -244,7 +255,7 @@ msgctxt "lowres" msgid "Override global volume settings" msgstr "Bolumen ezarpen globalak baliogabetu" -#: gui/launcher.cpp:280 gui/options.cpp:1100 +#: gui/launcher.cpp:280 gui/options.cpp:1110 msgid "MIDI" msgstr "MIDI" @@ -257,7 +268,7 @@ msgctxt "lowres" msgid "Override global MIDI settings" msgstr "MIDI ezarpen globalak baliogabetu" -#: gui/launcher.cpp:294 gui/options.cpp:1106 +#: gui/launcher.cpp:294 gui/options.cpp:1116 msgid "MT-32" msgstr "MT-32" @@ -270,11 +281,11 @@ msgctxt "lowres" msgid "Override global MT-32 settings" msgstr "MT-32 ezarpen globalak baliogabetu" -#: gui/launcher.cpp:308 gui/options.cpp:1113 +#: gui/launcher.cpp:308 gui/options.cpp:1123 msgid "Paths" msgstr "Bide-izenak" -#: gui/launcher.cpp:310 gui/options.cpp:1115 +#: gui/launcher.cpp:310 gui/options.cpp:1125 msgctxt "lowres" msgid "Paths" msgstr "Bideak" @@ -288,7 +299,7 @@ msgctxt "lowres" msgid "Game Path:" msgstr "Jokoa:" -#: gui/launcher.cpp:324 gui/options.cpp:1139 +#: gui/launcher.cpp:324 gui/options.cpp:1149 msgid "Extra Path:" msgstr "Gehigarriak:" @@ -296,42 +307,42 @@ msgstr "Gehigarriak:" msgid "Specifies path to additional data used the game" msgstr "Jokoak erabiltzen duen datu gehigarrien bide-izena" -#: gui/launcher.cpp:326 gui/options.cpp:1141 +#: gui/launcher.cpp:326 gui/options.cpp:1151 msgctxt "lowres" msgid "Extra Path:" msgstr "Gehigarria:" -#: gui/launcher.cpp:333 gui/options.cpp:1123 +#: gui/launcher.cpp:333 gui/options.cpp:1133 msgid "Save Path:" msgstr "Partida gordeak:" #: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 -#: gui/options.cpp:1123 gui/options.cpp:1125 gui/options.cpp:1126 +#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136 msgid "Specifies where your savegames are put" msgstr "Zure gordetako partidak non gordeko diren zehazten du" -#: gui/launcher.cpp:335 gui/options.cpp:1125 +#: gui/launcher.cpp:335 gui/options.cpp:1135 msgctxt "lowres" msgid "Save Path:" msgstr "Partida gordeak:" #: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 -#: gui/launcher.cpp:565 gui/options.cpp:1134 gui/options.cpp:1142 -#: gui/options.cpp:1151 gui/options.cpp:1258 gui/options.cpp:1264 -#: gui/options.cpp:1272 gui/options.cpp:1302 gui/options.cpp:1308 -#: gui/options.cpp:1315 gui/options.cpp:1408 gui/options.cpp:1411 -#: gui/options.cpp:1423 +#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152 +#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282 +#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326 +#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429 +#: gui/options.cpp:1441 msgctxt "path" msgid "None" msgstr "Bat ere ez" #: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 -#: gui/options.cpp:1252 gui/options.cpp:1296 gui/options.cpp:1414 +#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Lehenetsia" -#: gui/launcher.cpp:504 gui/options.cpp:1417 +#: gui/launcher.cpp:504 gui/options.cpp:1435 msgid "Select SoundFont" msgstr "SoundFont-a aukeratu" @@ -355,7 +366,7 @@ msgstr "ID hau jada erabilia izaten ari da. Mesedez, aukeratu beste bat." msgid "~Q~uit" msgstr "~I~rten" -#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:96 +#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95 msgid "Quit ScummVM" msgstr "Irten ScummVM-tik" @@ -363,7 +374,7 @@ msgstr "Irten ScummVM-tik" msgid "A~b~out..." msgstr "Ho~n~i buruz..." -#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:70 +#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69 msgid "About ScummVM" msgstr "ScummVM-i buruz" @@ -440,12 +451,14 @@ msgstr "Bilatu:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 +#: engines/pegasus/pegasus.cpp:345 msgid "Load game:" msgstr "Jokoa kargatu:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:345 +#: backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Kargatu" @@ -534,133 +547,133 @@ msgid "Discovered %d new games, ignored %d previously added games ..." msgstr "" "%d joko berri aurkitu dira, aurretik gehituriko %d ez dira kontuan hartu" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "Never" msgstr "Inoiz ez" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 5 mins" msgstr "5 minuturo" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 10 mins" msgstr "10 minuturo" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 15 mins" msgstr "15 minuturo" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 30 mins" msgstr "30 minuturo" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "8 kHz" msgstr "8 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "11kHz" msgstr "11kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "22 kHz" msgstr "22 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "44 kHz" msgstr "44 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:248 gui/options.cpp:474 gui/options.cpp:575 -#: gui/options.cpp:644 gui/options.cpp:852 +#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581 +#: gui/options.cpp:650 gui/options.cpp:858 msgctxt "soundfont" msgid "None" msgstr "Bat ere ez" -#: gui/options.cpp:382 +#: gui/options.cpp:388 msgid "Failed to apply some of the graphic options changes:" msgstr "Ezin izan da grafikoen aukeretako batzuk aplikatu:" -#: gui/options.cpp:394 +#: gui/options.cpp:400 msgid "the video mode could not be changed." msgstr "ezin izan da bideo-modua aldatu." -#: gui/options.cpp:400 +#: gui/options.cpp:406 msgid "the fullscreen setting could not be changed" msgstr "ezin izan da pantaila-osoaren ezarpena aldatu" -#: gui/options.cpp:406 +#: gui/options.cpp:412 msgid "the aspect ratio setting could not be changed" msgstr "formatu-ratioaren ezarpena ezin izan da aldatu" -#: gui/options.cpp:727 +#: gui/options.cpp:733 msgid "Graphics mode:" msgstr "Modu grafikoa:" -#: gui/options.cpp:741 +#: gui/options.cpp:747 msgid "Render mode:" msgstr "Renderizazioa:" -#: gui/options.cpp:741 gui/options.cpp:742 +#: gui/options.cpp:747 gui/options.cpp:748 msgid "Special dithering modes supported by some games" msgstr "Joko batzuk onarturiko lausotze-modu bereziak" -#: gui/options.cpp:753 +#: gui/options.cpp:759 #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476 msgid "Fullscreen mode" msgstr "Pantaila osoa" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Aspect ratio correction" msgstr "Formatu-ratioaren zuzenketa" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Correct aspect ratio for 320x200 games" msgstr "320x200 jokoentzako formatu-ratioa zuzendu" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Preferred Device:" msgstr "Gogoko gailua:" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Music Device:" msgstr "Musika gailua:" -#: gui/options.cpp:764 gui/options.cpp:766 +#: gui/options.cpp:770 gui/options.cpp:772 msgid "Specifies preferred sound device or sound card emulator" msgstr "Gogoko soinu txartel edo emuladorea zein den ezartzen du" -#: gui/options.cpp:764 gui/options.cpp:766 gui/options.cpp:767 +#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773 msgid "Specifies output sound device or sound card emulator" msgstr "Irteerako soinu txartel edo emuladorea ezartzen du" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Preferred Dev.:" msgstr "Gail. gogokoa:" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Music Device:" msgstr "Musika gailua:" -#: gui/options.cpp:793 +#: gui/options.cpp:799 msgid "AdLib emulator:" msgstr "AdLib emuladorea:" -#: gui/options.cpp:793 gui/options.cpp:794 +#: gui/options.cpp:799 gui/options.cpp:800 msgid "AdLib is used for music in many games" msgstr "AdLib musikarako hainbat jokotan erabiltzen da" -#: gui/options.cpp:804 +#: gui/options.cpp:810 msgid "Output rate:" msgstr "Irteera maizt.:" -#: gui/options.cpp:804 gui/options.cpp:805 +#: gui/options.cpp:810 gui/options.cpp:811 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -668,64 +681,68 @@ msgstr "" "Balio altuagoek soinu kalitate hobea ezartzen dute, baina baliteke zure " "soinu-txartela bateragarria ez izatea" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "GM Device:" msgstr "GM gailua:" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "Specifies default sound device for General MIDI output" msgstr "Defektuzko soinu txartela ezartzen du General MIDI irteerarako" -#: gui/options.cpp:826 +#: gui/options.cpp:832 msgid "Don't use General MIDI music" msgstr "Ez erabili General MIDI musika" -#: gui/options.cpp:837 gui/options.cpp:899 +#: gui/options.cpp:843 gui/options.cpp:909 msgid "Use first available device" msgstr "Erabilgarri dagoen lehen gailua erabili" -#: gui/options.cpp:849 +#: gui/options.cpp:855 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 +#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "Zenbait soinu txartel bateragarriak dira SoundFont-ekin, Fluidsynth eta " "Timidity besteak beste" -#: gui/options.cpp:851 +#: gui/options.cpp:857 msgctxt "lowres" msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Mixed AdLib/MIDI mode" msgstr "AdLib/MIDI modua" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Use both MIDI and AdLib sound generation" msgstr "Soinua sortzerakoan MIDI eta AdLib erabili" -#: gui/options.cpp:860 +#: gui/options.cpp:866 msgid "MIDI gain:" msgstr "MIDI irabazia:" -#: gui/options.cpp:870 +#: gui/options.cpp:873 +msgid "FluidSynth Settings" +msgstr "" + +#: gui/options.cpp:880 msgid "MT-32 Device:" msgstr "MT-32 gailua:" -#: gui/options.cpp:870 +#: gui/options.cpp:880 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" "Roland MT-32/LAPC1/CM32l/CM64 irteerarako defektuzko soinu txartela ezartzen " "du" -#: gui/options.cpp:875 +#: gui/options.cpp:885 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Benetako Roland MT-32 (GM emulazio gabe)" -#: gui/options.cpp:875 gui/options.cpp:877 +#: gui/options.cpp:885 gui/options.cpp:887 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -733,192 +750,193 @@ msgstr "" "Markatu ordenagailura konektaturiko Roland-ekin bateragarria den soinu-" "gailua erabiltzeko" -#: gui/options.cpp:877 +#: gui/options.cpp:887 msgctxt "lowres" msgid "True Roland MT-32 (no GM emulation)" msgstr "Benetako Roland MT-32 (GM emulazio gabe)" -#: gui/options.cpp:880 -msgid "Enable Roland GS Mode" -msgstr "Roland GS modua gaitu" +#: gui/options.cpp:890 +#, fuzzy +msgid "Roland GS Mode (disable GM mapping)" +msgstr "Benetako Roland MT-32 (GM emulazio gabe)" -#: gui/options.cpp:880 +#: gui/options.cpp:890 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "Roland MT-32 soinua duten jokoetan General MIDI bihurtzea desgaitzen du" -#: gui/options.cpp:889 +#: gui/options.cpp:899 msgid "Don't use Roland MT-32 music" msgstr "Ez erabili Roland MT-32 musika" -#: gui/options.cpp:916 +#: gui/options.cpp:926 msgid "Text and Speech:" msgstr "Testu eta ahotsa:" -#: gui/options.cpp:920 gui/options.cpp:930 +#: gui/options.cpp:930 gui/options.cpp:940 msgid "Speech" msgstr "Ahotsa" -#: gui/options.cpp:921 gui/options.cpp:931 +#: gui/options.cpp:931 gui/options.cpp:941 msgid "Subtitles" msgstr "Azpitituluak" -#: gui/options.cpp:922 +#: gui/options.cpp:932 msgid "Both" msgstr "Biak" -#: gui/options.cpp:924 +#: gui/options.cpp:934 msgid "Subtitle speed:" msgstr "Azpitit. abiadura:" -#: gui/options.cpp:926 +#: gui/options.cpp:936 msgctxt "lowres" msgid "Text and Speech:" msgstr "Testu eta ahotsa:" -#: gui/options.cpp:930 +#: gui/options.cpp:940 msgid "Spch" msgstr "Ahots." -#: gui/options.cpp:931 +#: gui/options.cpp:941 msgid "Subs" msgstr "Azp." -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgctxt "lowres" msgid "Both" msgstr "Biak" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgid "Show subtitles and play speech" msgstr "Ahotsak erreproduzitu eta azpitituluak erakutsi" -#: gui/options.cpp:934 +#: gui/options.cpp:944 msgctxt "lowres" msgid "Subtitle speed:" msgstr "Azpit. abiadura:" -#: gui/options.cpp:950 +#: gui/options.cpp:960 msgid "Music volume:" msgstr "Musika:" -#: gui/options.cpp:952 +#: gui/options.cpp:962 msgctxt "lowres" msgid "Music volume:" msgstr "Musika:" -#: gui/options.cpp:959 +#: gui/options.cpp:969 msgid "Mute All" msgstr "Mututu dena" -#: gui/options.cpp:962 +#: gui/options.cpp:972 msgid "SFX volume:" msgstr "Efektuak:" -#: gui/options.cpp:962 gui/options.cpp:964 gui/options.cpp:965 +#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975 msgid "Special sound effects volume" msgstr "Soinu efektu berezien bolumena" -#: gui/options.cpp:964 +#: gui/options.cpp:974 msgctxt "lowres" msgid "SFX volume:" msgstr "Efektuak:" -#: gui/options.cpp:972 +#: gui/options.cpp:982 msgid "Speech volume:" msgstr "Ahotsak:" -#: gui/options.cpp:974 +#: gui/options.cpp:984 msgctxt "lowres" msgid "Speech volume:" msgstr "Ahotsak:" -#: gui/options.cpp:1131 +#: gui/options.cpp:1141 msgid "Theme Path:" msgstr "Gaiak:" -#: gui/options.cpp:1133 +#: gui/options.cpp:1143 msgctxt "lowres" msgid "Theme Path:" msgstr "Gaiak:" -#: gui/options.cpp:1139 gui/options.cpp:1141 gui/options.cpp:1142 +#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "Joko guztiek edo ScummVM-k darabilten datu gehigarrien bide-izena ezartzen du" -#: gui/options.cpp:1148 +#: gui/options.cpp:1158 msgid "Plugins Path:" msgstr "Pluginak:" -#: gui/options.cpp:1150 +#: gui/options.cpp:1160 msgctxt "lowres" msgid "Plugins Path:" msgstr "Pluginak:" -#: gui/options.cpp:1159 +#: gui/options.cpp:1169 msgid "Misc" msgstr "Beste" -#: gui/options.cpp:1161 +#: gui/options.cpp:1171 msgctxt "lowres" msgid "Misc" msgstr "Beste" -#: gui/options.cpp:1163 +#: gui/options.cpp:1173 msgid "Theme:" msgstr "Gaia:" -#: gui/options.cpp:1167 +#: gui/options.cpp:1177 msgid "GUI Renderer:" msgstr "Interfazea:" -#: gui/options.cpp:1179 +#: gui/options.cpp:1189 msgid "Autosave:" msgstr "Autogordetzea:" -#: gui/options.cpp:1181 +#: gui/options.cpp:1191 msgctxt "lowres" msgid "Autosave:" msgstr "Autogordetzea:" -#: gui/options.cpp:1189 +#: gui/options.cpp:1199 msgid "Keys" msgstr "Teklak" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "GUI Language:" msgstr "Hizkuntza" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "Language of ScummVM GUI" msgstr "ScummVM interfazearen hizkuntza" -#: gui/options.cpp:1347 +#: gui/options.cpp:1365 msgid "You have to restart ScummVM before your changes will take effect." msgstr "ScummVM berrabiarazi behar duzu aldaketak indarrean jartzeko" -#: gui/options.cpp:1360 +#: gui/options.cpp:1378 msgid "Select directory for savegames" msgstr "Gordetako partiden direktorioa aukeratu" -#: gui/options.cpp:1367 +#: gui/options.cpp:1385 msgid "The chosen directory cannot be written to. Please select another one." msgstr "Aukeraturiko direktorioan ezin da idatzi. Mesedez, aukeratu beste bat." -#: gui/options.cpp:1376 +#: gui/options.cpp:1394 msgid "Select directory for GUI themes" msgstr "Gaien direktorioa aukeratu" -#: gui/options.cpp:1386 +#: gui/options.cpp:1404 msgid "Select directory for extra files" msgstr "Fitxategi gehigarrien direktorioa aukeratu" -#: gui/options.cpp:1397 +#: gui/options.cpp:1415 msgid "Select directory for plugins" msgstr "Pluginen direktorioa aukeratu" -#: gui/options.cpp:1450 +#: gui/options.cpp:1468 msgid "" "The theme you selected does not support your current language. If you want " "to use this theme you need to switch to another language first." @@ -926,74 +944,74 @@ msgstr "" "Aukeraturiko gaia ez da zure hizkuntzarekin bateragarria. Gai hau erabili " "nahi baduzu, aurretik beste hizkuntza batera pasa behar duzu." -#: gui/saveload-dialog.cpp:158 +#: gui/saveload-dialog.cpp:166 msgid "List view" msgstr "" -#: gui/saveload-dialog.cpp:159 +#: gui/saveload-dialog.cpp:167 msgid "Grid view" msgstr "" -#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 +#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358 msgid "No date saved" msgstr "Ez dago datarik gordeta" -#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359 msgid "No time saved" msgstr "Ez dago ordurik gordeta" -#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 +#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360 msgid "No playtime saved" msgstr "Ez dago denborarik gordeta" -#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275 msgid "Delete" msgstr "Ezabatu" -#: gui/saveload-dialog.cpp:266 +#: gui/saveload-dialog.cpp:274 msgid "Do you really want to delete this savegame?" msgstr "Ezabatu partida gorde hau?" -#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 +#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872 msgid "Date: " msgstr "Data:" -#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 +#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878 msgid "Time: " msgstr "Ordua" -#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 +#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886 msgid "Playtime: " msgstr "Denbora:" -#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 +#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494 msgid "Untitled savestate" msgstr "Titulurik gabeko partida" -#: gui/saveload-dialog.cpp:517 +#: gui/saveload-dialog.cpp:546 msgid "Next" msgstr "" -#: gui/saveload-dialog.cpp:520 +#: gui/saveload-dialog.cpp:549 msgid "Prev" msgstr "" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 #, fuzzy msgid "New Save" msgstr "Gorde" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 #, fuzzy msgid "Create a new save game" msgstr "Ezin izan da jokoa gorde" -#: gui/saveload-dialog.cpp:789 +#: gui/saveload-dialog.cpp:865 #, fuzzy msgid "Name: " msgstr "Izena:" -#: gui/saveload-dialog.cpp:861 +#: gui/saveload-dialog.cpp:937 #, c-format msgid "Enter a description for slot %d:" msgstr "" @@ -1031,35 +1049,35 @@ msgstr "Lausotua (16bpp)" msgid "Clear value" msgstr "Balioa kendu:" -#: base/main.cpp:209 +#: base/main.cpp:210 #, c-format msgid "Engine does not support debug level '%s'" msgstr "Motoreak ez da '%s' debug mailarekin bateragarria" -#: base/main.cpp:287 +#: base/main.cpp:288 msgid "Menu" msgstr "Menua" -#: base/main.cpp:290 backends/platform/symbian/src/SymbianActions.cpp:45 +#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:45 #: backends/platform/wince/CEActionsSmartphone.cpp:46 msgid "Skip" msgstr "Saltatu" -#: base/main.cpp:293 backends/platform/symbian/src/SymbianActions.cpp:50 +#: base/main.cpp:294 backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:42 msgid "Pause" msgstr "Gelditu" -#: base/main.cpp:296 +#: base/main.cpp:297 msgid "Skip line" msgstr "Lerroa saltatu" -#: base/main.cpp:467 +#: base/main.cpp:468 msgid "Error running game:" msgstr "Jokoa exekutatzean errorea:" -#: base/main.cpp:491 +#: base/main.cpp:492 msgid "Could not find any engine capable of running the selected game" msgstr "Ezin izan da aukeraturiko jokoa exekutatzeko gai den motorerik aurkitu" @@ -1174,13 +1192,16 @@ msgid "~R~eturn to Launcher" msgstr "It~z~uli abiarazlera" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284 +#: engines/pegasus/pegasus.cpp:369 msgid "Save game:" msgstr "Gorde jokoa:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:369 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1208,12 +1229,12 @@ msgstr "" "informaziorako eta laguntza gehiago nola jaso jakiteko." #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 -#: engines/mohawk/dialogs.cpp:174 +#: engines/mohawk/dialogs.cpp:170 msgid "~O~K" msgstr "~A~dos" #: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 -#: engines/mohawk/dialogs.cpp:175 +#: engines/mohawk/dialogs.cpp:171 msgid "~C~ancel" msgstr "~U~tzi" @@ -1221,23 +1242,23 @@ msgstr "~U~tzi" msgid "~K~eys" msgstr "~T~eklak" -#: engines/engine.cpp:235 +#: engines/engine.cpp:240 msgid "Could not initialize color format." msgstr "Kolore formatua ezin izan da hasieratu." -#: engines/engine.cpp:243 +#: engines/engine.cpp:248 msgid "Could not switch to video mode: '" msgstr "Ezin izan da aldatu bideo modura : '" -#: engines/engine.cpp:252 +#: engines/engine.cpp:257 msgid "Could not apply aspect ratio setting." msgstr "Ezin izan da formatu-ratio ezarpena aplikatu." -#: engines/engine.cpp:257 +#: engines/engine.cpp:262 msgid "Could not apply fullscreen setting." msgstr "Ezin izan da pantaila-osoa ezarpena aplikatu." -#: engines/engine.cpp:357 +#: engines/engine.cpp:362 msgid "" "You appear to be playing this game directly\n" "from the CD. This is known to cause problems,\n" @@ -1251,7 +1272,7 @@ msgstr "" "fitxategiak disko gogorrera kopiatzea.\n" "Jo README fitxategira xehetasunetarako." -#: engines/engine.cpp:368 +#: engines/engine.cpp:373 msgid "" "This game has audio tracks in its disk. These\n" "tracks need to be ripped from the disk using\n" @@ -1265,7 +1286,7 @@ msgstr "" "izateko. Jo README fitxategira\n" "xehetasunetarako." -#: engines/engine.cpp:426 +#: engines/engine.cpp:431 #, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " @@ -1274,7 +1295,7 @@ msgstr "" "Jokoaren egoera kargatzeak huts egin du (%s)! Jo ezazu README-ra oinarrizko " "informaziorako eta laguntza gehiago nola jaso jakiteko." -#: engines/engine.cpp:439 +#: engines/engine.cpp:444 msgid "" "WARNING: The game you are about to start is not yet fully supported by " "ScummVM. As such, it is likely to be unstable, and any saves you make might " @@ -1284,28 +1305,51 @@ msgstr "" "Hori dela eta, ezegonkorra izan daiteke eta gerta daiteke gordeta izan " "ditzakezun partidan ez ibiltzea ScummVM-ren etorkizuneko bertsioetan." -#: engines/engine.cpp:442 +#: engines/engine.cpp:447 msgid "Start anyway" msgstr "Jolastu berdin-berdin" -#: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 -#: engines/sci/detection.cpp:390 +#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270 +#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393 +#: engines/toltecs/detection.cpp:173 msgid "Use original save/load screens" msgstr "" -#: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 -#: engines/sci/detection.cpp:391 +#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271 +#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394 +#: engines/toltecs/detection.cpp:174 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore game:" msgstr "Jokoa kargatu:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore" msgstr "Kargatu" +#: engines/drascula/saveload.cpp:49 +#, fuzzy +msgid "" +"ScummVM found that you have old savefiles for Drascula that should be " +"converted.\n" +"The old save game format is no longer supported, so you will not be able to " +"load your games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" +msgstr "" +"ScummVM-k aurkitu du konbertitu beharko liratekeen Broken Sword 1-eko " +"partida gorde zaharrak dituzula.\n" +"Partida gordeen formatu zaharra ez da bateragarria jada, eta beraz ezingo " +"dituzu zure partidak kargatu ez badituzu formatu berrira pasatzen.\n" +"\n" +"Sakatu Ados orain konbertitzeko, bestela berriz galdetuko dizut jokoa berriz " +"martxan jartzen duzunean.\n" + #: engines/dreamweb/detection.cpp:57 #, fuzzy msgid "Use bright palette mode" @@ -1315,57 +1359,57 @@ msgstr "Goiko eskuineko objektua" msgid "Display graphics using the game's bright palette" msgstr "" -#: engines/sci/detection.cpp:370 +#: engines/sci/detection.cpp:373 msgid "EGA undithering" msgstr "EGA lausotzea" -#: engines/sci/detection.cpp:371 +#: engines/sci/detection.cpp:374 #, fuzzy msgid "Enable undithering in EGA games" msgstr "EGA lausotzea gaitu joko bateragarrietan" -#: engines/sci/detection.cpp:380 +#: engines/sci/detection.cpp:383 #, fuzzy msgid "Prefer digital sound effects" msgstr "Soinu efektu berezien bolumena" -#: engines/sci/detection.cpp:381 +#: engines/sci/detection.cpp:384 msgid "Prefer digital sound effects instead of synthesized ones" msgstr "" -#: engines/sci/detection.cpp:400 +#: engines/sci/detection.cpp:403 msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "" -#: engines/sci/detection.cpp:401 +#: engines/sci/detection.cpp:404 msgid "" "Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" -#: engines/sci/detection.cpp:411 +#: engines/sci/detection.cpp:414 msgid "Use CD audio" msgstr "" -#: engines/sci/detection.cpp:412 +#: engines/sci/detection.cpp:415 msgid "Use CD audio instead of in-game audio, if available" msgstr "" -#: engines/sci/detection.cpp:422 +#: engines/sci/detection.cpp:425 msgid "Use Windows cursors" msgstr "" -#: engines/sci/detection.cpp:423 +#: engines/sci/detection.cpp:426 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "" -#: engines/sci/detection.cpp:433 +#: engines/sci/detection.cpp:436 #, fuzzy msgid "Use silver cursors" msgstr "Kurtsore normala" -#: engines/sci/detection.cpp:434 +#: engines/sci/detection.cpp:437 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "" @@ -2017,7 +2061,7 @@ msgstr "Eskuinera hegan egin" msgid "Fly to lower right" msgstr "Behera eta eskuinera hegan egin" -#: engines/scumm/scumm.cpp:1773 +#: engines/scumm/scumm.cpp:1776 #, c-format msgid "" "Native MIDI support requires the Roland Upgrade from LucasArts,\n" @@ -2026,7 +2070,7 @@ msgstr "" "MIDI euskarri natiboak LucasArts-en Roland eguneraketa behar du,\n" "baina %s ez dago eskuragarri. AdLib erabiliko da." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 +#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2037,7 +2081,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 +#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2048,7 +2092,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 +#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2059,7 +2103,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2512 +#: engines/scumm/scumm.cpp:2537 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2070,7 +2114,7 @@ msgstr "" "aukeratu 'Maniac' direktorioa Tentacle-ren joko-direktorioaren barruan." #. I18N: Option for fast scene switching -#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171 +#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167 msgid "~Z~ip Mode Activated" msgstr "~Z~ip modua aktibaturik" @@ -2091,11 +2135,11 @@ msgstr "~M~apa erakutsi" msgid "~M~ain Menu" msgstr "Menu ~n~agusia" -#: engines/mohawk/dialogs.cpp:172 +#: engines/mohawk/dialogs.cpp:168 msgid "~W~ater Effect Enabled" msgstr "~U~r-efektua gaituta" -#: engines/agos/animation.cpp:560 +#: engines/agos/animation.cpp:557 #, c-format msgid "Cutscene file '%s' not found!" msgstr "'%s' bideo fitxategia ez da aurkitu!" @@ -2113,6 +2157,15 @@ msgstr "Ezin izan da jokoa fitxategira gorde." msgid "Failed to delete file." msgstr "Ezin izan da fitxategia ezabatu" +#: engines/groovie/detection.cpp:312 +#, fuzzy +msgid "Fast movie speed" +msgstr "Modu bizkorra" + +#: engines/groovie/detection.cpp:313 +msgid "Play movies at an increased speed" +msgstr "" + #: engines/groovie/script.cpp:420 msgid "Failed to save game" msgstr "Ezin izan da jokoa gorde" @@ -2205,11 +2258,11 @@ msgstr "Ezkerrera irristatu" msgid "Slide Right" msgstr "Eskuinera irristatu" -#: engines/kyra/lol.cpp:485 +#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2412 msgid "Turn Left" msgstr "Ezkerrera biratu" -#: engines/kyra/lol.cpp:486 +#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2413 msgid "Turn Right" msgstr "Eskuinera biratu" @@ -2225,7 +2278,7 @@ msgstr "Aukerak" msgid "Choose Spell" msgstr "Sorginkeria aukeratu" -#: engines/kyra/sound_midi.cpp:475 +#: engines/kyra/sound_midi.cpp:477 #, fuzzy msgid "" "You appear to be using a General MIDI device,\n" @@ -2272,26 +2325,26 @@ msgstr "" msgid "Use the floppy version's intro (CD version only)" msgstr "" -#: engines/sword1/animation.cpp:539 +#: engines/sword1/animation.cpp:519 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "" -#: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 +#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439 msgid "DXA cutscenes found but ScummVM has been built without zlib support" msgstr "" "DXA bideoak aurkitu dira, baina ScummVM zlib euskarri gabe konpilatu da" -#: engines/sword1/animation.cpp:570 engines/sword2/animation.cpp:465 +#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449 msgid "MPEG2 cutscenes are no longer supported" msgstr "MPEG2 bideoak ez dira bateragarriak jada" -#: engines/sword1/animation.cpp:576 engines/sword2/animation.cpp:473 +#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457 #, c-format msgid "Cutscene '%s' not found" msgstr "Ez da '%s' bideoa aurkitu" -#: engines/sword1/control.cpp:863 +#: engines/sword1/control.cpp:865 msgid "" "ScummVM found that you have old savefiles for Broken Sword 1 that should be " "converted.\n" @@ -2309,7 +2362,7 @@ msgstr "" "Sakatu Ados orain konbertitzeko, bestela berriz galdetuko dizut jokoa berriz " "martxan jartzen duzunean.\n" -#: engines/sword1/control.cpp:1232 +#: engines/sword1/control.cpp:1234 #, c-format msgid "" "Target new save game already exists!\n" @@ -2318,11 +2371,11 @@ msgstr "" "Gordetako partida jadanik existitzen da!\n" "Gordetako partida zaharra (%s) ala berria (%s) mantendu nahi zenuke?\n" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the old one" msgstr "Zaharra mantendu" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the new one" msgstr "Berria mantendu" @@ -2330,7 +2383,7 @@ msgstr "Berria mantendu" msgid "This is the end of the Broken Sword 1 Demo" msgstr "Hau Broken Sword 1 Demoaren amaiera da" -#: engines/sword2/animation.cpp:435 +#: engines/sword2/animation.cpp:419 msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" @@ -2345,12 +2398,12 @@ msgstr "" msgid "Show labels for objects on mouse hover" msgstr "" -#: engines/teenagent/resources.cpp:68 +#: engines/teenagent/resources.cpp:94 msgid "" "You're missing the 'teenagent.dat' file. Get it from the ScummVM website" msgstr "" -#: engines/teenagent/resources.cpp:89 +#: engines/teenagent/resources.cpp:115 msgid "" "The teenagent.dat file is compressed and zlib hasn't been included in this " "executable. Please decompress it" @@ -2406,6 +2459,47 @@ msgstr "" "\n" "Mesedez, eman abisua taldeari." +#: engines/pegasus/pegasus.cpp:675 +msgid "Invalid save file name" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2410 +msgid "Up/Zoom In/Move Forward/Open Doors" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2411 +#, fuzzy +msgid "Down/Zoom Out" +msgstr "Zoom-a hurbildu" + +#: engines/pegasus/pegasus.cpp:2414 +msgid "Display/Hide Inventory Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2415 +msgid "Display/Hide Biochip Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2416 +msgid "Action/Select" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2417 +msgid "Toggle Center Data Display" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2418 +msgid "Display/Hide Info Screen" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2419 +msgid "Display/Hide Pause Menu" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2420 +msgid "???" +msgstr "" + #: audio/fmopl.cpp:49 msgid "MAME OPL emulator" msgstr "MAME OPL emuladorea" @@ -2463,7 +2557,7 @@ msgstr "Musikarik ez" msgid "Amiga Audio Emulator" msgstr "Amiga Audio emuladorea" -#: audio/softsynth/adlib.cpp:1593 +#: audio/softsynth/adlib.cpp:2284 msgid "AdLib Emulator" msgstr "AdLib emuladorea" @@ -2475,11 +2569,11 @@ msgstr "Apple II GS emuladorea (INPLEMENTATU GABE)" msgid "C64 Audio Emulator" msgstr "C64 Audio emuladorea" -#: audio/softsynth/mt32.cpp:293 +#: audio/softsynth/mt32.cpp:205 msgid "Initializing MT-32 Emulator" msgstr "MT-32 emuladorea hasieratzen" -#: audio/softsynth/mt32.cpp:512 +#: audio/softsynth/mt32.cpp:431 msgid "MT-32 Emulator" msgstr "MT-32 emuladorea" @@ -2630,24 +2724,24 @@ msgstr "Erdiko klika" msgid "Right Click" msgstr "Eskuin-klika" -#: backends/platform/sdl/macosx/appmenu_osx.mm:78 +#: backends/platform/sdl/macosx/appmenu_osx.mm:77 msgid "Hide ScummVM" msgstr "ScummVM ezkutatu" -#: backends/platform/sdl/macosx/appmenu_osx.mm:83 +#: backends/platform/sdl/macosx/appmenu_osx.mm:82 msgid "Hide Others" msgstr "Besteak ezkutatu" -#: backends/platform/sdl/macosx/appmenu_osx.mm:88 +#: backends/platform/sdl/macosx/appmenu_osx.mm:87 msgid "Show All" msgstr "Denak erakutsi" -#: backends/platform/sdl/macosx/appmenu_osx.mm:110 -#: backends/platform/sdl/macosx/appmenu_osx.mm:121 +#: backends/platform/sdl/macosx/appmenu_osx.mm:109 +#: backends/platform/sdl/macosx/appmenu_osx.mm:120 msgid "Window" msgstr "Leihoa" -#: backends/platform/sdl/macosx/appmenu_osx.mm:115 +#: backends/platform/sdl/macosx/appmenu_osx.mm:114 msgid "Minimize" msgstr "Minimizatu" @@ -2661,12 +2755,12 @@ msgid "Normal (no scaling)" msgstr "Normala" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537 msgid "Enabled aspect ratio correction" msgstr "Formatu-ratio zuzenketa gaituta" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542 msgid "Disabled aspect ratio correction" msgstr "Formatu-ratio zuzenketa desgaituta" @@ -2675,7 +2769,7 @@ msgid "Active graphics filter:" msgstr "Filtro grafiko aktiboa:" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481 msgid "Windowed mode" msgstr "Leiho modua" @@ -2699,11 +2793,11 @@ msgstr "Oraingo bideo-modua" msgid "Current scale" msgstr "Oraingo eskala" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:558 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562 msgid "Active filter mode: Linear" msgstr "Filtro aktibo modua: lineala" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:560 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564 msgid "Active filter mode: Nearest" msgstr "Filtro aktibo modua: hurbilena" @@ -3030,19 +3124,19 @@ msgstr "Benetan irten?" #: backends/events/gph/gph-events.cpp:386 #: backends/events/gph/gph-events.cpp:429 -#: backends/events/openpandora/op-events.cpp:139 +#: backends/events/openpandora/op-events.cpp:168 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "Ukimen-pantailako 'kolpetxo modua' - Ezker klika" #: backends/events/gph/gph-events.cpp:388 #: backends/events/gph/gph-events.cpp:431 -#: backends/events/openpandora/op-events.cpp:141 +#: backends/events/openpandora/op-events.cpp:170 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "Ukimen-pantailako 'kolpetxo modua' - Eskuin klika" #: backends/events/gph/gph-events.cpp:390 #: backends/events/gph/gph-events.cpp:433 -#: backends/events/openpandora/op-events.cpp:143 +#: backends/events/openpandora/op-events.cpp:172 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "Ukimen-pantailako 'kolpetxo modua' - Flotatu (klikik ez)" @@ -3062,7 +3156,12 @@ msgstr "Bolumen minimoa" msgid "Decreasing Volume" msgstr "Bolumena jaisten" -#: backends/updates/macosx/macosx-updates.mm:65 +#: backends/events/openpandora/op-events.cpp:174 +#, fuzzy +msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)" +msgstr "Ukimen-pantailako 'kolpetxo modua' - Flotatu (klikik ez)" + +#: backends/updates/macosx/macosx-updates.mm:67 msgid "Check for Updates..." msgstr "Eguneraketak bilatzen..." @@ -3098,6 +3197,9 @@ msgstr "Klikatzea gaituta" msgid "Clicking Disabled" msgstr "Klikatzea desgaituta" +#~ msgid "Enable Roland GS Mode" +#~ msgstr "Roland GS modua gaitu" + #~ msgid "Hercules Green" #~ msgstr "Herkules berdea" diff --git a/po/fi_FI.po b/po/fi_FI.po new file mode 100644 index 0000000000..c81736edac --- /dev/null +++ b/po/fi_FI.po @@ -0,0 +1,3191 @@ +# Finnish translation for ScummVM. +# Copyright (c) 2012-2013 ScummVM Team +# This file is distributed under the same license as the ScummVM package. +# Toni Saarela <saarela@gmail.com>, 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: ScummVM 1.6.0git\n" +"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" +"POT-Creation-Date: 2013-02-07 23:11+0000\n" +"PO-Revision-Date: 2012-12-01 19:37+0200\n" +"Last-Translator: Toni Saarela <saarela@gmail.com>\n" +"Language-Team: Finnish\n" +"Language: Suomi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.5.4\n" + +#: gui/about.cpp:93 +#, c-format +msgid "(built on %s)" +msgstr "(käännöksen päiväys: %s)" + +#: gui/about.cpp:100 +msgid "Features compiled in:" +msgstr "Tähän versioon käännetyt ominaisuudet:" + +#: gui/about.cpp:109 +msgid "Available engines:" +msgstr "Tuetut pelimoottorit:" + +#: gui/browser.cpp:67 +#, fuzzy +msgid "Show hidden files" +msgstr "Näytä / piilota konsoli" + +#: gui/browser.cpp:67 +msgid "Show files marked with the hidden attribute" +msgstr "" + +#: gui/browser.cpp:71 +msgid "Go up" +msgstr "Siirry ylös" + +#: gui/browser.cpp:71 gui/browser.cpp:73 +msgid "Go to previous directory level" +msgstr "Palaa edelliselle hakemistotasolle" + +#: gui/browser.cpp:73 +msgctxt "lowres" +msgid "Go up" +msgstr "Siirry ylös" + +#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238 +#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275 +#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919 +#: gui/themebrowser.cpp:54 engines/engine.cpp:447 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:190 +#: engines/sword1/control.cpp:867 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:48 +#: backends/events/default/default-events.cpp:191 +#: backends/events/default/default-events.cpp:213 +msgid "Cancel" +msgstr "Peruuta" + +#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55 +msgid "Choose" +msgstr "Valitse" + +#: gui/gui-manager.cpp:115 engines/scumm/help.cpp:125 +#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165 +#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209 +#: backends/keymapper/remap-dialog.cpp:52 +msgid "Close" +msgstr "Sulje" + +#: gui/gui-manager.cpp:118 +msgid "Mouse click" +msgstr "Hiiren klikkaus" + +#: gui/gui-manager.cpp:122 base/main.cpp:301 +msgid "Display keyboard" +msgstr "Näytä näppäimistö" + +#: gui/gui-manager.cpp:126 base/main.cpp:305 +msgid "Remap keys" +msgstr "Määritä näppäimet uudelleen" + +#: gui/gui-manager.cpp:129 base/main.cpp:308 +msgid "Toggle FullScreen" +msgstr "Kokoruututilan vaihto" + +#: gui/KeysDialog.h:36 gui/KeysDialog.cpp:145 +msgid "Choose an action to map" +msgstr "Valitse toiminto" + +#: gui/KeysDialog.cpp:41 +msgid "Map" +msgstr "Näppäinkartta" + +#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 +#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239 +#: gui/saveload-dialog.cpp:920 engines/engine.cpp:366 engines/engine.cpp:377 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192 +#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558 +#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 +#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519 +#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550 +#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:867 +#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419 +#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449 +#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:47 +#: backends/platform/wince/CELauncherDialog.cpp:54 +msgid "OK" +msgstr "Tallenna" + +#: gui/KeysDialog.cpp:49 +msgid "Select an action and click 'Map'" +msgstr "Valitse toiminto ja klikkaa 'Map'" + +#: gui/KeysDialog.cpp:80 gui/KeysDialog.cpp:102 gui/KeysDialog.cpp:141 +#, c-format +msgid "Associated key : %s" +msgstr "Nykyinen näppäin : %s" + +#: gui/KeysDialog.cpp:82 gui/KeysDialog.cpp:104 gui/KeysDialog.cpp:143 +#, c-format +msgid "Associated key : none" +msgstr "Nykyinen näppäin : ei mikään" + +#: gui/KeysDialog.cpp:90 +msgid "Please select an action" +msgstr "Valitse toiminto" + +#: gui/KeysDialog.cpp:106 +msgid "Press the key to associate" +msgstr "Paina haluamaasi nappia" + +#: gui/launcher.cpp:187 +msgid "Game" +msgstr "Peli" + +#: gui/launcher.cpp:191 +msgid "ID:" +msgstr "Tunniste:" + +#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194 +msgid "" +"Short game identifier used for referring to savegames and running the game " +"from the command line" +msgstr "" +"Lyhyt pelitunniste, jota käytetään kun viitataan pelitallennuksiin ja kun " +"peli käynnistetään komentoriviltä" + +#: gui/launcher.cpp:193 +msgctxt "lowres" +msgid "ID:" +msgstr "Tunniste:" + +#: gui/launcher.cpp:198 +msgid "Name:" +msgstr "Nimi:" + +#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201 +msgid "Full title of the game" +msgstr "Pelin koko nimi" + +#: gui/launcher.cpp:200 +msgctxt "lowres" +msgid "Name:" +msgstr "Nimi:" + +#: gui/launcher.cpp:204 +msgid "Language:" +msgstr "Kieli:" + +#: gui/launcher.cpp:204 gui/launcher.cpp:205 +msgid "" +"Language of the game. This will not turn your Spanish game version into " +"English" +msgstr "" +"Pelin kieli. Tämä ei muuta esimerkiksi espanjankielistä versiota pelistä " +"englanninkieliseksi." + +#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86 +#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209 +#: audio/null.cpp:40 +msgid "<default>" +msgstr "<oletus>" + +#: gui/launcher.cpp:216 +msgid "Platform:" +msgstr "Alusta:" + +#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219 +msgid "Platform the game was originally designed for" +msgstr "Alusta jolle peli alunperin suunniteltiin" + +#: gui/launcher.cpp:218 +msgctxt "lowres" +msgid "Platform:" +msgstr "Alusta:" + +#: gui/launcher.cpp:231 +msgid "Engine" +msgstr "Moottori" + +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 +msgid "Graphics" +msgstr "Grafiikka" + +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 +msgid "GFX" +msgstr "GFX" + +#: gui/launcher.cpp:242 +msgid "Override global graphic settings" +msgstr "Ohita globaalit grafiikka-asetukset" + +#: gui/launcher.cpp:244 +msgctxt "lowres" +msgid "Override global graphic settings" +msgstr "Ohita globaalit grafiikka-asetukset" + +#: gui/launcher.cpp:251 gui/options.cpp:1095 +msgid "Audio" +msgstr "Ääni" + +#: gui/launcher.cpp:254 +msgid "Override global audio settings" +msgstr "Ohita globaalit ääniasetukset" + +#: gui/launcher.cpp:256 +msgctxt "lowres" +msgid "Override global audio settings" +msgstr "Ohita globaalit ääniasetukset" + +#: gui/launcher.cpp:265 gui/options.cpp:1100 +msgid "Volume" +msgstr "Voimakkuus" + +#: gui/launcher.cpp:267 gui/options.cpp:1102 +msgctxt "lowres" +msgid "Volume" +msgstr "Voimakkuus" + +#: gui/launcher.cpp:270 +msgid "Override global volume settings" +msgstr "Ohita globaalit äänenvoimakkuusasetukset" + +#: gui/launcher.cpp:272 +msgctxt "lowres" +msgid "Override global volume settings" +msgstr "Ohita globaalit äänenvoimakkuusasetukset" + +#: gui/launcher.cpp:280 gui/options.cpp:1110 +msgid "MIDI" +msgstr "MIDI" + +#: gui/launcher.cpp:283 +msgid "Override global MIDI settings" +msgstr "Ohita globaalit MIDI-asetukset" + +#: gui/launcher.cpp:285 +msgctxt "lowres" +msgid "Override global MIDI settings" +msgstr "Ohita globaalit MIDI-asetukset" + +#: gui/launcher.cpp:294 gui/options.cpp:1116 +msgid "MT-32" +msgstr "MT-32" + +#: gui/launcher.cpp:297 +msgid "Override global MT-32 settings" +msgstr "Ohita globaalit MT-32 asetukset" + +#: gui/launcher.cpp:299 +msgctxt "lowres" +msgid "Override global MT-32 settings" +msgstr "Ohita globaalit MT-32 asetukset" + +#: gui/launcher.cpp:308 gui/options.cpp:1123 +msgid "Paths" +msgstr "Polut" + +#: gui/launcher.cpp:310 gui/options.cpp:1125 +msgctxt "lowres" +msgid "Paths" +msgstr "Polut" + +#: gui/launcher.cpp:317 +msgid "Game Path:" +msgstr "Pelin polku:" + +#: gui/launcher.cpp:319 +msgctxt "lowres" +msgid "Game Path:" +msgstr "Pelin polku:" + +#: gui/launcher.cpp:324 gui/options.cpp:1149 +msgid "Extra Path:" +msgstr "Lisäkansio:" + +#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327 +msgid "Specifies path to additional data used the game" +msgstr "Määrittää polun lisätiedostoihin joita peli mahdollisesti käyttää" + +#: gui/launcher.cpp:326 gui/options.cpp:1151 +msgctxt "lowres" +msgid "Extra Path:" +msgstr "Lisäkansio:" + +#: gui/launcher.cpp:333 gui/options.cpp:1133 +msgid "Save Path:" +msgstr "Tallennuskansio:" + +#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 +#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136 +msgid "Specifies where your savegames are put" +msgstr "Määrittää polun pelitallennuksille" + +#: gui/launcher.cpp:335 gui/options.cpp:1135 +msgctxt "lowres" +msgid "Save Path:" +msgstr "Tallennuskansio:" + +#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 +#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152 +#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282 +#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326 +#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429 +#: gui/options.cpp:1441 +msgctxt "path" +msgid "None" +msgstr "Ei määritelty" + +#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 +#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432 +#: backends/platform/wii/options.cpp:56 +msgid "Default" +msgstr "Oletus" + +#: gui/launcher.cpp:504 gui/options.cpp:1435 +msgid "Select SoundFont" +msgstr "Valitse äänifontti" + +#: gui/launcher.cpp:523 gui/launcher.cpp:677 +msgid "Select directory with game data" +msgstr "Valitse pelin kansio" + +#: gui/launcher.cpp:541 +msgid "Select additional game directory" +msgstr "Valitse lisäkansio pelille" + +#: gui/launcher.cpp:553 +msgid "Select directory for saved games" +msgstr "Valitse kansio pelitallennuksille" + +#: gui/launcher.cpp:580 +msgid "This game ID is already taken. Please choose another one." +msgstr "Pelin tunnus on jo käytössä. Valitse jokin muu." + +#: gui/launcher.cpp:621 engines/dialogs.cpp:110 +msgid "~Q~uit" +msgstr "~L~opeta" + +#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95 +msgid "Quit ScummVM" +msgstr "Lopeta ScummVM" + +#: gui/launcher.cpp:622 +msgid "A~b~out..." +msgstr "Tietoa..." + +#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69 +msgid "About ScummVM" +msgstr "Tietoa ScummVM:stä" + +#: gui/launcher.cpp:623 +msgid "~O~ptions..." +msgstr "~A~setukset" + +#: gui/launcher.cpp:623 +msgid "Change global ScummVM options" +msgstr "Muuta globaaleja ScummVM:n asetuksia" + +#: gui/launcher.cpp:625 +msgid "~S~tart" +msgstr "~P~elaa" + +#: gui/launcher.cpp:625 +msgid "Start selected game" +msgstr "Pelaa valittua peliä" + +#: gui/launcher.cpp:628 +msgid "~L~oad..." +msgstr "~L~ataa..." + +#: gui/launcher.cpp:628 +msgid "Load savegame for selected game" +msgstr "Lataa pelitallennus valitulle pelille" + +#: gui/launcher.cpp:633 gui/launcher.cpp:1120 +msgid "~A~dd Game..." +msgstr "~L~isää peli..." + +#: gui/launcher.cpp:633 gui/launcher.cpp:640 +msgid "Hold Shift for Mass Add" +msgstr "Pidä Shift-näppäintä pohjassa lisätäksesi useita pelejä kerralla" + +#: gui/launcher.cpp:635 +msgid "~E~dit Game..." +msgstr "Muokkaa peliä..." + +#: gui/launcher.cpp:635 gui/launcher.cpp:642 +msgid "Change game options" +msgstr "Muuta pelin asetuksia" + +#: gui/launcher.cpp:637 +msgid "~R~emove Game" +msgstr "Poista peli" + +#: gui/launcher.cpp:637 gui/launcher.cpp:644 +msgid "Remove game from the list. The game data files stay intact" +msgstr "Poista peli listasta. Pelin tiedostoja ei poisteta levyltä" + +#: gui/launcher.cpp:640 gui/launcher.cpp:1120 +msgctxt "lowres" +msgid "~A~dd Game..." +msgstr "Lisää peli..." + +#: gui/launcher.cpp:642 +msgctxt "lowres" +msgid "~E~dit Game..." +msgstr "Muokkaa peliä..." + +#: gui/launcher.cpp:644 +msgctxt "lowres" +msgid "~R~emove Game" +msgstr "Poista peli..." + +#: gui/launcher.cpp:652 +msgid "Search in game list" +msgstr "Etsi peliä listasta" + +#: gui/launcher.cpp:656 gui/launcher.cpp:1167 +msgid "Search:" +msgstr "Etsi:" + +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 +#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 +#: engines/pegasus/pegasus.cpp:345 +msgid "Load game:" +msgstr "Lataa peli:" + +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 +#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 +#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:345 +#: backends/platform/wince/CEActionsPocket.cpp:267 +#: backends/platform/wince/CEActionsSmartphone.cpp:231 +msgid "Load" +msgstr "Lataa" + +#: gui/launcher.cpp:788 +msgid "" +"Do you really want to run the mass game detector? This could potentially add " +"a huge number of games." +msgstr "" +"Haluatko varmasti lisätä pelejä alihakemistoineen? Tämä voi lisätä suuren " +"määrän pelejä." + +#: gui/launcher.cpp:789 gui/launcher.cpp:937 +#: backends/events/symbiansdl/symbiansdl-events.cpp:184 +#: backends/platform/wince/CEActionsPocket.cpp:326 +#: backends/platform/wince/CEActionsSmartphone.cpp:287 +#: backends/platform/wince/CELauncherDialog.cpp:83 +msgid "Yes" +msgstr "Kyllä" + +#: gui/launcher.cpp:789 gui/launcher.cpp:937 +#: backends/events/symbiansdl/symbiansdl-events.cpp:184 +#: backends/platform/wince/CEActionsPocket.cpp:326 +#: backends/platform/wince/CEActionsSmartphone.cpp:287 +#: backends/platform/wince/CELauncherDialog.cpp:83 +msgid "No" +msgstr "Ei" + +#: gui/launcher.cpp:837 +msgid "ScummVM couldn't open the specified directory!" +msgstr "ScummVM ei voi avata kyseistä hakemistoa!" + +#: gui/launcher.cpp:849 +msgid "ScummVM could not find any game in the specified directory!" +msgstr "ScummVM ei löytänyt yhtään peliä kyseisestä hakemistosta!" + +#: gui/launcher.cpp:863 +msgid "Pick the game:" +msgstr "Valitse peli:" + +#: gui/launcher.cpp:937 +msgid "Do you really want to remove this game configuration?" +msgstr "Haluatko varmasti poistaa pelin asetuksineen listalta?" + +#: gui/launcher.cpp:1001 +msgid "This game does not support loading games from the launcher." +msgstr "Tämä peli ei tue pelitallennuksien lataamista pelin ulkopuolelta." + +#: gui/launcher.cpp:1005 +msgid "ScummVM could not find any engine capable of running the selected game!" +msgstr "ScummVM ei löytänyt pelimoottoria joka tukee valittua peliä!" + +#: gui/launcher.cpp:1119 +msgctxt "lowres" +msgid "Mass Add..." +msgstr "Lisää monta..." + +#: gui/launcher.cpp:1119 +msgid "Mass Add..." +msgstr "Lisää monta..." + +#: gui/massadd.cpp:78 gui/massadd.cpp:81 +msgid "... progress ..." +msgstr "... skannaa ..." + +#: gui/massadd.cpp:258 +msgid "Scan complete!" +msgstr "Skannaus on valmis!" + +#: gui/massadd.cpp:261 +#, c-format +msgid "Discovered %d new games, ignored %d previously added games." +msgstr "" +"%d uutta peliä löytyi, jätettiin %d peliä huomiotta, koska ne oli jo lisätty " +"aiemmin." + +#: gui/massadd.cpp:265 +#, c-format +msgid "Scanned %d directories ..." +msgstr "Skannattiin %d hakemistoa ..." + +#: gui/massadd.cpp:268 +#, c-format +msgid "Discovered %d new games, ignored %d previously added games ..." +msgstr "" +"%d uutta peliä löytyi, jätettiin %d peliä huomiotta, koska ne oli jo lisätty " +"aiemmin." + +#: gui/options.cpp:84 +msgid "Never" +msgstr "Ei koskaan" + +#: gui/options.cpp:84 +msgid "every 5 mins" +msgstr "5 minuutin välein" + +#: gui/options.cpp:84 +msgid "every 10 mins" +msgstr "10 minuutin välein" + +#: gui/options.cpp:84 +msgid "every 15 mins" +msgstr "15 minuutin välein" + +#: gui/options.cpp:84 +msgid "every 30 mins" +msgstr "30 minuutin välein" + +#: gui/options.cpp:86 +msgid "8 kHz" +msgstr "8 kHz" + +#: gui/options.cpp:86 +msgid "11kHz" +msgstr "11 kHz" + +#: gui/options.cpp:86 +msgid "22 kHz" +msgstr "22 kHz" + +#: gui/options.cpp:86 +msgid "44 kHz" +msgstr "44 kHz" + +#: gui/options.cpp:86 +msgid "48 kHz" +msgstr "48 kHz" + +#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581 +#: gui/options.cpp:650 gui/options.cpp:858 +msgctxt "soundfont" +msgid "None" +msgstr "Ei käytössä" + +#: gui/options.cpp:388 +msgid "Failed to apply some of the graphic options changes:" +msgstr "Joitain grafiikka-asetuksia ei saatu asetettua:" + +#: gui/options.cpp:400 +msgid "the video mode could not be changed." +msgstr "videotilaa ei voitu vaihtaa." + +#: gui/options.cpp:406 +msgid "the fullscreen setting could not be changed" +msgstr "kokoruututilaa ei voitu muuttaa" + +#: gui/options.cpp:412 +msgid "the aspect ratio setting could not be changed" +msgstr "kuvasuhdekorjausasetusta ei voitu muuttaa" + +#: gui/options.cpp:733 +msgid "Graphics mode:" +msgstr "Grafiikkatila:" + +#: gui/options.cpp:747 +msgid "Render mode:" +msgstr "Renderöintitila:" + +#: gui/options.cpp:747 gui/options.cpp:748 +msgid "Special dithering modes supported by some games" +msgstr "Erityiset dithering asetukset joita jotkut pelit tukevat" + +#: gui/options.cpp:759 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476 +msgid "Fullscreen mode" +msgstr "Kokoruututila" + +#: gui/options.cpp:762 +msgid "Aspect ratio correction" +msgstr "Kuvasuhteen korjaus" + +#: gui/options.cpp:762 +msgid "Correct aspect ratio for 320x200 games" +msgstr "Oikea kuvasuhde 320x200 peleille" + +#: gui/options.cpp:770 +msgid "Preferred Device:" +msgstr "Ensisijainen laite:" + +#: gui/options.cpp:770 +msgid "Music Device:" +msgstr "Musiikkilaite:" + +#: gui/options.cpp:770 gui/options.cpp:772 +msgid "Specifies preferred sound device or sound card emulator" +msgstr "" +"Määrittää äänilaitteen tai äänikorttiemulaattorin jota ensisijaisesti tulisi " +"käyttää" + +#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773 +msgid "Specifies output sound device or sound card emulator" +msgstr "Määrittää äänikortin tai äänikorttia emuloivan ohjelmiston" + +#: gui/options.cpp:772 +msgctxt "lowres" +msgid "Preferred Dev.:" +msgstr "Ensisijainen:" + +#: gui/options.cpp:772 +msgctxt "lowres" +msgid "Music Device:" +msgstr "Musiikkilaite:" + +#: gui/options.cpp:799 +msgid "AdLib emulator:" +msgstr "AdLib emulaattori:" + +#: gui/options.cpp:799 gui/options.cpp:800 +msgid "AdLib is used for music in many games" +msgstr "AdLibiä käytetään monien pelien musiikeissa" + +#: gui/options.cpp:810 +msgid "Output rate:" +msgstr "Taajuus:" + +#: gui/options.cpp:810 gui/options.cpp:811 +msgid "" +"Higher value specifies better sound quality but may be not supported by your " +"soundcard" +msgstr "" +"Isommat taajuudet merkitsevät parempaa äänenlaatua, mutta äänikorttisi ei " +"ehkä tue niitä." + +#: gui/options.cpp:821 +msgid "GM Device:" +msgstr "GM laite:" + +#: gui/options.cpp:821 +msgid "Specifies default sound device for General MIDI output" +msgstr "Määrittää oletuksena käytettävän äänilaitteen General MIDIlle" + +#: gui/options.cpp:832 +msgid "Don't use General MIDI music" +msgstr "Älä käytä General MIDIä musiikissa" + +#: gui/options.cpp:843 gui/options.cpp:909 +msgid "Use first available device" +msgstr "Käytä ensimmäistä laitetta" + +#: gui/options.cpp:855 +msgid "SoundFont:" +msgstr "Äänifontti:" + +#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858 +msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" +msgstr "" +"Jotkut äänikortit tukevat äänifonttia (SoundFont), FluidSynth ja Timidity" + +#: gui/options.cpp:857 +msgctxt "lowres" +msgid "SoundFont:" +msgstr "Äänifontti:" + +#: gui/options.cpp:863 +msgid "Mixed AdLib/MIDI mode" +msgstr "Yhdistetty AdLib/MIDI tila" + +#: gui/options.cpp:863 +msgid "Use both MIDI and AdLib sound generation" +msgstr "Käytä sekä MIDIä että Adlibiä äänentuotantoon" + +#: gui/options.cpp:866 +msgid "MIDI gain:" +msgstr "MIDIn äänilisäys:" + +#: gui/options.cpp:873 +msgid "FluidSynth Settings" +msgstr "" + +#: gui/options.cpp:880 +msgid "MT-32 Device:" +msgstr "MT-32 laite:" + +#: gui/options.cpp:880 +msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" +msgstr "Määrittää oletusäänilaitteen Roland MT-32/LAPC1/CM32l/CM64:n käyttöön" + +#: gui/options.cpp:885 +msgid "True Roland MT-32 (disable GM emulation)" +msgstr "Aito Roland MT-32 (ei GM emulointia)" + +#: gui/options.cpp:885 gui/options.cpp:887 +msgid "" +"Check if you want to use your real hardware Roland-compatible sound device " +"connected to your computer" +msgstr "" +"Valitse jos haluat käyttää aitoa Roland-yhteensopivaa laittetta joka on " +"kytketty tietokoneeseesi" + +#: gui/options.cpp:887 +msgctxt "lowres" +msgid "True Roland MT-32 (no GM emulation)" +msgstr "Aito Roland MT-32 (ei GM emulointia)" + +#: gui/options.cpp:890 +#, fuzzy +msgid "Roland GS Mode (disable GM mapping)" +msgstr "Aito Roland MT-32 (ei GM emulointia)" + +#: gui/options.cpp:890 +msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" +msgstr "Poistaa General MIDIn peleistä joissa on Roland MT-32 ääniraita" + +#: gui/options.cpp:899 +msgid "Don't use Roland MT-32 music" +msgstr "Älä käytä Roland MT-32 musiikkia" + +#: gui/options.cpp:926 +msgid "Text and Speech:" +msgstr "Tekstitys ja puhe:" + +#: gui/options.cpp:930 gui/options.cpp:940 +msgid "Speech" +msgstr "Puhe" + +#: gui/options.cpp:931 gui/options.cpp:941 +msgid "Subtitles" +msgstr "Tekstitys" + +#: gui/options.cpp:932 +msgid "Both" +msgstr "Molemmat" + +#: gui/options.cpp:934 +msgid "Subtitle speed:" +msgstr "Tekstin nopeus:" + +#: gui/options.cpp:936 +msgctxt "lowres" +msgid "Text and Speech:" +msgstr "Tekstitys ja puhe:" + +#: gui/options.cpp:940 +msgid "Spch" +msgstr "Puhe" + +#: gui/options.cpp:941 +msgid "Subs" +msgstr "Tekstit" + +#: gui/options.cpp:942 +msgctxt "lowres" +msgid "Both" +msgstr "Molemmat" + +#: gui/options.cpp:942 +msgid "Show subtitles and play speech" +msgstr "Näytä tekstitys ja käytä puhetta" + +#: gui/options.cpp:944 +msgctxt "lowres" +msgid "Subtitle speed:" +msgstr "Tekstin nopeus:" + +#: gui/options.cpp:960 +msgid "Music volume:" +msgstr "Musiikki:" + +#: gui/options.cpp:962 +msgctxt "lowres" +msgid "Music volume:" +msgstr "Musiikki:" + +#: gui/options.cpp:969 +msgid "Mute All" +msgstr "Vaimenna" + +#: gui/options.cpp:972 +msgid "SFX volume:" +msgstr "Ääniefektit:" + +#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975 +msgid "Special sound effects volume" +msgstr "Erikoisefektit" + +#: gui/options.cpp:974 +msgctxt "lowres" +msgid "SFX volume:" +msgstr "Ääniefektit:" + +#: gui/options.cpp:982 +msgid "Speech volume:" +msgstr "Puhe:" + +#: gui/options.cpp:984 +msgctxt "lowres" +msgid "Speech volume:" +msgstr "Puhe:" + +#: gui/options.cpp:1141 +msgid "Theme Path:" +msgstr "Teemojen polku:" + +#: gui/options.cpp:1143 +msgctxt "lowres" +msgid "Theme Path:" +msgstr "Teemojen polku:" + +#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152 +msgid "Specifies path to additional data used by all games or ScummVM" +msgstr "" +"Määrittää polun, jossa on lisätiedostoja joita ScummVM tai kaikki pelit " +"käyttävät" + +#: gui/options.cpp:1158 +msgid "Plugins Path:" +msgstr "Pluginien sijainti:" + +#: gui/options.cpp:1160 +msgctxt "lowres" +msgid "Plugins Path:" +msgstr "Pluginien sijainti:" + +#: gui/options.cpp:1169 +msgid "Misc" +msgstr "Muut" + +#: gui/options.cpp:1171 +msgctxt "lowres" +msgid "Misc" +msgstr "Muut" + +#: gui/options.cpp:1173 +msgid "Theme:" +msgstr "Teema" + +#: gui/options.cpp:1177 +msgid "GUI Renderer:" +msgstr "GUI renderöijä:" + +#: gui/options.cpp:1189 +msgid "Autosave:" +msgstr "Autom. tallennus:" + +#: gui/options.cpp:1191 +msgctxt "lowres" +msgid "Autosave:" +msgstr "Autom. tallennus:" + +#: gui/options.cpp:1199 +msgid "Keys" +msgstr "Näppäimet" + +#: gui/options.cpp:1206 +msgid "GUI Language:" +msgstr "ScummVM:n kieli:" + +#: gui/options.cpp:1206 +msgid "Language of ScummVM GUI" +msgstr "ScummVM käyttöliittymän kieli" + +#: gui/options.cpp:1365 +msgid "You have to restart ScummVM before your changes will take effect." +msgstr "ScummVM pitää käynnistää uudelleen jotta muutokset tulevat voimaan." + +#: gui/options.cpp:1378 +msgid "Select directory for savegames" +msgstr "Valitse hakemisto pelitallennuksille." + +#: gui/options.cpp:1385 +msgid "The chosen directory cannot be written to. Please select another one." +msgstr "Valittuun hakemistoon ei voi kirjoittaa. Valitse toinen hakemisto." + +#: gui/options.cpp:1394 +msgid "Select directory for GUI themes" +msgstr "Valitse hakemisto käyttöliittymän teemoille" + +#: gui/options.cpp:1404 +msgid "Select directory for extra files" +msgstr "Valitse hakemisto lisätiedostoille" + +#: gui/options.cpp:1415 +msgid "Select directory for plugins" +msgstr "Valitse hakemisto plugineille" + +#: gui/options.cpp:1468 +msgid "" +"The theme you selected does not support your current language. If you want " +"to use this theme you need to switch to another language first." +msgstr "" +"Valitsemasi teema ei tue nykyistä valitsemaasi kieltä. Vaihda kieli ensin, " +"ja yritä sitten uudelleen." + +#: gui/saveload-dialog.cpp:166 +msgid "List view" +msgstr "Listanäkymä" + +#: gui/saveload-dialog.cpp:167 +msgid "Grid view" +msgstr "Ruudukkonäkymä" + +#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358 +msgid "No date saved" +msgstr "Päiväystä ei ole tallennettu" + +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359 +msgid "No time saved" +msgstr "Aikaa ei ole tallennettu" + +#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360 +msgid "No playtime saved" +msgstr "Peliaikaa ei ole tallennettu" + +#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275 +msgid "Delete" +msgstr "Poista" + +#: gui/saveload-dialog.cpp:274 +msgid "Do you really want to delete this savegame?" +msgstr "Haluatko varmasti poistaa tämän pelitallennuksen?" + +#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872 +msgid "Date: " +msgstr "Päiväys: " + +#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878 +msgid "Time: " +msgstr "Aika: " + +#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886 +msgid "Playtime: " +msgstr "Peliaika: " + +#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494 +msgid "Untitled savestate" +msgstr "Nimetön pelitallennus" + +#: gui/saveload-dialog.cpp:546 +msgid "Next" +msgstr "Seuraava" + +#: gui/saveload-dialog.cpp:549 +msgid "Prev" +msgstr "Edellinen" + +#: gui/saveload-dialog.cpp:736 +msgid "New Save" +msgstr "Uusi pelitallennus" + +#: gui/saveload-dialog.cpp:736 +msgid "Create a new save game" +msgstr "Luo uusi pelitallennus" + +#: gui/saveload-dialog.cpp:865 +msgid "Name: " +msgstr "Nimi: " + +#: gui/saveload-dialog.cpp:937 +#, c-format +msgid "Enter a description for slot %d:" +msgstr "Anna kuvaus tallennukselle numero %d:" + +#: gui/themebrowser.cpp:44 +msgid "Select a Theme" +msgstr "Valitse teema" + +#: gui/ThemeEngine.cpp:337 +msgid "Disabled GFX" +msgstr "Disabloitu GFX" + +#: gui/ThemeEngine.cpp:337 +msgctxt "lowres" +msgid "Disabled GFX" +msgstr "Disabloitu GFX" + +#: gui/ThemeEngine.cpp:338 +msgid "Standard Renderer (16bpp)" +msgstr "Standardirenderöijä (16 bpp)" + +#: gui/ThemeEngine.cpp:338 +msgid "Standard (16bpp)" +msgstr "Standardi (16 bpp)" + +#: gui/ThemeEngine.cpp:340 +msgid "Antialiased Renderer (16bpp)" +msgstr "Antialiasoitu renderöijä (16 bpp)" + +#: gui/ThemeEngine.cpp:340 +msgid "Antialiased (16bpp)" +msgstr "Antialiasoitu (16 bpp)" + +#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332 +msgid "Clear value" +msgstr "Tyhjennä arvo" + +#: base/main.cpp:210 +#, c-format +msgid "Engine does not support debug level '%s'" +msgstr "Pelimoottori ei tue debug tasoa '%s'" + +#: base/main.cpp:288 +msgid "Menu" +msgstr "Valikko" + +#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45 +#: backends/platform/wince/CEActionsPocket.cpp:45 +#: backends/platform/wince/CEActionsSmartphone.cpp:46 +msgid "Skip" +msgstr "Ohita" + +#: base/main.cpp:294 backends/platform/symbian/src/SymbianActions.cpp:50 +#: backends/platform/wince/CEActionsPocket.cpp:42 +msgid "Pause" +msgstr "Tauko" + +#: base/main.cpp:297 +msgid "Skip line" +msgstr "Ohita rivi" + +#: base/main.cpp:468 +msgid "Error running game:" +msgstr "Virhe ajettaessa peliä:" + +#: base/main.cpp:492 +msgid "Could not find any engine capable of running the selected game" +msgstr "Pelimoottoria joka tukisi valittua peliä ei löytynyt" + +#: common/error.cpp:38 +msgid "No error" +msgstr "Ei virhettä" + +#: common/error.cpp:40 +msgid "Game data not found" +msgstr "Pelin tietoja ei löytynyt" + +#: common/error.cpp:42 +msgid "Game id not supported" +msgstr "Pelin tunniste ei ole tuettu" + +#: common/error.cpp:44 +msgid "Unsupported color mode" +msgstr "Väritilaa ei tueta" + +#: common/error.cpp:47 +msgid "Read permission denied" +msgstr "Lukuoikeuksia ei saatu" + +#: common/error.cpp:49 +msgid "Write permission denied" +msgstr "Kirjoitusoikeuksia ei saatu" + +#: common/error.cpp:52 +msgid "Path does not exist" +msgstr "Polkua ei ole olemassa" + +#: common/error.cpp:54 +msgid "Path not a directory" +msgstr "Polku ei ole hakemisto" + +#: common/error.cpp:56 +msgid "Path not a file" +msgstr "Polku ei ole tiedosto" + +#: common/error.cpp:59 +msgid "Cannot create file" +msgstr "Tiedoston luonti ei onnistu" + +#: common/error.cpp:61 +msgid "Reading data failed" +msgstr "Tiedon lukeminen epäonnistui" + +#: common/error.cpp:63 +msgid "Writing data failed" +msgstr "Tiedon kirjoittaminen epäonnistui" + +#: common/error.cpp:66 +msgid "Could not find suitable engine plugin" +msgstr "Sopivaa pelimoottorin pluginia ei löytynyt" + +#: common/error.cpp:68 +msgid "Engine plugin does not support save states" +msgstr "Pelimoottori ei tue tallennustiloja" + +#: common/error.cpp:71 +msgid "User canceled" +msgstr "Käyttäjä peruutti" + +#: common/error.cpp:75 +msgid "Unknown error" +msgstr "Tuntematon virhe" + +#: engines/advancedDetector.cpp:316 +#, c-format +msgid "The game in '%s' seems to be unknown." +msgstr "Peli hakemistossa '%s' näyttäisi olevan tuntematon." + +#: engines/advancedDetector.cpp:317 +msgid "Please, report the following data to the ScummVM team along with name" +msgstr "" +"Ole hyvä ja ilmoita ScummVM:n kehittäjille seuraavat tiedot, lisäksi kerro" + +#: engines/advancedDetector.cpp:319 +msgid "of the game you tried to add and its version/language/etc.:" +msgstr "" +"mikä peli oli kyseessä, ja sen versio, kieli, ja muut vastaavat tiedot." + +#: engines/dialogs.cpp:84 +msgid "~R~esume" +msgstr "~J~atka" + +#: engines/dialogs.cpp:86 +msgid "~L~oad" +msgstr "~L~ataa" + +#: engines/dialogs.cpp:90 +msgid "~S~ave" +msgstr "~T~allenna" + +#: engines/dialogs.cpp:94 +msgid "~O~ptions" +msgstr "~A~setukset" + +#: engines/dialogs.cpp:99 +msgid "~H~elp" +msgstr "~O~hje" + +#: engines/dialogs.cpp:101 +msgid "~A~bout" +msgstr "~T~ietoa" + +#: engines/dialogs.cpp:104 engines/dialogs.cpp:180 +msgid "~R~eturn to Launcher" +msgstr "Palaa p~e~livalitsimeen" + +#: engines/dialogs.cpp:106 engines/dialogs.cpp:182 +msgctxt "lowres" +msgid "~R~eturn to Launcher" +msgstr "Palaa p~e~livalitsimeen" + +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284 +#: engines/pegasus/pegasus.cpp:369 +msgid "Save game:" +msgstr "Tallenna peli:" + +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:369 +#: backends/platform/symbian/src/SymbianActions.cpp:44 +#: backends/platform/wince/CEActionsPocket.cpp:43 +#: backends/platform/wince/CEActionsPocket.cpp:267 +#: backends/platform/wince/CEActionsSmartphone.cpp:45 +#: backends/platform/wince/CEActionsSmartphone.cpp:231 +msgid "Save" +msgstr "Tallenna" + +#: engines/dialogs.cpp:144 +msgid "" +"Sorry, this engine does not currently provide in-game help. Please consult " +"the README for basic information, and for instructions on how to obtain " +"further assistance." +msgstr "" +"Tämä pelimoottori ei toistaiseksi tue pelin sisäistä ohjetta. Avaa LUEMINUT " +"tiedosto saadaksesi lisätietoa." + +#: engines/dialogs.cpp:228 +#, c-format +msgid "" +"Gamestate save failed (%s)! Please consult the README for basic information, " +"and for instructions on how to obtain further assistance." +msgstr "" +"Pelitilan tallennus epäonnistui (%s)! Avaa LUEMINUT tiedosto saadaksesi " +"lisätietoa." + +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 +#: engines/mohawk/dialogs.cpp:170 +msgid "~O~K" +msgstr "~H~yväksy" + +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 +#: engines/mohawk/dialogs.cpp:171 +msgid "~C~ancel" +msgstr "~P~eruuta" + +#: engines/dialogs.cpp:305 +msgid "~K~eys" +msgstr "~N~äppäimet" + +#: engines/engine.cpp:240 +msgid "Could not initialize color format." +msgstr "Väriformaattia ei voitu alustaa" + +#: engines/engine.cpp:248 +msgid "Could not switch to video mode: '" +msgstr "Videotilan vaihto ei onnistunut:'" + +#: engines/engine.cpp:257 +msgid "Could not apply aspect ratio setting." +msgstr "Kuvasuhdeasetusta ei voitu asettaa." + +#: engines/engine.cpp:262 +msgid "Could not apply fullscreen setting." +msgstr "Kokoruututila-asetusta ei voi asettaa." + +#: engines/engine.cpp:362 +msgid "" +"You appear to be playing this game directly\n" +"from the CD. This is known to cause problems,\n" +"and it is therefore recommended that you copy\n" +"the data files to your hard disk instead.\n" +"See the README file for details." +msgstr "" +"Pelaat suoraan CD-levyltä. Tämä aiheuttaa\n" +"ongelmia, joten on suositeltavaa että kopioit\n" +"pelin tiedostot kovalevyllesi. Avaa LUEMINUT\n" +"tiedosto ohjeita varten." + +#: engines/engine.cpp:373 +msgid "" +"This game has audio tracks in its disk. These\n" +"tracks need to be ripped from the disk using\n" +"an appropriate CD audio extracting tool in\n" +"order to listen to the game's music.\n" +"See the README file for details." +msgstr "" +"Pelin musiikki on CD-levyllä ääniraitoina.\n" +"Raidat pitää ripata levyltä sopivaa\n" +"ohjelmistoa käyttäen, jotta musiikit\n" +"kuuluvat. Lue ohjeet LUEMINUT tiedostosta." + +#: engines/engine.cpp:431 +#, c-format +msgid "" +"Gamestate load failed (%s)! Please consult the README for basic information, " +"and for instructions on how to obtain further assistance." +msgstr "" +"Pelitilan lataus epäonnistui (%s)! Avaa LUEMINUT tiedosto saadaksesi " +"lisätietoa." + +#: engines/engine.cpp:444 +msgid "" +"WARNING: The game you are about to start is not yet fully supported by " +"ScummVM. As such, it is likely to be unstable, and any saves you make might " +"not work in future versions of ScummVM." +msgstr "" +"VAROITUS: ScummVM ei vielä tue täysin valitsemaasi peliä. Peli saattaa olla " +"epävakaa, eivätkä pelitallennukset välttämättä toimi tulevissa ScummVM:n " +"versioissa." + +#: engines/engine.cpp:447 +msgid "Start anyway" +msgstr "Pelaa silti" + +#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270 +#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393 +#: engines/toltecs/detection.cpp:173 +msgid "Use original save/load screens" +msgstr "Käytä alkuperäisiä tallenna/lataa valikkoja" + +#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271 +#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394 +#: engines/toltecs/detection.cpp:174 +msgid "Use the original save/load screens, instead of the ScummVM ones" +msgstr "Käytä alkuperäisiä tallenna/lataa valikkoja, ScummVM valikoiden sijaan" + +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 +msgid "Restore game:" +msgstr "Lataa pelitallenne:" + +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 +msgid "Restore" +msgstr "Lataa tallenne" + +#: engines/drascula/saveload.cpp:49 +#, fuzzy +msgid "" +"ScummVM found that you have old savefiles for Drascula that should be " +"converted.\n" +"The old save game format is no longer supported, so you will not be able to " +"load your games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" +msgstr "" +"Broken Sword 1:n pelitallennukset ovat vanhassa formaatissa. Tallennukset " +"tulee muuntaa,\n" +"jotta niitä voi käyttää ScummVM:ssä. Paina 'Hyväksy' muuntaaksesi tiedostot. " +"Mikäli et halua muuntaa tiedostoja nyt\n" +"ScummVM kysyy asiaa seuraavan kerran kun käynnistät pelin.\n" + +#: engines/dreamweb/detection.cpp:57 +msgid "Use bright palette mode" +msgstr "Käytä kirkaspalettitilaa" + +#: engines/dreamweb/detection.cpp:58 +msgid "Display graphics using the game's bright palette" +msgstr "Näytä grafiikat käyttäen pelin kirkasta palettia" + +#: engines/sci/detection.cpp:373 +msgid "EGA undithering" +msgstr "EGA unditteröinti" + +#: engines/sci/detection.cpp:374 +msgid "Enable undithering in EGA games" +msgstr "Käytä unditteröintiä EGA peleissä" + +#: engines/sci/detection.cpp:383 +msgid "Prefer digital sound effects" +msgstr "Käytä mieluiten digitaalisia äänitehosteita." + +#: engines/sci/detection.cpp:384 +msgid "Prefer digital sound effects instead of synthesized ones" +msgstr "" +"Käytä mieluiten digitaalisia äänitehosteita synteettisten tehosteiden sijaan." + +#: engines/sci/detection.cpp:403 +msgid "Use IMF/Yamaha FB-01 for MIDI output" +msgstr "Käytä IMF/Yamaha FB-01:stä MIDI-musiikille" + +#: engines/sci/detection.cpp:404 +msgid "" +"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " +"output" +msgstr "" +"Käytä IBM:n Music Feature korttia, tai Yamaha FB-01 FM moduulia MIDIlle" + +#: engines/sci/detection.cpp:414 +msgid "Use CD audio" +msgstr "Käytä CD:n ääntä" + +#: engines/sci/detection.cpp:415 +msgid "Use CD audio instead of in-game audio, if available" +msgstr "Käytä CD:n audiota pelin audion sijaan, jos mahdollista." + +#: engines/sci/detection.cpp:425 +msgid "Use Windows cursors" +msgstr "Käytä Windowsin kursoreita" + +#: engines/sci/detection.cpp:426 +msgid "" +"Use the Windows cursors (smaller and monochrome) instead of the DOS ones" +msgstr "" +"Käytä Windowsin kursoreita (pienempiä ja harmaasävyisiä) DOS kursorien sijaan" + +#: engines/sci/detection.cpp:436 +msgid "Use silver cursors" +msgstr "Käytä hopeisia kursoreita" + +#: engines/sci/detection.cpp:437 +msgid "" +"Use the alternate set of silver cursors, instead of the normal golden ones" +msgstr "Käytä vaihtoehtoisia hopeisia kursoreita normaalien kultaisten sijaan" + +#: engines/scumm/dialogs.cpp:175 +#, c-format +msgid "Insert Disk %c and Press Button to Continue." +msgstr "Lisää levyke %c ja paina jotain nappia jatkaaksesi." + +#: engines/scumm/dialogs.cpp:176 +#, c-format +msgid "Unable to Find %s, (%c%d) Press Button." +msgstr "Tiedosto %s, (%c%d) ei löydy. Paina nappia." + +#: engines/scumm/dialogs.cpp:177 +#, c-format +msgid "Error reading disk %c, (%c%d) Press Button." +msgstr "Virhe luettaessa levyä %c, (%c%d) Paina jotain nappia." + +#: engines/scumm/dialogs.cpp:178 +msgid "Game Paused. Press SPACE to Continue." +msgstr "Pause. Paina välilyöntiä jatkaaksesi." + +#. I18N: You may specify 'Yes' symbol at the end of the line, like this: +#. "Moechten Sie wirklich neu starten? (J/N)J" +#. Will react to J as 'Yes' +#: engines/scumm/dialogs.cpp:182 +msgid "Are you sure you want to restart? (Y/N)" +msgstr "Haluatko varmasti aloittaa pelin alusta? (K/E)K" + +#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment +#: engines/scumm/dialogs.cpp:184 +msgid "Are you sure you want to quit? (Y/N)" +msgstr "Haluatko varmati lopettaa?" + +#: engines/scumm/dialogs.cpp:189 +msgid "Play" +msgstr "Pelaa" + +#: engines/scumm/dialogs.cpp:191 engines/scumm/help.cpp:82 +#: engines/scumm/help.cpp:84 +#: backends/platform/symbian/src/SymbianActions.cpp:52 +#: backends/platform/wince/CEActionsPocket.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:52 +#: backends/events/default/default-events.cpp:213 +msgid "Quit" +msgstr "Lopeta" + +#: engines/scumm/dialogs.cpp:193 +msgid "Insert save/load game disk" +msgstr "Laita tallennus/lataus levy asemaan" + +#: engines/scumm/dialogs.cpp:194 +msgid "You must enter a name" +msgstr "Nimi on pakko antaa" + +#: engines/scumm/dialogs.cpp:195 +msgid "The game was NOT saved (disk full?)" +msgstr "Peliä EI tallennettu (onko levy täysi?)" + +#: engines/scumm/dialogs.cpp:196 +msgid "The game was NOT loaded" +msgstr "Peliä EI ladattu" + +#: engines/scumm/dialogs.cpp:197 +#, c-format +msgid "Saving '%s'" +msgstr "Tallennetaan '%s'" + +#: engines/scumm/dialogs.cpp:198 +#, c-format +msgid "Loading '%s'" +msgstr "Ladataan '%s'" + +#: engines/scumm/dialogs.cpp:199 +msgid "Name your SAVE game" +msgstr "Nimeä pelitallenteesi" + +#: engines/scumm/dialogs.cpp:200 +msgid "Select a game to LOAD" +msgstr "Valitse ladattava peli" + +#: engines/scumm/dialogs.cpp:201 +msgid "Game title)" +msgstr "Pelin nimi" + +#. I18N: Previous page button +#: engines/scumm/dialogs.cpp:287 +msgid "~P~revious" +msgstr "E~d~ellinen" + +#. I18N: Next page button +#: engines/scumm/dialogs.cpp:289 +msgid "~N~ext" +msgstr "Se~u~raava" + +#: engines/scumm/dialogs.cpp:290 +#: backends/platform/ds/arm9/source/dsoptions.cpp:56 +msgid "~C~lose" +msgstr "~S~ulje" + +#: engines/scumm/dialogs.cpp:597 +msgid "Speech Only" +msgstr "Vain puhe" + +#: engines/scumm/dialogs.cpp:598 +msgid "Speech and Subtitles" +msgstr "Puhe ja Tekstitys" + +#: engines/scumm/dialogs.cpp:599 +msgid "Subtitles Only" +msgstr "Vain tekstitys" + +#: engines/scumm/dialogs.cpp:607 +msgctxt "lowres" +msgid "Speech & Subs" +msgstr "Puhe & teksti" + +#: engines/scumm/dialogs.cpp:653 +msgid "Select a Proficiency Level." +msgstr "Valitse taitotasosi." + +#: engines/scumm/dialogs.cpp:655 +msgid "Refer to your Loom(TM) manual for help." +msgstr "Lue Loom(TM) ohjekirjaa saadaksesi ohjeita." + +#: engines/scumm/dialogs.cpp:658 +msgid "Standard" +msgstr "Standardi" + +#: engines/scumm/dialogs.cpp:659 +msgid "Practice" +msgstr "Harjoitus" + +#: engines/scumm/dialogs.cpp:660 +msgid "Expert" +msgstr "Ekspertti" + +#: engines/scumm/help.cpp:73 +msgid "Common keyboard commands:" +msgstr "Yleisiä näppäimistökomentoja:" + +#: engines/scumm/help.cpp:74 +msgid "Save / Load dialog" +msgstr "Tallenna / Lataa peli" + +#: engines/scumm/help.cpp:76 +msgid "Skip line of text" +msgstr "Ohita rivi tekstiä" + +#: engines/scumm/help.cpp:77 +msgid "Esc" +msgstr "Esc" + +#: engines/scumm/help.cpp:77 +msgid "Skip cutscene" +msgstr "Ohita video" + +#: engines/scumm/help.cpp:78 +msgid "Space" +msgstr "Välilyönti" + +#: engines/scumm/help.cpp:78 +msgid "Pause game" +msgstr "Pause" + +#: engines/scumm/help.cpp:79 engines/scumm/help.cpp:84 +#: engines/scumm/help.cpp:95 engines/scumm/help.cpp:96 +#: engines/scumm/help.cpp:97 engines/scumm/help.cpp:98 +#: engines/scumm/help.cpp:99 engines/scumm/help.cpp:100 +#: engines/scumm/help.cpp:101 engines/scumm/help.cpp:102 +msgid "Ctrl" +msgstr "Ctrl" + +#: engines/scumm/help.cpp:79 +msgid "Load game state 1-10" +msgstr "Lataa pelitila 1-10" + +#: engines/scumm/help.cpp:80 engines/scumm/help.cpp:84 +#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:100 +#: engines/scumm/help.cpp:101 engines/scumm/help.cpp:102 +msgid "Alt" +msgstr "Alt" + +#: engines/scumm/help.cpp:80 +msgid "Save game state 1-10" +msgstr "Tallenna pelitila 1-10" + +#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89 +msgid "Enter" +msgstr "Enter" + +#: engines/scumm/help.cpp:86 +msgid "Toggle fullscreen" +msgstr "Kytke kokoruututila päälle tai pois" + +#: engines/scumm/help.cpp:87 +msgid "Music volume up / down" +msgstr "Musiikin äänenvoimakkuus ylös / alas" + +#: engines/scumm/help.cpp:88 +msgid "Text speed slower / faster" +msgstr "Hidasta/nopeuta tekstiä" + +#: engines/scumm/help.cpp:89 +msgid "Simulate left mouse button" +msgstr "Simuloi hiiren vasenta näppäintä" + +#: engines/scumm/help.cpp:90 +msgid "Tab" +msgstr "Sarkain" + +#: engines/scumm/help.cpp:90 +msgid "Simulate right mouse button" +msgstr "Simuloi oikeaa hiiren nappia" + +#: engines/scumm/help.cpp:93 +msgid "Special keyboard commands:" +msgstr "Erityiskomennot:" + +#: engines/scumm/help.cpp:94 +msgid "Show / Hide console" +msgstr "Näytä / piilota konsoli" + +#: engines/scumm/help.cpp:95 +msgid "Start the debugger" +msgstr "Käynnistä debuggeri" + +#: engines/scumm/help.cpp:96 +msgid "Show memory consumption" +msgstr "Näytä muistinkulutus" + +#: engines/scumm/help.cpp:97 +msgid "Run in fast mode (*)" +msgstr "Aja nopeassa tilassa (*)" + +#: engines/scumm/help.cpp:98 +msgid "Run in really fast mode (*)" +msgstr "Aja erittäin nopeassa tilassa (*)" + +#: engines/scumm/help.cpp:99 +msgid "Toggle mouse capture" +msgstr "Kytke hiiren kaappaus päälle tai pois" + +#: engines/scumm/help.cpp:100 +msgid "Switch between graphics filters" +msgstr "Vaihda grafiikkafiltteriä" + +#: engines/scumm/help.cpp:101 +msgid "Increase / Decrease scale factor" +msgstr "Kasvata / vähennä skaalakerrointa" + +#: engines/scumm/help.cpp:102 +msgid "Toggle aspect-ratio correction" +msgstr "Kytke kuvasuhdekorjaus päälle tai pois" + +#: engines/scumm/help.cpp:107 +msgid "* Note that using ctrl-f and" +msgstr "* Huomaa että ctrl-f ja" + +#: engines/scumm/help.cpp:108 +msgid " ctrl-g are not recommended" +msgstr " ctrl-g ovat epävakaita eikä" + +#: engines/scumm/help.cpp:109 +msgid " since they may cause crashes" +msgstr " niiden käyttöä suositella" + +#: engines/scumm/help.cpp:110 +msgid " or incorrect game behavior." +msgstr " mahdollisten virheiden vuoksi." + +#: engines/scumm/help.cpp:114 +msgid "Spinning drafts on the keyboard:" +msgstr "" + +#: engines/scumm/help.cpp:116 +msgid "Main game controls:" +msgstr "Pelin tärkeimmät kontrollit:" + +#: engines/scumm/help.cpp:121 engines/scumm/help.cpp:136 +#: engines/scumm/help.cpp:161 +msgid "Push" +msgstr "Paina" + +#: engines/scumm/help.cpp:122 engines/scumm/help.cpp:137 +#: engines/scumm/help.cpp:162 +msgid "Pull" +msgstr "Vedä" + +#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138 +#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197 +#: engines/scumm/help.cpp:207 +msgid "Give" +msgstr "Anna" + +#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139 +#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190 +#: engines/scumm/help.cpp:208 +msgid "Open" +msgstr "Avaa" + +#: engines/scumm/help.cpp:126 +msgid "Go to" +msgstr "Mene" + +#: engines/scumm/help.cpp:127 +msgid "Get" +msgstr "Ota" + +#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152 +#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:198 +#: engines/scumm/help.cpp:213 engines/scumm/help.cpp:224 +#: engines/scumm/help.cpp:250 +msgid "Use" +msgstr "Käytä" + +#: engines/scumm/help.cpp:129 engines/scumm/help.cpp:141 +msgid "Read" +msgstr "Lue" + +#: engines/scumm/help.cpp:130 engines/scumm/help.cpp:147 +msgid "New kid" +msgstr "Uusi lapsi" + +#: engines/scumm/help.cpp:131 engines/scumm/help.cpp:153 +#: engines/scumm/help.cpp:171 +msgid "Turn on" +msgstr "Käynnistä" + +#: engines/scumm/help.cpp:132 engines/scumm/help.cpp:154 +#: engines/scumm/help.cpp:172 +msgid "Turn off" +msgstr "Sammuta" + +#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167 +#: engines/scumm/help.cpp:194 +msgid "Walk to" +msgstr "Kävele" + +#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168 +#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210 +#: engines/scumm/help.cpp:227 +msgid "Pick up" +msgstr "Ota" + +#: engines/scumm/help.cpp:144 engines/scumm/help.cpp:169 +msgid "What is" +msgstr "Mitä on" + +#: engines/scumm/help.cpp:146 +msgid "Unlock" +msgstr "Avaa lukko" + +#: engines/scumm/help.cpp:149 +msgid "Put on" +msgstr "Pue ylle" + +#: engines/scumm/help.cpp:150 +msgid "Take off" +msgstr "Lähde matkaan" + +#: engines/scumm/help.cpp:156 +msgid "Fix" +msgstr "Korjaa" + +#: engines/scumm/help.cpp:158 +msgid "Switch" +msgstr "Vaihda" + +#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228 +msgid "Look" +msgstr "Katso" + +#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223 +msgid "Talk" +msgstr "Puhu" + +#: engines/scumm/help.cpp:174 +msgid "Travel" +msgstr "Matkusta" + +#: engines/scumm/help.cpp:175 +msgid "To Henry / To Indy" +msgstr "Henry / Indy" + +#. I18N: These are different musical notes +#: engines/scumm/help.cpp:179 +msgid "play C minor on distaff" +msgstr "soita C molli" + +#: engines/scumm/help.cpp:180 +msgid "play D on distaff" +msgstr "soita D" + +#: engines/scumm/help.cpp:181 +msgid "play E on distaff" +msgstr "soita E" + +#: engines/scumm/help.cpp:182 +msgid "play F on distaff" +msgstr "soita F" + +#: engines/scumm/help.cpp:183 +msgid "play G on distaff" +msgstr "soita G" + +#: engines/scumm/help.cpp:184 +msgid "play A on distaff" +msgstr "soita A" + +#: engines/scumm/help.cpp:185 +msgid "play B on distaff" +msgstr "soita B" + +#: engines/scumm/help.cpp:186 +msgid "play C major on distaff" +msgstr "soita C duuri" + +#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214 +msgid "puSh" +msgstr "Paina" + +#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215 +msgid "pull (Yank)" +msgstr "Vedä" + +#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212 +#: engines/scumm/help.cpp:248 +msgid "Talk to" +msgstr "Puhu" + +#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211 +msgid "Look at" +msgstr "Katso" + +#: engines/scumm/help.cpp:200 +msgid "turn oN" +msgstr "Kytke päälle" + +#: engines/scumm/help.cpp:201 +msgid "turn oFf" +msgstr "Kytke pois päältä" + +#: engines/scumm/help.cpp:217 +msgid "KeyUp" +msgstr "KeyUp" + +#: engines/scumm/help.cpp:217 +msgid "Highlight prev dialogue" +msgstr "Korosta edellistä dialogia" + +#: engines/scumm/help.cpp:218 +msgid "KeyDown" +msgstr "KeyDown" + +#: engines/scumm/help.cpp:218 +msgid "Highlight next dialogue" +msgstr "Korosta seuraavaa dialogia" + +#: engines/scumm/help.cpp:222 +msgid "Walk" +msgstr "Kävele" + +#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234 +#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249 +msgid "Inventory" +msgstr "Tavarat" + +#: engines/scumm/help.cpp:226 +msgid "Object" +msgstr "Esine" + +#: engines/scumm/help.cpp:229 +msgid "Black and White / Color" +msgstr "Mustavalko / Väri" + +#: engines/scumm/help.cpp:232 +msgid "Eyes" +msgstr "Silmät" + +#: engines/scumm/help.cpp:233 +msgid "Tongue" +msgstr "Kieli" + +#: engines/scumm/help.cpp:235 +msgid "Punch" +msgstr "Lyö" + +#: engines/scumm/help.cpp:236 +msgid "Kick" +msgstr "Potkaise" + +#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247 +msgid "Examine" +msgstr "Tutki" + +#: engines/scumm/help.cpp:240 +msgid "Regular cursor" +msgstr "Tavallinen kursori" + +#. I18N: Comm is a communication device +#: engines/scumm/help.cpp:243 +msgid "Comm" +msgstr "Kommunikointilaite" + +#: engines/scumm/help.cpp:246 +msgid "Save / Load / Options" +msgstr "Tallenna / Lataa / Asetukset" + +#: engines/scumm/help.cpp:255 +msgid "Other game controls:" +msgstr "Muut pelin ohjaimet:" + +#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267 +msgid "Inventory:" +msgstr "Tavarat:" + +#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274 +msgid "Scroll list up" +msgstr "Vieritä listaa ylös" + +#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275 +msgid "Scroll list down" +msgstr "Vieritä listaa alas" + +#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268 +msgid "Upper left item" +msgstr "" + +#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270 +msgid "Lower left item" +msgstr "" + +#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271 +msgid "Upper right item" +msgstr "" + +#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273 +msgid "Lower right item" +msgstr "" + +#: engines/scumm/help.cpp:269 +msgid "Middle left item" +msgstr "" + +#: engines/scumm/help.cpp:272 +msgid "Middle right item" +msgstr "" + +#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284 +msgid "Switching characters:" +msgstr "Vaihda hahmoa:" + +#: engines/scumm/help.cpp:281 +msgid "Second kid" +msgstr "Toinen lapsi" + +#: engines/scumm/help.cpp:282 +msgid "Third kid" +msgstr "Kolmas lapsi" + +#: engines/scumm/help.cpp:294 +msgid "Fighting controls (numpad):" +msgstr "Tappeluohjaimet (numpad)" + +#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296 +#: engines/scumm/help.cpp:297 +msgid "Step back" +msgstr "Astu taakse" + +#: engines/scumm/help.cpp:298 +msgid "Block high" +msgstr "Torju korkea" + +#: engines/scumm/help.cpp:299 +msgid "Block middle" +msgstr "Torju keskeltä" + +#: engines/scumm/help.cpp:300 +msgid "Block low" +msgstr "Torju alhaalta" + +#: engines/scumm/help.cpp:301 +msgid "Punch high" +msgstr "Lyö ylös" + +#: engines/scumm/help.cpp:302 +msgid "Punch middle" +msgstr "Lyö keskelle" + +#: engines/scumm/help.cpp:303 +msgid "Punch low" +msgstr "Lyö alas" + +#: engines/scumm/help.cpp:306 +msgid "These are for Indy on left." +msgstr "Nämä ovat Indylle vasemmalla." + +#: engines/scumm/help.cpp:307 +msgid "When Indy is on the right," +msgstr "Kun Indy on oikealla, " + +#: engines/scumm/help.cpp:308 +msgid "7, 4, and 1 are switched with" +msgstr "7, 4 ja 1 vaihdetaan näppäinten" + +#: engines/scumm/help.cpp:309 +msgid "9, 6, and 3, respectively." +msgstr "9, 6 ja 3 kanssa." + +#: engines/scumm/help.cpp:316 +msgid "Biplane controls (numpad):" +msgstr "Koneen ohjaimet (numpad):" + +#: engines/scumm/help.cpp:317 +msgid "Fly to upper left" +msgstr "Lennä ylös vasemmalle" + +#: engines/scumm/help.cpp:318 +msgid "Fly to left" +msgstr "Lennä vasemmalle" + +#: engines/scumm/help.cpp:319 +msgid "Fly to lower left" +msgstr "Lennä alas vasemmalle" + +#: engines/scumm/help.cpp:320 +msgid "Fly upwards" +msgstr "Lennä ylöspäin" + +#: engines/scumm/help.cpp:321 +msgid "Fly straight" +msgstr "Lennä suoraan" + +#: engines/scumm/help.cpp:322 +msgid "Fly down" +msgstr "Lennä alas" + +#: engines/scumm/help.cpp:323 +msgid "Fly to upper right" +msgstr "Lennä ylös oikealle" + +#: engines/scumm/help.cpp:324 +msgid "Fly to right" +msgstr "Lennä oikealle" + +#: engines/scumm/help.cpp:325 +msgid "Fly to lower right" +msgstr "Lennä alas oikealle" + +#: engines/scumm/scumm.cpp:1776 +#, c-format +msgid "" +"Native MIDI support requires the Roland Upgrade from LucasArts,\n" +"but %s is missing. Using AdLib instead." +msgstr "" +"Suora MIDI tuki vaatii Roland päivityksen LucasArtsilta, mutta\n" +"%s puuttuu. Käytetään AdLibia sen sijaan." + +#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220 +#, c-format +msgid "" +"Failed to save game state to file:\n" +"\n" +"%s" +msgstr "" +"Pelitilan tallennus ei onnistunut tiedostoon:\n" +"\n" +"%s" + +#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185 +#, c-format +msgid "" +"Failed to load game state from file:\n" +"\n" +"%s" +msgstr "" +"Pelitilan lataus ei onnistunut tiedostosta:\n" +"\n" +"%s" + +#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228 +#, c-format +msgid "" +"Successfully saved game state in file:\n" +"\n" +"%s" +msgstr "" +"Pelitilan tallennus onnistui tiedostoon:\n" +"\n" +"%s" + +#: engines/scumm/scumm.cpp:2537 +msgid "" +"Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " +"play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " +"directory inside the Tentacle game directory." +msgstr "" +"Maniac Mansionin pitäisi nyt käynnistyä, mutta ScummVM ei tue sitä vielä. " +"Pelataksesi Maniac Mansionia, mene ScummVM:n päävalikkoon ja paina 'Lisää " +"peli'. Valitse 'Maniac' hakemisto Tentacle hakemiston sisältä." + +#. I18N: Option for fast scene switching +#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167 +msgid "~Z~ip Mode Activated" +msgstr "~Z~ip moodi valittu" + +#: engines/mohawk/dialogs.cpp:93 +msgid "~T~ransitions Enabled" +msgstr "Siirtymät päällä" + +#. I18N: Drop book page +#: engines/mohawk/dialogs.cpp:95 +msgid "~D~rop Page" +msgstr "Pudota sivu" + +#: engines/mohawk/dialogs.cpp:99 +msgid "~S~how Map" +msgstr "Näytä kartta" + +#: engines/mohawk/dialogs.cpp:105 +msgid "~M~ain Menu" +msgstr "Päävalikko" + +#: engines/mohawk/dialogs.cpp:168 +msgid "~W~ater Effect Enabled" +msgstr "Vesiefekti päällä" + +#: engines/agos/animation.cpp:557 +#, c-format +msgid "Cutscene file '%s' not found!" +msgstr "Videotiedostoa '%s' ei löytynyt!" + +#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 +#: engines/tinsel/saveload.cpp:532 +msgid "Failed to load game state from file." +msgstr "Pelitallenteen lataaminen tiedostosta epäonnistui." + +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545 +msgid "Failed to save game state to file." +msgstr "Pelin tallentaminen tiedostoon epäonnistui." + +#: engines/gob/inter_v5.cpp:107 +msgid "Failed to delete file." +msgstr "Tiedoston tuhoaminen ei onnistunut." + +#: engines/groovie/detection.cpp:312 +#, fuzzy +msgid "Fast movie speed" +msgstr "Nopea moodi" + +#: engines/groovie/detection.cpp:313 +msgid "Play movies at an increased speed" +msgstr "" + +#: engines/groovie/script.cpp:420 +msgid "Failed to save game" +msgstr "Pelin tallentaminen epäonnistui." + +#. I18N: Studio audience adds an applause and cheering sounds whenever +#. Malcolm makes a joke. +#: engines/kyra/detection.cpp:62 +msgid "Studio audience" +msgstr "Studioyleisö" + +#: engines/kyra/detection.cpp:63 +msgid "Enable studio audience" +msgstr "Studioyleisö päälle" + +#. I18N: This option allows the user to skip text and cutscenes. +#: engines/kyra/detection.cpp:73 +msgid "Skip support" +msgstr "Ohita tuki" + +#: engines/kyra/detection.cpp:74 +msgid "Allow text and cutscenes to be skipped" +msgstr "Salli tekstin ja videoiden ohittaminen" + +#. I18N: Helium mode makes people sound like they've inhaled Helium. +#: engines/kyra/detection.cpp:84 +msgid "Helium mode" +msgstr "Helium moodi" + +#: engines/kyra/detection.cpp:85 +msgid "Enable helium mode" +msgstr "Käytä helium moodia" + +#. I18N: When enabled, this option makes scrolling smoother when +#. changing from one screen to another. +#: engines/kyra/detection.cpp:99 +msgid "Smooth scrolling" +msgstr "Pehmeä vieritys" + +#: engines/kyra/detection.cpp:100 +msgid "Enable smooth scrolling when walking" +msgstr "Käytä pehmeää vieritystä kävellessä" + +#. I18N: When enabled, this option changes the cursor when it floats to the +#. edge of the screen to a directional arrow. The player can then click to +#. walk towards that direction. +#: engines/kyra/detection.cpp:112 +msgid "Floating cursors" +msgstr "Leijuva kursori" + +#: engines/kyra/detection.cpp:113 +msgid "Enable floating cursors" +msgstr "Käytä leijuvia kursoreita" + +#. I18N: HP stands for Hit Points +#: engines/kyra/detection.cpp:127 +msgid "HP bar graphs" +msgstr "Kestopisteet (HP) graafisina palkkeina" + +#: engines/kyra/detection.cpp:128 +msgid "Enable hit point bar graphs" +msgstr "Käytä kestopisteissä värillisiä grafiikkapalkkeja numeroiden sijaan" + +#: engines/kyra/lol.cpp:478 +msgid "Attack 1" +msgstr "Hyökkäys 1" + +#: engines/kyra/lol.cpp:479 +msgid "Attack 2" +msgstr "Hyökkäys 2" + +#: engines/kyra/lol.cpp:480 +msgid "Attack 3" +msgstr "Hyökkäys 3" + +#: engines/kyra/lol.cpp:481 +msgid "Move Forward" +msgstr "Liiku eteenpäin" + +#: engines/kyra/lol.cpp:482 +msgid "Move Back" +msgstr "Liiku taaksepäin" + +#: engines/kyra/lol.cpp:483 +msgid "Slide Left" +msgstr "Liiku vasemmalle" + +#: engines/kyra/lol.cpp:484 +msgid "Slide Right" +msgstr "Liiku oikealle" + +#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2412 +msgid "Turn Left" +msgstr "Käänny vasemmalle" + +#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2413 +msgid "Turn Right" +msgstr "Käänny oikealle" + +#: engines/kyra/lol.cpp:487 +msgid "Rest" +msgstr "Lepää" + +#: engines/kyra/lol.cpp:488 +msgid "Options" +msgstr "Asetukset" + +#: engines/kyra/lol.cpp:489 +msgid "Choose Spell" +msgstr "Valitse loitsu" + +#: engines/kyra/sound_midi.cpp:477 +msgid "" +"You appear to be using a General MIDI device,\n" +"but your game only supports Roland MT32 MIDI.\n" +"We try to map the Roland MT32 instruments to\n" +"General MIDI ones. It is still possible that\n" +"some tracks sound incorrect." +msgstr "" +"Käytät General MIDI-äänilaitetta, mutta peli\n" +"tukee vain Roland MT-32:sta. Jotkut ääniraidat\n" +"eivät ehkä kuulosta siltä miltä niiden pitäisi." + +#: engines/queen/queen.cpp:59 +msgid "Alternative intro" +msgstr "Vaihtoehtoinen intro" + +#: engines/queen/queen.cpp:60 +msgid "Use an alternative game intro (CD version only)" +msgstr "Käytä vaihtoehtoista pelin introa (vain CD versiossa)" + +#: engines/sky/compact.cpp:130 +msgid "" +"Unable to find \"sky.cpt\" file!\n" +"Please download it from www.scummvm.org" +msgstr "" +"Tiedostoa \"sky.cpt\" ei löydy!\n" +"Hae se ScummVM:n verkkosivulta." + +#: engines/sky/compact.cpp:141 +msgid "" +"The \"sky.cpt\" file has an incorrect size.\n" +"Please (re)download it from www.scummvm.org" +msgstr "" +"Tiedosto \"sky.cpt\" on väärän kokoinen.\n" +"Hae uusi versio ScummVM:n verkkosivuilta." + +#: engines/sky/detection.cpp:44 +msgid "Floppy intro" +msgstr "Levykeversion intro" + +#: engines/sky/detection.cpp:45 +msgid "Use the floppy version's intro (CD version only)" +msgstr "Käytä levykeversion introa (vain CD versiossa)" + +#: engines/sword1/animation.cpp:519 +#, c-format +msgid "PSX stream cutscene '%s' cannot be played in paletted mode" +msgstr "PSX stream videota '%s' ei voi näyttää paletisoidussa tilassa" + +#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439 +msgid "DXA cutscenes found but ScummVM has been built without zlib support" +msgstr "" +"DXA videotiedostoja löydettiin mutta ScummVM on käännetty ilman zlib-tukea" + +#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449 +msgid "MPEG2 cutscenes are no longer supported" +msgstr "MPEG2 videotiedostoja ei enää tueta" + +#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457 +#, c-format +msgid "Cutscene '%s' not found" +msgstr "Videotiedosto '%s' ei löytynyt" + +#: engines/sword1/control.cpp:865 +msgid "" +"ScummVM found that you have old savefiles for Broken Sword 1 that should be " +"converted.\n" +"The old save game format is no longer supported, so you will not be able to " +"load your games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" +msgstr "" +"Broken Sword 1:n pelitallennukset ovat vanhassa formaatissa. Tallennukset " +"tulee muuntaa,\n" +"jotta niitä voi käyttää ScummVM:ssä. Paina 'Hyväksy' muuntaaksesi tiedostot. " +"Mikäli et halua muuntaa tiedostoja nyt\n" +"ScummVM kysyy asiaa seuraavan kerran kun käynnistät pelin.\n" + +#: engines/sword1/control.cpp:1234 +#, c-format +msgid "" +"Target new save game already exists!\n" +"Would you like to keep the old save game (%s) or the new one (%s)?\n" +msgstr "" +"Kohdetiedosto on jo olemassa!\n" +"Säilytetäänkö vanha pelitallennus (%s), vai uusi pelitallennus (%s)?\n" + +#: engines/sword1/control.cpp:1237 +msgid "Keep the old one" +msgstr "Säilytä vanha tallennus" + +#: engines/sword1/control.cpp:1237 +msgid "Keep the new one" +msgstr "Säilytä uusi tallennus" + +#: engines/sword1/logic.cpp:1633 +msgid "This is the end of the Broken Sword 1 Demo" +msgstr "Broken Sword 1:n demo päättyy tähän" + +#: engines/sword2/animation.cpp:419 +msgid "" +"PSX cutscenes found but ScummVM has been built without RGB color support" +msgstr "PSX videoita löydetty, mutta ScummVM on käännetty ilman RGB tukea" + +#: engines/sword2/sword2.cpp:79 +msgid "Show object labels" +msgstr "Näytä esineiden tiedot" + +#: engines/sword2/sword2.cpp:80 +msgid "Show labels for objects on mouse hover" +msgstr "Näytä esineiden kuvaus kohdistaessasi kursorin esineen ylle" + +#: engines/teenagent/resources.cpp:94 +msgid "" +"You're missing the 'teenagent.dat' file. Get it from the ScummVM website" +msgstr "" +"Asennuksestasi puuttuu 'teenagent.dat' tiedosto. Hae se ScummVM:n " +"nettisivuilta" + +#: engines/teenagent/resources.cpp:115 +msgid "" +"The teenagent.dat file is compressed and zlib hasn't been included in this " +"executable. Please decompress it" +msgstr "" +"Tiedosto teenagent.dat on pakattu, mutta zlib-kirjastoa ei ole käännetty " +"ScummVM:ään. Pura teenagent.dat." + +#: engines/parallaction/saveload.cpp:133 +#, c-format +msgid "" +"Can't save game in slot %i\n" +"\n" +msgstr "" +"Pelin tallennus kohtaan ei onnistunut kohtaan %i\n" +"\n" + +#: engines/parallaction/saveload.cpp:204 +msgid "Loading game..." +msgstr "Ladataan peliä..." + +#: engines/parallaction/saveload.cpp:219 +msgid "Saving game..." +msgstr "Tallennetaan peliä..." + +#: engines/parallaction/saveload.cpp:272 +msgid "" +"ScummVM found that you have old savefiles for Nippon Safes that should be " +"renamed.\n" +"The old names are no longer supported, so you will not be able to load your " +"games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked next time.\n" +msgstr "" +"Pelin Nippon Safes tallennukset ovat vanhassa muodossa, joita ei enää tueta. " +"Tallennukset\n" +"tulee nimetä uudelleen ennen kuin ScummVM voi käyttää niitä. Paina 'Hyväksy' " +"muuntaaksesi tallennukset.\n" +"Jos et tee muunnosta nyt, ScummVM kysyy sinulta uudelleen seuraavalla " +"kerralla kun käynnistät pelin.\n" + +#: engines/parallaction/saveload.cpp:319 +msgid "ScummVM successfully converted all your savefiles." +msgstr "ScummVM muunsi kaikki pelitallenteet onnistuneesti" + +#: engines/parallaction/saveload.cpp:321 +msgid "" +"ScummVM printed some warnings in your console window and can't guarantee all " +"your files have been converted.\n" +"\n" +"Please report to the team." +msgstr "" +"Osa tiedostoista ei ehkä muuntunut oikein. Varoitukset tulostettiin konsoli-" +"ikkunaan. Pyydämme että ilmoittaisit\n" +"niistä ScummVM:n kehittäjille." + +#: engines/pegasus/pegasus.cpp:675 +msgid "Invalid save file name" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2410 +msgid "Up/Zoom In/Move Forward/Open Doors" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2411 +#, fuzzy +msgid "Down/Zoom Out" +msgstr "Zoomaa ylös" + +#: engines/pegasus/pegasus.cpp:2414 +msgid "Display/Hide Inventory Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2415 +msgid "Display/Hide Biochip Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2416 +msgid "Action/Select" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2417 +msgid "Toggle Center Data Display" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2418 +msgid "Display/Hide Info Screen" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2419 +msgid "Display/Hide Pause Menu" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2420 +msgid "???" +msgstr "" + +#: audio/fmopl.cpp:49 +msgid "MAME OPL emulator" +msgstr "MAME OPL emulaattori" + +#: audio/fmopl.cpp:51 +msgid "DOSBox OPL emulator" +msgstr "DOSBox OPL emulaattori" + +#: audio/mididrv.cpp:209 +#, c-format +msgid "" +"The selected audio device '%s' was not found (e.g. might be turned off or " +"disconnected)." +msgstr "" +"Valittua äänilaitetta '%s' ei löytynyt. Se saattaa olla kytketty pois päältä " +"tai irrotettuna tietokoneesta." + +#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257 +#: audio/mididrv.cpp:272 +msgid "Attempting to fall back to the next available device..." +msgstr "Yritetään käyttää seuraavaa saatavilla olevaa laitetta..." + +#: audio/mididrv.cpp:221 +#, c-format +msgid "" +"The selected audio device '%s' cannot be used. See log file for more " +"information." +msgstr "" +"Valitsemaasi äänilaitetta '%s' ei voida käyttää. Avaa lokitiedosto " +"saadaksesi lisätietoja." + +#: audio/mididrv.cpp:257 +#, c-format +msgid "" +"The preferred audio device '%s' was not found (e.g. might be turned off or " +"disconnected)." +msgstr "" +"Ensisijaista äänilaitetta '%s' ei löytynyt. Se saattaa olla kytketty pois " +"päältä tai irrotettuna tietokoneesta." + +#: audio/mididrv.cpp:272 +#, c-format +msgid "" +"The preferred audio device '%s' cannot be used. See log file for more " +"information." +msgstr "" +"Ensisijaista äänilaitetta '%s' ei voida käyttää. Avaa lokitiedosto " +"saadaksesi lisätietoja." + +#: audio/null.h:43 +msgid "No music" +msgstr "Ei musiikkia" + +#: audio/mods/paula.cpp:189 +msgid "Amiga Audio Emulator" +msgstr "Amiga Audio emulaattori" + +#: audio/softsynth/adlib.cpp:2284 +msgid "AdLib Emulator" +msgstr "AdLib emulaattori" + +#: audio/softsynth/appleiigs.cpp:33 +msgid "Apple II GS Emulator (NOT IMPLEMENTED)" +msgstr "Apple II GS emulaattori (EI TOTEUTETTU)" + +#: audio/softsynth/sid.cpp:1430 +msgid "C64 Audio Emulator" +msgstr "C64 Audio emulaattori" + +#: audio/softsynth/mt32.cpp:205 +msgid "Initializing MT-32 Emulator" +msgstr "Alustetaan MT-32 emulaattoria" + +#: audio/softsynth/mt32.cpp:431 +msgid "MT-32 Emulator" +msgstr "MT-32 emulaattori" + +#: audio/softsynth/pcspk.cpp:139 +msgid "PC Speaker Emulator" +msgstr "PC kaiuttimen emulaattori" + +#: audio/softsynth/pcspk.cpp:158 +msgid "IBM PCjr Emulator" +msgstr "IBM PCjr emulaattori" + +#: backends/keymapper/remap-dialog.cpp:47 +msgid "Keymap:" +msgstr "Näppäinkartta:" + +#: backends/keymapper/remap-dialog.cpp:66 +msgid " (Effective)" +msgstr "" + +#: backends/keymapper/remap-dialog.cpp:106 +msgid " (Active)" +msgstr " (Aktiivinen)" + +#: backends/keymapper/remap-dialog.cpp:106 +msgid " (Blocked)" +msgstr " (Estetty)" + +#: backends/keymapper/remap-dialog.cpp:119 +msgid " (Global)" +msgstr " (Globaali)" + +#: backends/keymapper/remap-dialog.cpp:127 +msgid " (Game)" +msgstr " (Peli)" + +#: backends/midi/windows.cpp:164 +msgid "Windows MIDI" +msgstr "Windows MIDI" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:57 +msgid "ScummVM Main Menu" +msgstr "ScummVM päävalikko" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:63 +msgid "~L~eft handed mode" +msgstr "~V~asenkätinen tila" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:64 +msgid "~I~ndy fight controls" +msgstr "~I~ndyn tappelukontrollit" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:65 +msgid "Show mouse cursor" +msgstr "Näytä hiiren kursori" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:66 +msgid "Snap to edges" +msgstr "Tartu reunoihin" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:68 +msgid "Touch X Offset" +msgstr "Kosketuksen X siirros" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:75 +msgid "Touch Y Offset" +msgstr "Kosketuksen Y siirto" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:87 +msgid "Use laptop trackpad-style cursor control" +msgstr "Käytä kannettavan trackpad-tyylistä kursorinhallintaa" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:88 +msgid "Tap for left click, double tap right click" +msgstr "" +"Napauta kerran vasen klikkausta varten, napauta kahdesti oikeaa klikkausta " +"varten" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:90 +msgid "Sensitivity" +msgstr "Herkkyys" + +#: 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 "Pääruudun skaalaus" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:107 +msgid "Hardware scale (fast, but low quality)" +msgstr "Laitteistoskaalaus (nopea, mutta huono laatu)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:108 +msgid "Software scale (good quality, but slower)" +msgstr "Ohjelmistoskaalaus (hyvä laatu, mutta hitaampi)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:109 +msgid "Unscaled (you must scroll left and right)" +msgstr "Ei skaalattu (vierittä vasemmalle ja oikealle itse)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:111 +msgid "Brightness:" +msgstr "Kirkkaus:" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:121 +msgid "High quality audio (slower) (reboot)" +msgstr "Korkealuokkainen ääni (hidas) (buuttaus)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:122 +msgid "Disable power off" +msgstr "" + +#: backends/platform/iphone/osys_events.cpp:300 +msgid "Mouse-click-and-drag mode enabled." +msgstr "Hiiren vedä-ja-pudota tila käytössä." + +#: backends/platform/iphone/osys_events.cpp:302 +msgid "Mouse-click-and-drag mode disabled." +msgstr "Hiiren vedä-ja-pudota tila pois käytöstä." + +#: backends/platform/iphone/osys_events.cpp:313 +msgid "Touchpad mode enabled." +msgstr "Touchad tila päällä" + +#: backends/platform/iphone/osys_events.cpp:315 +msgid "Touchpad mode disabled." +msgstr "Touchpad tila pois päältä" + +#: backends/platform/maemo/maemo.cpp:209 +msgid "Click Mode" +msgstr "Klikkaus moodi" + +#: backends/platform/maemo/maemo.cpp:215 +#: backends/platform/symbian/src/SymbianActions.cpp:42 +#: backends/platform/wince/CEActionsPocket.cpp:60 +#: backends/platform/wince/CEActionsSmartphone.cpp:43 +#: backends/platform/bada/form.cpp:281 +msgid "Left Click" +msgstr "Vasen klikkaus" + +#: backends/platform/maemo/maemo.cpp:218 +msgid "Middle Click" +msgstr "Keskiklikkaus" + +#: backends/platform/maemo/maemo.cpp:221 +#: backends/platform/symbian/src/SymbianActions.cpp:43 +#: backends/platform/wince/CEActionsSmartphone.cpp:44 +#: backends/platform/bada/form.cpp:273 +msgid "Right Click" +msgstr "Oikea klikkaus" + +#: backends/platform/sdl/macosx/appmenu_osx.mm:77 +msgid "Hide ScummVM" +msgstr "Piilota ScummVM" + +#: backends/platform/sdl/macosx/appmenu_osx.mm:82 +msgid "Hide Others" +msgstr "Piilota muut" + +#: backends/platform/sdl/macosx/appmenu_osx.mm:87 +msgid "Show All" +msgstr "Näytä kaikki" + +#: backends/platform/sdl/macosx/appmenu_osx.mm:109 +#: backends/platform/sdl/macosx/appmenu_osx.mm:120 +msgid "Window" +msgstr "Ikkuna" + +#: backends/platform/sdl/macosx/appmenu_osx.mm:114 +msgid "Minimize" +msgstr "Minimoi" + +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45 +msgid "Normal (no scaling)" +msgstr "Normaali (ei skaalausta)" + +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:64 +msgctxt "lowres" +msgid "Normal (no scaling)" +msgstr "Normaali (ei skaalausta)" + +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537 +msgid "Enabled aspect ratio correction" +msgstr "Kuvasuhteen korjaus päällä" + +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542 +msgid "Disabled aspect ratio correction" +msgstr "Kuvasuhteen korjaus pois päältä" + +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196 +msgid "Active graphics filter:" +msgstr "Valittu grafiikkafiltteri:" + +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481 +msgid "Windowed mode" +msgstr "Ikkunoitu tila" + +#: backends/graphics/opengl/opengl-graphics.cpp:135 +msgid "OpenGL Normal" +msgstr "OpenGL Normal" + +#: backends/graphics/opengl/opengl-graphics.cpp:136 +msgid "OpenGL Conserve" +msgstr "OpenGL Conserve" + +#: backends/graphics/opengl/opengl-graphics.cpp:137 +msgid "OpenGL Original" +msgstr "OpenGL Original" + +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415 +msgid "Current display mode" +msgstr "Nykyinen näyttötila" + +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428 +msgid "Current scale" +msgstr "Nykyinen skaalaus" + +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562 +msgid "Active filter mode: Linear" +msgstr "Valittu filtteritila: Linear" + +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564 +msgid "Active filter mode: Nearest" +msgstr "Valittu filtteritila: Nearest" + +#: backends/platform/symbian/src/SymbianActions.cpp:38 +#: backends/platform/wince/CEActionsSmartphone.cpp:39 +msgid "Up" +msgstr "Ylös" + +#: backends/platform/symbian/src/SymbianActions.cpp:39 +#: backends/platform/wince/CEActionsSmartphone.cpp:40 +msgid "Down" +msgstr "Alas" + +#: backends/platform/symbian/src/SymbianActions.cpp:40 +#: backends/platform/wince/CEActionsSmartphone.cpp:41 +msgid "Left" +msgstr "Vasen" + +#: backends/platform/symbian/src/SymbianActions.cpp:41 +#: backends/platform/wince/CEActionsSmartphone.cpp:42 +msgid "Right" +msgstr "Oikea" + +#: backends/platform/symbian/src/SymbianActions.cpp:46 +#: backends/platform/wince/CEActionsSmartphone.cpp:47 +msgid "Zone" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:47 +#: backends/platform/wince/CEActionsPocket.cpp:54 +#: backends/platform/wince/CEActionsSmartphone.cpp:48 +msgid "Multi Function" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:48 +msgid "Swap character" +msgstr "Vaihda hahmoa" + +#: backends/platform/symbian/src/SymbianActions.cpp:49 +msgid "Skip text" +msgstr "Ohita teksti" + +#: backends/platform/symbian/src/SymbianActions.cpp:51 +msgid "Fast mode" +msgstr "Nopea moodi" + +#: backends/platform/symbian/src/SymbianActions.cpp:53 +msgid "Debugger" +msgstr "Debuggeri" + +#: backends/platform/symbian/src/SymbianActions.cpp:54 +msgid "Global menu" +msgstr "Päävalikko" + +#: backends/platform/symbian/src/SymbianActions.cpp:55 +msgid "Virtual keyboard" +msgstr "Virtuaalinen näppäimistö" + +#: backends/platform/symbian/src/SymbianActions.cpp:56 +msgid "Key mapper" +msgstr "Näppäinmäärittelijä" + +#: backends/events/symbiansdl/symbiansdl-events.cpp:184 +msgid "Do you want to quit ?" +msgstr "Haluatko lopettaa?" + +#: backends/platform/wii/options.cpp:51 +msgid "Video" +msgstr "Video" + +#: backends/platform/wii/options.cpp:54 +msgid "Current video mode:" +msgstr "Nykyinen videotila:" + +#: backends/platform/wii/options.cpp:56 +msgid "Double-strike" +msgstr "" + +#: backends/platform/wii/options.cpp:60 +msgid "Horizontal underscan:" +msgstr "Horisontaalinenunderscan" + +#: backends/platform/wii/options.cpp:66 +msgid "Vertical underscan:" +msgstr "Vertikaalinen underscan" + +#: backends/platform/wii/options.cpp:71 +msgid "Input" +msgstr "Syöte" + +#: backends/platform/wii/options.cpp:74 +msgid "GC Pad sensitivity:" +msgstr "GC Padin herkkyys" + +#: backends/platform/wii/options.cpp:80 +msgid "GC Pad acceleration:" +msgstr "GC PAdin kiihtyvyys" + +#: 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 "Tila:" + +#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102 +msgid "Unknown" +msgstr "Tuntematon" + +#: backends/platform/wii/options.cpp:93 +msgid "Mount DVD" +msgstr "Liitä DVD" + +#: backends/platform/wii/options.cpp:94 +msgid "Unmount DVD" +msgstr "Vapauta DVD" + +#: backends/platform/wii/options.cpp:98 +msgid "SMB" +msgstr "SMB" + +#: backends/platform/wii/options.cpp:106 +msgid "Server:" +msgstr "Palvelin:" + +#: backends/platform/wii/options.cpp:110 +msgid "Share:" +msgstr "Jako:" + +#: backends/platform/wii/options.cpp:114 +msgid "Username:" +msgstr "Käyttäjänimi:" + +#: backends/platform/wii/options.cpp:118 +msgid "Password:" +msgstr "Salasana:" + +#: backends/platform/wii/options.cpp:121 +msgid "Init network" +msgstr "Alusta verkko" + +#: backends/platform/wii/options.cpp:123 +msgid "Mount SMB" +msgstr "Mounttaa SMB" + +#: backends/platform/wii/options.cpp:124 +msgid "Unmount SMB" +msgstr "Vapauta SMB" + +#: backends/platform/wii/options.cpp:143 +msgid "DVD Mounted successfully" +msgstr "DVD mountattu onnistuneesti" + +#: backends/platform/wii/options.cpp:146 +msgid "Error while mounting the DVD" +msgstr "Virhe liitettäessä DVD:tä" + +#: backends/platform/wii/options.cpp:148 +msgid "DVD not mounted" +msgstr "DVD ei ole liitetty" + +#: backends/platform/wii/options.cpp:161 +msgid "Network up, share mounted" +msgstr "Verkko ylhäällä, jako liitetty" + +#: backends/platform/wii/options.cpp:163 +msgid "Network up" +msgstr "Verkko ylhäällä" + +#: backends/platform/wii/options.cpp:166 +msgid ", error while mounting the share" +msgstr ", virhe liitettäessä jakoa" + +#: backends/platform/wii/options.cpp:168 +msgid ", share not mounted" +msgstr ", jakoa ei liitetty" + +#: backends/platform/wii/options.cpp:174 +msgid "Network down" +msgstr "Verkko alhaalla" + +#: backends/platform/wii/options.cpp:178 +msgid "Initializing network" +msgstr "Alustetaan verkkoa" + +#: backends/platform/wii/options.cpp:182 +msgid "Timeout while initializing network" +msgstr "Aikakatkaisu kun verkkoa alustettiin" + +#: backends/platform/wii/options.cpp:186 +#, c-format +msgid "Network not initialized (%d)" +msgstr "Verkko ei ole alustettu (%d)" + +#: backends/platform/wince/CEActionsPocket.cpp:46 +msgid "Hide Toolbar" +msgstr "Piilota työkalupalkki" + +#: backends/platform/wince/CEActionsPocket.cpp:47 +msgid "Show Keyboard" +msgstr "Näytä näppäimistö" + +#: backends/platform/wince/CEActionsPocket.cpp:48 +msgid "Sound on/off" +msgstr "Äänet päällä/pois" + +#: backends/platform/wince/CEActionsPocket.cpp:49 +msgid "Right click" +msgstr "Oikea klikkaus" + +#: backends/platform/wince/CEActionsPocket.cpp:50 +msgid "Show/Hide Cursor" +msgstr "Näytä/Piilota kursori" + +#: backends/platform/wince/CEActionsPocket.cpp:51 +msgid "Free look" +msgstr "Vapaa katselu" + +#: backends/platform/wince/CEActionsPocket.cpp:52 +msgid "Zoom up" +msgstr "Zoomaa ylös" + +#: backends/platform/wince/CEActionsPocket.cpp:53 +msgid "Zoom down" +msgstr "Zoomaa alas" + +#: backends/platform/wince/CEActionsPocket.cpp:55 +#: backends/platform/wince/CEActionsSmartphone.cpp:49 +msgid "Bind Keys" +msgstr "Määritä näppäimet" + +#: backends/platform/wince/CEActionsPocket.cpp:56 +msgid "Cursor Up" +msgstr "Nuoli ylös" + +#: backends/platform/wince/CEActionsPocket.cpp:57 +msgid "Cursor Down" +msgstr "Nuoli alas" + +#: backends/platform/wince/CEActionsPocket.cpp:58 +msgid "Cursor Left" +msgstr "Nuoli vasemmalle" + +#: backends/platform/wince/CEActionsPocket.cpp:59 +msgid "Cursor Right" +msgstr "Nuoli oikealle" + +#: backends/platform/wince/CEActionsPocket.cpp:267 +#: backends/platform/wince/CEActionsSmartphone.cpp:231 +msgid "Do you want to load or save the game?" +msgstr "Haluatko tallentaa vai ladata pelin?" + +#: backends/platform/wince/CEActionsPocket.cpp:326 +#: backends/platform/wince/CEActionsSmartphone.cpp:287 +msgid " Are you sure you want to quit ? " +msgstr " Haluatko varmasti lopettaa?" + +#: backends/platform/wince/CEActionsSmartphone.cpp:50 +msgid "Keyboard" +msgstr "Näppäimistö" + +#: backends/platform/wince/CEActionsSmartphone.cpp:51 +msgid "Rotate" +msgstr "Käännä" + +#: backends/platform/wince/CELauncherDialog.cpp:56 +msgid "Using SDL driver " +msgstr "Käytetään SDL:n ajuria" + +#: backends/platform/wince/CELauncherDialog.cpp:60 +msgid "Display " +msgstr "Näyttö" + +#: backends/platform/wince/CELauncherDialog.cpp:83 +msgid "Do you want to perform an automatic scan ?" +msgstr "Haluatko suorittaa automaattisen skannauksen?" + +#: backends/platform/wince/wince-sdl.cpp:515 +msgid "Map right click action" +msgstr "Määritä oikeaklikkauksen toiminto" + +#: backends/platform/wince/wince-sdl.cpp:519 +msgid "You must map a key to the 'Right Click' action to play this game" +msgstr "" +"Hiiren oikealle klikkaukselle on määriteltävä näppäin, ennen kuin tätä peliä " +"voi pelata" + +#: backends/platform/wince/wince-sdl.cpp:528 +msgid "Map hide toolbar action" +msgstr "Määritä näppäin työkalupalkin piilottamiselle" + +#: backends/platform/wince/wince-sdl.cpp:532 +msgid "You must map a key to the 'Hide toolbar' action to play this game" +msgstr "" +"Työkalupalkin piilottamiselle on määriteltävä näppäin, ennen kuin tätä peliä " +"voi pelata" + +#: backends/platform/wince/wince-sdl.cpp:541 +msgid "Map Zoom Up action (optional)" +msgstr "Zoomaa karttaa ylös (valinnainen)" + +#: backends/platform/wince/wince-sdl.cpp:544 +msgid "Map Zoom Down action (optional)" +msgstr "Zoomaa karttaa alas (valinnainen)" + +#: backends/platform/wince/wince-sdl.cpp:552 +msgid "" +"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory" +msgstr "" +"Muista määritellä näppäin työkalupalkin piilottamiselle, jotta voit nähdä " +"koko tavaraluettelon" + +#: backends/events/default/default-events.cpp:191 +msgid "Do you really want to return to the Launcher?" +msgstr "Haluatko varmasti palata pelivalitsimeen?" + +#: backends/events/default/default-events.cpp:191 +msgid "Launcher" +msgstr "Pelivalitsin" + +#: backends/events/default/default-events.cpp:213 +msgid "Do you really want to quit?" +msgstr "Haluatko varmasti lopettaa?" + +#: backends/events/gph/gph-events.cpp:386 +#: backends/events/gph/gph-events.cpp:429 +#: backends/events/openpandora/op-events.cpp:168 +msgid "Touchscreen 'Tap Mode' - Left Click" +msgstr "Kosketusnäytön 'Tap moodi' - vasen klikkaus" + +#: backends/events/gph/gph-events.cpp:388 +#: backends/events/gph/gph-events.cpp:431 +#: backends/events/openpandora/op-events.cpp:170 +msgid "Touchscreen 'Tap Mode' - Right Click" +msgstr "Kosketusnäytön 'Tap moodi' - oikea klikkaus" + +#: backends/events/gph/gph-events.cpp:390 +#: backends/events/gph/gph-events.cpp:433 +#: backends/events/openpandora/op-events.cpp:172 +msgid "Touchscreen 'Tap Mode' - Hover (No Click)" +msgstr "Kosketusnäytön 'Tap moodi' - ei klikkausta" + +#: backends/events/gph/gph-events.cpp:410 +msgid "Maximum Volume" +msgstr "Maksimi äänenvoimakkuus" + +#: backends/events/gph/gph-events.cpp:412 +msgid "Increasing Volume" +msgstr "Nostetaan äänenvoimakkuutta" + +#: backends/events/gph/gph-events.cpp:418 +msgid "Minimal Volume" +msgstr "Minimi äänenvoimakkuus" + +#: backends/events/gph/gph-events.cpp:420 +msgid "Decreasing Volume" +msgstr "Lasketaan äänenvoimakkuutta" + +#: backends/events/openpandora/op-events.cpp:174 +#, fuzzy +msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)" +msgstr "Kosketusnäytön 'Tap moodi' - ei klikkausta" + +#: backends/updates/macosx/macosx-updates.mm:67 +msgid "Check for Updates..." +msgstr "Tarkista päivitykset..." + +#: backends/platform/bada/form.cpp:269 +msgid "Right Click Once" +msgstr "Klikkaa oikealla kerran" + +#: backends/platform/bada/form.cpp:277 +msgid "Move Only" +msgstr "" + +#: backends/platform/bada/form.cpp:291 +msgid "Escape Key" +msgstr "Esc näppäin" + +#: backends/platform/bada/form.cpp:296 +msgid "Game Menu" +msgstr "Pelivalikko" + +#: backends/platform/bada/form.cpp:301 +msgid "Show Keypad" +msgstr "Näytä keypad" + +#: backends/platform/bada/form.cpp:309 +msgid "Control Mouse" +msgstr "Ohjaa hiirtä" + +#: backends/events/maemosdl/maemosdl-events.cpp:192 +msgid "Clicking Enabled" +msgstr "Klikkaus päällä" + +#: backends/events/maemosdl/maemosdl-events.cpp:192 +msgid "Clicking Disabled" +msgstr "Klikkaus pois päältä" + +#~ msgid "Enable Roland GS Mode" +#~ msgstr "Käytä Roland GS moodia" diff --git a/po/fr_FR.po b/po/fr_FR.po index cd98af1bb7..1bdaf2e40d 100644 --- a/po/fr_FR.po +++ b/po/fr_FR.po @@ -1,5 +1,5 @@ # French translation for ScummVM. -# Copyright (C) 2010-2012 ScummVM Team +# Copyright (C) 2010-2013 ScummVM Team # This file is distributed under the same license as the ScummVM package. # Thierry Crozat <criezy@scummvm.org>, 2011. # @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-08-12 14:57+0200\n" +"POT-Creation-Date: 2013-02-07 23:11+0000\n" "PO-Revision-Date: 2012-07-08 12:24+0100\n" "Last-Translator: Thierry Crozat <criezy@scummvm.org>\n" "Language-Team: French <scummvm-devel@lists.sf.net>\n" @@ -17,45 +17,55 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n>1;\n" -#: gui/about.cpp:91 +#: gui/about.cpp:93 #, c-format msgid "(built on %s)" msgstr "(compilé sur %s)" -#: gui/about.cpp:98 +#: gui/about.cpp:100 msgid "Features compiled in:" msgstr "Options incluses:" -#: gui/about.cpp:107 +#: gui/about.cpp:109 msgid "Available engines:" msgstr "Moteurs disponibles:" -#: gui/browser.cpp:66 +#: gui/browser.cpp:67 +#, fuzzy +msgid "Show hidden files" +msgstr "Afficher/Cacher la console" + +#: gui/browser.cpp:67 +msgid "Show files marked with the hidden attribute" +msgstr "" + +#: gui/browser.cpp:71 msgid "Go up" msgstr "Remonter" -#: gui/browser.cpp:66 gui/browser.cpp:68 +#: gui/browser.cpp:71 gui/browser.cpp:73 msgid "Go to previous directory level" msgstr "Remonte d'un niveau dans la hiérarchie de répertoire" -#: gui/browser.cpp:68 +#: gui/browser.cpp:73 msgctxt "lowres" msgid "Go up" msgstr "Remonter" -#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 -#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 -#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 -#: gui/themebrowser.cpp:54 engines/engine.cpp:442 -#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 +#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238 +#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275 +#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919 +#: gui/themebrowser.cpp:54 engines/engine.cpp:447 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:190 +#: engines/sword1/control.cpp:867 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" msgstr "Annuler" -#: gui/browser.cpp:70 gui/chooser.cpp:46 gui/themebrowser.cpp:55 +#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55 msgid "Choose" msgstr "Choisir" @@ -70,15 +80,15 @@ msgstr "Fermer" msgid "Mouse click" msgstr "Clic de souris" -#: gui/gui-manager.cpp:122 base/main.cpp:300 +#: gui/gui-manager.cpp:122 base/main.cpp:301 msgid "Display keyboard" msgstr "Afficher le clavier" -#: gui/gui-manager.cpp:126 base/main.cpp:304 +#: gui/gui-manager.cpp:126 base/main.cpp:305 msgid "Remap keys" msgstr "Changer l'affectation des touches" -#: gui/gui-manager.cpp:129 base/main.cpp:307 +#: gui/gui-manager.cpp:129 base/main.cpp:308 msgid "Toggle FullScreen" msgstr "Basculer en plein écran" @@ -91,17 +101,18 @@ msgid "Map" msgstr "Affecter" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 -#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 -#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 -#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 -#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 -#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 -#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 -#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 -#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 -#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 +#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239 +#: gui/saveload-dialog.cpp:920 engines/engine.cpp:366 engines/engine.cpp:377 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192 +#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558 +#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 +#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519 +#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550 +#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:867 +#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419 +#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449 +#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -174,8 +185,8 @@ msgstr "" "Langue du jeu. Cela ne traduira pas en anglais par magie votre version " "espagnole du jeu." -#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:80 -#: gui/options.cpp:730 gui/options.cpp:743 gui/options.cpp:1199 +#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86 +#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209 #: audio/null.cpp:40 msgid "<default>" msgstr "<defaut>" @@ -197,11 +208,11 @@ msgstr "Système:" msgid "Engine" msgstr "Moteur" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "Graphics" msgstr "Graphique" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "GFX" msgstr "GFX" @@ -214,7 +225,7 @@ msgctxt "lowres" msgid "Override global graphic settings" msgstr "Réglages spécifiques à ce jeux" -#: gui/launcher.cpp:251 gui/options.cpp:1085 +#: gui/launcher.cpp:251 gui/options.cpp:1095 msgid "Audio" msgstr "Audio" @@ -227,11 +238,11 @@ msgctxt "lowres" msgid "Override global audio settings" msgstr "Réglages spécifiques à ce jeux" -#: gui/launcher.cpp:265 gui/options.cpp:1090 +#: gui/launcher.cpp:265 gui/options.cpp:1100 msgid "Volume" msgstr "Volume" -#: gui/launcher.cpp:267 gui/options.cpp:1092 +#: gui/launcher.cpp:267 gui/options.cpp:1102 msgctxt "lowres" msgid "Volume" msgstr "Volume" @@ -245,7 +256,7 @@ msgctxt "lowres" msgid "Override global volume settings" msgstr "Réglages spécifiques à ce jeux" -#: gui/launcher.cpp:280 gui/options.cpp:1100 +#: gui/launcher.cpp:280 gui/options.cpp:1110 msgid "MIDI" msgstr "MIDI" @@ -258,7 +269,7 @@ msgctxt "lowres" msgid "Override global MIDI settings" msgstr "Réglages spécifiques à ce jeux" -#: gui/launcher.cpp:294 gui/options.cpp:1106 +#: gui/launcher.cpp:294 gui/options.cpp:1116 msgid "MT-32" msgstr "MT-32" @@ -271,11 +282,11 @@ msgctxt "lowres" msgid "Override global MT-32 settings" msgstr "Réglages spécifiques à ce jeux" -#: gui/launcher.cpp:308 gui/options.cpp:1113 +#: gui/launcher.cpp:308 gui/options.cpp:1123 msgid "Paths" msgstr "Chemins" -#: gui/launcher.cpp:310 gui/options.cpp:1115 +#: gui/launcher.cpp:310 gui/options.cpp:1125 msgctxt "lowres" msgid "Paths" msgstr "Chemins" @@ -289,7 +300,7 @@ msgctxt "lowres" msgid "Game Path:" msgstr "Chemin du Jeu:" -#: gui/launcher.cpp:324 gui/options.cpp:1139 +#: gui/launcher.cpp:324 gui/options.cpp:1149 msgid "Extra Path:" msgstr "Extra:" @@ -297,42 +308,42 @@ msgstr "Extra:" 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:326 gui/options.cpp:1141 +#: gui/launcher.cpp:326 gui/options.cpp:1151 msgctxt "lowres" msgid "Extra Path:" msgstr "Extra:" -#: gui/launcher.cpp:333 gui/options.cpp:1123 +#: gui/launcher.cpp:333 gui/options.cpp:1133 msgid "Save Path:" msgstr "Sauvegardes:" #: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 -#: gui/options.cpp:1123 gui/options.cpp:1125 gui/options.cpp:1126 +#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136 msgid "Specifies where your savegames are put" msgstr "Définie l'emplacement où les fichiers de sauvegarde sont créés" -#: gui/launcher.cpp:335 gui/options.cpp:1125 +#: gui/launcher.cpp:335 gui/options.cpp:1135 msgctxt "lowres" msgid "Save Path:" msgstr "Sauvegardes:" #: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 -#: gui/launcher.cpp:565 gui/options.cpp:1134 gui/options.cpp:1142 -#: gui/options.cpp:1151 gui/options.cpp:1258 gui/options.cpp:1264 -#: gui/options.cpp:1272 gui/options.cpp:1302 gui/options.cpp:1308 -#: gui/options.cpp:1315 gui/options.cpp:1408 gui/options.cpp:1411 -#: gui/options.cpp:1423 +#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152 +#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282 +#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326 +#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429 +#: gui/options.cpp:1441 msgctxt "path" msgid "None" msgstr "Aucun" #: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 -#: gui/options.cpp:1252 gui/options.cpp:1296 gui/options.cpp:1414 +#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Défaut" -#: gui/launcher.cpp:504 gui/options.cpp:1417 +#: gui/launcher.cpp:504 gui/options.cpp:1435 msgid "Select SoundFont" msgstr "Choisir une banque de sons" @@ -356,7 +367,7 @@ msgstr "Cet ID est déjà utilisé par un autre jeu. Choisissez en un autre svp." msgid "~Q~uit" msgstr "~Q~uitter" -#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:96 +#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95 msgid "Quit ScummVM" msgstr "Quitter ScummVM" @@ -364,7 +375,7 @@ msgstr "Quitter ScummVM" msgid "A~b~out..." msgstr "À ~P~ropos..." -#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:70 +#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69 msgid "About ScummVM" msgstr "À propos de ScummVM" @@ -442,12 +453,14 @@ msgstr "Filtre:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 +#: engines/pegasus/pegasus.cpp:345 msgid "Load game:" msgstr "Charger le jeu:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:345 +#: backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Charger" @@ -534,135 +547,135 @@ msgid "Discovered %d new games, ignored %d previously added games ..." msgstr "" "%d nouveaux jeux trouvés, %d jeux ignorés (déjà ajouté précédemment) ..." -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "Never" msgstr "Jamais" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 5 mins" msgstr "Toutes les 5 mins" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 10 mins" msgstr "Toutes les 10 mins" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 15 mins" msgstr "Toutes les 15 mins" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 30 mins" msgstr "Toutes les 30 mins" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "8 kHz" msgstr "8 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "11kHz" msgstr "11 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "22 kHz" msgstr "22 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "44 kHz" msgstr "44 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:248 gui/options.cpp:474 gui/options.cpp:575 -#: gui/options.cpp:644 gui/options.cpp:852 +#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581 +#: gui/options.cpp:650 gui/options.cpp:858 msgctxt "soundfont" msgid "None" msgstr "Aucune" -#: gui/options.cpp:382 +#: gui/options.cpp:388 msgid "Failed to apply some of the graphic options changes:" msgstr "Certaines options graphiques n'ont pu être changées:" -#: gui/options.cpp:394 +#: gui/options.cpp:400 msgid "the video mode could not be changed." msgstr "le mode vidéo n'a pu être changé." -#: gui/options.cpp:400 +#: gui/options.cpp:406 msgid "the fullscreen setting could not be changed" msgstr "le mode plein écran n'a pu être changé." -#: gui/options.cpp:406 +#: gui/options.cpp:412 msgid "the aspect ratio setting could not be changed" msgstr "la correction de rapport d'aspect n'a pu être changée." -#: gui/options.cpp:727 +#: gui/options.cpp:733 msgid "Graphics mode:" msgstr "Mode graphique:" -#: gui/options.cpp:741 +#: gui/options.cpp:747 msgid "Render mode:" msgstr "Mode de rendu:" -#: gui/options.cpp:741 gui/options.cpp:742 +#: gui/options.cpp:747 gui/options.cpp:748 msgid "Special dithering modes supported by some games" msgstr "Mode spécial de tramage supporté par certains jeux" -#: gui/options.cpp:753 +#: gui/options.cpp:759 #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476 msgid "Fullscreen mode" msgstr "Plein écran" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Aspect ratio correction" msgstr "Correction du rapport d'aspect" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Correct aspect ratio for 320x200 games" msgstr "Corrige le rapport d'aspect pour les jeu 320x200" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Preferred Device:" msgstr "Sortie Préféré:" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Music Device:" msgstr "Sortie Audio:" -#: gui/options.cpp:764 gui/options.cpp:766 +#: gui/options.cpp:770 gui/options.cpp:772 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:764 gui/options.cpp:766 gui/options.cpp:767 +#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773 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:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Preferred Dev.:" msgstr "Sortie Préféré:" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Music Device:" msgstr "Sortie Audio:" -#: gui/options.cpp:793 +#: gui/options.cpp:799 msgid "AdLib emulator:" msgstr "Émulateur AdLib:" -#: gui/options.cpp:793 gui/options.cpp:794 +#: gui/options.cpp:799 gui/options.cpp:800 msgid "AdLib is used for music in many games" msgstr "AdLib est utilisé pour la musique dans de nombreux jeux" -#: gui/options.cpp:804 +#: gui/options.cpp:810 msgid "Output rate:" msgstr "Fréquence:" -#: gui/options.cpp:804 gui/options.cpp:805 +#: gui/options.cpp:810 gui/options.cpp:811 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -670,64 +683,68 @@ msgstr "" "Une valeur plus élevée donne une meilleure qualité audio mais peut ne pas " "être supporté par votre carte son" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "GM Device:" msgstr "Sortie GM:" -#: gui/options.cpp:815 +#: gui/options.cpp:821 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:826 +#: gui/options.cpp:832 msgid "Don't use General MIDI music" msgstr "Ne pas utiliser la musique General MIDI" -#: gui/options.cpp:837 gui/options.cpp:899 +#: gui/options.cpp:843 gui/options.cpp:909 msgid "Use first available device" msgstr "Utiliser le premier périphérique disponible" -#: gui/options.cpp:849 +#: gui/options.cpp:855 msgid "SoundFont:" msgstr "Banque de sons:" -#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 +#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "La banque de sons (SoundFont) est utilisée par certaines cartes audio, " "Fluidsynth et Timidity" -#: gui/options.cpp:851 +#: gui/options.cpp:857 msgctxt "lowres" msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Mixed AdLib/MIDI mode" msgstr "Mode mixe AdLib/MIDI" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Use both MIDI and AdLib sound generation" msgstr "Utiliser à la fois MIDI et AdLib" -#: gui/options.cpp:860 +#: gui/options.cpp:866 msgid "MIDI gain:" msgstr "Gain MIDI:" -#: gui/options.cpp:870 +#: gui/options.cpp:873 +msgid "FluidSynth Settings" +msgstr "" + +#: gui/options.cpp:880 msgid "MT-32 Device:" msgstr "Sortie MT-32:" -#: gui/options.cpp:870 +#: gui/options.cpp:880 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:875 +#: gui/options.cpp:885 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Roland MT-32 exacte (désactive l'émulation GM)" -#: gui/options.cpp:875 gui/options.cpp:877 +#: gui/options.cpp:885 gui/options.cpp:887 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -735,195 +752,196 @@ msgstr "" "Vérifie si vous voulez utiliser un périphérique audio compatible Roland " "connecté à l'ordinateur" -#: gui/options.cpp:877 +#: gui/options.cpp:887 msgctxt "lowres" msgid "True Roland MT-32 (no GM emulation)" msgstr "Roland MT-32 exacte (pas d'ému GM)" -#: gui/options.cpp:880 -msgid "Enable Roland GS Mode" -msgstr "Activer le mode Roland GS" +#: gui/options.cpp:890 +#, fuzzy +msgid "Roland GS Mode (disable GM mapping)" +msgstr "Roland MT-32 exacte (désactive l'émulation GM)" -#: gui/options.cpp:880 +#: gui/options.cpp:890 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:889 +#: gui/options.cpp:899 msgid "Don't use Roland MT-32 music" msgstr "Ne pas utiliser la musique Roland MT-32" -#: gui/options.cpp:916 +#: gui/options.cpp:926 msgid "Text and Speech:" msgstr "Dialogue:" -#: gui/options.cpp:920 gui/options.cpp:930 +#: gui/options.cpp:930 gui/options.cpp:940 msgid "Speech" msgstr "Voix" -#: gui/options.cpp:921 gui/options.cpp:931 +#: gui/options.cpp:931 gui/options.cpp:941 msgid "Subtitles" msgstr "Sous-titres" -#: gui/options.cpp:922 +#: gui/options.cpp:932 msgid "Both" msgstr "Les deux" -#: gui/options.cpp:924 +#: gui/options.cpp:934 msgid "Subtitle speed:" msgstr "Vitesse des ST:" -#: gui/options.cpp:926 +#: gui/options.cpp:936 msgctxt "lowres" msgid "Text and Speech:" msgstr "Dialogue:" -#: gui/options.cpp:930 +#: gui/options.cpp:940 msgid "Spch" msgstr "Voix" -#: gui/options.cpp:931 +#: gui/options.cpp:941 msgid "Subs" msgstr "Subs" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgctxt "lowres" msgid "Both" msgstr "V&S" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgid "Show subtitles and play speech" msgstr "Affiche les sous-titres et joue les dialogues audio" -#: gui/options.cpp:934 +#: gui/options.cpp:944 msgctxt "lowres" msgid "Subtitle speed:" msgstr "Vitesse des ST:" -#: gui/options.cpp:950 +#: gui/options.cpp:960 msgid "Music volume:" msgstr "Volume Musique:" -#: gui/options.cpp:952 +#: gui/options.cpp:962 msgctxt "lowres" msgid "Music volume:" msgstr "Musique:" -#: gui/options.cpp:959 +#: gui/options.cpp:969 msgid "Mute All" msgstr "Silence" -#: gui/options.cpp:962 +#: gui/options.cpp:972 msgid "SFX volume:" msgstr "Volume Bruitage:" -#: gui/options.cpp:962 gui/options.cpp:964 gui/options.cpp:965 +#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975 msgid "Special sound effects volume" msgstr "Volume des effets spéciaux sonores" -#: gui/options.cpp:964 +#: gui/options.cpp:974 msgctxt "lowres" msgid "SFX volume:" msgstr "Bruitage:" -#: gui/options.cpp:972 +#: gui/options.cpp:982 msgid "Speech volume:" msgstr "Volume Dialogues:" -#: gui/options.cpp:974 +#: gui/options.cpp:984 msgctxt "lowres" msgid "Speech volume:" msgstr "Dialogues:" -#: gui/options.cpp:1131 +#: gui/options.cpp:1141 msgid "Theme Path:" msgstr "Thèmes:" -#: gui/options.cpp:1133 +#: gui/options.cpp:1143 msgctxt "lowres" msgid "Theme Path:" msgstr "Thèmes:" -#: gui/options.cpp:1139 gui/options.cpp:1141 gui/options.cpp:1142 +#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152 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:1148 +#: gui/options.cpp:1158 msgid "Plugins Path:" msgstr "Plugins:" -#: gui/options.cpp:1150 +#: gui/options.cpp:1160 msgctxt "lowres" msgid "Plugins Path:" msgstr "Plugins:" -#: gui/options.cpp:1159 +#: gui/options.cpp:1169 msgid "Misc" msgstr "Divers" -#: gui/options.cpp:1161 +#: gui/options.cpp:1171 msgctxt "lowres" msgid "Misc" msgstr "Divers" -#: gui/options.cpp:1163 +#: gui/options.cpp:1173 msgid "Theme:" msgstr "Thème:" -#: gui/options.cpp:1167 +#: gui/options.cpp:1177 msgid "GUI Renderer:" msgstr "Interface:" -#: gui/options.cpp:1179 +#: gui/options.cpp:1189 msgid "Autosave:" msgstr "Sauvegarde auto:" -#: gui/options.cpp:1181 +#: gui/options.cpp:1191 msgctxt "lowres" msgid "Autosave:" msgstr "Sauvegarde:" -#: gui/options.cpp:1189 +#: gui/options.cpp:1199 msgid "Keys" msgstr "Touches" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "GUI Language:" msgstr "Langue:" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "Language of ScummVM GUI" msgstr "Langue de l'interface graphique de ScummVM" -#: gui/options.cpp:1347 +#: gui/options.cpp:1365 msgid "You have to restart ScummVM before your changes will take effect." msgstr "" "Vous devez relancer ScummVM pour que le changement soit pris en compte." -#: gui/options.cpp:1360 +#: gui/options.cpp:1378 msgid "Select directory for savegames" msgstr "Sélectionner le répertoire pour les sauvegardes" -#: gui/options.cpp:1367 +#: gui/options.cpp:1385 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:1376 +#: gui/options.cpp:1394 msgid "Select directory for GUI themes" msgstr "Sélectionner le répertoire des thèmes d'interface" -#: gui/options.cpp:1386 +#: gui/options.cpp:1404 msgid "Select directory for extra files" msgstr "Sélectionner le répertoire pour les fichiers suplémentaires" -#: gui/options.cpp:1397 +#: gui/options.cpp:1415 msgid "Select directory for plugins" msgstr "Sélectionner le répertoire des plugins" -#: gui/options.cpp:1450 +#: gui/options.cpp:1468 msgid "" "The theme you selected does not support your current language. If you want " "to use this theme you need to switch to another language first." @@ -931,74 +949,74 @@ msgstr "" "Le thème que vous avez sélectioné ne support pas la langue française. Si " "vous voulez l'utiliser vous devez d'abord changer de langue." -#: gui/saveload-dialog.cpp:158 +#: gui/saveload-dialog.cpp:166 msgid "List view" msgstr "" -#: gui/saveload-dialog.cpp:159 +#: gui/saveload-dialog.cpp:167 msgid "Grid view" msgstr "" -#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 +#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358 msgid "No date saved" msgstr "Date inconnue" -#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359 msgid "No time saved" msgstr "Heure inconnue" -#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 +#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360 msgid "No playtime saved" msgstr "Durée de jeu inconnue" -#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275 msgid "Delete" msgstr "Supprimer" -#: gui/saveload-dialog.cpp:266 +#: gui/saveload-dialog.cpp:274 msgid "Do you really want to delete this savegame?" msgstr "Voulez-vous vraiment supprimer cette sauvegarde?" -#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 +#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872 msgid "Date: " msgstr "Date: " -#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 +#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878 msgid "Time: " msgstr "Heure: " -#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 +#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886 msgid "Playtime: " msgstr "Durée de jeu: " -#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 +#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494 msgid "Untitled savestate" msgstr "Sauvegarde sans nom" -#: gui/saveload-dialog.cpp:517 +#: gui/saveload-dialog.cpp:546 msgid "Next" msgstr "" -#: gui/saveload-dialog.cpp:520 +#: gui/saveload-dialog.cpp:549 msgid "Prev" msgstr "" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 #, fuzzy msgid "New Save" msgstr "Sauver" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 #, fuzzy msgid "Create a new save game" msgstr "Échec de la sauvegarde." -#: gui/saveload-dialog.cpp:789 +#: gui/saveload-dialog.cpp:865 #, fuzzy msgid "Name: " msgstr "Nom:" -#: gui/saveload-dialog.cpp:861 +#: gui/saveload-dialog.cpp:937 #, c-format msgid "Enter a description for slot %d:" msgstr "" @@ -1036,35 +1054,35 @@ msgstr "Anti-crénelé (16 bpp)" msgid "Clear value" msgstr "Effacer la valeur" -#: base/main.cpp:209 +#: base/main.cpp:210 #, 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:287 +#: base/main.cpp:288 msgid "Menu" msgstr "Menu" -#: base/main.cpp:290 backends/platform/symbian/src/SymbianActions.cpp:45 +#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:45 #: backends/platform/wince/CEActionsSmartphone.cpp:46 msgid "Skip" msgstr "Passer" -#: base/main.cpp:293 backends/platform/symbian/src/SymbianActions.cpp:50 +#: base/main.cpp:294 backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:42 msgid "Pause" msgstr "Mettre en pause" -#: base/main.cpp:296 +#: base/main.cpp:297 msgid "Skip line" msgstr "Passer la phrase" -#: base/main.cpp:467 +#: base/main.cpp:468 msgid "Error running game:" msgstr "Erreur lors de l'éxécution du jeu:" -#: base/main.cpp:491 +#: base/main.cpp:492 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é" @@ -1181,13 +1199,16 @@ msgid "~R~eturn to Launcher" msgstr "Retour au ~L~anceur" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284 +#: engines/pegasus/pegasus.cpp:369 msgid "Save game:" msgstr "Sauvegarde:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:369 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1216,12 +1237,12 @@ msgstr "" "de base et les instructions pour obtenir de l'aide supplémentaire." #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 -#: engines/mohawk/dialogs.cpp:174 +#: engines/mohawk/dialogs.cpp:170 msgid "~O~K" msgstr "~O~K" #: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 -#: engines/mohawk/dialogs.cpp:175 +#: engines/mohawk/dialogs.cpp:171 msgid "~C~ancel" msgstr "~A~nnuler" @@ -1229,23 +1250,23 @@ msgstr "~A~nnuler" msgid "~K~eys" msgstr "~T~ouches" -#: engines/engine.cpp:235 +#: engines/engine.cpp:240 msgid "Could not initialize color format." msgstr "Impossible d'initialiser le format des couleurs." -#: engines/engine.cpp:243 +#: engines/engine.cpp:248 msgid "Could not switch to video mode: '" msgstr "Impossible de changer le mode vidéo à: '" -#: engines/engine.cpp:252 +#: engines/engine.cpp:257 msgid "Could not apply aspect ratio setting." msgstr "Impossible d'appliquer la correction du rapport d'aspect." -#: engines/engine.cpp:257 +#: engines/engine.cpp:262 msgid "Could not apply fullscreen setting." msgstr "Impossible d'appliquer l'option plein écran." -#: engines/engine.cpp:357 +#: engines/engine.cpp:362 msgid "" "You appear to be playing this game directly\n" "from the CD. This is known to cause problems,\n" @@ -1259,7 +1280,7 @@ msgstr "" "données du jeu sur votre disque dur.\n" "Lisez le fichier README pour plus de détails." -#: engines/engine.cpp:368 +#: engines/engine.cpp:373 msgid "" "This game has audio tracks in its disk. These\n" "tracks need to be ripped from the disk using\n" @@ -1273,7 +1294,7 @@ msgstr "" "logiciel approprié.\n" "Lisez le fichier README pour plus de détails." -#: engines/engine.cpp:426 +#: engines/engine.cpp:431 #, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " @@ -1282,7 +1303,7 @@ msgstr "" "Echec du chargement (%s)! . Lisez le fichier README pour les informations de " "base et les instructions pour obtenir de l'aide supplémentaire." -#: engines/engine.cpp:439 +#: engines/engine.cpp:444 msgid "" "WARNING: The game you are about to start is not yet fully supported by " "ScummVM. As such, it is likely to be unstable, and any saves you make might " @@ -1292,30 +1313,53 @@ msgstr "" "complètement supporté par ScummVM. Il est donc instable et les sauvegardes " "peuvent ne pas marcher avec une future version de ScummVM." -#: engines/engine.cpp:442 +#: engines/engine.cpp:447 msgid "Start anyway" msgstr "Jouer quand même" -#: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 -#: engines/sci/detection.cpp:390 +#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270 +#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393 +#: engines/toltecs/detection.cpp:173 msgid "Use original save/load screens" msgstr "Dialogues sauvegarde/chargement d'origine" -#: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 -#: engines/sci/detection.cpp:391 +#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271 +#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394 +#: engines/toltecs/detection.cpp:174 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" "Utiliser les dialogues sauvegarde/chargement d'origine plutôt que ceux de " "ScummVM" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore game:" msgstr "Charger le jeu:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore" msgstr "Charger" +#: engines/drascula/saveload.cpp:49 +#, fuzzy +msgid "" +"ScummVM found that you have old savefiles for Drascula that should be " +"converted.\n" +"The old save game format is no longer supported, so you will not be able to " +"load your games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" +msgstr "" +"ScummVM a trouvé des anciens fichiers de sauvegarde pour Broken Sword 1 qui " +"ont besoin d'être convertis.\n" +"L'ancien format de sauvegarde n'est plus supporté, donc vous ne pourrez pas " +"les charger si vous ne les convertissez pas.\n" +"\n" +"Appuyer sur OK pour les convertir maintenant, sinon le même message " +"s'affichera la prochaine fois que vous démarrerez le jeu.\n" + #: engines/dreamweb/detection.cpp:57 msgid "Use bright palette mode" msgstr "Utiliser le mode palette lumineuse" @@ -1324,27 +1368,27 @@ msgstr "Utiliser le mode palette lumineuse" msgid "Display graphics using the game's bright palette" msgstr "Utiliser la palette lumineuse du jeu pour l'affichage" -#: engines/sci/detection.cpp:370 +#: engines/sci/detection.cpp:373 msgid "EGA undithering" msgstr "Détramage EGA" -#: engines/sci/detection.cpp:371 +#: engines/sci/detection.cpp:374 msgid "Enable undithering in EGA games" msgstr "Activer le détramage dans les jeux EGA" -#: engines/sci/detection.cpp:380 +#: engines/sci/detection.cpp:383 msgid "Prefer digital sound effects" msgstr "Préférer les effets sonors digitals" -#: engines/sci/detection.cpp:381 +#: engines/sci/detection.cpp:384 msgid "Prefer digital sound effects instead of synthesized ones" msgstr "Préférer les effets sonores digitaux plutôt que ceux synthétisés" -#: engines/sci/detection.cpp:400 +#: engines/sci/detection.cpp:403 msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "Utiliser IMF/Yamaha FB-01 pour la sortie MIDI" -#: engines/sci/detection.cpp:401 +#: engines/sci/detection.cpp:404 msgid "" "Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" @@ -1352,32 +1396,32 @@ msgstr "" "Utiliser une carte IBM Music Feature ou un module Yamaha FB-01 FM pour la " "sortie MIDI" -#: engines/sci/detection.cpp:411 +#: engines/sci/detection.cpp:414 msgid "Use CD audio" msgstr "Utiliser la musique du CD" -#: engines/sci/detection.cpp:412 +#: engines/sci/detection.cpp:415 msgid "Use CD audio instead of in-game audio, if available" msgstr "" "Utiliser la musique du CD quand elle est disponible au lieu de la musique du " "jeu" -#: engines/sci/detection.cpp:422 +#: engines/sci/detection.cpp:425 msgid "Use Windows cursors" msgstr "Utiliser les curseurs Windows" -#: engines/sci/detection.cpp:423 +#: engines/sci/detection.cpp:426 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "" "Utiliser les curseurs Windows (plus petits et monochromes) au lieu des " "curseurs DOS" -#: engines/sci/detection.cpp:433 +#: engines/sci/detection.cpp:436 msgid "Use silver cursors" msgstr "Utiliser les curseurs argentés" -#: engines/sci/detection.cpp:434 +#: engines/sci/detection.cpp:437 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "Utiliser les curseurs argentés au lieu des curseurs normaux dorés" @@ -2029,7 +2073,7 @@ msgstr "Voler vers la droite" msgid "Fly to lower right" msgstr "Voler vers la bas à droite" -#: engines/scumm/scumm.cpp:1773 +#: engines/scumm/scumm.cpp:1776 #, c-format msgid "" "Native MIDI support requires the Roland Upgrade from LucasArts,\n" @@ -2038,7 +2082,7 @@ msgstr "" "Support MIDI natif requière la mise à jour Roland de LucasArt,\n" "mais %s manque. Utilise AdLib à la place." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 +#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2049,7 +2093,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 +#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2060,7 +2104,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 +#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2071,7 +2115,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2512 +#: engines/scumm/scumm.cpp:2537 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2083,7 +2127,7 @@ msgstr "" "répertoire 'Maniac Mansion' dans le répertoire du jeu Day Of The Tentacle." #. I18N: Option for fast scene switching -#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171 +#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167 msgid "~Z~ip Mode Activated" msgstr "Mode ~Z~ip Activé" @@ -2104,11 +2148,11 @@ msgstr "Afficher la Carte" msgid "~M~ain Menu" msgstr "~M~enu Principal" -#: engines/mohawk/dialogs.cpp:172 +#: engines/mohawk/dialogs.cpp:168 msgid "~W~ater Effect Enabled" msgstr "~E~ffets de l'Eau Activés" -#: engines/agos/animation.cpp:560 +#: engines/agos/animation.cpp:557 #, c-format msgid "Cutscene file '%s' not found!" msgstr "Fichier de séquence '%s' non trouvé!" @@ -2126,6 +2170,15 @@ msgstr "Échec de l'enregistrement de l'état du jeu sur le disque." msgid "Failed to delete file." msgstr "Échec de la suppression du fichier." +#: engines/groovie/detection.cpp:312 +#, fuzzy +msgid "Fast movie speed" +msgstr "Mode rapide" + +#: engines/groovie/detection.cpp:313 +msgid "Play movies at an increased speed" +msgstr "" + #: engines/groovie/script.cpp:420 msgid "Failed to save game" msgstr "Échec de la sauvegarde." @@ -2216,11 +2269,11 @@ msgstr "Faire un pas vers la Gauche" msgid "Slide Right" msgstr "Faire un pas vers la Droite" -#: engines/kyra/lol.cpp:485 +#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2412 msgid "Turn Left" msgstr "Tourner vers la Gauche" -#: engines/kyra/lol.cpp:486 +#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2413 msgid "Turn Right" msgstr "Tourner vers la Droite" @@ -2236,7 +2289,7 @@ msgstr "Options" msgid "Choose Spell" msgstr "Choisir un Sort" -#: engines/kyra/sound_midi.cpp:475 +#: engines/kyra/sound_midi.cpp:477 msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2283,28 +2336,28 @@ msgstr "Intro disquette" msgid "Use the floppy version's intro (CD version only)" msgstr "Utiliser l'intro de la version disquette (version CD uniquement)" -#: engines/sword1/animation.cpp:539 +#: engines/sword1/animation.cpp:519 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "" "La scène cinématique PSX '%s' ne peut pas être lu avec 256 couleurs ou moins" -#: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 +#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439 msgid "DXA cutscenes found but ScummVM has been built without zlib support" msgstr "" "Les séquences DXA sont présente mais ScummVM a été compilé sans le support " "zlib." -#: engines/sword1/animation.cpp:570 engines/sword2/animation.cpp:465 +#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449 msgid "MPEG2 cutscenes are no longer supported" msgstr "Les séquences MPEG2 ne sont plus supportées" -#: engines/sword1/animation.cpp:576 engines/sword2/animation.cpp:473 +#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457 #, c-format msgid "Cutscene '%s' not found" msgstr "Séquence '%s' non trouvé" -#: engines/sword1/control.cpp:863 +#: engines/sword1/control.cpp:865 msgid "" "ScummVM found that you have old savefiles for Broken Sword 1 that should be " "converted.\n" @@ -2322,7 +2375,7 @@ msgstr "" "Appuyer sur OK pour les convertir maintenant, sinon le même message " "s'affichera la prochaine fois que vous démarrerez le jeu.\n" -#: engines/sword1/control.cpp:1232 +#: engines/sword1/control.cpp:1234 #, c-format msgid "" "Target new save game already exists!\n" @@ -2331,11 +2384,11 @@ msgstr "" "La sauvegarde cible existe déjà!\n" "Voulez-vous conserver l'ancienne sauvegarde (%s) ou la nouvelle (%s)?\n" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the old one" msgstr "Garde l'ancienne" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the new one" msgstr "Garder la nouvelle" @@ -2343,7 +2396,7 @@ msgstr "Garder la nouvelle" msgid "This is the end of the Broken Sword 1 Demo" msgstr "C'est la fin de la démo des Chevaliers de Baphomet" -#: engines/sword2/animation.cpp:435 +#: engines/sword2/animation.cpp:419 msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" @@ -2358,12 +2411,12 @@ msgstr "Afficher la description des objets" msgid "Show labels for objects on mouse hover" msgstr "Afficher la description des objets lors de passage du pointeur" -#: engines/teenagent/resources.cpp:68 +#: engines/teenagent/resources.cpp:94 msgid "" "You're missing the 'teenagent.dat' file. Get it from the ScummVM website" msgstr "" -#: engines/teenagent/resources.cpp:89 +#: engines/teenagent/resources.cpp:115 msgid "" "The teenagent.dat file is compressed and zlib hasn't been included in this " "executable. Please decompress it" @@ -2417,6 +2470,47 @@ msgstr "" "ScummVM a affiché des messages d'avertissements dans votre fenêtre de " "console et ne peut pas garantir que tous les fichiers ont été convertis." +#: engines/pegasus/pegasus.cpp:675 +msgid "Invalid save file name" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2410 +msgid "Up/Zoom In/Move Forward/Open Doors" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2411 +#, fuzzy +msgid "Down/Zoom Out" +msgstr "Dézoomer" + +#: engines/pegasus/pegasus.cpp:2414 +msgid "Display/Hide Inventory Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2415 +msgid "Display/Hide Biochip Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2416 +msgid "Action/Select" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2417 +msgid "Toggle Center Data Display" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2418 +msgid "Display/Hide Info Screen" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2419 +msgid "Display/Hide Pause Menu" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2420 +msgid "???" +msgstr "" + #: audio/fmopl.cpp:49 msgid "MAME OPL emulator" msgstr "Émulateur MAME OPL" @@ -2474,7 +2568,7 @@ msgstr "Pas de musique" msgid "Amiga Audio Emulator" msgstr "Émulateur Amiga Audio" -#: audio/softsynth/adlib.cpp:1593 +#: audio/softsynth/adlib.cpp:2284 msgid "AdLib Emulator" msgstr "Émulateur AdLib" @@ -2486,11 +2580,11 @@ msgstr "Émulateur Apple II GS (PAS IMPLÉMENTÉ)" msgid "C64 Audio Emulator" msgstr "Émulateur C64 Audio" -#: audio/softsynth/mt32.cpp:293 +#: audio/softsynth/mt32.cpp:205 msgid "Initializing MT-32 Emulator" msgstr "Initialisation de l'Émulateur MT-32" -#: audio/softsynth/mt32.cpp:512 +#: audio/softsynth/mt32.cpp:431 msgid "MT-32 Emulator" msgstr "Émulateur MT-32" @@ -2641,24 +2735,24 @@ msgstr "Clic Milieu" msgid "Right Click" msgstr "Clic Droit" -#: backends/platform/sdl/macosx/appmenu_osx.mm:78 +#: backends/platform/sdl/macosx/appmenu_osx.mm:77 msgid "Hide ScummVM" msgstr "Masquer ScummVM" -#: backends/platform/sdl/macosx/appmenu_osx.mm:83 +#: backends/platform/sdl/macosx/appmenu_osx.mm:82 msgid "Hide Others" msgstr "Masquer les autres" -#: backends/platform/sdl/macosx/appmenu_osx.mm:88 +#: backends/platform/sdl/macosx/appmenu_osx.mm:87 msgid "Show All" msgstr "Tout afficher" -#: backends/platform/sdl/macosx/appmenu_osx.mm:110 -#: backends/platform/sdl/macosx/appmenu_osx.mm:121 +#: backends/platform/sdl/macosx/appmenu_osx.mm:109 +#: backends/platform/sdl/macosx/appmenu_osx.mm:120 msgid "Window" msgstr "Fenêtre" -#: backends/platform/sdl/macosx/appmenu_osx.mm:115 +#: backends/platform/sdl/macosx/appmenu_osx.mm:114 msgid "Minimize" msgstr "Placer dans le Dock" @@ -2672,12 +2766,12 @@ msgid "Normal (no scaling)" msgstr "Normal" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537 msgid "Enabled aspect ratio correction" msgstr "Activer la correction du rapport d'aspect" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542 msgid "Disabled aspect ratio correction" msgstr "Désactiver la correction du rapport d'aspect" @@ -2686,7 +2780,7 @@ msgid "Active graphics filter:" msgstr "Mode graphique actif:" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481 msgid "Windowed mode" msgstr "Mode Fenêtre" @@ -2710,11 +2804,11 @@ msgstr "Mode vidéo actuel" msgid "Current scale" msgstr "Échelle actuelle" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:558 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562 msgid "Active filter mode: Linear" msgstr "Filtre actif: Linéaire" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:560 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564 msgid "Active filter mode: Nearest" msgstr "Filtre actif: Plus proche" @@ -3042,19 +3136,19 @@ msgstr "Voulez-vous vraiment quitter?" #: backends/events/gph/gph-events.cpp:386 #: backends/events/gph/gph-events.cpp:429 -#: backends/events/openpandora/op-events.cpp:139 +#: backends/events/openpandora/op-events.cpp:168 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "Touchscreen 'Tap Mode' - Clic Gauche" #: backends/events/gph/gph-events.cpp:388 #: backends/events/gph/gph-events.cpp:431 -#: backends/events/openpandora/op-events.cpp:141 +#: backends/events/openpandora/op-events.cpp:170 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "Touchscreen 'Tap Mode' - Clic Droit" #: backends/events/gph/gph-events.cpp:390 #: backends/events/gph/gph-events.cpp:433 -#: backends/events/openpandora/op-events.cpp:143 +#: backends/events/openpandora/op-events.cpp:172 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "Touchscreen 'Tap Mode' - Déplacer sans cliquer" @@ -3074,7 +3168,12 @@ msgstr "Volume Minimum" msgid "Decreasing Volume" msgstr "Diminution Volume" -#: backends/updates/macosx/macosx-updates.mm:65 +#: backends/events/openpandora/op-events.cpp:174 +#, fuzzy +msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)" +msgstr "Touchscreen 'Tap Mode' - Déplacer sans cliquer" + +#: backends/updates/macosx/macosx-updates.mm:67 msgid "Check for Updates..." msgstr "Recherche des mises à jour..." @@ -3110,6 +3209,9 @@ msgstr "Clic Activé" msgid "Clicking Disabled" msgstr "Clic Désactivé" +#~ msgid "Enable Roland GS Mode" +#~ msgstr "Activer le mode Roland GS" + #~ msgid "Hercules Green" #~ msgstr "Hercules Vert" diff --git a/po/gl_ES.po b/po/gl_ES.po index d08867b717..8d048f546b 100644 --- a/po/gl_ES.po +++ b/po/gl_ES.po @@ -1,5 +1,5 @@ # LANGUAGE translation for ScummVM. -# Copyright (C) YEAR ScummVM Team +# Copyright (C) 2010-2013 ScummVM Team # This file is distributed under the same license as the ScummVM package. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.6.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-08-12 14:57+0200\n" +"POT-Creation-Date: 2013-02-07 23:11+0000\n" "PO-Revision-Date: 2012-08-15 13:33+0100\n" "Last-Translator: Santiago G. Sanz <s.sanz@uvigo.es>\n" "Language-Team: \n" @@ -16,45 +16,55 @@ msgstr "" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -#: gui/about.cpp:91 +#: gui/about.cpp:93 #, c-format msgid "(built on %s)" msgstr "(compilado o %s)" -#: gui/about.cpp:98 +#: gui/about.cpp:100 msgid "Features compiled in:" msgstr "Funcionalidades compiladas:" -#: gui/about.cpp:107 +#: gui/about.cpp:109 msgid "Available engines:" msgstr "Motores dispoñibles:" -#: gui/browser.cpp:66 +#: gui/browser.cpp:67 +#, fuzzy +msgid "Show hidden files" +msgstr "Mostrar/ocultar consola" + +#: gui/browser.cpp:67 +msgid "Show files marked with the hidden attribute" +msgstr "" + +#: gui/browser.cpp:71 msgid "Go up" msgstr "Arriba" -#: gui/browser.cpp:66 gui/browser.cpp:68 +#: gui/browser.cpp:71 gui/browser.cpp:73 msgid "Go to previous directory level" msgstr "Ir ao directorio superior" -#: gui/browser.cpp:68 +#: gui/browser.cpp:73 msgctxt "lowres" msgid "Go up" msgstr "Arriba" -#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 -#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 -#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 -#: gui/themebrowser.cpp:54 engines/engine.cpp:442 -#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 +#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238 +#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275 +#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919 +#: gui/themebrowser.cpp:54 engines/engine.cpp:447 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:190 +#: engines/sword1/control.cpp:867 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" msgstr "Cancelar" -#: gui/browser.cpp:70 gui/chooser.cpp:46 gui/themebrowser.cpp:55 +#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55 msgid "Choose" msgstr "Elexir" @@ -69,15 +79,15 @@ msgstr "Pechar" msgid "Mouse click" msgstr "Premer co rato" -#: gui/gui-manager.cpp:122 base/main.cpp:300 +#: gui/gui-manager.cpp:122 base/main.cpp:301 msgid "Display keyboard" msgstr "Mostrar teclado" -#: gui/gui-manager.cpp:126 base/main.cpp:304 +#: gui/gui-manager.cpp:126 base/main.cpp:305 msgid "Remap keys" msgstr "Asignar teclas" -#: gui/gui-manager.cpp:129 base/main.cpp:307 +#: gui/gui-manager.cpp:129 base/main.cpp:308 msgid "Toggle FullScreen" msgstr "Activar/desactivar pantalla completa" @@ -90,17 +100,18 @@ msgid "Map" msgstr "Asignar" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 -#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 -#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 -#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 -#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 -#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 -#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 -#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 -#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 -#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 +#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239 +#: gui/saveload-dialog.cpp:920 engines/engine.cpp:366 engines/engine.cpp:377 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192 +#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558 +#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 +#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519 +#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550 +#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:867 +#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419 +#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449 +#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "Aceptar" @@ -171,8 +182,8 @@ msgid "" "English" msgstr "Idioma do xogo. Non converterá a versión galega do xogo en inglesa" -#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:80 -#: gui/options.cpp:730 gui/options.cpp:743 gui/options.cpp:1199 +#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86 +#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209 #: audio/null.cpp:40 msgid "<default>" msgstr "<por defecto>" @@ -194,11 +205,11 @@ msgstr "Plataforma:" msgid "Engine" msgstr "Motor" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "Graphics" msgstr "Gráficos" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "GFX" msgstr "Efectos gráficos" @@ -211,7 +222,7 @@ msgctxt "lowres" msgid "Override global graphic settings" msgstr "Anular a configuración dos gráficos" -#: gui/launcher.cpp:251 gui/options.cpp:1085 +#: gui/launcher.cpp:251 gui/options.cpp:1095 msgid "Audio" msgstr "Son" @@ -224,11 +235,11 @@ msgctxt "lowres" msgid "Override global audio settings" msgstr "Anular a configuración do son" -#: gui/launcher.cpp:265 gui/options.cpp:1090 +#: gui/launcher.cpp:265 gui/options.cpp:1100 msgid "Volume" msgstr "Volume" -#: gui/launcher.cpp:267 gui/options.cpp:1092 +#: gui/launcher.cpp:267 gui/options.cpp:1102 msgctxt "lowres" msgid "Volume" msgstr "Volume" @@ -242,7 +253,7 @@ msgctxt "lowres" msgid "Override global volume settings" msgstr "Anular a configuración do volume" -#: gui/launcher.cpp:280 gui/options.cpp:1100 +#: gui/launcher.cpp:280 gui/options.cpp:1110 msgid "MIDI" msgstr "MIDI" @@ -255,7 +266,7 @@ msgctxt "lowres" msgid "Override global MIDI settings" msgstr "Anular a configuración de MIDI" -#: gui/launcher.cpp:294 gui/options.cpp:1106 +#: gui/launcher.cpp:294 gui/options.cpp:1116 msgid "MT-32" msgstr "MT-32" @@ -268,11 +279,11 @@ msgctxt "lowres" msgid "Override global MT-32 settings" msgstr "Anular a configuración de MT-32" -#: gui/launcher.cpp:308 gui/options.cpp:1113 +#: gui/launcher.cpp:308 gui/options.cpp:1123 msgid "Paths" msgstr "Camiños" -#: gui/launcher.cpp:310 gui/options.cpp:1115 +#: gui/launcher.cpp:310 gui/options.cpp:1125 msgctxt "lowres" msgid "Paths" msgstr "Camiños" @@ -286,7 +297,7 @@ msgctxt "lowres" msgid "Game Path:" msgstr "Camiño do xogo:" -#: gui/launcher.cpp:324 gui/options.cpp:1139 +#: gui/launcher.cpp:324 gui/options.cpp:1149 msgid "Extra Path:" msgstr "Camiño adicional:" @@ -294,42 +305,42 @@ msgstr "Camiño adicional:" msgid "Specifies path to additional data used the game" msgstr "Especifica o camiño dos datos adicionais usados no xogo" -#: gui/launcher.cpp:326 gui/options.cpp:1141 +#: gui/launcher.cpp:326 gui/options.cpp:1151 msgctxt "lowres" msgid "Extra Path:" msgstr "Camiño adicional:" -#: gui/launcher.cpp:333 gui/options.cpp:1123 +#: gui/launcher.cpp:333 gui/options.cpp:1133 msgid "Save Path:" msgstr "Camiño de gardado:" #: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 -#: gui/options.cpp:1123 gui/options.cpp:1125 gui/options.cpp:1126 +#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136 msgid "Specifies where your savegames are put" msgstr "Especifica o lugar dos ficheiros de gardado" -#: gui/launcher.cpp:335 gui/options.cpp:1125 +#: gui/launcher.cpp:335 gui/options.cpp:1135 msgctxt "lowres" msgid "Save Path:" msgstr "Camiño de gardado:" #: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 -#: gui/launcher.cpp:565 gui/options.cpp:1134 gui/options.cpp:1142 -#: gui/options.cpp:1151 gui/options.cpp:1258 gui/options.cpp:1264 -#: gui/options.cpp:1272 gui/options.cpp:1302 gui/options.cpp:1308 -#: gui/options.cpp:1315 gui/options.cpp:1408 gui/options.cpp:1411 -#: gui/options.cpp:1423 +#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152 +#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282 +#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326 +#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429 +#: gui/options.cpp:1441 msgctxt "path" msgid "None" msgstr "Ningún" #: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 -#: gui/options.cpp:1252 gui/options.cpp:1296 gui/options.cpp:1414 +#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Predefinido" -#: gui/launcher.cpp:504 gui/options.cpp:1417 +#: gui/launcher.cpp:504 gui/options.cpp:1435 msgid "Select SoundFont" msgstr "Seleccionar SoundFont" @@ -353,7 +364,7 @@ msgstr "Este ID de xogo xa está en uso. Selecciona outro." msgid "~Q~uit" msgstr "~S~aír" -#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:96 +#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95 msgid "Quit ScummVM" msgstr "Saír de ScummVM" @@ -361,7 +372,7 @@ msgstr "Saír de ScummVM" msgid "A~b~out..." msgstr "Ace~r~ca de..." -#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:70 +#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69 msgid "About ScummVM" msgstr "Acerca de ScummVM" @@ -438,12 +449,14 @@ msgstr "Buscar:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 +#: engines/pegasus/pegasus.cpp:345 msgid "Load game:" msgstr "Cargar partida:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:345 +#: backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Cargar" @@ -528,133 +541,133 @@ msgstr "%d directorios analizados..." msgid "Discovered %d new games, ignored %d previously added games ..." msgstr "%d xogos novos atopados; %d xogos xa engadidos ignorados..." -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "Never" msgstr "Nunca" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 5 mins" msgstr "cada 5 min" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 10 mins" msgstr "cada 10 min" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 15 mins" msgstr "cada 15 min" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 30 mins" msgstr "cada 30 min" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "8 kHz" msgstr "8 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "11kHz" msgstr "11 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "22 kHz" msgstr "22 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "44 kHz" msgstr "44 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:248 gui/options.cpp:474 gui/options.cpp:575 -#: gui/options.cpp:644 gui/options.cpp:852 +#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581 +#: gui/options.cpp:650 gui/options.cpp:858 msgctxt "soundfont" msgid "None" msgstr "Ningunha" -#: gui/options.cpp:382 +#: gui/options.cpp:388 msgid "Failed to apply some of the graphic options changes:" msgstr "Erro ao aplicar os cambios na configuración dos gráficos:" -#: gui/options.cpp:394 +#: gui/options.cpp:400 msgid "the video mode could not be changed." msgstr "non se puido cambiar o modo de vídeo." -#: gui/options.cpp:400 +#: gui/options.cpp:406 msgid "the fullscreen setting could not be changed" msgstr "non se puido cambiar a configuración de pantalla completa." -#: gui/options.cpp:406 +#: gui/options.cpp:412 msgid "the aspect ratio setting could not be changed" msgstr "non se puido cambiar a proporción." -#: gui/options.cpp:727 +#: gui/options.cpp:733 msgid "Graphics mode:" msgstr "Modo de gráficos:" -#: gui/options.cpp:741 +#: gui/options.cpp:747 msgid "Render mode:" msgstr "Modo de procesamento:" -#: gui/options.cpp:741 gui/options.cpp:742 +#: gui/options.cpp:747 gui/options.cpp:748 msgid "Special dithering modes supported by some games" msgstr "Modos de interpolación de cores compatibles con algúns xogos" -#: gui/options.cpp:753 +#: gui/options.cpp:759 #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476 msgid "Fullscreen mode" msgstr "Pantalla completa" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Aspect ratio correction" msgstr "Corrección de proporción" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Correct aspect ratio for 320x200 games" msgstr "Corrixir a proporción para os xogos en 320x200" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Preferred Device:" msgstr "Dispositivo preferido:" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Music Device:" msgstr "Dispositivo de música:" -#: gui/options.cpp:764 gui/options.cpp:766 +#: gui/options.cpp:770 gui/options.cpp:772 msgid "Specifies preferred sound device or sound card emulator" msgstr "Especifica o dispositivo ou emulador de tarxeta de son preferido" -#: gui/options.cpp:764 gui/options.cpp:766 gui/options.cpp:767 +#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773 msgid "Specifies output sound device or sound card emulator" msgstr "Especifica o dispositivo ou emulador de tarxeta de son de saída" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Preferred Dev.:" msgstr "Disp. preferido:" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Music Device:" msgstr "Disp. música:" -#: gui/options.cpp:793 +#: gui/options.cpp:799 msgid "AdLib emulator:" msgstr "Emulador de AdLib:" -#: gui/options.cpp:793 gui/options.cpp:794 +#: gui/options.cpp:799 gui/options.cpp:800 msgid "AdLib is used for music in many games" msgstr "Moitos xogos empregan AdLib para a música" -#: gui/options.cpp:804 +#: gui/options.cpp:810 msgid "Output rate:" msgstr "Taxa de saída:" -#: gui/options.cpp:804 gui/options.cpp:805 +#: gui/options.cpp:810 gui/options.cpp:811 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -662,255 +675,260 @@ msgstr "" "A maior valor, maior calidade do son, mais talvez non sexa compatible coa " "tarxeta" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "GM Device:" msgstr "Dispositivo de GM:" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "Specifies default sound device for General MIDI output" msgstr "" "Especifica o dispositivo de son por defecto para a saída de General MIDI" -#: gui/options.cpp:826 +#: gui/options.cpp:832 msgid "Don't use General MIDI music" msgstr "Non empregar música en General MIDI" -#: gui/options.cpp:837 gui/options.cpp:899 +#: gui/options.cpp:843 gui/options.cpp:909 msgid "Use first available device" msgstr "Empregar o primeiro dispositivo dispoñible" -#: gui/options.cpp:849 +#: gui/options.cpp:855 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 +#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "SoundFont é compatible con algunhas tarxetas de son, Fluidsynth e Timidity" -#: gui/options.cpp:851 +#: gui/options.cpp:857 msgctxt "lowres" msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Mixed AdLib/MIDI mode" msgstr "Modo AdLib/MIDI mixto" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Use both MIDI and AdLib sound generation" msgstr "Empregar xeración de son MIDI e máis AdLib" -#: gui/options.cpp:860 +#: gui/options.cpp:866 msgid "MIDI gain:" msgstr "Ganancia de MIDI:" -#: gui/options.cpp:870 +#: gui/options.cpp:873 +msgid "FluidSynth Settings" +msgstr "" + +#: gui/options.cpp:880 msgid "MT-32 Device:" msgstr "Dispositivo de MT-32:" -#: gui/options.cpp:870 +#: gui/options.cpp:880 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" "Especifica o dispositivo por defecto para a saída de Roland MT-32/LAPC1/" "CM32l/CM64" -#: gui/options.cpp:875 +#: gui/options.cpp:885 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Roland MT-32 verdadeiro (sen emulación de GM)" -#: gui/options.cpp:875 gui/options.cpp:877 +#: gui/options.cpp:885 gui/options.cpp:887 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" msgstr "" "Marcar para empregar o hardware compatible con Roland conectado ao sistema" -#: gui/options.cpp:877 +#: gui/options.cpp:887 msgctxt "lowres" msgid "True Roland MT-32 (no GM emulation)" msgstr "Roland MT-32 (sen emulación de GM)" -#: gui/options.cpp:880 -msgid "Enable Roland GS Mode" -msgstr "Activar modo Roland GS" +#: gui/options.cpp:890 +#, fuzzy +msgid "Roland GS Mode (disable GM mapping)" +msgstr "Roland MT-32 verdadeiro (sen emulación de GM)" -#: gui/options.cpp:880 +#: gui/options.cpp:890 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "Desactiva o General MIDI para os xogos con música en Roland MT-32" -#: gui/options.cpp:889 +#: gui/options.cpp:899 msgid "Don't use Roland MT-32 music" msgstr "Non empregar música en Roland MT-32" -#: gui/options.cpp:916 +#: gui/options.cpp:926 msgid "Text and Speech:" msgstr "Texto e voz:" -#: gui/options.cpp:920 gui/options.cpp:930 +#: gui/options.cpp:930 gui/options.cpp:940 msgid "Speech" msgstr "Voz" -#: gui/options.cpp:921 gui/options.cpp:931 +#: gui/options.cpp:931 gui/options.cpp:941 msgid "Subtitles" msgstr "Subtítulos" -#: gui/options.cpp:922 +#: gui/options.cpp:932 msgid "Both" msgstr "Ambos" -#: gui/options.cpp:924 +#: gui/options.cpp:934 msgid "Subtitle speed:" msgstr "Velocidade dos subtítulos:" -#: gui/options.cpp:926 +#: gui/options.cpp:936 msgctxt "lowres" msgid "Text and Speech:" msgstr "Texto e voz:" -#: gui/options.cpp:930 +#: gui/options.cpp:940 msgid "Spch" msgstr "Voz" -#: gui/options.cpp:931 +#: gui/options.cpp:941 msgid "Subs" msgstr "Subs" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgctxt "lowres" msgid "Both" msgstr "Ambos" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgid "Show subtitles and play speech" msgstr "Mostrar os subtítulos e reproducir as voces" -#: gui/options.cpp:934 +#: gui/options.cpp:944 msgctxt "lowres" msgid "Subtitle speed:" msgstr "Velocidade subs:" -#: gui/options.cpp:950 +#: gui/options.cpp:960 msgid "Music volume:" msgstr "Volume de música:" -#: gui/options.cpp:952 +#: gui/options.cpp:962 msgctxt "lowres" msgid "Music volume:" msgstr "Volume música:" -#: gui/options.cpp:959 +#: gui/options.cpp:969 msgid "Mute All" msgstr "Silenciar todo" -#: gui/options.cpp:962 +#: gui/options.cpp:972 msgid "SFX volume:" msgstr "Volume de efectos:" -#: gui/options.cpp:962 gui/options.cpp:964 gui/options.cpp:965 +#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975 msgid "Special sound effects volume" msgstr "Volume dos efectos de son" -#: gui/options.cpp:964 +#: gui/options.cpp:974 msgctxt "lowres" msgid "SFX volume:" msgstr "Volume efectos:" -#: gui/options.cpp:972 +#: gui/options.cpp:982 msgid "Speech volume:" msgstr "Volume de voz:" -#: gui/options.cpp:974 +#: gui/options.cpp:984 msgctxt "lowres" msgid "Speech volume:" msgstr "Volume voz:" -#: gui/options.cpp:1131 +#: gui/options.cpp:1141 msgid "Theme Path:" msgstr "Camiño do tema:" -#: gui/options.cpp:1133 +#: gui/options.cpp:1143 msgctxt "lowres" msgid "Theme Path:" msgstr "Camiño tema:" -#: gui/options.cpp:1139 gui/options.cpp:1141 gui/options.cpp:1142 +#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "Especificar o camiño dos datos adicionais de todos os xogos ou de ScummVM" -#: gui/options.cpp:1148 +#: gui/options.cpp:1158 msgid "Plugins Path:" msgstr "Camiño dos complementos:" -#: gui/options.cpp:1150 +#: gui/options.cpp:1160 msgctxt "lowres" msgid "Plugins Path:" msgstr "Camiño complementos:" -#: gui/options.cpp:1159 +#: gui/options.cpp:1169 msgid "Misc" msgstr "Misc." -#: gui/options.cpp:1161 +#: gui/options.cpp:1171 msgctxt "lowres" msgid "Misc" msgstr "Misc." -#: gui/options.cpp:1163 +#: gui/options.cpp:1173 msgid "Theme:" msgstr "Tema:" -#: gui/options.cpp:1167 +#: gui/options.cpp:1177 msgid "GUI Renderer:" msgstr "Procesamento da interfaz:" -#: gui/options.cpp:1179 +#: gui/options.cpp:1189 msgid "Autosave:" msgstr "Autogardado:" -#: gui/options.cpp:1181 +#: gui/options.cpp:1191 msgctxt "lowres" msgid "Autosave:" msgstr "Autogardado:" -#: gui/options.cpp:1189 +#: gui/options.cpp:1199 msgid "Keys" msgstr "Teclas" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "GUI Language:" msgstr "Idioma de interfaz:" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "Language of ScummVM GUI" msgstr "Idioma da interfaz de ScummVM" -#: gui/options.cpp:1347 +#: gui/options.cpp:1365 msgid "You have to restart ScummVM before your changes will take effect." msgstr "Debes reiniciar ScummVM para que os cambios teñan efecto." -#: gui/options.cpp:1360 +#: gui/options.cpp:1378 msgid "Select directory for savegames" msgstr "Seleccionar directorio para ficheiros de gardado" -#: gui/options.cpp:1367 +#: gui/options.cpp:1385 msgid "The chosen directory cannot be written to. Please select another one." msgstr "Non é posible escribir no directorio elixido. Selecciona outro." -#: gui/options.cpp:1376 +#: gui/options.cpp:1394 msgid "Select directory for GUI themes" msgstr "Seleccionar directorio para temas de interfaz" -#: gui/options.cpp:1386 +#: gui/options.cpp:1404 msgid "Select directory for extra files" msgstr "Seleccionar directorio para ficheiros adicionais" -#: gui/options.cpp:1397 +#: gui/options.cpp:1415 msgid "Select directory for plugins" msgstr "Seleccionar directorio para complementos" -#: gui/options.cpp:1450 +#: gui/options.cpp:1468 msgid "" "The theme you selected does not support your current language. If you want " "to use this theme you need to switch to another language first." @@ -918,71 +936,71 @@ msgstr "" "O tema seleccionado non é compatible co idioma actual. Para empregar o tema, " "deberás cambiar antes o idioma da interfaz." -#: gui/saveload-dialog.cpp:158 +#: gui/saveload-dialog.cpp:166 msgid "List view" msgstr "Lista" -#: gui/saveload-dialog.cpp:159 +#: gui/saveload-dialog.cpp:167 msgid "Grid view" msgstr "Grade" -#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 +#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358 msgid "No date saved" msgstr "Non hai data gardada" -#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359 msgid "No time saved" msgstr "Non hai hora gardada" -#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 +#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360 msgid "No playtime saved" msgstr "Non hai tempo de xogo gardado" -#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275 msgid "Delete" msgstr "Eliminar" -#: gui/saveload-dialog.cpp:266 +#: gui/saveload-dialog.cpp:274 msgid "Do you really want to delete this savegame?" msgstr "Seguro que queres eliminar esta partida?" -#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 +#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872 msgid "Date: " msgstr "Data:" -#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 +#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878 msgid "Time: " msgstr "Hora:" -#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 +#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886 msgid "Playtime: " msgstr "Tempo de xogo:" -#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 +#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494 msgid "Untitled savestate" msgstr "Partida sen título" -#: gui/saveload-dialog.cpp:517 +#: gui/saveload-dialog.cpp:546 msgid "Next" msgstr "Seg." -#: gui/saveload-dialog.cpp:520 +#: gui/saveload-dialog.cpp:549 msgid "Prev" msgstr "Ant." -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 msgid "New Save" msgstr "Novo ficheiro" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 msgid "Create a new save game" msgstr "Crea un novo ficheiro de gardado" -#: gui/saveload-dialog.cpp:789 +#: gui/saveload-dialog.cpp:865 msgid "Name: " msgstr "Nome:" -#: gui/saveload-dialog.cpp:861 +#: gui/saveload-dialog.cpp:937 #, c-format msgid "Enter a description for slot %d:" msgstr "Introduce unha descrición para o espazo %d:" @@ -1020,35 +1038,35 @@ msgstr "Antidistorsión (16 bpp)" msgid "Clear value" msgstr "Limpar valor" -#: base/main.cpp:209 +#: base/main.cpp:210 #, c-format msgid "Engine does not support debug level '%s'" msgstr "O motor non é compatible co nivel de depuración %s" -#: base/main.cpp:287 +#: base/main.cpp:288 msgid "Menu" msgstr "Menú" -#: base/main.cpp:290 backends/platform/symbian/src/SymbianActions.cpp:45 +#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:45 #: backends/platform/wince/CEActionsSmartphone.cpp:46 msgid "Skip" msgstr "Omitir" -#: base/main.cpp:293 backends/platform/symbian/src/SymbianActions.cpp:50 +#: base/main.cpp:294 backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:42 msgid "Pause" msgstr "Pausa" -#: base/main.cpp:296 +#: base/main.cpp:297 msgid "Skip line" msgstr "Omitir liña" -#: base/main.cpp:467 +#: base/main.cpp:468 msgid "Error running game:" msgstr "Erro de execución do xogo:" -#: base/main.cpp:491 +#: base/main.cpp:492 msgid "Could not find any engine capable of running the selected game" msgstr "Non se puido atopar un motor para executar o xogo seleccionado" @@ -1163,13 +1181,16 @@ msgid "~R~eturn to Launcher" msgstr "~V~olver ao Iniciador" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284 +#: engines/pegasus/pegasus.cpp:369 msgid "Save game:" msgstr "Gardar partida:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:369 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1198,12 +1219,12 @@ msgstr "" "básica e máis instrucións para acadar asistencia adicional." #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 -#: engines/mohawk/dialogs.cpp:174 +#: engines/mohawk/dialogs.cpp:170 msgid "~O~K" msgstr "~A~ceptar" #: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 -#: engines/mohawk/dialogs.cpp:175 +#: engines/mohawk/dialogs.cpp:171 msgid "~C~ancel" msgstr "~C~ancelar" @@ -1211,23 +1232,23 @@ msgstr "~C~ancelar" msgid "~K~eys" msgstr "~T~eclas" -#: engines/engine.cpp:235 +#: engines/engine.cpp:240 msgid "Could not initialize color format." msgstr "Non se puido iniciar o formato de cor." -#: engines/engine.cpp:243 +#: engines/engine.cpp:248 msgid "Could not switch to video mode: '" msgstr "Non se puido cambiar ao modo de vídeo: '" -#: engines/engine.cpp:252 +#: engines/engine.cpp:257 msgid "Could not apply aspect ratio setting." msgstr "Non se puido aplicar a configuración de proporción." -#: engines/engine.cpp:257 +#: engines/engine.cpp:262 msgid "Could not apply fullscreen setting." msgstr "Non se puido aplicar a configuración de pantalla completa." -#: engines/engine.cpp:357 +#: engines/engine.cpp:362 msgid "" "You appear to be playing this game directly\n" "from the CD. This is known to cause problems,\n" @@ -1241,7 +1262,7 @@ msgstr "" "os ficheiros de datos ao disco duro. Consulta\n" "o ficheiro README para obter máis información." -#: engines/engine.cpp:368 +#: engines/engine.cpp:373 msgid "" "This game has audio tracks in its disk. These\n" "tracks need to be ripped from the disk using\n" @@ -1255,7 +1276,7 @@ msgstr "" "do xogo. Consulta o ficheiro README\n" "para obter máis información." -#: engines/engine.cpp:426 +#: engines/engine.cpp:431 #, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " @@ -1264,7 +1285,7 @@ msgstr "" "Erro ao cargar (%s)! Consulta o ficheiro README para obter información " "básica e máis instrucións para acadar asistencia adicional." -#: engines/engine.cpp:439 +#: engines/engine.cpp:444 msgid "" "WARNING: The game you are about to start is not yet fully supported by " "ScummVM. As such, it is likely to be unstable, and any saves you make might " @@ -1274,29 +1295,52 @@ msgstr "" "Por iso, talvez sexa inestable e os ficheiros de gardado talvez non " "funcionen en futuras versións de ScummVM." -#: engines/engine.cpp:442 +#: engines/engine.cpp:447 msgid "Start anyway" msgstr "Iniciar de todos os xeitos" -#: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 -#: engines/sci/detection.cpp:390 +#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270 +#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393 +#: engines/toltecs/detection.cpp:173 msgid "Use original save/load screens" msgstr "Empregar pantallas orixinais de gardado e carga" -#: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 -#: engines/sci/detection.cpp:391 +#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271 +#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394 +#: engines/toltecs/detection.cpp:174 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" "Empregar as pantallas orixinais de gardado e carga, no canto das de ScummVM" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore game:" msgstr "Restaurar xogo:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore" msgstr "Restaurar" +#: engines/drascula/saveload.cpp:49 +#, fuzzy +msgid "" +"ScummVM found that you have old savefiles for Drascula that should be " +"converted.\n" +"The old save game format is no longer supported, so you will not be able to " +"load your games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" +msgstr "" +"ScummVM atopou ficheiros de gardado vellos de Broken Sword 1 que deberían " +"ser convertidos.\n" +"O formato vello xa non é compatible, de xeito que non poderás cargar as " +"partidas se non os convertes.\n" +"\n" +"Preme Aceptar para convertilos. Se non, volverás ver esta mensaxe a próxima " +"vez que inicies o xogo.\n" + #: engines/dreamweb/detection.cpp:57 msgid "Use bright palette mode" msgstr "Empregar modo de paleta intensa" @@ -1305,27 +1349,27 @@ msgstr "Empregar modo de paleta intensa" msgid "Display graphics using the game's bright palette" msgstr "Mostrar os gráficos coa paletta intensa do xogo" -#: engines/sci/detection.cpp:370 +#: engines/sci/detection.cpp:373 msgid "EGA undithering" msgstr "Non interpolación EGA" -#: engines/sci/detection.cpp:371 +#: engines/sci/detection.cpp:374 msgid "Enable undithering in EGA games" msgstr "Activar a non interpolación nos xogos en EGA" -#: engines/sci/detection.cpp:380 +#: engines/sci/detection.cpp:383 msgid "Prefer digital sound effects" msgstr "Preferir efectos de son dixitais" -#: engines/sci/detection.cpp:381 +#: engines/sci/detection.cpp:384 msgid "Prefer digital sound effects instead of synthesized ones" msgstr "Dar preferencia aos efectos de son dixitais no canto dos sintéticos" -#: engines/sci/detection.cpp:400 +#: engines/sci/detection.cpp:403 msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "Empregar IMF/Yamaha FB-01 para a saída de MIDI" -#: engines/sci/detection.cpp:401 +#: engines/sci/detection.cpp:404 msgid "" "Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" @@ -1333,30 +1377,30 @@ msgstr "" "Empregar unha tarxeta IBM Music Feature ou un módulo de sintetizador Yamaha " "FB-01 FM para a saída de MIDI" -#: engines/sci/detection.cpp:411 +#: engines/sci/detection.cpp:414 msgid "Use CD audio" msgstr "Empregar son de CD" -#: engines/sci/detection.cpp:412 +#: engines/sci/detection.cpp:415 msgid "Use CD audio instead of in-game audio, if available" msgstr "Empregar son de CD no canto do do xogo, de ser o caso" -#: engines/sci/detection.cpp:422 +#: engines/sci/detection.cpp:425 msgid "Use Windows cursors" msgstr "Empregar cursores de Windows" -#: engines/sci/detection.cpp:423 +#: engines/sci/detection.cpp:426 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "" "Empregar os cursores de Windows (máis pequenos e monocromos) no canto dos de " "DOS" -#: engines/sci/detection.cpp:433 +#: engines/sci/detection.cpp:436 msgid "Use silver cursors" msgstr "Empregar cursores prateados" -#: engines/sci/detection.cpp:434 +#: engines/sci/detection.cpp:437 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "" @@ -2010,7 +2054,7 @@ msgstr "Voar á dereita" msgid "Fly to lower right" msgstr "Voar á dereita abaixo" -#: engines/scumm/scumm.cpp:1773 +#: engines/scumm/scumm.cpp:1776 #, c-format msgid "" "Native MIDI support requires the Roland Upgrade from LucasArts,\n" @@ -2019,7 +2063,7 @@ msgstr "" "A compatibilidade nativa con MIDI precisa a actualización de Roland\n" "de LucasArts, mais falla %s. Empregarase AdLib." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 +#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2030,7 +2074,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 +#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2041,7 +2085,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 +#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2052,7 +2096,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2512 +#: engines/scumm/scumm.cpp:2537 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2063,7 +2107,7 @@ msgstr "" "selecciona o directorio Maniac que está dentro do directorio Tentacle." #. I18N: Option for fast scene switching -#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171 +#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167 msgid "~Z~ip Mode Activated" msgstr "Modo ~c~omprimido activado" @@ -2084,11 +2128,11 @@ msgstr "Mo~s~trar mapa" msgid "~M~ain Menu" msgstr "~M~enú principal" -#: engines/mohawk/dialogs.cpp:172 +#: engines/mohawk/dialogs.cpp:168 msgid "~W~ater Effect Enabled" msgstr "Efecto de ~a~uga activado" -#: engines/agos/animation.cpp:560 +#: engines/agos/animation.cpp:557 #, c-format msgid "Cutscene file '%s' not found!" msgstr "Non se atopou o ficheiro de secuencia %s!" @@ -2106,6 +2150,15 @@ msgstr "Erro ao gardar a partida no ficheiro." msgid "Failed to delete file." msgstr "Erro ao eliminar o ficheiro." +#: engines/groovie/detection.cpp:312 +#, fuzzy +msgid "Fast movie speed" +msgstr "Modo rápido" + +#: engines/groovie/detection.cpp:313 +msgid "Play movies at an increased speed" +msgstr "" + #: engines/groovie/script.cpp:420 msgid "Failed to save game" msgstr "Erro ao gardar a partida" @@ -2196,11 +2249,11 @@ msgstr "Esvarar á esquerda" msgid "Slide Right" msgstr "Esvarar á dereita" -#: engines/kyra/lol.cpp:485 +#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2412 msgid "Turn Left" msgstr "Xirar á esquerda" -#: engines/kyra/lol.cpp:486 +#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2413 msgid "Turn Right" msgstr "Xirar á dereita" @@ -2216,7 +2269,7 @@ msgstr "Opcións" msgid "Choose Spell" msgstr "Elixir feitizo" -#: engines/kyra/sound_midi.cpp:475 +#: engines/kyra/sound_midi.cpp:477 msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2262,27 +2315,27 @@ msgstr "Intro de disquete" msgid "Use the floppy version's intro (CD version only)" msgstr "Empregar a introdución da versión en disquete (só versión en CD)" -#: engines/sword1/animation.cpp:539 +#: engines/sword1/animation.cpp:519 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "Non se pode reproducir a secuencia %s de PSX neste modo gráfico" -#: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 +#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439 msgid "DXA cutscenes found but ScummVM has been built without zlib support" msgstr "" "Atopáronse secuencias de DXA. No entanto, esta versión de ScummVM non é " "compatible con zlib" -#: engines/sword1/animation.cpp:570 engines/sword2/animation.cpp:465 +#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449 msgid "MPEG2 cutscenes are no longer supported" msgstr "Xa non hai compatibilidade coas secuencias en MPEG2" -#: engines/sword1/animation.cpp:576 engines/sword2/animation.cpp:473 +#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457 #, c-format msgid "Cutscene '%s' not found" msgstr "Non se atopou a secuencia %s" -#: engines/sword1/control.cpp:863 +#: engines/sword1/control.cpp:865 msgid "" "ScummVM found that you have old savefiles for Broken Sword 1 that should be " "converted.\n" @@ -2300,7 +2353,7 @@ msgstr "" "Preme Aceptar para convertilos. Se non, volverás ver esta mensaxe a próxima " "vez que inicies o xogo.\n" -#: engines/sword1/control.cpp:1232 +#: engines/sword1/control.cpp:1234 #, c-format msgid "" "Target new save game already exists!\n" @@ -2309,11 +2362,11 @@ msgstr "" "Xa existe unha partida con ese nome!\n" "Queres conservar a vella (%s) ou a nova (%s)?\n" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the old one" msgstr "Conservar a vella" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the new one" msgstr "Conservar a nova" @@ -2321,7 +2374,7 @@ msgstr "Conservar a nova" msgid "This is the end of the Broken Sword 1 Demo" msgstr "Aquí remata a demo de Broken Sword 1" -#: engines/sword2/animation.cpp:435 +#: engines/sword2/animation.cpp:419 msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" @@ -2336,13 +2389,13 @@ msgstr "Mostrar etiquetas" msgid "Show labels for objects on mouse hover" msgstr "Mostrar as etiquetas dos obxectos ao apuntar co rato" -#: engines/teenagent/resources.cpp:68 +#: engines/teenagent/resources.cpp:94 msgid "" "You're missing the 'teenagent.dat' file. Get it from the ScummVM website" msgstr "" "Falta o ficheiro teenagent.dat. Descárgao dende o sitio web de ScummVM." -#: engines/teenagent/resources.cpp:89 +#: engines/teenagent/resources.cpp:115 msgid "" "The teenagent.dat file is compressed and zlib hasn't been included in this " "executable. Please decompress it" @@ -2400,6 +2453,47 @@ msgstr "" "\n" "Contacta co equipo de ScummVM." +#: engines/pegasus/pegasus.cpp:675 +msgid "Invalid save file name" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2410 +msgid "Up/Zoom In/Move Forward/Open Doors" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2411 +#, fuzzy +msgid "Down/Zoom Out" +msgstr "Ampliar" + +#: engines/pegasus/pegasus.cpp:2414 +msgid "Display/Hide Inventory Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2415 +msgid "Display/Hide Biochip Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2416 +msgid "Action/Select" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2417 +msgid "Toggle Center Data Display" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2418 +msgid "Display/Hide Info Screen" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2419 +msgid "Display/Hide Pause Menu" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2420 +msgid "???" +msgstr "" + #: audio/fmopl.cpp:49 msgid "MAME OPL emulator" msgstr "Emulador de OPL de MAME" @@ -2457,7 +2551,7 @@ msgstr "Sen música" msgid "Amiga Audio Emulator" msgstr "Emulador de Amiga Audio" -#: audio/softsynth/adlib.cpp:1593 +#: audio/softsynth/adlib.cpp:2284 msgid "AdLib Emulator" msgstr "Emulador de AdLib" @@ -2469,11 +2563,11 @@ msgstr "Emulador de Apple II GS (non implementado)" msgid "C64 Audio Emulator" msgstr "Emulador de C64 Audio" -#: audio/softsynth/mt32.cpp:293 +#: audio/softsynth/mt32.cpp:205 msgid "Initializing MT-32 Emulator" msgstr "Iniciando emulador de MT-32" -#: audio/softsynth/mt32.cpp:512 +#: audio/softsynth/mt32.cpp:431 msgid "MT-32 Emulator" msgstr "Emulador de MT-32" @@ -2624,24 +2718,24 @@ msgstr "Botón central" msgid "Right Click" msgstr "Botón secundario" -#: backends/platform/sdl/macosx/appmenu_osx.mm:78 +#: backends/platform/sdl/macosx/appmenu_osx.mm:77 msgid "Hide ScummVM" msgstr "Ocultar ScummVM" -#: backends/platform/sdl/macosx/appmenu_osx.mm:83 +#: backends/platform/sdl/macosx/appmenu_osx.mm:82 msgid "Hide Others" msgstr "Ocultar outros" -#: backends/platform/sdl/macosx/appmenu_osx.mm:88 +#: backends/platform/sdl/macosx/appmenu_osx.mm:87 msgid "Show All" msgstr "Mostrar todo" -#: backends/platform/sdl/macosx/appmenu_osx.mm:110 -#: backends/platform/sdl/macosx/appmenu_osx.mm:121 +#: backends/platform/sdl/macosx/appmenu_osx.mm:109 +#: backends/platform/sdl/macosx/appmenu_osx.mm:120 msgid "Window" msgstr "Ventá" -#: backends/platform/sdl/macosx/appmenu_osx.mm:115 +#: backends/platform/sdl/macosx/appmenu_osx.mm:114 msgid "Minimize" msgstr "Minimizar" @@ -2655,12 +2749,12 @@ msgid "Normal (no scaling)" msgstr "Normal (sen escala)" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537 msgid "Enabled aspect ratio correction" msgstr "Corrección de proporción activada" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542 msgid "Disabled aspect ratio correction" msgstr "Corrección de proporción desactivada" @@ -2669,7 +2763,7 @@ msgid "Active graphics filter:" msgstr "Filtro de gráficos activo:" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481 msgid "Windowed mode" msgstr "Modo en ventá" @@ -2693,11 +2787,11 @@ msgstr "Modo de visualización actual" msgid "Current scale" msgstr "Escala actual" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:558 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562 msgid "Active filter mode: Linear" msgstr "Modo de filtro activo: lineal" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:560 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564 msgid "Active filter mode: Nearest" msgstr "Modo de filtro activo: máis próximo" @@ -3023,19 +3117,19 @@ msgstr "Seguro que queres saír?" #: backends/events/gph/gph-events.cpp:386 #: backends/events/gph/gph-events.cpp:429 -#: backends/events/openpandora/op-events.cpp:139 +#: backends/events/openpandora/op-events.cpp:168 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "Modo pantalla táctil: premer botón primario" #: backends/events/gph/gph-events.cpp:388 #: backends/events/gph/gph-events.cpp:431 -#: backends/events/openpandora/op-events.cpp:141 +#: backends/events/openpandora/op-events.cpp:170 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "Modo pantalla táctil: premer botón secundario" #: backends/events/gph/gph-events.cpp:390 #: backends/events/gph/gph-events.cpp:433 -#: backends/events/openpandora/op-events.cpp:143 +#: backends/events/openpandora/op-events.cpp:172 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "Modo pantalla táctil: apuntar co rato" @@ -3055,7 +3149,12 @@ msgstr "Volume mínimo" msgid "Decreasing Volume" msgstr "Baixando volume" -#: backends/updates/macosx/macosx-updates.mm:65 +#: backends/events/openpandora/op-events.cpp:174 +#, fuzzy +msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)" +msgstr "Modo pantalla táctil: apuntar co rato" + +#: backends/updates/macosx/macosx-updates.mm:67 msgid "Check for Updates..." msgstr "Buscar actualizacións..." @@ -3090,3 +3189,6 @@ msgstr "Premer activado" #: backends/events/maemosdl/maemosdl-events.cpp:192 msgid "Clicking Disabled" msgstr "Premer desactivado" + +#~ msgid "Enable Roland GS Mode" +#~ msgstr "Activar modo Roland GS" diff --git a/po/hu_HU.po b/po/hu_HU.po index b263d2c539..e02882d677 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -1,5 +1,5 @@ # Hungarian translation for ScummVM. -# Copyright (C) 2010-2011 ScummVM Team +# Copyright (C) 2010-2013 ScummVM Team # This file is distributed under the same license as the ScummVM package. # George Kormendi <grubycza@hotmail.com>, 2010. # @@ -7,58 +7,66 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-08-12 14:57+0200\n" -"PO-Revision-Date: 2012-08-14 07:29+0100\n" +"POT-Creation-Date: 2013-02-07 23:11+0000\n" +"PO-Revision-Date: 2013-02-03 09:21+0100\n" "Last-Translator: George Kormendi <grubycza@hotmail.com>\n" "Language-Team: Hungarian\n" "Language: Magyar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-2\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" -"X-Poedit-Language: Hungarian\n" -"X-Poedit-Country: HUNGARY\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: iso-8859-1\n" +"X-Generator: Poedit 1.5.4\n" -#: gui/about.cpp:91 +#: gui/about.cpp:93 #, c-format msgid "(built on %s)" msgstr "(készült %s)" -#: gui/about.cpp:98 +#: gui/about.cpp:100 msgid "Features compiled in:" msgstr "Lefordított összetevõk:" -#: gui/about.cpp:107 +#: gui/about.cpp:109 msgid "Available engines:" msgstr "Támogatott játékmotorok:" -#: gui/browser.cpp:66 +#: gui/browser.cpp:67 +msgid "Show hidden files" +msgstr "Rejtett fájlok látszanak" + +#: gui/browser.cpp:67 +msgid "Show files marked with the hidden attribute" +msgstr "Rejtett attribútumu fájlok megjelenítése" + +#: gui/browser.cpp:71 msgid "Go up" msgstr "Feljebb" -#: gui/browser.cpp:66 gui/browser.cpp:68 +#: gui/browser.cpp:71 gui/browser.cpp:73 msgid "Go to previous directory level" msgstr "Vissza az elõzõ könyvtárszintre" -#: gui/browser.cpp:68 +#: gui/browser.cpp:73 msgctxt "lowres" msgid "Go up" msgstr "Feljebb" -#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 -#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 -#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 -#: gui/themebrowser.cpp:54 engines/engine.cpp:442 -#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 +#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238 +#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275 +#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919 +#: gui/themebrowser.cpp:54 engines/engine.cpp:447 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:190 +#: engines/sword1/control.cpp:867 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" msgstr "Mégse" -#: gui/browser.cpp:70 gui/chooser.cpp:46 gui/themebrowser.cpp:55 +#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55 msgid "Choose" msgstr "Választ" @@ -73,15 +81,15 @@ msgstr "Bezár" msgid "Mouse click" msgstr "Egérkattintás" -#: gui/gui-manager.cpp:122 base/main.cpp:300 +#: gui/gui-manager.cpp:122 base/main.cpp:301 msgid "Display keyboard" msgstr "Billentyûzet beállítások" -#: gui/gui-manager.cpp:126 base/main.cpp:304 +#: gui/gui-manager.cpp:126 base/main.cpp:305 msgid "Remap keys" msgstr "Billentyûk átállítása" -#: gui/gui-manager.cpp:129 base/main.cpp:307 +#: gui/gui-manager.cpp:129 base/main.cpp:308 msgid "Toggle FullScreen" msgstr "Teljesképernyõ kapcsoló" @@ -94,17 +102,18 @@ msgid "Map" msgstr "Kiosztás" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 -#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 -#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 -#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 -#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 -#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 -#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 -#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 -#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 -#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 +#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239 +#: gui/saveload-dialog.cpp:920 engines/engine.cpp:366 engines/engine.cpp:377 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192 +#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558 +#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 +#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519 +#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550 +#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:867 +#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419 +#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449 +#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -175,8 +184,8 @@ msgid "" msgstr "" "A játék nyelve. Ne állítsd át a pl. Spanyol nyelvû játékodat Angol nyelvre" -#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:80 -#: gui/options.cpp:730 gui/options.cpp:743 gui/options.cpp:1199 +#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86 +#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209 #: audio/null.cpp:40 msgid "<default>" msgstr "<alapértelmezett>" @@ -198,11 +207,11 @@ msgstr "Platform:" msgid "Engine" msgstr "Motor" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "Graphics" msgstr "Grafika" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "GFX" msgstr "GFX" @@ -215,7 +224,7 @@ msgctxt "lowres" msgid "Override global graphic settings" msgstr "Globális grafikai beállítások felülbírálása" -#: gui/launcher.cpp:251 gui/options.cpp:1085 +#: gui/launcher.cpp:251 gui/options.cpp:1095 msgid "Audio" msgstr "Audió" @@ -228,11 +237,11 @@ msgctxt "lowres" msgid "Override global audio settings" msgstr "Globális audió beállítások felülbírálása" -#: gui/launcher.cpp:265 gui/options.cpp:1090 +#: gui/launcher.cpp:265 gui/options.cpp:1100 msgid "Volume" msgstr "Hangerõ" -#: gui/launcher.cpp:267 gui/options.cpp:1092 +#: gui/launcher.cpp:267 gui/options.cpp:1102 msgctxt "lowres" msgid "Volume" msgstr "Hangerõ" @@ -246,7 +255,7 @@ msgctxt "lowres" msgid "Override global volume settings" msgstr "Globális hangerõbeállítások felülbírálása" -#: gui/launcher.cpp:280 gui/options.cpp:1100 +#: gui/launcher.cpp:280 gui/options.cpp:1110 msgid "MIDI" msgstr "MIDI" @@ -259,7 +268,7 @@ msgctxt "lowres" msgid "Override global MIDI settings" msgstr "Globális MIDI beállítások felülbírálása" -#: gui/launcher.cpp:294 gui/options.cpp:1106 +#: gui/launcher.cpp:294 gui/options.cpp:1116 msgid "MT-32" msgstr "MT-32" @@ -272,11 +281,11 @@ msgctxt "lowres" msgid "Override global MT-32 settings" msgstr "Globális MT-32 beállítások felülbírálása" -#: gui/launcher.cpp:308 gui/options.cpp:1113 +#: gui/launcher.cpp:308 gui/options.cpp:1123 msgid "Paths" msgstr "Mappák" -#: gui/launcher.cpp:310 gui/options.cpp:1115 +#: gui/launcher.cpp:310 gui/options.cpp:1125 msgctxt "lowres" msgid "Paths" msgstr "Mappák" @@ -290,7 +299,7 @@ msgctxt "lowres" msgid "Game Path:" msgstr "Játék Mappa:" -#: gui/launcher.cpp:324 gui/options.cpp:1139 +#: gui/launcher.cpp:324 gui/options.cpp:1149 msgid "Extra Path:" msgstr "Extra Mappa:" @@ -298,42 +307,42 @@ msgstr "Extra Mappa:" msgid "Specifies path to additional data used the game" msgstr "Mappa kiválasztás a játékok kiegészítõ fájljaihoz" -#: gui/launcher.cpp:326 gui/options.cpp:1141 +#: gui/launcher.cpp:326 gui/options.cpp:1151 msgctxt "lowres" msgid "Extra Path:" msgstr "Extra Mappa:" -#: gui/launcher.cpp:333 gui/options.cpp:1123 +#: gui/launcher.cpp:333 gui/options.cpp:1133 msgid "Save Path:" msgstr "Mentés Mappa:" #: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 -#: gui/options.cpp:1123 gui/options.cpp:1125 gui/options.cpp:1126 +#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136 msgid "Specifies where your savegames are put" msgstr "Játékmentések helyének meghatározása" -#: gui/launcher.cpp:335 gui/options.cpp:1125 +#: gui/launcher.cpp:335 gui/options.cpp:1135 msgctxt "lowres" msgid "Save Path:" msgstr "Mentés Mappa:" #: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 -#: gui/launcher.cpp:565 gui/options.cpp:1134 gui/options.cpp:1142 -#: gui/options.cpp:1151 gui/options.cpp:1258 gui/options.cpp:1264 -#: gui/options.cpp:1272 gui/options.cpp:1302 gui/options.cpp:1308 -#: gui/options.cpp:1315 gui/options.cpp:1408 gui/options.cpp:1411 -#: gui/options.cpp:1423 +#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152 +#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282 +#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326 +#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429 +#: gui/options.cpp:1441 msgctxt "path" msgid "None" msgstr "Nincs" #: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 -#: gui/options.cpp:1252 gui/options.cpp:1296 gui/options.cpp:1414 +#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Alapértelmezett" -#: gui/launcher.cpp:504 gui/options.cpp:1417 +#: gui/launcher.cpp:504 gui/options.cpp:1435 msgid "Select SoundFont" msgstr "SoundFont kiválasztás" @@ -357,7 +366,7 @@ msgstr "Ez a játékazonosító ID már foglalt, Válassz egy másikat." msgid "~Q~uit" msgstr "Kilépés" -#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:96 +#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95 msgid "Quit ScummVM" msgstr "ScummVM bezárása" @@ -365,7 +374,7 @@ msgstr "ScummVM bezárása" msgid "A~b~out..." msgstr "Névjegy" -#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:70 +#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69 msgid "About ScummVM" msgstr "ScummVM névjegy" @@ -442,12 +451,14 @@ msgstr "Keresés:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 +#: engines/pegasus/pegasus.cpp:345 msgid "Load game:" msgstr "Játék betöltése:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:345 +#: backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Betöltés" @@ -533,194 +544,198 @@ msgstr "%d Mappa átvizsgálva..." msgid "Discovered %d new games, ignored %d previously added games ..." msgstr "%d új játékot találtam, %d elõzõleg hozzáadott játék kihagyva..." -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "Never" msgstr "Soha" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 5 mins" msgstr "5 percenként" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 10 mins" msgstr "10 percenként" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 15 mins" msgstr "15 percenként" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 30 mins" msgstr "30 percenként" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "8 kHz" msgstr "8 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "11kHz" msgstr "11kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "22 kHz" msgstr "22 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "44 kHz" msgstr "44 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:248 gui/options.cpp:474 gui/options.cpp:575 -#: gui/options.cpp:644 gui/options.cpp:852 +#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581 +#: gui/options.cpp:650 gui/options.cpp:858 msgctxt "soundfont" msgid "None" msgstr "Nincs" -#: gui/options.cpp:382 +#: gui/options.cpp:388 msgid "Failed to apply some of the graphic options changes:" msgstr "Néhány grafikus opció változtatása sikertelen:" -#: gui/options.cpp:394 +#: gui/options.cpp:400 msgid "the video mode could not be changed." msgstr "a videómód nem változott." -#: gui/options.cpp:400 +#: gui/options.cpp:406 msgid "the fullscreen setting could not be changed" msgstr "a teljesképernyõs beállítás nem változott" -#: gui/options.cpp:406 +#: gui/options.cpp:412 msgid "the aspect ratio setting could not be changed" msgstr "a képméretarány beállítások nem változtak" -#: gui/options.cpp:727 +#: gui/options.cpp:733 msgid "Graphics mode:" msgstr "Grafikus mód:" -#: gui/options.cpp:741 +#: gui/options.cpp:747 msgid "Render mode:" msgstr "Kirajzolás mód:" -#: gui/options.cpp:741 gui/options.cpp:742 +#: gui/options.cpp:747 gui/options.cpp:748 msgid "Special dithering modes supported by some games" msgstr "Néhány játék támogatja a speciális árnyalási módokat" -#: gui/options.cpp:753 +#: gui/options.cpp:759 #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476 msgid "Fullscreen mode" msgstr "Teljesképernyõs mód:" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Aspect ratio correction" msgstr "Képméretarány korrekció" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Correct aspect ratio for 320x200 games" msgstr "Helyes oldalarány a 320x200 játékokhoz" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Preferred Device:" msgstr "Elsõdleges eszköz:" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Music Device:" msgstr "Zene eszköz:" -#: gui/options.cpp:764 gui/options.cpp:766 +#: gui/options.cpp:770 gui/options.cpp:772 msgid "Specifies preferred sound device or sound card emulator" msgstr "Elsõdleges hangeszköz vagy hang emulátor beállítások" -#: gui/options.cpp:764 gui/options.cpp:766 gui/options.cpp:767 +#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773 msgid "Specifies output sound device or sound card emulator" msgstr "Hangeszköz vagy hangkártya emulátor beállítások" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Preferred Dev.:" msgstr "Elsõdleges eszk.:" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Music Device:" msgstr "Zene eszköz:" -#: gui/options.cpp:793 +#: gui/options.cpp:799 msgid "AdLib emulator:" msgstr "AdLib emulátor:" -#: gui/options.cpp:793 gui/options.cpp:794 +#: gui/options.cpp:799 gui/options.cpp:800 msgid "AdLib is used for music in many games" msgstr "AdLib meghajtót sok játék használja zenéhez" -#: gui/options.cpp:804 +#: gui/options.cpp:810 msgid "Output rate:" msgstr "Kimeneti ráta:" -#: gui/options.cpp:804 gui/options.cpp:805 +#: gui/options.cpp:810 gui/options.cpp:811 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" msgstr "" "Nagyobb értékek jobb hangminõséget adnak, de nem minden hangkártya támogatja" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "GM Device:" msgstr "GM Eszköz:" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "Specifies default sound device for General MIDI output" msgstr "Alapértelmezett hangeszköz General MIDI kimenethez" -#: gui/options.cpp:826 +#: gui/options.cpp:832 msgid "Don't use General MIDI music" msgstr "Ne használj General MIDI zenét" -#: gui/options.cpp:837 gui/options.cpp:899 +#: gui/options.cpp:843 gui/options.cpp:909 msgid "Use first available device" msgstr "Elsõ elérhetõ eszköz használata" -#: gui/options.cpp:849 +#: gui/options.cpp:855 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 +#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "Néhány hangkárya, Fluidsynth és Timidyti támogatja a SoundFont betöltését" -#: gui/options.cpp:851 +#: gui/options.cpp:857 msgctxt "lowres" msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Mixed AdLib/MIDI mode" msgstr "Vegyes AdLib/MIDI mód" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Use both MIDI and AdLib sound generation" msgstr "MIDI és AdLib hanggenerátorok használata" -#: gui/options.cpp:860 +#: gui/options.cpp:866 msgid "MIDI gain:" msgstr "MIDI erõsítés:" -#: gui/options.cpp:870 +#: gui/options.cpp:873 +msgid "FluidSynth Settings" +msgstr "FluidSynth Beállítása" + +#: gui/options.cpp:880 msgid "MT-32 Device:" msgstr "MT-32 Eszköz:" -#: gui/options.cpp:870 +#: gui/options.cpp:880 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "Roland MT-32/LAPC1/CM32l/CM64 alapértelmezett hangeszközök beállítása" -#: gui/options.cpp:875 +#: gui/options.cpp:885 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Roland MT-32 Hardver (GM emuláció tiltva)" -#: gui/options.cpp:875 gui/options.cpp:877 +#: gui/options.cpp:885 gui/options.cpp:887 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -728,190 +743,190 @@ msgstr "" "Jelöld be, ha hardveres Roland-Kompatibilis hangeszköz van csatlakoztatva a " "gépedhez és használni akarod" -#: gui/options.cpp:877 +#: gui/options.cpp:887 msgctxt "lowres" msgid "True Roland MT-32 (no GM emulation)" msgstr "Roland MT-32 Hardver (GM emuláció nincs)" -#: gui/options.cpp:880 -msgid "Enable Roland GS Mode" -msgstr "Roland GS Mód engedélyezve" +#: gui/options.cpp:890 +msgid "Roland GS Mode (disable GM mapping)" +msgstr "Roland GS Mód (GM mapping tiltása)" -#: gui/options.cpp:880 +#: gui/options.cpp:890 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "General MIDI leképezés Roland MT-32 zenés játékokhoz kikapcsolva" -#: gui/options.cpp:889 +#: gui/options.cpp:899 msgid "Don't use Roland MT-32 music" msgstr "Ne használj Roland MT-32 zenét" -#: gui/options.cpp:916 +#: gui/options.cpp:926 msgid "Text and Speech:" msgstr "Szöveg és beszéd:" -#: gui/options.cpp:920 gui/options.cpp:930 +#: gui/options.cpp:930 gui/options.cpp:940 msgid "Speech" msgstr "Csak beszéd" -#: gui/options.cpp:921 gui/options.cpp:931 +#: gui/options.cpp:931 gui/options.cpp:941 msgid "Subtitles" msgstr "Csak felirat" -#: gui/options.cpp:922 +#: gui/options.cpp:932 msgid "Both" msgstr "Mind" -#: gui/options.cpp:924 +#: gui/options.cpp:934 msgid "Subtitle speed:" msgstr "Felirat sebesség:" -#: gui/options.cpp:926 +#: gui/options.cpp:936 msgctxt "lowres" msgid "Text and Speech:" msgstr "Felirat és beszéd:" -#: gui/options.cpp:930 +#: gui/options.cpp:940 msgid "Spch" msgstr "Besz" -#: gui/options.cpp:931 +#: gui/options.cpp:941 msgid "Subs" msgstr "Text" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgctxt "lowres" msgid "Both" msgstr "Mind" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgid "Show subtitles and play speech" msgstr "Hang és feliratok megjelenítése" -#: gui/options.cpp:934 +#: gui/options.cpp:944 msgctxt "lowres" msgid "Subtitle speed:" msgstr "Felirat sebesség:" -#: gui/options.cpp:950 +#: gui/options.cpp:960 msgid "Music volume:" msgstr "Zene hangerõ:" -#: gui/options.cpp:952 +#: gui/options.cpp:962 msgctxt "lowres" msgid "Music volume:" msgstr "Zene hangerõ:" -#: gui/options.cpp:959 +#: gui/options.cpp:969 msgid "Mute All" msgstr "Összes némítása" -#: gui/options.cpp:962 +#: gui/options.cpp:972 msgid "SFX volume:" msgstr "SFX hangerõ:" -#: gui/options.cpp:962 gui/options.cpp:964 gui/options.cpp:965 +#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975 msgid "Special sound effects volume" msgstr "Speciális hangeffektusok hangereje" -#: gui/options.cpp:964 +#: gui/options.cpp:974 msgctxt "lowres" msgid "SFX volume:" msgstr "SFX hangerõ:" -#: gui/options.cpp:972 +#: gui/options.cpp:982 msgid "Speech volume:" msgstr "Beszéd hangerõ:" -#: gui/options.cpp:974 +#: gui/options.cpp:984 msgctxt "lowres" msgid "Speech volume:" msgstr "Beszéd hangerõ:" -#: gui/options.cpp:1131 +#: gui/options.cpp:1141 msgid "Theme Path:" msgstr "Téma Mappa:" -#: gui/options.cpp:1133 +#: gui/options.cpp:1143 msgctxt "lowres" msgid "Theme Path:" msgstr "Téma Mappa:" -#: gui/options.cpp:1139 gui/options.cpp:1141 gui/options.cpp:1142 +#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "Minden jéték és ScummVM kiegészítõ fájljainak mappája:" -#: gui/options.cpp:1148 +#: gui/options.cpp:1158 msgid "Plugins Path:" msgstr "Plugin Mappa:" -#: gui/options.cpp:1150 +#: gui/options.cpp:1160 msgctxt "lowres" msgid "Plugins Path:" msgstr "Plugin Mappa:" -#: gui/options.cpp:1159 +#: gui/options.cpp:1169 msgid "Misc" msgstr "Vegyes" -#: gui/options.cpp:1161 +#: gui/options.cpp:1171 msgctxt "lowres" msgid "Misc" msgstr "Vegyes" -#: gui/options.cpp:1163 +#: gui/options.cpp:1173 msgid "Theme:" msgstr "Téma:" -#: gui/options.cpp:1167 +#: gui/options.cpp:1177 msgid "GUI Renderer:" msgstr "GUI Renderelõ:" -#: gui/options.cpp:1179 +#: gui/options.cpp:1189 msgid "Autosave:" msgstr "Automentés:" -#: gui/options.cpp:1181 +#: gui/options.cpp:1191 msgctxt "lowres" msgid "Autosave:" msgstr "Automentés:" -#: gui/options.cpp:1189 +#: gui/options.cpp:1199 msgid "Keys" msgstr "Billentyûk" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "GUI Language:" msgstr "GUI nyelve:" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "Language of ScummVM GUI" msgstr "A ScummVM GUI nyelve" -#: gui/options.cpp:1347 +#: gui/options.cpp:1365 msgid "You have to restart ScummVM before your changes will take effect." msgstr "Indítsd újra a ScummVM-et a változások érvényesítéséhez." -#: gui/options.cpp:1360 +#: gui/options.cpp:1378 msgid "Select directory for savegames" msgstr "Válassz játékmentés mappát" -#: gui/options.cpp:1367 +#: gui/options.cpp:1385 msgid "The chosen directory cannot be written to. Please select another one." msgstr "A kiválasztott mappába nem lehet írni, válassz egy másikat" -#: gui/options.cpp:1376 +#: gui/options.cpp:1394 msgid "Select directory for GUI themes" msgstr "GUI téma mappa kiválasztása" -#: gui/options.cpp:1386 +#: gui/options.cpp:1404 msgid "Select directory for extra files" msgstr "Mappa választás az extra fájloknak" -#: gui/options.cpp:1397 +#: gui/options.cpp:1415 msgid "Select directory for plugins" msgstr "Plugin mappa kiválasztása" -#: gui/options.cpp:1450 +#: gui/options.cpp:1468 msgid "" "The theme you selected does not support your current language. If you want " "to use this theme you need to switch to another language first." @@ -919,71 +934,71 @@ msgstr "" "A kiválasztott téma nem támogatja a nyelvedet. Ha használni akarod ezt a " "témát, elõszõr válts át egy másik nyelvre." -#: gui/saveload-dialog.cpp:158 +#: gui/saveload-dialog.cpp:166 msgid "List view" msgstr "Lista nézet" -#: gui/saveload-dialog.cpp:159 +#: gui/saveload-dialog.cpp:167 msgid "Grid view" msgstr "Rács nézet" -#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 +#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358 msgid "No date saved" msgstr "Dátum nincs mentve" -#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359 msgid "No time saved" msgstr "Idõ nincs mentve" -#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 +#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360 msgid "No playtime saved" msgstr "Játékidõ nincs mentve" -#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275 msgid "Delete" msgstr "Töröl" -#: gui/saveload-dialog.cpp:266 +#: gui/saveload-dialog.cpp:274 msgid "Do you really want to delete this savegame?" msgstr "Biztos hogy törölni akarod ezt a játékállást?" -#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 +#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872 msgid "Date: " msgstr "Dátum:" -#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 +#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878 msgid "Time: " msgstr "Idõ:" -#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 +#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886 msgid "Playtime: " msgstr "Játékidõ:" -#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 +#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494 msgid "Untitled savestate" msgstr "Névtelen játékállás" -#: gui/saveload-dialog.cpp:517 +#: gui/saveload-dialog.cpp:546 msgid "Next" msgstr "Következõ" -#: gui/saveload-dialog.cpp:520 +#: gui/saveload-dialog.cpp:549 msgid "Prev" msgstr "Elõzõ" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 msgid "New Save" msgstr "Új Mentés" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 msgid "Create a new save game" msgstr "Új játékmentés készítése" -#: gui/saveload-dialog.cpp:789 +#: gui/saveload-dialog.cpp:865 msgid "Name: " msgstr "Név:" -#: gui/saveload-dialog.cpp:861 +#: gui/saveload-dialog.cpp:937 #, c-format msgid "Enter a description for slot %d:" msgstr "Adj meg egy leírást a %d slothoz:" @@ -1021,35 +1036,35 @@ msgstr "Élsimított (16bpp)" msgid "Clear value" msgstr "Érték törlése" -#: base/main.cpp:209 +#: base/main.cpp:210 #, c-format msgid "Engine does not support debug level '%s'" msgstr "A motor nem támogatja a '%s' debug szintet" -#: base/main.cpp:287 +#: base/main.cpp:288 msgid "Menu" msgstr "Menü" -#: base/main.cpp:290 backends/platform/symbian/src/SymbianActions.cpp:45 +#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:45 #: backends/platform/wince/CEActionsSmartphone.cpp:46 msgid "Skip" msgstr "Tovább" -#: base/main.cpp:293 backends/platform/symbian/src/SymbianActions.cpp:50 +#: base/main.cpp:294 backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:42 msgid "Pause" msgstr "Szünet" -#: base/main.cpp:296 +#: base/main.cpp:297 msgid "Skip line" msgstr "Sor átlépése" -#: base/main.cpp:467 +#: base/main.cpp:468 msgid "Error running game:" msgstr "Hiba a játék futtatásakor:" -#: base/main.cpp:491 +#: base/main.cpp:492 msgid "Could not find any engine capable of running the selected game" msgstr "Nem található olyan játékmotor ami a választott játékot támogatja" @@ -1164,13 +1179,16 @@ msgid "~R~eturn to Launcher" msgstr "Visszatérés az indítóba" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284 +#: engines/pegasus/pegasus.cpp:369 msgid "Save game:" msgstr "Játék mentése:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:369 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1198,12 +1216,12 @@ msgstr "" "információkról, és hogy hogyan segíthetsz a késõbbiekben." #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 -#: engines/mohawk/dialogs.cpp:174 +#: engines/mohawk/dialogs.cpp:170 msgid "~O~K" msgstr "~O~K" #: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 -#: engines/mohawk/dialogs.cpp:175 +#: engines/mohawk/dialogs.cpp:171 msgid "~C~ancel" msgstr "Mégse" @@ -1211,23 +1229,23 @@ msgstr "Mégse" msgid "~K~eys" msgstr "Billentyük" -#: engines/engine.cpp:235 +#: engines/engine.cpp:240 msgid "Could not initialize color format." msgstr "Szín formátum nincs alkalmazva" -#: engines/engine.cpp:243 +#: engines/engine.cpp:248 msgid "Could not switch to video mode: '" msgstr "Videómód nincs átállítva: ' " -#: engines/engine.cpp:252 +#: engines/engine.cpp:257 msgid "Could not apply aspect ratio setting." msgstr "Méretarány korrekció nem változott." -#: engines/engine.cpp:257 +#: engines/engine.cpp:262 msgid "Could not apply fullscreen setting." msgstr "Teljesképernyõs beállítás nincs alkalmazva" -#: engines/engine.cpp:357 +#: engines/engine.cpp:362 msgid "" "You appear to be playing this game directly\n" "from the CD. This is known to cause problems,\n" @@ -1241,7 +1259,7 @@ msgstr "" "adatfájljait a merevlemezedre.\n" "Nézd meg a README fájlt a részletekért." -#: engines/engine.cpp:368 +#: engines/engine.cpp:373 msgid "" "This game has audio tracks in its disk. These\n" "tracks need to be ripped from the disk using\n" @@ -1255,7 +1273,7 @@ msgstr "" "hogy a játék zenéje hallható legyen.\n" "Nézd meg a README fájlt a részletekért." -#: engines/engine.cpp:426 +#: engines/engine.cpp:431 #, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " @@ -1264,7 +1282,7 @@ msgstr "" "(%s) játékállás betöltése nem sikerült!. Olvassd el a README-t az alap " "információkról, és hogy hogyan segíthetsz a késõbbiekben." -#: engines/engine.cpp:439 +#: engines/engine.cpp:444 msgid "" "WARNING: The game you are about to start is not yet fully supported by " "ScummVM. As such, it is likely to be unstable, and any saves you make might " @@ -1274,28 +1292,49 @@ msgstr "" "ScummVM. Számíts rá hogy nem stabilan fut, és a mentések nem mûködnek a " "jövõbeni ScummVM verziókkal." -#: engines/engine.cpp:442 +#: engines/engine.cpp:447 msgid "Start anyway" msgstr "Indítás így is" -#: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 -#: engines/sci/detection.cpp:390 +#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270 +#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393 +#: engines/toltecs/detection.cpp:173 msgid "Use original save/load screens" msgstr "Eredeti ment/tölt képernyõk használata" -#: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 -#: engines/sci/detection.cpp:391 +#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271 +#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394 +#: engines/toltecs/detection.cpp:174 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "Az eredeti mentés/betöltés képernyõ használata a ScummVM képek helyett" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore game:" msgstr "Játékmenet visszaállítása:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore" msgstr "Visszaállítás" +#: engines/drascula/saveload.cpp:49 +msgid "" +"ScummVM found that you have old savefiles for Drascula that should be " +"converted.\n" +"The old save game format is no longer supported, so you will not be able to " +"load your games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" +msgstr "" +"ScummVM régi játékmentést talált a Drascula-hoz, ezt át kell alakítani.\n" +"A régi játékmentés forma többé nem támogatott, ezért a játék mentése nem " +"töltõdik be ha nem akítod át azt.\n" +"\n" +"Nyomj OK-t ha átalakítod most, vagy rákérdezek újra ha legközelebb elindítod " +"a játékot.\n" + #: engines/dreamweb/detection.cpp:57 msgid "Use bright palette mode" msgstr "Fényes paletta mód használata" @@ -1304,27 +1343,27 @@ msgstr "Fényes paletta mód használata" msgid "Display graphics using the game's bright palette" msgstr "Grafikus megjelenítésre használja a játék fényes palettáját" -#: engines/sci/detection.cpp:370 +#: engines/sci/detection.cpp:373 msgid "EGA undithering" msgstr "EGA szinjavítás" -#: engines/sci/detection.cpp:371 +#: engines/sci/detection.cpp:374 msgid "Enable undithering in EGA games" msgstr "Undithering engedélyezése EGA játékokban" -#: engines/sci/detection.cpp:380 +#: engines/sci/detection.cpp:383 msgid "Prefer digital sound effects" msgstr "Digitális hangeffektusok elõnyben" -#: engines/sci/detection.cpp:381 +#: engines/sci/detection.cpp:384 msgid "Prefer digital sound effects instead of synthesized ones" msgstr "Digitális hanghatások elõnyben a szintetizáltakkal szemben" -#: engines/sci/detection.cpp:400 +#: engines/sci/detection.cpp:403 msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "IMF/Yamaha FB-01 használata MIDI kimentre" -#: engines/sci/detection.cpp:401 +#: engines/sci/detection.cpp:404 msgid "" "Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" @@ -1332,28 +1371,28 @@ msgstr "" "IBM Music Feature kártya vagy Yamaha FB-01 FM szintetizátor modul használata " "MIDI kimenetre" -#: engines/sci/detection.cpp:411 +#: engines/sci/detection.cpp:414 msgid "Use CD audio" msgstr "CD audió használata" -#: engines/sci/detection.cpp:412 +#: engines/sci/detection.cpp:415 msgid "Use CD audio instead of in-game audio, if available" msgstr "CD audió használata a játékban lévõvel szemben, ha elérhetõ" -#: engines/sci/detection.cpp:422 +#: engines/sci/detection.cpp:425 msgid "Use Windows cursors" msgstr "Windows kurzorok használata" -#: engines/sci/detection.cpp:423 +#: engines/sci/detection.cpp:426 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "Windows kurzorok használata (kisebb és monokróm) a DOS-osok helyett " -#: engines/sci/detection.cpp:433 +#: engines/sci/detection.cpp:436 msgid "Use silver cursors" msgstr "Ezüst kurzor használata" -#: engines/sci/detection.cpp:434 +#: engines/sci/detection.cpp:437 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "Alternatív ezüst kurzorszett használata, a normál arany helyett" @@ -2005,7 +2044,7 @@ msgstr "Jobbra repülés" msgid "Fly to lower right" msgstr "Jobbra le repülés" -#: engines/scumm/scumm.cpp:1773 +#: engines/scumm/scumm.cpp:1776 #, c-format msgid "" "Native MIDI support requires the Roland Upgrade from LucasArts,\n" @@ -2014,7 +2053,7 @@ msgstr "" "Native MIDI támogatáshoz kell a Roland Upgrade a LucasArts-tól,\n" "a %s hiányzik. AdLib-ot használok helyette." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 +#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2025,7 +2064,7 @@ msgstr "" "\n" "%s fájlba nem sikerült" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 +#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2036,7 +2075,7 @@ msgstr "" "\n" "%s fájlból nem sikerült" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 +#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2047,7 +2086,7 @@ msgstr "" "\n" "%s fájlba elkészült" -#: engines/scumm/scumm.cpp:2512 +#: engines/scumm/scumm.cpp:2537 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2058,7 +2097,7 @@ msgstr "" "válaszd a 'Maniac' mappát a 'Tentacle' könyvtárában." #. I18N: Option for fast scene switching -#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171 +#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167 msgid "~Z~ip Mode Activated" msgstr "~Z~ip Mód aktiválva" @@ -2079,11 +2118,11 @@ msgstr "~S~ Térkép" msgid "~M~ain Menu" msgstr "Fõ~M~enü" -#: engines/mohawk/dialogs.cpp:172 +#: engines/mohawk/dialogs.cpp:168 msgid "~W~ater Effect Enabled" msgstr "Vízeffektus engedélyezve" -#: engines/agos/animation.cpp:560 +#: engines/agos/animation.cpp:557 #, c-format msgid "Cutscene file '%s' not found!" msgstr "'%s' átvezetõ fájl nem található" @@ -2101,6 +2140,14 @@ msgstr "Játékállás mentése fájlba nem sikerült." msgid "Failed to delete file." msgstr "Fájl törlés sikertelen." +#: engines/groovie/detection.cpp:312 +msgid "Fast movie speed" +msgstr "Gyors filmsebesség" + +#: engines/groovie/detection.cpp:313 +msgid "Play movies at an increased speed" +msgstr "Filmek lejátszása nagyobb sebességgel" + #: engines/groovie/script.cpp:420 msgid "Failed to save game" msgstr "Játék mentés nem sikerült" @@ -2191,11 +2238,11 @@ msgstr "Siklás balra" msgid "Slide Right" msgstr "Siklás jobbra" -#: engines/kyra/lol.cpp:485 +#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2412 msgid "Turn Left" msgstr "Balra fordul" -#: engines/kyra/lol.cpp:486 +#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2413 msgid "Turn Right" msgstr "Jobbra fordul" @@ -2211,7 +2258,7 @@ msgstr "Opciók" msgid "Choose Spell" msgstr "Válassz varázslatot" -#: engines/kyra/sound_midi.cpp:475 +#: engines/kyra/sound_midi.cpp:477 msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2257,25 +2304,25 @@ msgstr "Floppy intro" msgid "Use the floppy version's intro (CD version only)" msgstr "A floppy verzió intro használata (csak CD verziónál)" -#: engines/sword1/animation.cpp:539 +#: engines/sword1/animation.cpp:519 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "'%s' PSX stream átvezetõ nem játszható le paletta módban" -#: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 +#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439 msgid "DXA cutscenes found but ScummVM has been built without zlib support" msgstr "DXA átvezetõ elérhetõ, de a ScummVM zlib támogatás nincs lefordítva" -#: engines/sword1/animation.cpp:570 engines/sword2/animation.cpp:465 +#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449 msgid "MPEG2 cutscenes are no longer supported" msgstr "MPEG2 átvezetõk már nem támogatottak" -#: engines/sword1/animation.cpp:576 engines/sword2/animation.cpp:473 +#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457 #, c-format msgid "Cutscene '%s' not found" msgstr "'%s' átvezetõ nem található" -#: engines/sword1/control.cpp:863 +#: engines/sword1/control.cpp:865 msgid "" "ScummVM found that you have old savefiles for Broken Sword 1 that should be " "converted.\n" @@ -2293,7 +2340,7 @@ msgstr "" "Nyomj OK-t az átalakításhoz, vagy rákérdezzek ha legközelebb elindítod a " "játékot.\n" -#: engines/sword1/control.cpp:1232 +#: engines/sword1/control.cpp:1234 #, c-format msgid "" "Target new save game already exists!\n" @@ -2302,11 +2349,11 @@ msgstr "" "A választott játékmentés már létezik!\n" "Megtartod a régi játékmentést (%s) vagy kicseréled az újra (%s)?\n" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the old one" msgstr "A régit megtartom" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the new one" msgstr "Az újat megtartom" @@ -2314,7 +2361,7 @@ msgstr "Az újat megtartom" msgid "This is the end of the Broken Sword 1 Demo" msgstr "Ez a Broken Sword 1 Demo vége" -#: engines/sword2/animation.cpp:435 +#: engines/sword2/animation.cpp:419 msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" @@ -2329,12 +2376,12 @@ msgstr "Tárgycimke látható" msgid "Show labels for objects on mouse hover" msgstr "Tárgycimke látható ha az egér felette van" -#: engines/teenagent/resources.cpp:68 +#: engines/teenagent/resources.cpp:94 msgid "" "You're missing the 'teenagent.dat' file. Get it from the ScummVM website" msgstr "Hiányzik a 'teenagent.dat' fájl. Szerezd be a ScummVM website-ról" -#: engines/teenagent/resources.cpp:89 +#: engines/teenagent/resources.cpp:115 msgid "" "The teenagent.dat file is compressed and zlib hasn't been included in this " "executable. Please decompress it" @@ -2391,6 +2438,47 @@ msgstr "" "\n" "Légyszíves jelentsd a csapatnak." +#: engines/pegasus/pegasus.cpp:675 +msgid "Invalid save file name" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2410 +msgid "Up/Zoom In/Move Forward/Open Doors" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2411 +#, fuzzy +msgid "Down/Zoom Out" +msgstr "Nagyítás" + +#: engines/pegasus/pegasus.cpp:2414 +msgid "Display/Hide Inventory Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2415 +msgid "Display/Hide Biochip Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2416 +msgid "Action/Select" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2417 +msgid "Toggle Center Data Display" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2418 +msgid "Display/Hide Info Screen" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2419 +msgid "Display/Hide Pause Menu" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2420 +msgid "???" +msgstr "" + #: audio/fmopl.cpp:49 msgid "MAME OPL emulator" msgstr "MAME OPL emulátor" @@ -2446,7 +2534,7 @@ msgstr "Nincs zene" msgid "Amiga Audio Emulator" msgstr "Amiga Audió Emulátor" -#: audio/softsynth/adlib.cpp:1593 +#: audio/softsynth/adlib.cpp:2284 msgid "AdLib Emulator" msgstr "AdLib Emulátor" @@ -2458,11 +2546,11 @@ msgstr "Apple II GS Emulátor (NEM TÁMOGATOTT)" msgid "C64 Audio Emulator" msgstr "C64 Audio Emulátor" -#: audio/softsynth/mt32.cpp:293 +#: audio/softsynth/mt32.cpp:205 msgid "Initializing MT-32 Emulator" msgstr "MT-32 Emulátor inicializálása" -#: audio/softsynth/mt32.cpp:512 +#: audio/softsynth/mt32.cpp:431 msgid "MT-32 Emulator" msgstr "MT-32 Emulátor" @@ -2613,24 +2701,24 @@ msgstr "Középsõ katt" msgid "Right Click" msgstr "Jobb katt" -#: backends/platform/sdl/macosx/appmenu_osx.mm:78 +#: backends/platform/sdl/macosx/appmenu_osx.mm:77 msgid "Hide ScummVM" msgstr "ScummVM elrejtése" -#: backends/platform/sdl/macosx/appmenu_osx.mm:83 +#: backends/platform/sdl/macosx/appmenu_osx.mm:82 msgid "Hide Others" msgstr "Többi elrejtése" -#: backends/platform/sdl/macosx/appmenu_osx.mm:88 +#: backends/platform/sdl/macosx/appmenu_osx.mm:87 msgid "Show All" msgstr "Mutasd mind" -#: backends/platform/sdl/macosx/appmenu_osx.mm:110 -#: backends/platform/sdl/macosx/appmenu_osx.mm:121 +#: backends/platform/sdl/macosx/appmenu_osx.mm:109 +#: backends/platform/sdl/macosx/appmenu_osx.mm:120 msgid "Window" msgstr "Ablak" -#: backends/platform/sdl/macosx/appmenu_osx.mm:115 +#: backends/platform/sdl/macosx/appmenu_osx.mm:114 msgid "Minimize" msgstr "Kis méret" @@ -2644,12 +2732,12 @@ msgid "Normal (no scaling)" msgstr "Normál (nincs átméretezés)" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537 msgid "Enabled aspect ratio correction" msgstr "Méretarány korrekció engedélyezve" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542 msgid "Disabled aspect ratio correction" msgstr "Méretarány korrekció letiltva" @@ -2658,7 +2746,7 @@ msgid "Active graphics filter:" msgstr "Aktív grafikus szûrõk:" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481 msgid "Windowed mode" msgstr "Ablakos mód" @@ -2682,11 +2770,11 @@ msgstr "Jelenlegi videómód" msgid "Current scale" msgstr "Aktuális méretezés" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:558 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562 msgid "Active filter mode: Linear" msgstr "Aktív filter mód: Lineáris" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:560 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564 msgid "Active filter mode: Nearest" msgstr "Aktív filter mód: Közelítõ" @@ -3010,19 +3098,19 @@ msgstr "Biztos hogy ki akarsz lépni ?" #: backends/events/gph/gph-events.cpp:386 #: backends/events/gph/gph-events.cpp:429 -#: backends/events/openpandora/op-events.cpp:139 +#: backends/events/openpandora/op-events.cpp:168 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "Érintõképernyõ 'Tap Mód' - Bal katt" #: backends/events/gph/gph-events.cpp:388 #: backends/events/gph/gph-events.cpp:431 -#: backends/events/openpandora/op-events.cpp:141 +#: backends/events/openpandora/op-events.cpp:170 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "Érintõképernyõ 'Tap Mód' - Jobb katt" #: backends/events/gph/gph-events.cpp:390 #: backends/events/gph/gph-events.cpp:433 -#: backends/events/openpandora/op-events.cpp:143 +#: backends/events/openpandora/op-events.cpp:172 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "Érintõképernyõ 'Tap Mód' - Lebegõ (Nincs katt)" @@ -3042,7 +3130,11 @@ msgstr "Minimum Hangerõ" msgid "Decreasing Volume" msgstr "Hangerõ csökkentése" -#: backends/updates/macosx/macosx-updates.mm:65 +#: backends/events/openpandora/op-events.cpp:174 +msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)" +msgstr "Érintõképernyõ 'Érintésmód' - Lebegõ (DPad katt)" + +#: backends/updates/macosx/macosx-updates.mm:67 msgid "Check for Updates..." msgstr "Frissítések keresése..." @@ -3078,6 +3170,9 @@ msgstr "Kattintás engedve" msgid "Clicking Disabled" msgstr "Kattintás tiltva" +#~ msgid "Enable Roland GS Mode" +#~ msgstr "Roland GS Mód engedélyezve" + #~ msgid "Hercules Green" #~ msgstr "Hercules Zöld" diff --git a/po/it_IT.po b/po/it_IT.po index 7d4c11319d..ad12239437 100644 --- a/po/it_IT.po +++ b/po/it_IT.po @@ -1,5 +1,5 @@ # Italian translation for ScummVM. -# Copyright (C) 2010-2012 ScummVM Team +# Copyright (C) 2010-2013 ScummVM Team # This file is distributed under the same license as the ScummVM package. # Matteo 'Maff' Angelino <matteo.maff at gmail dot com>, 2010. # @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-08-12 14:57+0200\n" +"POT-Creation-Date: 2013-02-07 23:11+0000\n" "PO-Revision-Date: 2012-07-09 09:30+0100\n" "Last-Translator: Matteo 'Maff' Angelino <matteo.maff at gmail dot com>\n" "Language-Team: Italian\n" @@ -16,45 +16,55 @@ msgstr "" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -#: gui/about.cpp:91 +#: gui/about.cpp:93 #, c-format msgid "(built on %s)" msgstr "(build creata il %s)" -#: gui/about.cpp:98 +#: gui/about.cpp:100 msgid "Features compiled in:" msgstr "Funzionalità compilate in:" -#: gui/about.cpp:107 +#: gui/about.cpp:109 msgid "Available engines:" msgstr "Motori disponibili:" -#: gui/browser.cpp:66 +#: gui/browser.cpp:67 +#, fuzzy +msgid "Show hidden files" +msgstr "Mostra/nascondi console" + +#: gui/browser.cpp:67 +msgid "Show files marked with the hidden attribute" +msgstr "" + +#: gui/browser.cpp:71 msgid "Go up" msgstr "Cartella superiore" -#: gui/browser.cpp:66 gui/browser.cpp:68 +#: gui/browser.cpp:71 gui/browser.cpp:73 msgid "Go to previous directory level" msgstr "Vai alla cartella superiore" -#: gui/browser.cpp:68 +#: gui/browser.cpp:73 msgctxt "lowres" msgid "Go up" msgstr "Su" -#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 -#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 -#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 -#: gui/themebrowser.cpp:54 engines/engine.cpp:442 -#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 +#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238 +#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275 +#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919 +#: gui/themebrowser.cpp:54 engines/engine.cpp:447 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:190 +#: engines/sword1/control.cpp:867 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" msgstr "Annulla" -#: gui/browser.cpp:70 gui/chooser.cpp:46 gui/themebrowser.cpp:55 +#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55 msgid "Choose" msgstr "Scegli" @@ -69,15 +79,15 @@ msgstr "Chiudi" msgid "Mouse click" msgstr "Clic del mouse" -#: gui/gui-manager.cpp:122 base/main.cpp:300 +#: gui/gui-manager.cpp:122 base/main.cpp:301 msgid "Display keyboard" msgstr "Mostra tastiera" -#: gui/gui-manager.cpp:126 base/main.cpp:304 +#: gui/gui-manager.cpp:126 base/main.cpp:305 msgid "Remap keys" msgstr "Riprogramma tasti" -#: gui/gui-manager.cpp:129 base/main.cpp:307 +#: gui/gui-manager.cpp:129 base/main.cpp:308 msgid "Toggle FullScreen" msgstr "Attiva / disattiva schermo intero" @@ -90,17 +100,18 @@ msgid "Map" msgstr "Mappa" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 -#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 -#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 -#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 -#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 -#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 -#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 -#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 -#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 -#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 +#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239 +#: gui/saveload-dialog.cpp:920 engines/engine.cpp:366 engines/engine.cpp:377 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192 +#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558 +#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 +#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519 +#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550 +#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:867 +#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419 +#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449 +#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -172,8 +183,8 @@ msgid "" msgstr "" "Lingua del gioco. Un gioco inglese non potrà risultare tradotto in italiano" -#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:80 -#: gui/options.cpp:730 gui/options.cpp:743 gui/options.cpp:1199 +#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86 +#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209 #: audio/null.cpp:40 msgid "<default>" msgstr "<predefinito>" @@ -195,11 +206,11 @@ msgstr "Piattaf.:" msgid "Engine" msgstr "Motore" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "Graphics" msgstr "Grafica" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "GFX" msgstr "Grafica" @@ -212,7 +223,7 @@ msgctxt "lowres" msgid "Override global graphic settings" msgstr "Ignora le impostazioni grafiche globali" -#: gui/launcher.cpp:251 gui/options.cpp:1085 +#: gui/launcher.cpp:251 gui/options.cpp:1095 msgid "Audio" msgstr "Audio" @@ -225,11 +236,11 @@ msgctxt "lowres" msgid "Override global audio settings" msgstr "Ignora le impostazioni audio globali" -#: gui/launcher.cpp:265 gui/options.cpp:1090 +#: gui/launcher.cpp:265 gui/options.cpp:1100 msgid "Volume" msgstr "Volume" -#: gui/launcher.cpp:267 gui/options.cpp:1092 +#: gui/launcher.cpp:267 gui/options.cpp:1102 msgctxt "lowres" msgid "Volume" msgstr "Volume" @@ -243,7 +254,7 @@ msgctxt "lowres" msgid "Override global volume settings" msgstr "Ignora le impostazioni globali di volume" -#: gui/launcher.cpp:280 gui/options.cpp:1100 +#: gui/launcher.cpp:280 gui/options.cpp:1110 msgid "MIDI" msgstr "MIDI" @@ -256,7 +267,7 @@ msgctxt "lowres" msgid "Override global MIDI settings" msgstr "Ignora le impostazioni MIDI globali" -#: gui/launcher.cpp:294 gui/options.cpp:1106 +#: gui/launcher.cpp:294 gui/options.cpp:1116 msgid "MT-32" msgstr "MT-32" @@ -269,11 +280,11 @@ msgctxt "lowres" msgid "Override global MT-32 settings" msgstr "Ignora le impostazioni MT-32 globali" -#: gui/launcher.cpp:308 gui/options.cpp:1113 +#: gui/launcher.cpp:308 gui/options.cpp:1123 msgid "Paths" msgstr "Percorsi" -#: gui/launcher.cpp:310 gui/options.cpp:1115 +#: gui/launcher.cpp:310 gui/options.cpp:1125 msgctxt "lowres" msgid "Paths" msgstr "Perc." @@ -287,7 +298,7 @@ msgctxt "lowres" msgid "Game Path:" msgstr "Perc. gioco:" -#: gui/launcher.cpp:324 gui/options.cpp:1139 +#: gui/launcher.cpp:324 gui/options.cpp:1149 msgid "Extra Path:" msgstr "Percorso extra:" @@ -295,42 +306,42 @@ msgstr "Percorso extra:" msgid "Specifies path to additional data used the game" msgstr "Specifica il percorso di ulteriori dati usati dal gioco" -#: gui/launcher.cpp:326 gui/options.cpp:1141 +#: gui/launcher.cpp:326 gui/options.cpp:1151 msgctxt "lowres" msgid "Extra Path:" msgstr "Perc. extra:" -#: gui/launcher.cpp:333 gui/options.cpp:1123 +#: gui/launcher.cpp:333 gui/options.cpp:1133 msgid "Save Path:" msgstr "Salvataggi:" #: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 -#: gui/options.cpp:1123 gui/options.cpp:1125 gui/options.cpp:1126 +#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136 msgid "Specifies where your savegames are put" msgstr "Specifica dove archiviare i salvataggi" -#: gui/launcher.cpp:335 gui/options.cpp:1125 +#: gui/launcher.cpp:335 gui/options.cpp:1135 msgctxt "lowres" msgid "Save Path:" msgstr "Salvataggi:" #: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 -#: gui/launcher.cpp:565 gui/options.cpp:1134 gui/options.cpp:1142 -#: gui/options.cpp:1151 gui/options.cpp:1258 gui/options.cpp:1264 -#: gui/options.cpp:1272 gui/options.cpp:1302 gui/options.cpp:1308 -#: gui/options.cpp:1315 gui/options.cpp:1408 gui/options.cpp:1411 -#: gui/options.cpp:1423 +#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152 +#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282 +#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326 +#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429 +#: gui/options.cpp:1441 msgctxt "path" msgid "None" msgstr "Nessuno" #: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 -#: gui/options.cpp:1252 gui/options.cpp:1296 gui/options.cpp:1414 +#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Predefinito" -#: gui/launcher.cpp:504 gui/options.cpp:1417 +#: gui/launcher.cpp:504 gui/options.cpp:1435 msgid "Select SoundFont" msgstr "Seleziona SoundFont" @@ -354,7 +365,7 @@ msgstr "Questo ID di gioco è già in uso. Si prega di sceglierne un'altro." msgid "~Q~uit" msgstr "C~h~iudi" -#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:96 +#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95 msgid "Quit ScummVM" msgstr "Esci da ScummVM" @@ -362,7 +373,7 @@ msgstr "Esci da ScummVM" msgid "A~b~out..." msgstr "~I~nfo..." -#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:70 +#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69 msgid "About ScummVM" msgstr "Informazioni su ScummVM" @@ -439,12 +450,14 @@ msgstr "Cerca:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 +#: engines/pegasus/pegasus.cpp:345 msgid "Load game:" msgstr "Carica gioco:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:345 +#: backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Carica" @@ -533,135 +546,135 @@ msgstr "%d cartelle analizzate..." msgid "Discovered %d new games, ignored %d previously added games ..." msgstr "Rilevati %d nuovi giochi, ignorati %d giochi aggiunti in precedenza..." -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "Never" msgstr "Mai" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 5 mins" msgstr "ogni 5 minuti" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 10 mins" msgstr "ogni 10 minuti" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 15 mins" msgstr "ogni 15 minuti" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 30 mins" msgstr "ogni 30 minuti" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "8 kHz" msgstr "8 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "11kHz" msgstr "11kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "22 kHz" msgstr "22 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "44 kHz" msgstr "44 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:248 gui/options.cpp:474 gui/options.cpp:575 -#: gui/options.cpp:644 gui/options.cpp:852 +#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581 +#: gui/options.cpp:650 gui/options.cpp:858 msgctxt "soundfont" msgid "None" msgstr "Nessuno" -#: gui/options.cpp:382 +#: gui/options.cpp:388 msgid "Failed to apply some of the graphic options changes:" msgstr "Impossibile applicare alcuni dei cambiamenti nelle opzioni grafiche." -#: gui/options.cpp:394 +#: gui/options.cpp:400 msgid "the video mode could not be changed." msgstr "impossibile modificare la modalità video." -#: gui/options.cpp:400 +#: gui/options.cpp:406 msgid "the fullscreen setting could not be changed" msgstr "impossibile modificare l'impostazione schermo intero" -#: gui/options.cpp:406 +#: gui/options.cpp:412 msgid "the aspect ratio setting could not be changed" msgstr "impossibile modificare l'impostazione proporzioni" -#: gui/options.cpp:727 +#: gui/options.cpp:733 msgid "Graphics mode:" msgstr "Modalità:" -#: gui/options.cpp:741 +#: gui/options.cpp:747 msgid "Render mode:" msgstr "Resa grafica:" -#: gui/options.cpp:741 gui/options.cpp:742 +#: gui/options.cpp:747 gui/options.cpp:748 msgid "Special dithering modes supported by some games" msgstr "Modalità di resa grafica speciali supportate da alcuni giochi" -#: gui/options.cpp:753 +#: gui/options.cpp:759 #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476 msgid "Fullscreen mode" msgstr "Modalità a schermo intero" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Aspect ratio correction" msgstr "Correzione proporzioni" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Correct aspect ratio for 320x200 games" msgstr "Corregge le proporzioni dei giochi 320x200" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Preferred Device:" msgstr "Disp. preferito:" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Music Device:" msgstr "Dispositivo audio:" -#: gui/options.cpp:764 gui/options.cpp:766 +#: gui/options.cpp:770 gui/options.cpp:772 msgid "Specifies preferred sound device or sound card emulator" msgstr "" "Specifica il dispositivo audio o l'emulatore della scheda audio preferiti" -#: gui/options.cpp:764 gui/options.cpp:766 gui/options.cpp:767 +#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773 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:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Preferred Dev.:" msgstr "Disp. preferito:" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Music Device:" msgstr "Disposit. audio:" -#: gui/options.cpp:793 +#: gui/options.cpp:799 msgid "AdLib emulator:" msgstr "Emulatore AdLib:" -#: gui/options.cpp:793 gui/options.cpp:794 +#: gui/options.cpp:799 gui/options.cpp:800 msgid "AdLib is used for music in many games" msgstr "AdLib è utilizzato per la musica in molti giochi" -#: gui/options.cpp:804 +#: gui/options.cpp:810 msgid "Output rate:" msgstr "Frequenza:" -#: gui/options.cpp:804 gui/options.cpp:805 +#: gui/options.cpp:810 gui/options.cpp:811 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -669,62 +682,66 @@ msgstr "" "Valori più alti restituiscono un suono di maggior qualità, ma potrebbero non " "essere supportati dalla tua scheda audio" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "GM Device:" msgstr "Dispositivo GM:" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "Specifies default sound device for General MIDI output" msgstr "Specifica il dispositivo audio predefinito per l'output General MIDI" -#: gui/options.cpp:826 +#: gui/options.cpp:832 msgid "Don't use General MIDI music" msgstr "Non utilizzare la musica General MIDI" -#: gui/options.cpp:837 gui/options.cpp:899 +#: gui/options.cpp:843 gui/options.cpp:909 msgid "Use first available device" msgstr "Utilizza il primo dispositivo disponibile" -#: gui/options.cpp:849 +#: gui/options.cpp:855 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 +#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "SoundFont è supportato da alcune schede audio, Fluidsynth e Timidity" -#: gui/options.cpp:851 +#: gui/options.cpp:857 msgctxt "lowres" msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Mixed AdLib/MIDI mode" msgstr "Modalità mista AdLib/MIDI" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Use both MIDI and AdLib sound generation" msgstr "Utilizza generazione di suono sia MIDI che AdLib" -#: gui/options.cpp:860 +#: gui/options.cpp:866 msgid "MIDI gain:" msgstr "Guadagno MIDI:" -#: gui/options.cpp:870 +#: gui/options.cpp:873 +msgid "FluidSynth Settings" +msgstr "" + +#: gui/options.cpp:880 msgid "MT-32 Device:" msgstr "Disposit. MT-32:" -#: gui/options.cpp:870 +#: gui/options.cpp:880 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:875 +#: gui/options.cpp:885 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Roland MT-32 effettivo (disattiva emulazione GM)" -#: gui/options.cpp:875 gui/options.cpp:877 +#: gui/options.cpp:885 gui/options.cpp:887 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -732,192 +749,193 @@ msgstr "" "Seleziona se vuoi usare il dispositivo hardware audio compatibile con Roland " "che è connesso al tuo computer" -#: gui/options.cpp:877 +#: gui/options.cpp:887 msgctxt "lowres" msgid "True Roland MT-32 (no GM emulation)" msgstr "Roland MT-32 effettivo (disat.emul.GM)" -#: gui/options.cpp:880 -msgid "Enable Roland GS Mode" -msgstr "Attiva la modalità Roland GS" +#: gui/options.cpp:890 +#, fuzzy +msgid "Roland GS Mode (disable GM mapping)" +msgstr "Roland MT-32 effettivo (disattiva emulazione GM)" -#: gui/options.cpp:880 +#: gui/options.cpp:890 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:889 +#: gui/options.cpp:899 msgid "Don't use Roland MT-32 music" msgstr "Non utilizzare la musica Roland MT-32" -#: gui/options.cpp:916 +#: gui/options.cpp:926 msgid "Text and Speech:" msgstr "Testo e voci:" -#: gui/options.cpp:920 gui/options.cpp:930 +#: gui/options.cpp:930 gui/options.cpp:940 msgid "Speech" msgstr "Voci" -#: gui/options.cpp:921 gui/options.cpp:931 +#: gui/options.cpp:931 gui/options.cpp:941 msgid "Subtitles" msgstr "Sottotitoli" -#: gui/options.cpp:922 +#: gui/options.cpp:932 msgid "Both" msgstr "Entrambi" -#: gui/options.cpp:924 +#: gui/options.cpp:934 msgid "Subtitle speed:" msgstr "Velocità testo:" -#: gui/options.cpp:926 +#: gui/options.cpp:936 msgctxt "lowres" msgid "Text and Speech:" msgstr "Testo e voci:" -#: gui/options.cpp:930 +#: gui/options.cpp:940 msgid "Spch" msgstr "Voci" -#: gui/options.cpp:931 +#: gui/options.cpp:941 msgid "Subs" msgstr "Sub" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgctxt "lowres" msgid "Both" msgstr "Entr." -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgid "Show subtitles and play speech" msgstr "Mostra i sottotitoli e attiva le voci" -#: gui/options.cpp:934 +#: gui/options.cpp:944 msgctxt "lowres" msgid "Subtitle speed:" msgstr "Velocità testo:" -#: gui/options.cpp:950 +#: gui/options.cpp:960 msgid "Music volume:" msgstr "Volume musica:" -#: gui/options.cpp:952 +#: gui/options.cpp:962 msgctxt "lowres" msgid "Music volume:" msgstr "Volume musica:" -#: gui/options.cpp:959 +#: gui/options.cpp:969 msgid "Mute All" msgstr "Disattiva audio" -#: gui/options.cpp:962 +#: gui/options.cpp:972 msgid "SFX volume:" msgstr "Volume effetti:" -#: gui/options.cpp:962 gui/options.cpp:964 gui/options.cpp:965 +#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975 msgid "Special sound effects volume" msgstr "Volume degli effetti sonori" -#: gui/options.cpp:964 +#: gui/options.cpp:974 msgctxt "lowres" msgid "SFX volume:" msgstr "Volume effetti:" -#: gui/options.cpp:972 +#: gui/options.cpp:982 msgid "Speech volume:" msgstr "Volume voci:" -#: gui/options.cpp:974 +#: gui/options.cpp:984 msgctxt "lowres" msgid "Speech volume:" msgstr "Volume voci:" -#: gui/options.cpp:1131 +#: gui/options.cpp:1141 msgid "Theme Path:" msgstr "Percorso tema:" -#: gui/options.cpp:1133 +#: gui/options.cpp:1143 msgctxt "lowres" msgid "Theme Path:" msgstr "Perc. tema:" -#: gui/options.cpp:1139 gui/options.cpp:1141 gui/options.cpp:1142 +#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152 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:1148 +#: gui/options.cpp:1158 msgid "Plugins Path:" msgstr "Percorso plugin:" -#: gui/options.cpp:1150 +#: gui/options.cpp:1160 msgctxt "lowres" msgid "Plugins Path:" msgstr "Perc. plugin:" -#: gui/options.cpp:1159 +#: gui/options.cpp:1169 msgid "Misc" msgstr "Varie" -#: gui/options.cpp:1161 +#: gui/options.cpp:1171 msgctxt "lowres" msgid "Misc" msgstr "Varie" -#: gui/options.cpp:1163 +#: gui/options.cpp:1173 msgid "Theme:" msgstr "Tema:" -#: gui/options.cpp:1167 +#: gui/options.cpp:1177 msgid "GUI Renderer:" msgstr "Renderer GUI:" -#: gui/options.cpp:1179 +#: gui/options.cpp:1189 msgid "Autosave:" msgstr "Autosalva:" -#: gui/options.cpp:1181 +#: gui/options.cpp:1191 msgctxt "lowres" msgid "Autosave:" msgstr "Autosalva:" -#: gui/options.cpp:1189 +#: gui/options.cpp:1199 msgid "Keys" msgstr "Tasti" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "GUI Language:" msgstr "Lingua GUI:" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "Language of ScummVM GUI" msgstr "Lingua dell'interfaccia grafica di ScummVM" -#: gui/options.cpp:1347 +#: gui/options.cpp:1365 msgid "You have to restart ScummVM before your changes will take effect." msgstr "Devi riavviare ScummVM affinché le modifiche abbiano effetto." -#: gui/options.cpp:1360 +#: gui/options.cpp:1378 msgid "Select directory for savegames" msgstr "Seleziona la cartella per i salvataggi" -#: gui/options.cpp:1367 +#: gui/options.cpp:1385 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:1376 +#: gui/options.cpp:1394 msgid "Select directory for GUI themes" msgstr "Seleziona la cartella dei temi dell'interfaccia" -#: gui/options.cpp:1386 +#: gui/options.cpp:1404 msgid "Select directory for extra files" msgstr "Seleziona la cartella dei file aggiuntivi" -#: gui/options.cpp:1397 +#: gui/options.cpp:1415 msgid "Select directory for plugins" msgstr "Seleziona la cartella dei plugin" -#: gui/options.cpp:1450 +#: gui/options.cpp:1468 msgid "" "The theme you selected does not support your current language. If you want " "to use this theme you need to switch to another language first." @@ -925,74 +943,74 @@ msgstr "" "Il tema che hai selezionato non supporta la lingua attuale. Se vuoi " "utilizzare questo tema devi prima cambiare la lingua." -#: gui/saveload-dialog.cpp:158 +#: gui/saveload-dialog.cpp:166 msgid "List view" msgstr "" -#: gui/saveload-dialog.cpp:159 +#: gui/saveload-dialog.cpp:167 msgid "Grid view" msgstr "" -#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 +#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358 msgid "No date saved" msgstr "Nessuna data salvata" -#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359 msgid "No time saved" msgstr "Nessun orario salvato" -#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 +#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360 msgid "No playtime saved" msgstr "Nessun tempo salvato" -#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275 msgid "Delete" msgstr "Elimina" -#: gui/saveload-dialog.cpp:266 +#: gui/saveload-dialog.cpp:274 msgid "Do you really want to delete this savegame?" msgstr "Sei sicuro di voler eliminare questo salvataggio?" -#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 +#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872 msgid "Date: " msgstr "Data: " -#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 +#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878 msgid "Time: " msgstr "Ora: " -#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 +#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886 msgid "Playtime: " msgstr "Tempo di gioco: " -#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 +#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494 msgid "Untitled savestate" msgstr "Salvataggio senza titolo" -#: gui/saveload-dialog.cpp:517 +#: gui/saveload-dialog.cpp:546 msgid "Next" msgstr "" -#: gui/saveload-dialog.cpp:520 +#: gui/saveload-dialog.cpp:549 msgid "Prev" msgstr "" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 #, fuzzy msgid "New Save" msgstr "Salva" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 #, fuzzy msgid "Create a new save game" msgstr "Impossibile salvare il gioco" -#: gui/saveload-dialog.cpp:789 +#: gui/saveload-dialog.cpp:865 #, fuzzy msgid "Name: " msgstr "Nome:" -#: gui/saveload-dialog.cpp:861 +#: gui/saveload-dialog.cpp:937 #, c-format msgid "Enter a description for slot %d:" msgstr "" @@ -1030,35 +1048,35 @@ msgstr "Con antialiasing (16bpp)" msgid "Clear value" msgstr "Cancella" -#: base/main.cpp:209 +#: base/main.cpp:210 #, c-format msgid "Engine does not support debug level '%s'" msgstr "Il motore non supporta il livello di debug '%s'" -#: base/main.cpp:287 +#: base/main.cpp:288 msgid "Menu" msgstr "Menu" -#: base/main.cpp:290 backends/platform/symbian/src/SymbianActions.cpp:45 +#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:45 #: backends/platform/wince/CEActionsSmartphone.cpp:46 msgid "Skip" msgstr "Salta" -#: base/main.cpp:293 backends/platform/symbian/src/SymbianActions.cpp:50 +#: base/main.cpp:294 backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:42 msgid "Pause" msgstr "Pausa" -#: base/main.cpp:296 +#: base/main.cpp:297 msgid "Skip line" msgstr "Salta battuta" -#: base/main.cpp:467 +#: base/main.cpp:468 msgid "Error running game:" msgstr "Errore nell'esecuzione del gioco:" -#: base/main.cpp:491 +#: base/main.cpp:492 msgid "Could not find any engine capable of running the selected game" msgstr "" "Impossibile trovare un motore in grado di eseguire il gioco selezionato" @@ -1174,13 +1192,16 @@ msgid "~R~eturn to Launcher" msgstr "~V~ai a elenco giochi" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284 +#: engines/pegasus/pegasus.cpp:369 msgid "Save game:" msgstr "Salva gioco:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:369 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1210,12 +1231,12 @@ msgstr "" "assistenza." #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 -#: engines/mohawk/dialogs.cpp:174 +#: engines/mohawk/dialogs.cpp:170 msgid "~O~K" msgstr "~O~K" #: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 -#: engines/mohawk/dialogs.cpp:175 +#: engines/mohawk/dialogs.cpp:171 msgid "~C~ancel" msgstr "~A~nnulla" @@ -1223,23 +1244,23 @@ msgstr "~A~nnulla" msgid "~K~eys" msgstr "~T~asti" -#: engines/engine.cpp:235 +#: engines/engine.cpp:240 msgid "Could not initialize color format." msgstr "Impossibile inizializzare il formato colore." -#: engines/engine.cpp:243 +#: engines/engine.cpp:248 msgid "Could not switch to video mode: '" msgstr "Impossibile cambiare la modalità video: '" -#: engines/engine.cpp:252 +#: engines/engine.cpp:257 msgid "Could not apply aspect ratio setting." msgstr "Impossibile applicare l'impostazione proporzioni" -#: engines/engine.cpp:257 +#: engines/engine.cpp:262 msgid "Could not apply fullscreen setting." msgstr "Impossibile applicare l'impostazione schermo intero." -#: engines/engine.cpp:357 +#: engines/engine.cpp:362 msgid "" "You appear to be playing this game directly\n" "from the CD. This is known to cause problems,\n" @@ -1253,7 +1274,7 @@ msgstr "" "sull'hard disk.\n" "Vedi il file README per i dettagli." -#: engines/engine.cpp:368 +#: engines/engine.cpp:373 msgid "" "This game has audio tracks in its disk. These\n" "tracks need to be ripped from the disk using\n" @@ -1267,7 +1288,7 @@ msgstr "" "la musica del gioco.\n" "Vedi il file README per i dettagli." -#: engines/engine.cpp:426 +#: engines/engine.cpp:431 #, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " @@ -1277,7 +1298,7 @@ msgstr "" "per le informazioni di base e per le istruzioni su come ottenere ulteriore " "assistenza." -#: engines/engine.cpp:439 +#: engines/engine.cpp:444 msgid "" "WARNING: The game you are about to start is not yet fully supported by " "ScummVM. As such, it is likely to be unstable, and any saves you make might " @@ -1287,30 +1308,53 @@ msgstr "" "ScummVM. È quindi possibile che sia instabile, e i salvataggi potrebbero non " "funzionare con future versioni di ScummVM." -#: engines/engine.cpp:442 +#: engines/engine.cpp:447 msgid "Start anyway" msgstr "Avvia comunque" -#: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 -#: engines/sci/detection.cpp:390 +#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270 +#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393 +#: engines/toltecs/detection.cpp:173 msgid "Use original save/load screens" msgstr "Usa schermate di salvataggio originali" -#: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 -#: engines/sci/detection.cpp:391 +#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271 +#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394 +#: engines/toltecs/detection.cpp:174 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" "Usa le schermate originali di salvataggio e caricamento, al posto di quelle " "di ScummVM" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore game:" msgstr "Ripristina gioco:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore" msgstr "Ripristina" +#: engines/drascula/saveload.cpp:49 +#, fuzzy +msgid "" +"ScummVM found that you have old savefiles for Drascula that should be " +"converted.\n" +"The old save game format is no longer supported, so you will not be able to " +"load your games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" +msgstr "" +"ScummVM ha trovato vecchi salvataggi per Broken Sword 1 che dovrebbero " +"essere convertiti.\n" +"Il vecchio formato di salvataggio non è più supportato, quindi non potrai " +"caricare i tuoi salvataggi senza prima convertirli.\n" +"\n" +"Premi OK per convertirli adesso, altrimenti ti verrà richiesto al prossimo " +"avvio del gioco.\n" + #: engines/dreamweb/detection.cpp:57 msgid "Use bright palette mode" msgstr "Usa modalità colori brillanti" @@ -1319,27 +1363,27 @@ msgstr "Usa modalità colori brillanti" msgid "Display graphics using the game's bright palette" msgstr "Visualizza la grafica con i colori brillanti del gioco" -#: engines/sci/detection.cpp:370 +#: engines/sci/detection.cpp:373 msgid "EGA undithering" msgstr "Undithering EGA" -#: engines/sci/detection.cpp:371 +#: engines/sci/detection.cpp:374 msgid "Enable undithering in EGA games" msgstr "Attiva undithering nei giochi EGA" -#: engines/sci/detection.cpp:380 +#: engines/sci/detection.cpp:383 msgid "Prefer digital sound effects" msgstr "Scegli effetti sonori digitali" -#: engines/sci/detection.cpp:381 +#: engines/sci/detection.cpp:384 msgid "Prefer digital sound effects instead of synthesized ones" msgstr "Scegli gli effetti sonori digitali al posto di quelli sintetizzati" -#: engines/sci/detection.cpp:400 +#: engines/sci/detection.cpp:403 msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "Usa IMF/Yamaha FB-01 per output MIDI" -#: engines/sci/detection.cpp:401 +#: engines/sci/detection.cpp:404 msgid "" "Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" @@ -1347,30 +1391,30 @@ msgstr "" "Usa una scheda IBM Music Feature o un modulo synth Yamaha FB-01 FM per " "l'output MIDI" -#: engines/sci/detection.cpp:411 +#: engines/sci/detection.cpp:414 msgid "Use CD audio" msgstr "Usa audio da CD" -#: engines/sci/detection.cpp:412 +#: engines/sci/detection.cpp:415 msgid "Use CD audio instead of in-game audio, if available" msgstr "" "Usa l'audio da CD al posto di quello incorporato nel gioco, se disponibile" -#: engines/sci/detection.cpp:422 +#: engines/sci/detection.cpp:425 msgid "Use Windows cursors" msgstr "Usa cursori di Windows" -#: engines/sci/detection.cpp:423 +#: engines/sci/detection.cpp:426 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "" "Usa i cursori di Windows (più piccoli e monocromatici) al posto di quelli DOS" -#: engines/sci/detection.cpp:433 +#: engines/sci/detection.cpp:436 msgid "Use silver cursors" msgstr "Usa cursori d'argento" -#: engines/sci/detection.cpp:434 +#: engines/sci/detection.cpp:437 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "" @@ -2023,7 +2067,7 @@ msgstr "Vola a destra" msgid "Fly to lower right" msgstr "Vola in basso a destra" -#: engines/scumm/scumm.cpp:1773 +#: engines/scumm/scumm.cpp:1776 #, c-format msgid "" "Native MIDI support requires the Roland Upgrade from LucasArts,\n" @@ -2032,7 +2076,7 @@ msgstr "" "Il supporto nativo MIDI richiede il Roland Upgrade della LucasArts,\n" "ma %s non è presente. Verrà usato AdLib." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 +#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2043,7 +2087,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 +#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2054,7 +2098,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 +#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2065,7 +2109,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2512 +#: engines/scumm/scumm.cpp:2537 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2077,7 +2121,7 @@ msgstr "" "cartella di Day Of The Tentacle." #. I18N: Option for fast scene switching -#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171 +#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167 msgid "~Z~ip Mode Activated" msgstr "Modalità ~Z~ip attivata" @@ -2098,11 +2142,11 @@ msgstr "~M~ostra mappa" msgid "~M~ain Menu" msgstr "~M~enu principale" -#: engines/mohawk/dialogs.cpp:172 +#: engines/mohawk/dialogs.cpp:168 msgid "~W~ater Effect Enabled" msgstr "~E~ffetto acqua attivo" -#: engines/agos/animation.cpp:560 +#: engines/agos/animation.cpp:557 #, c-format msgid "Cutscene file '%s' not found!" msgstr "File della scena di intermezzo '%s' non trovato!" @@ -2120,6 +2164,15 @@ msgstr "Impossibile salvare il gioco nel file." msgid "Failed to delete file." msgstr "Impossibile eliminare il file." +#: engines/groovie/detection.cpp:312 +#, fuzzy +msgid "Fast movie speed" +msgstr "Modalità veloce" + +#: engines/groovie/detection.cpp:313 +msgid "Play movies at an increased speed" +msgstr "" + #: engines/groovie/script.cpp:420 msgid "Failed to save game" msgstr "Impossibile salvare il gioco" @@ -2210,11 +2263,11 @@ msgstr "Scorri a sinistra" msgid "Slide Right" msgstr "Scorri a destra" -#: engines/kyra/lol.cpp:485 +#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2412 msgid "Turn Left" msgstr "Gira a sinistra" -#: engines/kyra/lol.cpp:486 +#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2413 msgid "Turn Right" msgstr "Gira a destra" @@ -2230,7 +2283,7 @@ msgstr "Opzioni" msgid "Choose Spell" msgstr "Scegli incantesimo" -#: engines/kyra/sound_midi.cpp:475 +#: engines/kyra/sound_midi.cpp:477 msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2277,28 +2330,28 @@ msgstr "Intro floppy" msgid "Use the floppy version's intro (CD version only)" msgstr "Usa la versione floppy dell'intro (solo versione CD)" -#: engines/sword1/animation.cpp:539 +#: engines/sword1/animation.cpp:519 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "" "La scena PSX di intermezzo '%s' non può essere eseguita in modalità tavolozza" -#: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 +#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439 msgid "DXA cutscenes found but ScummVM has been built without zlib support" msgstr "" "Sono state trovare scene di intermezzo DXA ma ScummVM è stato compilato " "senza il supporto zlib" -#: engines/sword1/animation.cpp:570 engines/sword2/animation.cpp:465 +#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449 msgid "MPEG2 cutscenes are no longer supported" msgstr "Le scene di intermezzo MPEG2 non sono più supportate" -#: engines/sword1/animation.cpp:576 engines/sword2/animation.cpp:473 +#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457 #, c-format msgid "Cutscene '%s' not found" msgstr "Scena di intermezzo '%s' non trovata" -#: engines/sword1/control.cpp:863 +#: engines/sword1/control.cpp:865 msgid "" "ScummVM found that you have old savefiles for Broken Sword 1 that should be " "converted.\n" @@ -2316,7 +2369,7 @@ msgstr "" "Premi OK per convertirli adesso, altrimenti ti verrà richiesto al prossimo " "avvio del gioco.\n" -#: engines/sword1/control.cpp:1232 +#: engines/sword1/control.cpp:1234 #, c-format msgid "" "Target new save game already exists!\n" @@ -2325,11 +2378,11 @@ msgstr "" "La destinazione del nuovo salvataggio già esiste!\n" "Vuoi mantenere il vecchio salvataggio (%s) o quello nuovo (%s)?\n" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the old one" msgstr "Mantieni quello vecchio" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the new one" msgstr "Mantieni quello nuovo" @@ -2337,7 +2390,7 @@ msgstr "Mantieni quello nuovo" msgid "This is the end of the Broken Sword 1 Demo" msgstr "Questa è la fine della demo di Broken Sword 1" -#: engines/sword2/animation.cpp:435 +#: engines/sword2/animation.cpp:419 msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" @@ -2352,12 +2405,12 @@ msgstr "Mostra etichette oggetti" msgid "Show labels for objects on mouse hover" msgstr "Mostra etichette per gli oggetti al passaggio del mouse" -#: engines/teenagent/resources.cpp:68 +#: engines/teenagent/resources.cpp:94 msgid "" "You're missing the 'teenagent.dat' file. Get it from the ScummVM website" msgstr "" -#: engines/teenagent/resources.cpp:89 +#: engines/teenagent/resources.cpp:115 msgid "" "The teenagent.dat file is compressed and zlib hasn't been included in this " "executable. Please decompress it" @@ -2413,6 +2466,47 @@ msgstr "" "\n" "Per favore, contatta il team." +#: engines/pegasus/pegasus.cpp:675 +msgid "Invalid save file name" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2410 +msgid "Up/Zoom In/Move Forward/Open Doors" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2411 +#, fuzzy +msgid "Down/Zoom Out" +msgstr "Zoom avanti" + +#: engines/pegasus/pegasus.cpp:2414 +msgid "Display/Hide Inventory Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2415 +msgid "Display/Hide Biochip Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2416 +msgid "Action/Select" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2417 +msgid "Toggle Center Data Display" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2418 +msgid "Display/Hide Info Screen" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2419 +msgid "Display/Hide Pause Menu" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2420 +msgid "???" +msgstr "" + #: audio/fmopl.cpp:49 msgid "MAME OPL emulator" msgstr "Emulatore OPL MAME" @@ -2470,7 +2564,7 @@ msgstr "Nessuna musica" msgid "Amiga Audio Emulator" msgstr "Emulatore audio Amiga" -#: audio/softsynth/adlib.cpp:1593 +#: audio/softsynth/adlib.cpp:2284 msgid "AdLib Emulator" msgstr "Emulatore AdLib" @@ -2482,11 +2576,11 @@ msgstr "Emulatore Apple II GS (NON IMPLEMENTATO)" msgid "C64 Audio Emulator" msgstr "Emulatore audio C64" -#: audio/softsynth/mt32.cpp:293 +#: audio/softsynth/mt32.cpp:205 msgid "Initializing MT-32 Emulator" msgstr "Avvio in corso dell'emulatore MT-32" -#: audio/softsynth/mt32.cpp:512 +#: audio/softsynth/mt32.cpp:431 msgid "MT-32 Emulator" msgstr "Emulatore MT-32" @@ -2637,24 +2731,24 @@ msgstr "Clic centrale" msgid "Right Click" msgstr "Clic destro" -#: backends/platform/sdl/macosx/appmenu_osx.mm:78 +#: backends/platform/sdl/macosx/appmenu_osx.mm:77 msgid "Hide ScummVM" msgstr "Nascondi ScummVM" -#: backends/platform/sdl/macosx/appmenu_osx.mm:83 +#: backends/platform/sdl/macosx/appmenu_osx.mm:82 msgid "Hide Others" msgstr "Nascondi altre" -#: backends/platform/sdl/macosx/appmenu_osx.mm:88 +#: backends/platform/sdl/macosx/appmenu_osx.mm:87 msgid "Show All" msgstr "Mostra tutte" -#: backends/platform/sdl/macosx/appmenu_osx.mm:110 -#: backends/platform/sdl/macosx/appmenu_osx.mm:121 +#: backends/platform/sdl/macosx/appmenu_osx.mm:109 +#: backends/platform/sdl/macosx/appmenu_osx.mm:120 msgid "Window" msgstr "Finestra" -#: backends/platform/sdl/macosx/appmenu_osx.mm:115 +#: backends/platform/sdl/macosx/appmenu_osx.mm:114 msgid "Minimize" msgstr "Contrai" @@ -2668,12 +2762,12 @@ msgid "Normal (no scaling)" msgstr "Normale (no ridim.)" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537 msgid "Enabled aspect ratio correction" msgstr "Correzione proporzioni attivata" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542 msgid "Disabled aspect ratio correction" msgstr "Correzione proporzioni disattivata" @@ -2682,7 +2776,7 @@ msgid "Active graphics filter:" msgstr "Filtro grafico attivo:" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481 msgid "Windowed mode" msgstr "Modalità finestra" @@ -2706,11 +2800,11 @@ msgstr "Modalità visualizzazione attuale" msgid "Current scale" msgstr "Dimensioni attuali" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:558 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562 msgid "Active filter mode: Linear" msgstr "Modalità filtro attiva: Lineare" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:560 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564 msgid "Active filter mode: Nearest" msgstr "Modalità filtro attiva: Più vicino" @@ -3036,19 +3130,19 @@ msgstr "Sei sicuro di voler uscire?" #: backends/events/gph/gph-events.cpp:386 #: backends/events/gph/gph-events.cpp:429 -#: backends/events/openpandora/op-events.cpp:139 +#: backends/events/openpandora/op-events.cpp:168 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "Touchscreen 'Tap Mode' - Clic sinistro" #: backends/events/gph/gph-events.cpp:388 #: backends/events/gph/gph-events.cpp:431 -#: backends/events/openpandora/op-events.cpp:141 +#: backends/events/openpandora/op-events.cpp:170 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "Touchscreen 'Tap Mode' - Clic destro" #: backends/events/gph/gph-events.cpp:390 #: backends/events/gph/gph-events.cpp:433 -#: backends/events/openpandora/op-events.cpp:143 +#: backends/events/openpandora/op-events.cpp:172 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "Touchscreen 'Tap Mode' - Passaggio del cursore (nessun clic)" @@ -3068,7 +3162,12 @@ msgstr "Volume minimo" msgid "Decreasing Volume" msgstr "Diminuzione volume" -#: backends/updates/macosx/macosx-updates.mm:65 +#: backends/events/openpandora/op-events.cpp:174 +#, fuzzy +msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)" +msgstr "Touchscreen 'Tap Mode' - Passaggio del cursore (nessun clic)" + +#: backends/updates/macosx/macosx-updates.mm:67 msgid "Check for Updates..." msgstr "Cerca aggiornamenti..." @@ -3104,6 +3203,9 @@ msgstr "Clic attivato" msgid "Clicking Disabled" msgstr "Clic disattivato" +#~ msgid "Enable Roland GS Mode" +#~ msgstr "Attiva la modalità Roland GS" + #~ msgid "Hercules Green" #~ msgstr "Hercules verde" diff --git a/po/nb_NO.po b/po/nb_NO.po index b775d11dd2..90de2f4673 100644 --- a/po/nb_NO.po +++ b/po/nb_NO.po @@ -1,5 +1,5 @@ # Norwegian (Bokmaal) translation for ScummVM. -# Copyright (C) 2010-2012 ScummVM Team +# Copyright (C) 2010-2013 ScummVM Team # This file is distributed under the same license as the ScummVM package. # Einar Johan T. Sømåen <einarjohants@gmail.com>, 2010. # @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-08-12 14:57+0200\n" +"POT-Creation-Date: 2013-02-07 23:11+0000\n" "PO-Revision-Date: 2012-07-04 02:19+0100\n" "Last-Translator: Einar Johan Sømåen <einarjohants@gmail.com>\n" "Language-Team: somaen <einarjohants@gmail.com>\n" @@ -20,45 +20,55 @@ msgstr "" "X-Poedit-Country: NORWAY\n" "X-Poedit-SourceCharset: iso-8859-1\n" -#: gui/about.cpp:91 +#: gui/about.cpp:93 #, c-format msgid "(built on %s)" msgstr "(bygd den %s)" -#: gui/about.cpp:98 +#: gui/about.cpp:100 msgid "Features compiled in:" msgstr "Funksjoner innkompilert:" -#: gui/about.cpp:107 +#: gui/about.cpp:109 msgid "Available engines:" msgstr "Tilgjengelige motorer:" -#: gui/browser.cpp:66 +#: gui/browser.cpp:67 +#, fuzzy +msgid "Show hidden files" +msgstr "Vis / Skjul konsollen" + +#: gui/browser.cpp:67 +msgid "Show files marked with the hidden attribute" +msgstr "" + +#: gui/browser.cpp:71 msgid "Go up" msgstr "Gå tilbake" -#: gui/browser.cpp:66 gui/browser.cpp:68 +#: gui/browser.cpp:71 gui/browser.cpp:73 msgid "Go to previous directory level" msgstr "Gå til forrige mappenivå" -#: gui/browser.cpp:68 +#: gui/browser.cpp:73 msgctxt "lowres" msgid "Go up" msgstr "Gå tilbake" -#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 -#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 -#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 -#: gui/themebrowser.cpp:54 engines/engine.cpp:442 -#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 +#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238 +#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275 +#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919 +#: gui/themebrowser.cpp:54 engines/engine.cpp:447 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:190 +#: engines/sword1/control.cpp:867 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" msgstr "Avbryt" -#: gui/browser.cpp:70 gui/chooser.cpp:46 gui/themebrowser.cpp:55 +#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55 msgid "Choose" msgstr "Velg" @@ -73,15 +83,15 @@ msgstr "Lukk" msgid "Mouse click" msgstr "Musklikk" -#: gui/gui-manager.cpp:122 base/main.cpp:300 +#: gui/gui-manager.cpp:122 base/main.cpp:301 msgid "Display keyboard" msgstr "Vis tastatur" -#: gui/gui-manager.cpp:126 base/main.cpp:304 +#: gui/gui-manager.cpp:126 base/main.cpp:305 msgid "Remap keys" msgstr "Omkoble taster" -#: gui/gui-manager.cpp:129 base/main.cpp:307 +#: gui/gui-manager.cpp:129 base/main.cpp:308 msgid "Toggle FullScreen" msgstr "Veksle fullskjerm" @@ -94,17 +104,18 @@ msgid "Map" msgstr "Koble" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 -#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 -#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 -#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 -#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 -#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 -#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 -#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 -#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 -#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 +#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239 +#: gui/saveload-dialog.cpp:920 engines/engine.cpp:366 engines/engine.cpp:377 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192 +#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558 +#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 +#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519 +#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550 +#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:867 +#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419 +#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449 +#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -177,8 +188,8 @@ msgstr "" "Spillets språk. Dette vil ikke gjøre din spanske spillversjon om til engelsk " "versjon" -#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:80 -#: gui/options.cpp:730 gui/options.cpp:743 gui/options.cpp:1199 +#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86 +#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209 #: audio/null.cpp:40 msgid "<default>" msgstr "<standard>" @@ -200,11 +211,11 @@ msgstr "Plattform:" msgid "Engine" msgstr "Motor" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "Graphics" msgstr "Grafikk" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "GFX" msgstr "GFX" @@ -217,7 +228,7 @@ msgctxt "lowres" msgid "Override global graphic settings" msgstr "Overstyr globale grafikkinstillinger" -#: gui/launcher.cpp:251 gui/options.cpp:1085 +#: gui/launcher.cpp:251 gui/options.cpp:1095 msgid "Audio" msgstr "Lyd" @@ -230,11 +241,11 @@ msgctxt "lowres" msgid "Override global audio settings" msgstr "Overstyr globale lydinstillinger" -#: gui/launcher.cpp:265 gui/options.cpp:1090 +#: gui/launcher.cpp:265 gui/options.cpp:1100 msgid "Volume" msgstr "Volum" -#: gui/launcher.cpp:267 gui/options.cpp:1092 +#: gui/launcher.cpp:267 gui/options.cpp:1102 msgctxt "lowres" msgid "Volume" msgstr "Volum" @@ -248,7 +259,7 @@ msgctxt "lowres" msgid "Override global volume settings" msgstr "Overstyr globale voluminstillinger" -#: gui/launcher.cpp:280 gui/options.cpp:1100 +#: gui/launcher.cpp:280 gui/options.cpp:1110 msgid "MIDI" msgstr "MIDI" @@ -261,7 +272,7 @@ msgctxt "lowres" msgid "Override global MIDI settings" msgstr "Overstyr globale MIDI-instillinger" -#: gui/launcher.cpp:294 gui/options.cpp:1106 +#: gui/launcher.cpp:294 gui/options.cpp:1116 msgid "MT-32" msgstr "MT-32" @@ -274,11 +285,11 @@ msgctxt "lowres" msgid "Override global MT-32 settings" msgstr "Overstyr globale MT-32-instillinger" -#: gui/launcher.cpp:308 gui/options.cpp:1113 +#: gui/launcher.cpp:308 gui/options.cpp:1123 msgid "Paths" msgstr "Sti" -#: gui/launcher.cpp:310 gui/options.cpp:1115 +#: gui/launcher.cpp:310 gui/options.cpp:1125 msgctxt "lowres" msgid "Paths" msgstr "Sti" @@ -292,7 +303,7 @@ msgctxt "lowres" msgid "Game Path:" msgstr "Spillsti:" -#: gui/launcher.cpp:324 gui/options.cpp:1139 +#: gui/launcher.cpp:324 gui/options.cpp:1149 msgid "Extra Path:" msgstr "Ekstrasti:" @@ -300,42 +311,42 @@ msgstr "Ekstrasti:" msgid "Specifies path to additional data used the game" msgstr "Bestemmer sti til ytterligere data brukt av spillet" -#: gui/launcher.cpp:326 gui/options.cpp:1141 +#: gui/launcher.cpp:326 gui/options.cpp:1151 msgctxt "lowres" msgid "Extra Path:" msgstr "Ekstrasti:" -#: gui/launcher.cpp:333 gui/options.cpp:1123 +#: gui/launcher.cpp:333 gui/options.cpp:1133 msgid "Save Path:" msgstr "Lagringssti:" #: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 -#: gui/options.cpp:1123 gui/options.cpp:1125 gui/options.cpp:1126 +#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136 msgid "Specifies where your savegames are put" msgstr "Bestemmer sti til lagrede spill" -#: gui/launcher.cpp:335 gui/options.cpp:1125 +#: gui/launcher.cpp:335 gui/options.cpp:1135 msgctxt "lowres" msgid "Save Path:" msgstr "Lagringssti:" #: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 -#: gui/launcher.cpp:565 gui/options.cpp:1134 gui/options.cpp:1142 -#: gui/options.cpp:1151 gui/options.cpp:1258 gui/options.cpp:1264 -#: gui/options.cpp:1272 gui/options.cpp:1302 gui/options.cpp:1308 -#: gui/options.cpp:1315 gui/options.cpp:1408 gui/options.cpp:1411 -#: gui/options.cpp:1423 +#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152 +#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282 +#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326 +#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429 +#: gui/options.cpp:1441 msgctxt "path" msgid "None" msgstr "Ingen" #: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 -#: gui/options.cpp:1252 gui/options.cpp:1296 gui/options.cpp:1414 +#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Standard" -#: gui/launcher.cpp:504 gui/options.cpp:1417 +#: gui/launcher.cpp:504 gui/options.cpp:1435 msgid "Select SoundFont" msgstr "Velg SoundFont" @@ -359,7 +370,7 @@ msgstr "Denne spill-IDen er allerede i bruk. Vennligst velg en annen." msgid "~Q~uit" msgstr "~A~vslutt" -#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:96 +#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95 msgid "Quit ScummVM" msgstr "Avslutt ScummVM" @@ -367,7 +378,7 @@ msgstr "Avslutt ScummVM" msgid "A~b~out..." msgstr "~O~m..." -#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:70 +#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69 msgid "About ScummVM" msgstr "Om ScummVM" @@ -444,12 +455,14 @@ msgstr "Søk:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 +#: engines/pegasus/pegasus.cpp:345 msgid "Load game:" msgstr "Åpne spill:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:345 +#: backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Åpne" @@ -537,133 +550,133 @@ msgid "Discovered %d new games, ignored %d previously added games ..." msgstr "" "Fant %d nye spill, ignorerte %d spill som har blitt lagt til tidligere..." -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "Never" msgstr "Aldri" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 5 mins" msgstr "hvert 5. min" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 10 mins" msgstr "hvert 10. min" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 15 mins" msgstr "hvert 15. min" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 30 mins" msgstr "hvert 30. min" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "8 kHz" msgstr "8 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "11kHz" msgstr "11kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "22 kHz" msgstr "22 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "44 kHz" msgstr "44 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:248 gui/options.cpp:474 gui/options.cpp:575 -#: gui/options.cpp:644 gui/options.cpp:852 +#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581 +#: gui/options.cpp:650 gui/options.cpp:858 msgctxt "soundfont" msgid "None" msgstr "Ingen" -#: gui/options.cpp:382 +#: gui/options.cpp:388 msgid "Failed to apply some of the graphic options changes:" msgstr "Klarte ikke å aktivere enkelte av endringene i grafikkinstillinger:" -#: gui/options.cpp:394 +#: gui/options.cpp:400 msgid "the video mode could not be changed." msgstr "videomodusen kunne ikke endres." -#: gui/options.cpp:400 +#: gui/options.cpp:406 msgid "the fullscreen setting could not be changed" msgstr "fullskjermsinnstillingen kunne ikke endres" -#: gui/options.cpp:406 +#: gui/options.cpp:412 msgid "the aspect ratio setting could not be changed" msgstr "aspektrate-innstillingen kunne ikke endres" -#: gui/options.cpp:727 +#: gui/options.cpp:733 msgid "Graphics mode:" msgstr "Grafikkmodus:" -#: gui/options.cpp:741 +#: gui/options.cpp:747 msgid "Render mode:" msgstr "Tegnemodus:" -#: gui/options.cpp:741 gui/options.cpp:742 +#: gui/options.cpp:747 gui/options.cpp:748 msgid "Special dithering modes supported by some games" msgstr "Spesiel dithering-modus støttet av enkelte spill" -#: gui/options.cpp:753 +#: gui/options.cpp:759 #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476 msgid "Fullscreen mode" msgstr "Fullskjermsmodus" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Aspect ratio correction" msgstr "Aspekt-rate korrigering" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Correct aspect ratio for 320x200 games" msgstr "Korriger aspekt-rate for 320x200-spill" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Preferred Device:" msgstr "Foretrukket enhet:" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Music Device:" msgstr "Musikkenhet:" -#: gui/options.cpp:764 gui/options.cpp:766 +#: gui/options.cpp:770 gui/options.cpp:772 msgid "Specifies preferred sound device or sound card emulator" msgstr "Velger foretrukket lydenhet eller lydkort-emulator" -#: gui/options.cpp:764 gui/options.cpp:766 gui/options.cpp:767 +#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773 msgid "Specifies output sound device or sound card emulator" msgstr "Velger ut-lydenhet eller lydkortemulator" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Preferred Dev.:" msgstr "Foretrukket enh.:" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Music Device:" msgstr "Musikkenhet:" -#: gui/options.cpp:793 +#: gui/options.cpp:799 msgid "AdLib emulator:" msgstr "AdLib-emulator:" -#: gui/options.cpp:793 gui/options.cpp:794 +#: gui/options.cpp:799 gui/options.cpp:800 msgid "AdLib is used for music in many games" msgstr "AdLib brukes til musikk i mange spill" -#: gui/options.cpp:804 +#: gui/options.cpp:810 msgid "Output rate:" msgstr "Utrate:" -#: gui/options.cpp:804 gui/options.cpp:805 +#: gui/options.cpp:810 gui/options.cpp:811 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -671,60 +684,64 @@ msgstr "" "Høyere verdier gir bedre lydkvalitet, men støttes kanskje ikke av ditt " "lydkort " -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "GM Device:" msgstr "GM-enhet:" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "Specifies default sound device for General MIDI output" msgstr "Velger standard lydenhet for General MIDI-utdata" -#: gui/options.cpp:826 +#: gui/options.cpp:832 msgid "Don't use General MIDI music" msgstr "Ikke bruk General MIDI-musikk" -#: gui/options.cpp:837 gui/options.cpp:899 +#: gui/options.cpp:843 gui/options.cpp:909 msgid "Use first available device" msgstr "Bruk første tilgjengelige enhet" -#: gui/options.cpp:849 +#: gui/options.cpp:855 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 +#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "SoundFont støttes ikke av enkelte lydkort, FluidSynth og Timidity" -#: gui/options.cpp:851 +#: gui/options.cpp:857 msgctxt "lowres" msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Mixed AdLib/MIDI mode" msgstr "Mikset AdLib/MIDI-modus" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Use both MIDI and AdLib sound generation" msgstr "Bruk både MIDI- og AdLib- lydgenerering" -#: gui/options.cpp:860 +#: gui/options.cpp:866 msgid "MIDI gain:" msgstr "MIDI gain:" -#: gui/options.cpp:870 +#: gui/options.cpp:873 +msgid "FluidSynth Settings" +msgstr "" + +#: gui/options.cpp:880 msgid "MT-32 Device:" msgstr "MT-32 Enhet:" -#: gui/options.cpp:870 +#: gui/options.cpp:880 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "Velger standard lydenhet for Roland MT-32/LAPC1/CM32I/CM64-avspilling" -#: gui/options.cpp:875 +#: gui/options.cpp:885 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Ekte Roland MT-32 (deaktiver GM-emulering)" -#: gui/options.cpp:875 gui/options.cpp:877 +#: gui/options.cpp:885 gui/options.cpp:887 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -732,190 +749,191 @@ msgstr "" "Velg hvis du har et ekte Roland-kompatible lydkort tilkoblet maskinen, og " "vil bruke dette." -#: gui/options.cpp:877 +#: gui/options.cpp:887 msgctxt "lowres" msgid "True Roland MT-32 (no GM emulation)" msgstr "Ekte Roland MT-32 (deaktiver GM-emulering)" -#: gui/options.cpp:880 -msgid "Enable Roland GS Mode" -msgstr "Aktiver Roland GS-modus" +#: gui/options.cpp:890 +#, fuzzy +msgid "Roland GS Mode (disable GM mapping)" +msgstr "Ekte Roland MT-32 (deaktiver GM-emulering)" -#: gui/options.cpp:880 +#: gui/options.cpp:890 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "Slå av General MIDI-kobling for spill som har Roland MT-32-lydspor" -#: gui/options.cpp:889 +#: gui/options.cpp:899 msgid "Don't use Roland MT-32 music" msgstr "Ikke bruk Roland MT-32-musikk" -#: gui/options.cpp:916 +#: gui/options.cpp:926 msgid "Text and Speech:" msgstr "Tekst og Tale:" -#: gui/options.cpp:920 gui/options.cpp:930 +#: gui/options.cpp:930 gui/options.cpp:940 msgid "Speech" msgstr "Tale" -#: gui/options.cpp:921 gui/options.cpp:931 +#: gui/options.cpp:931 gui/options.cpp:941 msgid "Subtitles" msgstr "Undertekster" -#: gui/options.cpp:922 +#: gui/options.cpp:932 msgid "Both" msgstr "Begge" -#: gui/options.cpp:924 +#: gui/options.cpp:934 msgid "Subtitle speed:" msgstr "Teksthastighet:" -#: gui/options.cpp:926 +#: gui/options.cpp:936 msgctxt "lowres" msgid "Text and Speech:" msgstr "Tekst og Tale:" -#: gui/options.cpp:930 +#: gui/options.cpp:940 msgid "Spch" msgstr "Tale" -#: gui/options.cpp:931 +#: gui/options.cpp:941 msgid "Subs" msgstr "Tekst" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgctxt "lowres" msgid "Both" msgstr "Begge" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgid "Show subtitles and play speech" msgstr "Vis undertekster, og spill av tale" -#: gui/options.cpp:934 +#: gui/options.cpp:944 msgctxt "lowres" msgid "Subtitle speed:" msgstr "Underteksthastighet:" -#: gui/options.cpp:950 +#: gui/options.cpp:960 msgid "Music volume:" msgstr "Musikkvolum:" -#: gui/options.cpp:952 +#: gui/options.cpp:962 msgctxt "lowres" msgid "Music volume:" msgstr "Musikkvolum:" -#: gui/options.cpp:959 +#: gui/options.cpp:969 msgid "Mute All" msgstr "Demp alle" -#: gui/options.cpp:962 +#: gui/options.cpp:972 msgid "SFX volume:" msgstr "Lydeffektvolum:" -#: gui/options.cpp:962 gui/options.cpp:964 gui/options.cpp:965 +#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975 msgid "Special sound effects volume" msgstr "Volum for spesielle lydeffekter" -#: gui/options.cpp:964 +#: gui/options.cpp:974 msgctxt "lowres" msgid "SFX volume:" msgstr "Lydeffektvolum:" -#: gui/options.cpp:972 +#: gui/options.cpp:982 msgid "Speech volume:" msgstr "Talevolum:" -#: gui/options.cpp:974 +#: gui/options.cpp:984 msgctxt "lowres" msgid "Speech volume:" msgstr "Talevolum:" -#: gui/options.cpp:1131 +#: gui/options.cpp:1141 msgid "Theme Path:" msgstr "Temasti:" -#: gui/options.cpp:1133 +#: gui/options.cpp:1143 msgctxt "lowres" msgid "Theme Path:" msgstr "Temasti:" -#: gui/options.cpp:1139 gui/options.cpp:1141 gui/options.cpp:1142 +#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "Velger sti for ytterligere data brukt av alle spill eller ScummVM" -#: gui/options.cpp:1148 +#: gui/options.cpp:1158 msgid "Plugins Path:" msgstr "Pluginsti:" -#: gui/options.cpp:1150 +#: gui/options.cpp:1160 msgctxt "lowres" msgid "Plugins Path:" msgstr "Pluginsti:" -#: gui/options.cpp:1159 +#: gui/options.cpp:1169 msgid "Misc" msgstr "Div" -#: gui/options.cpp:1161 +#: gui/options.cpp:1171 msgctxt "lowres" msgid "Misc" msgstr "Div" -#: gui/options.cpp:1163 +#: gui/options.cpp:1173 msgid "Theme:" msgstr "Tema:" -#: gui/options.cpp:1167 +#: gui/options.cpp:1177 msgid "GUI Renderer:" msgstr "GUI-tegner:" -#: gui/options.cpp:1179 +#: gui/options.cpp:1189 msgid "Autosave:" msgstr "Autolagre:" -#: gui/options.cpp:1181 +#: gui/options.cpp:1191 msgctxt "lowres" msgid "Autosave:" msgstr "Autolagre:" -#: gui/options.cpp:1189 +#: gui/options.cpp:1199 msgid "Keys" msgstr "Taster" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "GUI Language:" msgstr "GUI-språk:" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "Language of ScummVM GUI" msgstr "Språk i ScummVM-GUIet" -#: gui/options.cpp:1347 +#: gui/options.cpp:1365 msgid "You have to restart ScummVM before your changes will take effect." msgstr "Du må starte ScummVM på nytt for at endringene skal tre i kraft. " -#: gui/options.cpp:1360 +#: gui/options.cpp:1378 msgid "Select directory for savegames" msgstr "Velg mappe for lagrede spill" -#: gui/options.cpp:1367 +#: gui/options.cpp:1385 msgid "The chosen directory cannot be written to. Please select another one." msgstr "Den valgte mappen kan ikke skrives til. Vennligst velg en annen." -#: gui/options.cpp:1376 +#: gui/options.cpp:1394 msgid "Select directory for GUI themes" msgstr "Velg mappe for GUI-temaer" -#: gui/options.cpp:1386 +#: gui/options.cpp:1404 msgid "Select directory for extra files" msgstr "Velg mappe for ytterligere filer" -#: gui/options.cpp:1397 +#: gui/options.cpp:1415 msgid "Select directory for plugins" msgstr "Velg mappe for plugins" -#: gui/options.cpp:1450 +#: gui/options.cpp:1468 msgid "" "The theme you selected does not support your current language. If you want " "to use this theme you need to switch to another language first." @@ -923,74 +941,74 @@ msgstr "" "Temaet du valgte støtter ikke det aktive språket. Hvis du vil bruke dette " "temaet, må du bytte til et annet språk først." -#: gui/saveload-dialog.cpp:158 +#: gui/saveload-dialog.cpp:166 msgid "List view" msgstr "" -#: gui/saveload-dialog.cpp:159 +#: gui/saveload-dialog.cpp:167 msgid "Grid view" msgstr "" -#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 +#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358 msgid "No date saved" msgstr "Ingen dato lagret" -#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359 msgid "No time saved" msgstr "Ingen tid lagret" -#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 +#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360 msgid "No playtime saved" msgstr "Ingen spilltid lagret" -#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275 msgid "Delete" msgstr "Slett" -#: gui/saveload-dialog.cpp:266 +#: gui/saveload-dialog.cpp:274 msgid "Do you really want to delete this savegame?" msgstr "Vil du virkelig slette dette lagrede spillet?" -#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 +#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872 msgid "Date: " msgstr "Dato: " -#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 +#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878 msgid "Time: " msgstr "Tid: " -#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 +#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886 msgid "Playtime: " msgstr "Spilltid: " -#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 +#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494 msgid "Untitled savestate" msgstr "Ikke navngitt spilltilstand" -#: gui/saveload-dialog.cpp:517 +#: gui/saveload-dialog.cpp:546 msgid "Next" msgstr "" -#: gui/saveload-dialog.cpp:520 +#: gui/saveload-dialog.cpp:549 msgid "Prev" msgstr "" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 #, fuzzy msgid "New Save" msgstr "Lagre" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 #, fuzzy msgid "Create a new save game" msgstr "Klarte ikke å lagre spill." -#: gui/saveload-dialog.cpp:789 +#: gui/saveload-dialog.cpp:865 #, fuzzy msgid "Name: " msgstr "Navn:" -#: gui/saveload-dialog.cpp:861 +#: gui/saveload-dialog.cpp:937 #, c-format msgid "Enter a description for slot %d:" msgstr "" @@ -1028,35 +1046,35 @@ msgstr "Antialiased (16bpp)" msgid "Clear value" msgstr "Tøm verdi" -#: base/main.cpp:209 +#: base/main.cpp:210 #, c-format msgid "Engine does not support debug level '%s'" msgstr "Motoren støtter ikke debug-nivå '%s'" -#: base/main.cpp:287 +#: base/main.cpp:288 msgid "Menu" msgstr "Meny" -#: base/main.cpp:290 backends/platform/symbian/src/SymbianActions.cpp:45 +#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:45 #: backends/platform/wince/CEActionsSmartphone.cpp:46 msgid "Skip" msgstr "Hopp over" -#: base/main.cpp:293 backends/platform/symbian/src/SymbianActions.cpp:50 +#: base/main.cpp:294 backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:42 msgid "Pause" msgstr "Pause" -#: base/main.cpp:296 +#: base/main.cpp:297 msgid "Skip line" msgstr "Hopp over linje" -#: base/main.cpp:467 +#: base/main.cpp:468 msgid "Error running game:" msgstr "Problem ved kjøring av spill:" -#: base/main.cpp:491 +#: base/main.cpp:492 msgid "Could not find any engine capable of running the selected game" msgstr "Kunne ikke finne noen motor som kunne kjøre det valgte spillet" @@ -1172,13 +1190,16 @@ msgid "~R~eturn to Launcher" msgstr "~T~ilbake til oppstarter" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284 +#: engines/pegasus/pegasus.cpp:369 msgid "Save game:" msgstr "Lagret spill:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:369 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1207,12 +1228,12 @@ msgstr "" "grunnleggende informasjon og instruksjon om hvordan du får ytterligere hjelp." #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 -#: engines/mohawk/dialogs.cpp:174 +#: engines/mohawk/dialogs.cpp:170 msgid "~O~K" msgstr "~O~K" #: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 -#: engines/mohawk/dialogs.cpp:175 +#: engines/mohawk/dialogs.cpp:171 msgid "~C~ancel" msgstr "~A~vbryt" @@ -1220,23 +1241,23 @@ msgstr "~A~vbryt" msgid "~K~eys" msgstr "~T~aster" -#: engines/engine.cpp:235 +#: engines/engine.cpp:240 msgid "Could not initialize color format." msgstr "Kunne ikke initalisere fargeformat." -#: engines/engine.cpp:243 +#: engines/engine.cpp:248 msgid "Could not switch to video mode: '" msgstr "Kunne ikke veksle til videomodus: '" -#: engines/engine.cpp:252 +#: engines/engine.cpp:257 msgid "Could not apply aspect ratio setting." msgstr "Kunne ikke aktivere aspektrate-innstilling." -#: engines/engine.cpp:257 +#: engines/engine.cpp:262 msgid "Could not apply fullscreen setting." msgstr "Kunne ikke aktivere fullskjermsinnstilling." -#: engines/engine.cpp:357 +#: engines/engine.cpp:362 msgid "" "You appear to be playing this game directly\n" "from the CD. This is known to cause problems,\n" @@ -1250,7 +1271,7 @@ msgstr "" "datafilene til harddisken din istedet.\n" "Se README-filen for detaljer." -#: engines/engine.cpp:368 +#: engines/engine.cpp:373 msgid "" "This game has audio tracks in its disk. These\n" "tracks need to be ripped from the disk using\n" @@ -1259,14 +1280,14 @@ msgid "" "See the README file for details." msgstr "" -#: engines/engine.cpp:426 +#: engines/engine.cpp:431 #, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -#: engines/engine.cpp:439 +#: engines/engine.cpp:444 msgid "" "WARNING: The game you are about to start is not yet fully supported by " "ScummVM. As such, it is likely to be unstable, and any saves you make might " @@ -1276,28 +1297,51 @@ msgstr "" "Derfor er det sannsynlig at det vil være ustabilt, og det er ikke sikkert at " "lagrede spill vil fortsette å fungere i fremtidige versjoner av ScummVM." -#: engines/engine.cpp:442 +#: engines/engine.cpp:447 msgid "Start anyway" msgstr "Start allikevel" -#: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 -#: engines/sci/detection.cpp:390 +#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270 +#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393 +#: engines/toltecs/detection.cpp:173 msgid "Use original save/load screens" msgstr "Bruk originale lagre/laste-skjermer" -#: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 -#: engines/sci/detection.cpp:391 +#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271 +#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394 +#: engines/toltecs/detection.cpp:174 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "Bruk de originale lagre/laste-skjermene, istedenfor ScummVM-variantene" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore game:" msgstr "Gjennopprett spill:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore" msgstr "Gjenopprett" +#: engines/drascula/saveload.cpp:49 +#, fuzzy +msgid "" +"ScummVM found that you have old savefiles for Drascula that should be " +"converted.\n" +"The old save game format is no longer supported, so you will not be able to " +"load your games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" +msgstr "" +"ScummVM oppdaget at du har gamle lagrede spill for Broken Sword 1 som bør " +"konverteres.\n" +"Det gamle formatet for lagrede spill støttes ikke lengre, så du vil ikke " +"være i stand til å laste de lagrede spillene,\n" +"med mindre du konverterer dem.\n" +"Trykk OK for å konvertere dem nå, ellers vil du bli spurt igjen neste gang " +"du starter spillet." + #: engines/dreamweb/detection.cpp:57 msgid "Use bright palette mode" msgstr "Bruk lys palettmodus" @@ -1306,54 +1350,54 @@ msgstr "Bruk lys palettmodus" msgid "Display graphics using the game's bright palette" msgstr "Vis grafikk med spillets lyse palett" -#: engines/sci/detection.cpp:370 +#: engines/sci/detection.cpp:373 msgid "EGA undithering" msgstr "EGA av-dithering" -#: engines/sci/detection.cpp:371 +#: engines/sci/detection.cpp:374 msgid "Enable undithering in EGA games" msgstr "Aktiver av-dithering i EGA-spill" -#: engines/sci/detection.cpp:380 +#: engines/sci/detection.cpp:383 msgid "Prefer digital sound effects" msgstr "Foretrekk digitale lydeffekter" -#: engines/sci/detection.cpp:381 +#: engines/sci/detection.cpp:384 msgid "Prefer digital sound effects instead of synthesized ones" msgstr "Foretrekk digitale lydeffekter fremfor syntetiske" -#: engines/sci/detection.cpp:400 +#: engines/sci/detection.cpp:403 msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "Bruk IMF/Yamaha-FB-01 for MIDI-output" -#: engines/sci/detection.cpp:401 +#: engines/sci/detection.cpp:404 msgid "" "Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" -#: engines/sci/detection.cpp:411 +#: engines/sci/detection.cpp:414 msgid "Use CD audio" msgstr "Bruk CD-lyd" -#: engines/sci/detection.cpp:412 +#: engines/sci/detection.cpp:415 msgid "Use CD audio instead of in-game audio, if available" msgstr "Bruk CD-lyd istedenfor spillets lyd, hvis tilgjengelig" -#: engines/sci/detection.cpp:422 +#: engines/sci/detection.cpp:425 msgid "Use Windows cursors" msgstr "Bruk Windows-muspekere" -#: engines/sci/detection.cpp:423 +#: engines/sci/detection.cpp:426 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "Bruk Windows-muspekerene (mindre, og monokrome) isteden" -#: engines/sci/detection.cpp:433 +#: engines/sci/detection.cpp:436 msgid "Use silver cursors" msgstr "Bruk sølvmuspekere" -#: engines/sci/detection.cpp:434 +#: engines/sci/detection.cpp:437 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "" @@ -2006,14 +2050,14 @@ msgstr "Fly til høyre" msgid "Fly to lower right" msgstr "Fly til nedre høyre" -#: engines/scumm/scumm.cpp:1773 +#: engines/scumm/scumm.cpp:1776 #, c-format msgid "" "Native MIDI support requires the Roland Upgrade from LucasArts,\n" "but %s is missing. Using AdLib instead." msgstr "" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 +#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2024,7 +2068,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 +#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2035,7 +2079,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 +#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2046,7 +2090,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2512 +#: engines/scumm/scumm.cpp:2537 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2057,7 +2101,7 @@ msgstr "" "hovedmenyen og velg 'Maniac'-undermappa i Tentacle-mappa." #. I18N: Option for fast scene switching -#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171 +#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167 msgid "~Z~ip Mode Activated" msgstr "~Z~ipmodus aktivert" @@ -2078,11 +2122,11 @@ msgstr "Vi~s~ Kart" msgid "~M~ain Menu" msgstr "Hoved~m~eny" -#: engines/mohawk/dialogs.cpp:172 +#: engines/mohawk/dialogs.cpp:168 msgid "~W~ater Effect Enabled" msgstr "~V~anneffekt aktivert" -#: engines/agos/animation.cpp:560 +#: engines/agos/animation.cpp:557 #, c-format msgid "Cutscene file '%s' not found!" msgstr "" @@ -2100,6 +2144,15 @@ msgstr "Klarte ikke lagre spilltilstand fra fil." msgid "Failed to delete file." msgstr "Klarte ikke å slette fil." +#: engines/groovie/detection.cpp:312 +#, fuzzy +msgid "Fast movie speed" +msgstr "Rask modus" + +#: engines/groovie/detection.cpp:313 +msgid "Play movies at an increased speed" +msgstr "" + #: engines/groovie/script.cpp:420 msgid "Failed to save game" msgstr "Klarte ikke å lagre spill." @@ -2190,11 +2243,11 @@ msgstr "Skli mot Venstre" msgid "Slide Right" msgstr "Skli mot Høyre" -#: engines/kyra/lol.cpp:485 +#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2412 msgid "Turn Left" msgstr "Svin til Venstre" -#: engines/kyra/lol.cpp:486 +#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2413 msgid "Turn Right" msgstr "Sving til Høyre" @@ -2211,7 +2264,7 @@ msgstr "Valg" msgid "Choose Spell" msgstr "Velg" -#: engines/kyra/sound_midi.cpp:475 +#: engines/kyra/sound_midi.cpp:477 #, fuzzy msgid "" "You appear to be using a General MIDI device,\n" @@ -2257,25 +2310,25 @@ msgstr "Diskett-intro" msgid "Use the floppy version's intro (CD version only)" msgstr "Bruk diskettversjonens intro (Kun for CD-versjon)" -#: engines/sword1/animation.cpp:539 +#: engines/sword1/animation.cpp:519 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "" -#: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 +#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439 msgid "DXA cutscenes found but ScummVM has been built without zlib support" msgstr "" -#: engines/sword1/animation.cpp:570 engines/sword2/animation.cpp:465 +#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449 msgid "MPEG2 cutscenes are no longer supported" msgstr "" -#: engines/sword1/animation.cpp:576 engines/sword2/animation.cpp:473 +#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457 #, c-format msgid "Cutscene '%s' not found" msgstr "" -#: engines/sword1/control.cpp:863 +#: engines/sword1/control.cpp:865 msgid "" "ScummVM found that you have old savefiles for Broken Sword 1 that should be " "converted.\n" @@ -2291,20 +2344,20 @@ msgstr "" "være i stand til å laste de lagrede spillene,\n" "med mindre du konverterer dem.\n" "Trykk OK for å konvertere dem nå, ellers vil du bli spurt igjen neste gang " -"du starter spillet." +"du starter spillet.\n" -#: engines/sword1/control.cpp:1232 +#: engines/sword1/control.cpp:1234 #, c-format msgid "" "Target new save game already exists!\n" "Would you like to keep the old save game (%s) or the new one (%s)?\n" msgstr "" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the old one" msgstr "Behold den gamle" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the new one" msgstr "Behold den nye" @@ -2312,7 +2365,7 @@ msgstr "Behold den nye" msgid "This is the end of the Broken Sword 1 Demo" msgstr "Dette er slutten på Broken Sword 1-demoen" -#: engines/sword2/animation.cpp:435 +#: engines/sword2/animation.cpp:419 msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" @@ -2325,12 +2378,12 @@ msgstr "" msgid "Show labels for objects on mouse hover" msgstr "" -#: engines/teenagent/resources.cpp:68 +#: engines/teenagent/resources.cpp:94 msgid "" "You're missing the 'teenagent.dat' file. Get it from the ScummVM website" msgstr "" -#: engines/teenagent/resources.cpp:89 +#: engines/teenagent/resources.cpp:115 msgid "" "The teenagent.dat file is compressed and zlib hasn't been included in this " "executable. Please decompress it" @@ -2366,7 +2419,7 @@ msgstr "" "laste de lagrede spillene,\n" "med mindre du konverterer dem.\n" "Trykk OK for å konvertere dem nå, ellers vil du bli spurt igjen neste gang " -"du starter spillet." +"du starter spillet.\n" #: engines/parallaction/saveload.cpp:319 msgid "ScummVM successfully converted all your savefiles." @@ -2384,6 +2437,47 @@ msgstr "" "\n" "Vennligst rapporter dette til teamet." +#: engines/pegasus/pegasus.cpp:675 +msgid "Invalid save file name" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2410 +msgid "Up/Zoom In/Move Forward/Open Doors" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2411 +#, fuzzy +msgid "Down/Zoom Out" +msgstr "Zoom opp" + +#: engines/pegasus/pegasus.cpp:2414 +msgid "Display/Hide Inventory Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2415 +msgid "Display/Hide Biochip Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2416 +msgid "Action/Select" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2417 +msgid "Toggle Center Data Display" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2418 +msgid "Display/Hide Info Screen" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2419 +msgid "Display/Hide Pause Menu" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2420 +msgid "???" +msgstr "" + #: audio/fmopl.cpp:49 msgid "MAME OPL emulator" msgstr "MAME OPL emulator" @@ -2441,7 +2535,7 @@ msgstr "Ingen musikk" msgid "Amiga Audio Emulator" msgstr "Amiga Lydemulator" -#: audio/softsynth/adlib.cpp:1593 +#: audio/softsynth/adlib.cpp:2284 msgid "AdLib Emulator" msgstr "AdLib Emulator" @@ -2453,11 +2547,11 @@ msgstr "Apple II GS Emulator (IKKE IMPLEMENTERT)" msgid "C64 Audio Emulator" msgstr "C64 Lydemulator" -#: audio/softsynth/mt32.cpp:293 +#: audio/softsynth/mt32.cpp:205 msgid "Initializing MT-32 Emulator" msgstr "Initialiserer MT-32-Emulator" -#: audio/softsynth/mt32.cpp:512 +#: audio/softsynth/mt32.cpp:431 msgid "MT-32 Emulator" msgstr "MT-32 Emulator" @@ -2609,24 +2703,24 @@ msgstr "Midtklikk" msgid "Right Click" msgstr "Høyreklikk" -#: backends/platform/sdl/macosx/appmenu_osx.mm:78 +#: backends/platform/sdl/macosx/appmenu_osx.mm:77 msgid "Hide ScummVM" msgstr "Skjul ScummVM" -#: backends/platform/sdl/macosx/appmenu_osx.mm:83 +#: backends/platform/sdl/macosx/appmenu_osx.mm:82 msgid "Hide Others" msgstr "Skjul andre" -#: backends/platform/sdl/macosx/appmenu_osx.mm:88 +#: backends/platform/sdl/macosx/appmenu_osx.mm:87 msgid "Show All" msgstr "Vis alle" -#: backends/platform/sdl/macosx/appmenu_osx.mm:110 -#: backends/platform/sdl/macosx/appmenu_osx.mm:121 +#: backends/platform/sdl/macosx/appmenu_osx.mm:109 +#: backends/platform/sdl/macosx/appmenu_osx.mm:120 msgid "Window" msgstr "Vindu" -#: backends/platform/sdl/macosx/appmenu_osx.mm:115 +#: backends/platform/sdl/macosx/appmenu_osx.mm:114 msgid "Minimize" msgstr "Minimer" @@ -2640,12 +2734,12 @@ msgid "Normal (no scaling)" msgstr "Normal (ingen skalering)" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537 msgid "Enabled aspect ratio correction" msgstr "Aspekt-rate korrigering aktivert" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542 msgid "Disabled aspect ratio correction" msgstr "Aspekt-rate korrigering deaktivert" @@ -2654,7 +2748,7 @@ msgid "Active graphics filter:" msgstr "Aktivt grafikkfilter:" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481 msgid "Windowed mode" msgstr "Vindusmodus" @@ -2678,11 +2772,11 @@ msgstr "Nåværende videomodus" msgid "Current scale" msgstr "Nåværende skala" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:558 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562 msgid "Active filter mode: Linear" msgstr "Aktiv filtermodus: Linjær" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:560 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564 msgid "Active filter mode: Nearest" msgstr "Aktiv filtermodus: Nærmeste" @@ -3010,19 +3104,19 @@ msgstr "Vil du virkelig avslutte?" #: backends/events/gph/gph-events.cpp:386 #: backends/events/gph/gph-events.cpp:429 -#: backends/events/openpandora/op-events.cpp:139 +#: backends/events/openpandora/op-events.cpp:168 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "Touchskjerm 'Tapmodus' - Venstreklikk" #: backends/events/gph/gph-events.cpp:388 #: backends/events/gph/gph-events.cpp:431 -#: backends/events/openpandora/op-events.cpp:141 +#: backends/events/openpandora/op-events.cpp:170 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "Touchskjerm 'Tapmodus' - Høyreklikk" #: backends/events/gph/gph-events.cpp:390 #: backends/events/gph/gph-events.cpp:433 -#: backends/events/openpandora/op-events.cpp:143 +#: backends/events/openpandora/op-events.cpp:172 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "Touchskjerm 'Tapmodus' - Sveve (Ingen Klikk)" @@ -3042,7 +3136,12 @@ msgstr "Minimalt Volum" msgid "Decreasing Volume" msgstr "Senker volum" -#: backends/updates/macosx/macosx-updates.mm:65 +#: backends/events/openpandora/op-events.cpp:174 +#, fuzzy +msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)" +msgstr "Touchskjerm 'Tapmodus' - Sveve (Ingen Klikk)" + +#: backends/updates/macosx/macosx-updates.mm:67 msgid "Check for Updates..." msgstr "Sjekk for oppdateringer..." @@ -3078,6 +3177,9 @@ msgstr "Klikking aktivert" msgid "Clicking Disabled" msgstr "Klikking deaktivert" +#~ msgid "Enable Roland GS Mode" +#~ msgstr "Aktiver Roland GS-modus" + #~ msgid "Hercules Green" #~ msgstr "Hercules Grønn" diff --git a/po/nn_NO.po b/po/nn_NO.po index 1b78932a46..e65ef27eda 100644 --- a/po/nn_NO.po +++ b/po/nn_NO.po @@ -1,5 +1,5 @@ # Norwegian (Nynorsk) translation for ScummVM. -# Copyright (C) 2010-2012 ScummVM Team +# Copyright (C) 2010-2013 ScummVM Team # This file is distributed under the same license as the ScummVM package. # Einar Johan T. Sømåen <einarjohants@gmail.com>, 2010. # @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-08-12 14:57+0200\n" +"POT-Creation-Date: 2013-02-07 23:11+0000\n" "PO-Revision-Date: 2011-04-25 23:07+0100\n" "Last-Translator: Einar Johan T. Sømåen <einarjohants@gmail.com>\n" "Language-Team: somaen <einarjohants@gmail.com>\n" @@ -20,45 +20,55 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Poedit-Country: NORWAY\n" -#: gui/about.cpp:91 +#: gui/about.cpp:93 #, c-format msgid "(built on %s)" msgstr "(bygd den %s)" -#: gui/about.cpp:98 +#: gui/about.cpp:100 msgid "Features compiled in:" msgstr "Funksjonar innkompilert:" -#: gui/about.cpp:107 +#: gui/about.cpp:109 msgid "Available engines:" msgstr "Tilgjengelege motorar:" -#: gui/browser.cpp:66 +#: gui/browser.cpp:67 +#, fuzzy +msgid "Show hidden files" +msgstr "Vis / Skjul konsoll" + +#: gui/browser.cpp:67 +msgid "Show files marked with the hidden attribute" +msgstr "" + +#: gui/browser.cpp:71 msgid "Go up" msgstr "Gå tilbake" -#: gui/browser.cpp:66 gui/browser.cpp:68 +#: gui/browser.cpp:71 gui/browser.cpp:73 msgid "Go to previous directory level" msgstr "Gå til forrige mappenivå" -#: gui/browser.cpp:68 +#: gui/browser.cpp:73 msgctxt "lowres" msgid "Go up" msgstr "Gå tilbake" -#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 -#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 -#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 -#: gui/themebrowser.cpp:54 engines/engine.cpp:442 -#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 +#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238 +#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275 +#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919 +#: gui/themebrowser.cpp:54 engines/engine.cpp:447 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:190 +#: engines/sword1/control.cpp:867 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" msgstr "Avbryt" -#: gui/browser.cpp:70 gui/chooser.cpp:46 gui/themebrowser.cpp:55 +#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55 msgid "Choose" msgstr "Vel" @@ -73,15 +83,15 @@ msgstr "Steng" msgid "Mouse click" msgstr "Musklikk" -#: gui/gui-manager.cpp:122 base/main.cpp:300 +#: gui/gui-manager.cpp:122 base/main.cpp:301 msgid "Display keyboard" msgstr "Syn Tastatur" -#: gui/gui-manager.cpp:126 base/main.cpp:304 +#: gui/gui-manager.cpp:126 base/main.cpp:305 msgid "Remap keys" msgstr "Omkople tastar" -#: gui/gui-manager.cpp:129 base/main.cpp:307 +#: gui/gui-manager.cpp:129 base/main.cpp:308 #, fuzzy msgid "Toggle FullScreen" msgstr "Veksle fullskjerm" @@ -95,17 +105,18 @@ msgid "Map" msgstr "Kople" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 -#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 -#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 -#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 -#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 -#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 -#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 -#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 -#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 -#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 +#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239 +#: gui/saveload-dialog.cpp:920 engines/engine.cpp:366 engines/engine.cpp:377 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192 +#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558 +#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 +#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519 +#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550 +#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:867 +#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419 +#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449 +#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -178,8 +189,8 @@ msgstr "" "Spelets språk. Dette vil ikkje gjere den spanske versjonen av spelet til ein " "engelsk versjon" -#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:80 -#: gui/options.cpp:730 gui/options.cpp:743 gui/options.cpp:1199 +#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86 +#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209 #: audio/null.cpp:40 msgid "<default>" msgstr "<standard>" @@ -202,11 +213,11 @@ msgstr "Plattform:" msgid "Engine" msgstr "Undersøk" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "Graphics" msgstr "Grafikk" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "GFX" msgstr "GFX" @@ -219,7 +230,7 @@ msgctxt "lowres" msgid "Override global graphic settings" msgstr "Overstyr globale grafikkinstillingar" -#: gui/launcher.cpp:251 gui/options.cpp:1085 +#: gui/launcher.cpp:251 gui/options.cpp:1095 msgid "Audio" msgstr "Lyd" @@ -232,11 +243,11 @@ msgctxt "lowres" msgid "Override global audio settings" msgstr "Overstyr globale lydinstillingar" -#: gui/launcher.cpp:265 gui/options.cpp:1090 +#: gui/launcher.cpp:265 gui/options.cpp:1100 msgid "Volume" msgstr "Volum" -#: gui/launcher.cpp:267 gui/options.cpp:1092 +#: gui/launcher.cpp:267 gui/options.cpp:1102 msgctxt "lowres" msgid "Volume" msgstr "Volum" @@ -250,7 +261,7 @@ msgctxt "lowres" msgid "Override global volume settings" msgstr "Overstyr globale voluminstillingar" -#: gui/launcher.cpp:280 gui/options.cpp:1100 +#: gui/launcher.cpp:280 gui/options.cpp:1110 msgid "MIDI" msgstr "MIDI" @@ -263,7 +274,7 @@ msgctxt "lowres" msgid "Override global MIDI settings" msgstr "Overstyr globale MIDI-instillingar" -#: gui/launcher.cpp:294 gui/options.cpp:1106 +#: gui/launcher.cpp:294 gui/options.cpp:1116 msgid "MT-32" msgstr "MT-32" @@ -276,11 +287,11 @@ msgctxt "lowres" msgid "Override global MT-32 settings" msgstr "Overstyr globale MT-32-instillingar" -#: gui/launcher.cpp:308 gui/options.cpp:1113 +#: gui/launcher.cpp:308 gui/options.cpp:1123 msgid "Paths" msgstr "Stiar" -#: gui/launcher.cpp:310 gui/options.cpp:1115 +#: gui/launcher.cpp:310 gui/options.cpp:1125 msgctxt "lowres" msgid "Paths" msgstr "Stiar" @@ -294,7 +305,7 @@ msgctxt "lowres" msgid "Game Path:" msgstr "Spelsti:" -#: gui/launcher.cpp:324 gui/options.cpp:1139 +#: gui/launcher.cpp:324 gui/options.cpp:1149 msgid "Extra Path:" msgstr "Ekstrasti:" @@ -302,42 +313,42 @@ msgstr "Ekstrasti:" msgid "Specifies path to additional data used the game" msgstr "" -#: gui/launcher.cpp:326 gui/options.cpp:1141 +#: gui/launcher.cpp:326 gui/options.cpp:1151 msgctxt "lowres" msgid "Extra Path:" msgstr "Ekstrasti:" -#: gui/launcher.cpp:333 gui/options.cpp:1123 +#: gui/launcher.cpp:333 gui/options.cpp:1133 msgid "Save Path:" msgstr "Lagringssti:" #: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 -#: gui/options.cpp:1123 gui/options.cpp:1125 gui/options.cpp:1126 +#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136 msgid "Specifies where your savegames are put" msgstr "" -#: gui/launcher.cpp:335 gui/options.cpp:1125 +#: gui/launcher.cpp:335 gui/options.cpp:1135 msgctxt "lowres" msgid "Save Path:" msgstr "Lagringssti:" #: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 -#: gui/launcher.cpp:565 gui/options.cpp:1134 gui/options.cpp:1142 -#: gui/options.cpp:1151 gui/options.cpp:1258 gui/options.cpp:1264 -#: gui/options.cpp:1272 gui/options.cpp:1302 gui/options.cpp:1308 -#: gui/options.cpp:1315 gui/options.cpp:1408 gui/options.cpp:1411 -#: gui/options.cpp:1423 +#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152 +#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282 +#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326 +#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429 +#: gui/options.cpp:1441 msgctxt "path" msgid "None" msgstr "Ingen" #: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 -#: gui/options.cpp:1252 gui/options.cpp:1296 gui/options.cpp:1414 +#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Standard" -#: gui/launcher.cpp:504 gui/options.cpp:1417 +#: gui/launcher.cpp:504 gui/options.cpp:1435 msgid "Select SoundFont" msgstr "Vel SoundFont" @@ -361,7 +372,7 @@ msgstr "" msgid "~Q~uit" msgstr "~A~vslutt" -#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:96 +#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95 msgid "Quit ScummVM" msgstr "Avslutt ScummVM" @@ -369,7 +380,7 @@ msgstr "Avslutt ScummVM" msgid "A~b~out..." msgstr "~O~m..." -#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:70 +#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69 msgid "About ScummVM" msgstr "Om ScummVM" @@ -446,12 +457,14 @@ msgstr "Søk:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 +#: engines/pegasus/pegasus.cpp:345 msgid "Load game:" msgstr "Åpne spel:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:345 +#: backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Åpne" @@ -536,133 +549,133 @@ msgstr "Søkt i %d mappar ..." msgid "Discovered %d new games, ignored %d previously added games ..." msgstr "Oppdaga %d nye spel ..." -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "Never" msgstr "Aldri" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 5 mins" msgstr "kvart 5. min" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 10 mins" msgstr "kvart 10. min" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 15 mins" msgstr "kvart 15. min" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 30 mins" msgstr "kvart 30. min" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "8 kHz" msgstr "8 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "11kHz" msgstr "11kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "22 kHz" msgstr "22 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "44 kHz" msgstr "44 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:248 gui/options.cpp:474 gui/options.cpp:575 -#: gui/options.cpp:644 gui/options.cpp:852 +#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581 +#: gui/options.cpp:650 gui/options.cpp:858 msgctxt "soundfont" msgid "None" msgstr "Ingen" -#: gui/options.cpp:382 +#: gui/options.cpp:388 msgid "Failed to apply some of the graphic options changes:" msgstr "" -#: gui/options.cpp:394 +#: gui/options.cpp:400 msgid "the video mode could not be changed." msgstr "" -#: gui/options.cpp:400 +#: gui/options.cpp:406 msgid "the fullscreen setting could not be changed" msgstr "" -#: gui/options.cpp:406 +#: gui/options.cpp:412 msgid "the aspect ratio setting could not be changed" msgstr "" -#: gui/options.cpp:727 +#: gui/options.cpp:733 msgid "Graphics mode:" msgstr "Grafikkmodus:" -#: gui/options.cpp:741 +#: gui/options.cpp:747 msgid "Render mode:" msgstr "Teiknemodus:" -#: gui/options.cpp:741 gui/options.cpp:742 +#: gui/options.cpp:747 gui/options.cpp:748 msgid "Special dithering modes supported by some games" msgstr "Spesielle dithering-modus som støttast av nokre spel" -#: gui/options.cpp:753 +#: gui/options.cpp:759 #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476 msgid "Fullscreen mode" msgstr "Fullskjermsmodus" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Aspect ratio correction" msgstr "Aspekt-korrigering" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Correct aspect ratio for 320x200 games" msgstr "Rett opp aspekt for 320x200 spel" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Preferred Device:" msgstr "Føretrukken eining:" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Music Device:" msgstr "" -#: gui/options.cpp:764 gui/options.cpp:766 +#: gui/options.cpp:770 gui/options.cpp:772 msgid "Specifies preferred sound device or sound card emulator" msgstr "" -#: gui/options.cpp:764 gui/options.cpp:766 gui/options.cpp:767 +#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773 msgid "Specifies output sound device or sound card emulator" msgstr "" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Preferred Dev.:" msgstr "" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Music Device:" msgstr "" -#: gui/options.cpp:793 +#: gui/options.cpp:799 msgid "AdLib emulator:" msgstr "AdLib emulator:" -#: gui/options.cpp:793 gui/options.cpp:794 +#: gui/options.cpp:799 gui/options.cpp:800 msgid "AdLib is used for music in many games" msgstr "AdLib nyttast til musikk i mange spel" -#: gui/options.cpp:804 +#: gui/options.cpp:810 msgid "Output rate:" msgstr "" -#: gui/options.cpp:804 gui/options.cpp:805 +#: gui/options.cpp:810 gui/options.cpp:811 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -670,250 +683,255 @@ msgstr "" "Høgare verdier gir betre lydkvalitet, men støttast kanskje ikkje av " "lydkortet ditt" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "GM Device:" msgstr "" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "Specifies default sound device for General MIDI output" msgstr "" -#: gui/options.cpp:826 +#: gui/options.cpp:832 msgid "Don't use General MIDI music" msgstr "Ikkje nytt General MIDI musikk" -#: gui/options.cpp:837 gui/options.cpp:899 +#: gui/options.cpp:843 gui/options.cpp:909 msgid "Use first available device" msgstr "" -#: gui/options.cpp:849 +#: gui/options.cpp:855 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 +#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "SoundFont støttast av enkelte lydkort, Fluidsynth og Timidity" -#: gui/options.cpp:851 +#: gui/options.cpp:857 msgctxt "lowres" msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Mixed AdLib/MIDI mode" msgstr "Blanda AdLib/MIDI-modus" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Use both MIDI and AdLib sound generation" msgstr "Nytt båe MIDI og AdLib lydskaping" -#: gui/options.cpp:860 +#: gui/options.cpp:866 msgid "MIDI gain:" msgstr "MIDI gain:" -#: gui/options.cpp:870 +#: gui/options.cpp:873 +msgid "FluidSynth Settings" +msgstr "" + +#: gui/options.cpp:880 msgid "MT-32 Device:" msgstr "" -#: gui/options.cpp:870 +#: gui/options.cpp:880 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" -#: gui/options.cpp:875 +#: gui/options.cpp:885 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Ekte Roland MT-32 (deaktiver GM-emulering)" -#: gui/options.cpp:875 gui/options.cpp:877 +#: gui/options.cpp:885 gui/options.cpp:887 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" msgstr "" -#: gui/options.cpp:877 +#: gui/options.cpp:887 msgctxt "lowres" msgid "True Roland MT-32 (no GM emulation)" msgstr "Ekte Roland MT-32 (ingen GS-emulering)" -#: gui/options.cpp:880 -msgid "Enable Roland GS Mode" -msgstr "Aktiver Roland GS-modus" +#: gui/options.cpp:890 +#, fuzzy +msgid "Roland GS Mode (disable GM mapping)" +msgstr "Ekte Roland MT-32 (deaktiver GM-emulering)" -#: gui/options.cpp:880 +#: gui/options.cpp:890 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "Slår av General MIDI-kopling for spel med Roland MT-32 lydspor" -#: gui/options.cpp:889 +#: gui/options.cpp:899 msgid "Don't use Roland MT-32 music" msgstr "Ikkje nytt Roland MT-32 musikk" -#: gui/options.cpp:916 +#: gui/options.cpp:926 msgid "Text and Speech:" msgstr "Tekst og Tale:" -#: gui/options.cpp:920 gui/options.cpp:930 +#: gui/options.cpp:930 gui/options.cpp:940 msgid "Speech" msgstr "Tale" -#: gui/options.cpp:921 gui/options.cpp:931 +#: gui/options.cpp:931 gui/options.cpp:941 msgid "Subtitles" msgstr "Teksting" -#: gui/options.cpp:922 +#: gui/options.cpp:932 msgid "Both" msgstr "Begge" -#: gui/options.cpp:924 +#: gui/options.cpp:934 msgid "Subtitle speed:" msgstr "Undertekstfart:" -#: gui/options.cpp:926 +#: gui/options.cpp:936 msgctxt "lowres" msgid "Text and Speech:" msgstr "Tekst og Tale:" -#: gui/options.cpp:930 +#: gui/options.cpp:940 msgid "Spch" msgstr "Tale" -#: gui/options.cpp:931 +#: gui/options.cpp:941 msgid "Subs" msgstr "Tekst" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgctxt "lowres" msgid "Both" msgstr "Båe" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgid "Show subtitles and play speech" msgstr "Vis teksting og spel av tale" -#: gui/options.cpp:934 +#: gui/options.cpp:944 msgctxt "lowres" msgid "Subtitle speed:" msgstr "Undertekstfart:" -#: gui/options.cpp:950 +#: gui/options.cpp:960 msgid "Music volume:" msgstr "Musikkvolum:" -#: gui/options.cpp:952 +#: gui/options.cpp:962 msgctxt "lowres" msgid "Music volume:" msgstr "Musikkvolum:" -#: gui/options.cpp:959 +#: gui/options.cpp:969 msgid "Mute All" msgstr "Demp alle" -#: gui/options.cpp:962 +#: gui/options.cpp:972 msgid "SFX volume:" msgstr "Lydeffektvolum:" -#: gui/options.cpp:962 gui/options.cpp:964 gui/options.cpp:965 +#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975 msgid "Special sound effects volume" msgstr "" -#: gui/options.cpp:964 +#: gui/options.cpp:974 msgctxt "lowres" msgid "SFX volume:" msgstr "Lydeffektvolum:" -#: gui/options.cpp:972 +#: gui/options.cpp:982 msgid "Speech volume:" msgstr "Talevolum:" -#: gui/options.cpp:974 +#: gui/options.cpp:984 msgctxt "lowres" msgid "Speech volume:" msgstr "Talevolum:" -#: gui/options.cpp:1131 +#: gui/options.cpp:1141 msgid "Theme Path:" msgstr "Temasti:" -#: gui/options.cpp:1133 +#: gui/options.cpp:1143 msgctxt "lowres" msgid "Theme Path:" msgstr "Temasti:" -#: gui/options.cpp:1139 gui/options.cpp:1141 gui/options.cpp:1142 +#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" -#: gui/options.cpp:1148 +#: gui/options.cpp:1158 msgid "Plugins Path:" msgstr "Pluginsti:" -#: gui/options.cpp:1150 +#: gui/options.cpp:1160 msgctxt "lowres" msgid "Plugins Path:" msgstr "Pluginsti:" -#: gui/options.cpp:1159 +#: gui/options.cpp:1169 msgid "Misc" msgstr "Div" -#: gui/options.cpp:1161 +#: gui/options.cpp:1171 msgctxt "lowres" msgid "Misc" msgstr "Div" -#: gui/options.cpp:1163 +#: gui/options.cpp:1173 msgid "Theme:" msgstr "Tema:" -#: gui/options.cpp:1167 +#: gui/options.cpp:1177 msgid "GUI Renderer:" msgstr "GUI-teiknar:" -#: gui/options.cpp:1179 +#: gui/options.cpp:1189 msgid "Autosave:" msgstr "Autolagre:" -#: gui/options.cpp:1181 +#: gui/options.cpp:1191 msgctxt "lowres" msgid "Autosave:" msgstr "Autolagre:" -#: gui/options.cpp:1189 +#: gui/options.cpp:1199 msgid "Keys" msgstr "Tastar" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "GUI Language:" msgstr "GUI-språk:" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "Language of ScummVM GUI" msgstr "Språk i ScummVM-GUIet" -#: gui/options.cpp:1347 +#: gui/options.cpp:1365 #, fuzzy msgid "You have to restart ScummVM before your changes will take effect." msgstr "Du må omstarte ScummVM for at endringane skal skje." -#: gui/options.cpp:1360 +#: gui/options.cpp:1378 msgid "Select directory for savegames" msgstr "Vel mappe for lagra spel" -#: gui/options.cpp:1367 +#: gui/options.cpp:1385 msgid "The chosen directory cannot be written to. Please select another one." msgstr "Den velde mappa kan ikkje skrivast til. Vennlegst vel ein annan." -#: gui/options.cpp:1376 +#: gui/options.cpp:1394 msgid "Select directory for GUI themes" msgstr "Vel ei mappe for GUI-tema:" -#: gui/options.cpp:1386 +#: gui/options.cpp:1404 msgid "Select directory for extra files" msgstr "Vel ei mappe for ekstra filer" -#: gui/options.cpp:1397 +#: gui/options.cpp:1415 msgid "Select directory for plugins" msgstr "Vel ei mappe for plugins" -#: gui/options.cpp:1450 +#: gui/options.cpp:1468 msgid "" "The theme you selected does not support your current language. If you want " "to use this theme you need to switch to another language first." @@ -921,74 +939,74 @@ msgstr "" "Temaet du har valt støttar ikkje det aktive språket. Om du vil nytte dette " "temaet må du bytte til eit anna språk først." -#: gui/saveload-dialog.cpp:158 +#: gui/saveload-dialog.cpp:166 msgid "List view" msgstr "" -#: gui/saveload-dialog.cpp:159 +#: gui/saveload-dialog.cpp:167 msgid "Grid view" msgstr "" -#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 +#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358 msgid "No date saved" msgstr "Ingen dato lagra" -#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359 msgid "No time saved" msgstr "Inga tid lagra" -#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 +#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360 msgid "No playtime saved" msgstr "Inga speletid lagra" -#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275 msgid "Delete" msgstr "Slett" -#: gui/saveload-dialog.cpp:266 +#: gui/saveload-dialog.cpp:274 msgid "Do you really want to delete this savegame?" msgstr "Vil du verkeleg slette det lagra spelet?" -#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 +#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872 msgid "Date: " msgstr "Dato: " -#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 +#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878 msgid "Time: " msgstr "Tid: " -#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 +#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886 msgid "Playtime: " msgstr "Speletid: " -#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 +#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494 msgid "Untitled savestate" msgstr "Ikkje navngjeven speltilstand" -#: gui/saveload-dialog.cpp:517 +#: gui/saveload-dialog.cpp:546 msgid "Next" msgstr "" -#: gui/saveload-dialog.cpp:520 +#: gui/saveload-dialog.cpp:549 msgid "Prev" msgstr "" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 #, fuzzy msgid "New Save" msgstr "Lagre" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 #, fuzzy msgid "Create a new save game" msgstr "Full speltittel:" -#: gui/saveload-dialog.cpp:789 +#: gui/saveload-dialog.cpp:865 #, fuzzy msgid "Name: " msgstr "Namn:" -#: gui/saveload-dialog.cpp:861 +#: gui/saveload-dialog.cpp:937 #, c-format msgid "Enter a description for slot %d:" msgstr "" @@ -1026,35 +1044,35 @@ msgstr "Antialiased (16bpp)" msgid "Clear value" msgstr "Tøm verdi" -#: base/main.cpp:209 +#: base/main.cpp:210 #, c-format msgid "Engine does not support debug level '%s'" msgstr "Motoren støttar ikkje debug-nivå '%s'" -#: base/main.cpp:287 +#: base/main.cpp:288 msgid "Menu" msgstr "Meny" -#: base/main.cpp:290 backends/platform/symbian/src/SymbianActions.cpp:45 +#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:45 #: backends/platform/wince/CEActionsSmartphone.cpp:46 msgid "Skip" msgstr "Hopp over" -#: base/main.cpp:293 backends/platform/symbian/src/SymbianActions.cpp:50 +#: base/main.cpp:294 backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:42 msgid "Pause" msgstr "Pause" -#: base/main.cpp:296 +#: base/main.cpp:297 msgid "Skip line" msgstr "Hopp over linje" -#: base/main.cpp:467 +#: base/main.cpp:468 msgid "Error running game:" msgstr "Feil under køyring av spel:" -#: base/main.cpp:491 +#: base/main.cpp:492 msgid "Could not find any engine capable of running the selected game" msgstr "Kunne ikkje finne nokon motor som kunne køyre det velde spelet." @@ -1172,13 +1190,16 @@ msgid "~R~eturn to Launcher" msgstr "~T~ilbake til oppstarter" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284 +#: engines/pegasus/pegasus.cpp:369 msgid "Save game:" msgstr "Lagra spel:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:369 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1202,12 +1223,12 @@ msgid "" msgstr "" #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 -#: engines/mohawk/dialogs.cpp:174 +#: engines/mohawk/dialogs.cpp:170 msgid "~O~K" msgstr "~O~K" #: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 -#: engines/mohawk/dialogs.cpp:175 +#: engines/mohawk/dialogs.cpp:171 msgid "~C~ancel" msgstr "~A~vbryt" @@ -1215,25 +1236,25 @@ msgstr "~A~vbryt" msgid "~K~eys" msgstr "~T~astar" -#: engines/engine.cpp:235 +#: engines/engine.cpp:240 msgid "Could not initialize color format." msgstr "" -#: engines/engine.cpp:243 +#: engines/engine.cpp:248 #, fuzzy msgid "Could not switch to video mode: '" msgstr "Gjeldende videomodus:" -#: engines/engine.cpp:252 +#: engines/engine.cpp:257 #, fuzzy msgid "Could not apply aspect ratio setting." msgstr "Veksle aspekt-korrigering" -#: engines/engine.cpp:257 +#: engines/engine.cpp:262 msgid "Could not apply fullscreen setting." msgstr "" -#: engines/engine.cpp:357 +#: engines/engine.cpp:362 msgid "" "You appear to be playing this game directly\n" "from the CD. This is known to cause problems,\n" @@ -1242,7 +1263,7 @@ msgid "" "See the README file for details." msgstr "" -#: engines/engine.cpp:368 +#: engines/engine.cpp:373 msgid "" "This game has audio tracks in its disk. These\n" "tracks need to be ripped from the disk using\n" @@ -1251,42 +1272,57 @@ msgid "" "See the README file for details." msgstr "" -#: engines/engine.cpp:426 +#: engines/engine.cpp:431 #, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -#: engines/engine.cpp:439 +#: engines/engine.cpp:444 msgid "" "WARNING: The game you are about to start is not yet fully supported by " "ScummVM. As such, it is likely to be unstable, and any saves you make might " "not work in future versions of ScummVM." msgstr "" -#: engines/engine.cpp:442 +#: engines/engine.cpp:447 msgid "Start anyway" msgstr "" -#: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 -#: engines/sci/detection.cpp:390 +#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270 +#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393 +#: engines/toltecs/detection.cpp:173 msgid "Use original save/load screens" msgstr "" -#: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 -#: engines/sci/detection.cpp:391 +#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271 +#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394 +#: engines/toltecs/detection.cpp:174 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore game:" msgstr "Gjenopprett spel:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore" msgstr "Gjenopprett" +#: engines/drascula/saveload.cpp:49 +msgid "" +"ScummVM found that you have old savefiles for Drascula that should be " +"converted.\n" +"The old save game format is no longer supported, so you will not be able to " +"load your games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" +msgstr "" + #: engines/dreamweb/detection.cpp:57 #, fuzzy msgid "Use bright palette mode" @@ -1296,55 +1332,55 @@ msgstr "Øvre høgre gjenstand" msgid "Display graphics using the game's bright palette" msgstr "" -#: engines/sci/detection.cpp:370 +#: engines/sci/detection.cpp:373 msgid "EGA undithering" msgstr "" -#: engines/sci/detection.cpp:371 +#: engines/sci/detection.cpp:374 msgid "Enable undithering in EGA games" msgstr "" -#: engines/sci/detection.cpp:380 +#: engines/sci/detection.cpp:383 msgid "Prefer digital sound effects" msgstr "" -#: engines/sci/detection.cpp:381 +#: engines/sci/detection.cpp:384 msgid "Prefer digital sound effects instead of synthesized ones" msgstr "" -#: engines/sci/detection.cpp:400 +#: engines/sci/detection.cpp:403 msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "" -#: engines/sci/detection.cpp:401 +#: engines/sci/detection.cpp:404 msgid "" "Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" -#: engines/sci/detection.cpp:411 +#: engines/sci/detection.cpp:414 msgid "Use CD audio" msgstr "" -#: engines/sci/detection.cpp:412 +#: engines/sci/detection.cpp:415 msgid "Use CD audio instead of in-game audio, if available" msgstr "" -#: engines/sci/detection.cpp:422 +#: engines/sci/detection.cpp:425 msgid "Use Windows cursors" msgstr "" -#: engines/sci/detection.cpp:423 +#: engines/sci/detection.cpp:426 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "" -#: engines/sci/detection.cpp:433 +#: engines/sci/detection.cpp:436 #, fuzzy msgid "Use silver cursors" msgstr "Vanleg peikar" -#: engines/sci/detection.cpp:434 +#: engines/sci/detection.cpp:437 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "" @@ -2005,14 +2041,14 @@ msgstr "Fly til høgre" msgid "Fly to lower right" msgstr "Fly til nedre høgre" -#: engines/scumm/scumm.cpp:1773 +#: engines/scumm/scumm.cpp:1776 #, c-format msgid "" "Native MIDI support requires the Roland Upgrade from LucasArts,\n" "but %s is missing. Using AdLib instead." msgstr "" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 +#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2020,7 +2056,7 @@ msgid "" "%s" msgstr "" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 +#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2028,7 +2064,7 @@ msgid "" "%s" msgstr "" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 +#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2036,7 +2072,7 @@ msgid "" "%s" msgstr "" -#: engines/scumm/scumm.cpp:2512 +#: engines/scumm/scumm.cpp:2537 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2047,7 +2083,7 @@ msgstr "" "menyen og vel 'Maniac'-undermappa i 'Tentacle'-mappa." #. I18N: Option for fast scene switching -#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171 +#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167 msgid "~Z~ip Mode Activated" msgstr "~Z~ipmodus aktivert" @@ -2069,11 +2105,11 @@ msgstr "" msgid "~M~ain Menu" msgstr "ScummVM Hovudmeny" -#: engines/mohawk/dialogs.cpp:172 +#: engines/mohawk/dialogs.cpp:168 msgid "~W~ater Effect Enabled" msgstr "~V~anneffekt aktivert" -#: engines/agos/animation.cpp:560 +#: engines/agos/animation.cpp:557 #, c-format msgid "Cutscene file '%s' not found!" msgstr "" @@ -2091,6 +2127,15 @@ msgstr "" msgid "Failed to delete file." msgstr "" +#: engines/groovie/detection.cpp:312 +#, fuzzy +msgid "Fast movie speed" +msgstr "Rask modus" + +#: engines/groovie/detection.cpp:313 +msgid "Play movies at an increased speed" +msgstr "" + #: engines/groovie/script.cpp:420 #, fuzzy msgid "Failed to save game" @@ -2185,12 +2230,12 @@ msgstr "" msgid "Slide Right" msgstr "Høgre" -#: engines/kyra/lol.cpp:485 +#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2412 #, fuzzy msgid "Turn Left" msgstr "Slå av" -#: engines/kyra/lol.cpp:486 +#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2413 #, fuzzy msgid "Turn Right" msgstr "Peikar høgre" @@ -2210,7 +2255,7 @@ msgstr "~V~al" msgid "Choose Spell" msgstr "Vel" -#: engines/kyra/sound_midi.cpp:475 +#: engines/kyra/sound_midi.cpp:477 msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2247,25 +2292,25 @@ msgstr "" msgid "Use the floppy version's intro (CD version only)" msgstr "" -#: engines/sword1/animation.cpp:539 +#: engines/sword1/animation.cpp:519 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "" -#: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 +#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439 msgid "DXA cutscenes found but ScummVM has been built without zlib support" msgstr "" -#: engines/sword1/animation.cpp:570 engines/sword2/animation.cpp:465 +#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449 msgid "MPEG2 cutscenes are no longer supported" msgstr "" -#: engines/sword1/animation.cpp:576 engines/sword2/animation.cpp:473 +#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457 #, c-format msgid "Cutscene '%s' not found" msgstr "" -#: engines/sword1/control.cpp:863 +#: engines/sword1/control.cpp:865 msgid "" "ScummVM found that you have old savefiles for Broken Sword 1 that should be " "converted.\n" @@ -2276,18 +2321,18 @@ msgid "" "time you start the game.\n" msgstr "" -#: engines/sword1/control.cpp:1232 +#: engines/sword1/control.cpp:1234 #, c-format msgid "" "Target new save game already exists!\n" "Would you like to keep the old save game (%s) or the new one (%s)?\n" msgstr "" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the old one" msgstr "" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the new one" msgstr "" @@ -2295,7 +2340,7 @@ msgstr "" msgid "This is the end of the Broken Sword 1 Demo" msgstr "" -#: engines/sword2/animation.cpp:435 +#: engines/sword2/animation.cpp:419 msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" @@ -2308,12 +2353,12 @@ msgstr "" msgid "Show labels for objects on mouse hover" msgstr "" -#: engines/teenagent/resources.cpp:68 +#: engines/teenagent/resources.cpp:94 msgid "" "You're missing the 'teenagent.dat' file. Get it from the ScummVM website" msgstr "" -#: engines/teenagent/resources.cpp:89 +#: engines/teenagent/resources.cpp:115 msgid "" "The teenagent.dat file is compressed and zlib hasn't been included in this " "executable. Please decompress it" @@ -2358,6 +2403,47 @@ msgid "" "Please report to the team." msgstr "" +#: engines/pegasus/pegasus.cpp:675 +msgid "Invalid save file name" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2410 +msgid "Up/Zoom In/Move Forward/Open Doors" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2411 +#, fuzzy +msgid "Down/Zoom Out" +msgstr "Zoom opp" + +#: engines/pegasus/pegasus.cpp:2414 +msgid "Display/Hide Inventory Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2415 +msgid "Display/Hide Biochip Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2416 +msgid "Action/Select" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2417 +msgid "Toggle Center Data Display" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2418 +msgid "Display/Hide Info Screen" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2419 +msgid "Display/Hide Pause Menu" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2420 +msgid "???" +msgstr "" + #: audio/fmopl.cpp:49 msgid "MAME OPL emulator" msgstr "MAME OPL emulator" @@ -2407,7 +2493,7 @@ msgstr "Ingen musikk" msgid "Amiga Audio Emulator" msgstr "Amiga Lydemulator" -#: audio/softsynth/adlib.cpp:1593 +#: audio/softsynth/adlib.cpp:2284 msgid "AdLib Emulator" msgstr "AdLib Emulator" @@ -2419,12 +2505,12 @@ msgstr "Apple II GS Emulator (IKKJE IMPLEMENTERT)" msgid "C64 Audio Emulator" msgstr "C64 Lydemulator" -#: audio/softsynth/mt32.cpp:293 +#: audio/softsynth/mt32.cpp:205 #, fuzzy msgid "Initializing MT-32 Emulator" msgstr "Initialiserar MT-32-emulator" -#: audio/softsynth/mt32.cpp:512 +#: audio/softsynth/mt32.cpp:431 msgid "MT-32 Emulator" msgstr "MT-32 Emulator" @@ -2577,25 +2663,25 @@ msgstr "Midtre venstre gjenstand" msgid "Right Click" msgstr "Høgreklikk" -#: backends/platform/sdl/macosx/appmenu_osx.mm:78 +#: backends/platform/sdl/macosx/appmenu_osx.mm:77 #, fuzzy msgid "Hide ScummVM" msgstr "Avslutt ScummVM" -#: backends/platform/sdl/macosx/appmenu_osx.mm:83 +#: backends/platform/sdl/macosx/appmenu_osx.mm:82 msgid "Hide Others" msgstr "" -#: backends/platform/sdl/macosx/appmenu_osx.mm:88 +#: backends/platform/sdl/macosx/appmenu_osx.mm:87 msgid "Show All" msgstr "" -#: backends/platform/sdl/macosx/appmenu_osx.mm:110 -#: backends/platform/sdl/macosx/appmenu_osx.mm:121 +#: backends/platform/sdl/macosx/appmenu_osx.mm:109 +#: backends/platform/sdl/macosx/appmenu_osx.mm:120 msgid "Window" msgstr "" -#: backends/platform/sdl/macosx/appmenu_osx.mm:115 +#: backends/platform/sdl/macosx/appmenu_osx.mm:114 msgid "Minimize" msgstr "" @@ -2609,13 +2695,13 @@ msgid "Normal (no scaling)" msgstr "Normal (inga skalering)" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537 #, fuzzy msgid "Enabled aspect ratio correction" msgstr "Veksle aspekt-korrigering" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542 #, fuzzy msgid "Disabled aspect ratio correction" msgstr "Veksle aspekt-korrigering" @@ -2626,7 +2712,7 @@ msgid "Active graphics filter:" msgstr "Veksle grafikkfiltre" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481 #, fuzzy msgid "Windowed mode" msgstr "Teiknemodus:" @@ -2652,11 +2738,11 @@ msgstr "Gjeldende videomodus:" msgid "Current scale" msgstr "" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:558 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562 msgid "Active filter mode: Linear" msgstr "" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:560 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564 msgid "Active filter mode: Nearest" msgstr "" @@ -2986,19 +3072,19 @@ msgstr "Vil du avslutte?" #: backends/events/gph/gph-events.cpp:386 #: backends/events/gph/gph-events.cpp:429 -#: backends/events/openpandora/op-events.cpp:139 +#: backends/events/openpandora/op-events.cpp:168 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "" #: backends/events/gph/gph-events.cpp:388 #: backends/events/gph/gph-events.cpp:431 -#: backends/events/openpandora/op-events.cpp:141 +#: backends/events/openpandora/op-events.cpp:170 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "" #: backends/events/gph/gph-events.cpp:390 #: backends/events/gph/gph-events.cpp:433 -#: backends/events/openpandora/op-events.cpp:143 +#: backends/events/openpandora/op-events.cpp:172 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "" @@ -3020,7 +3106,11 @@ msgstr "Volum" msgid "Decreasing Volume" msgstr "" -#: backends/updates/macosx/macosx-updates.mm:65 +#: backends/events/openpandora/op-events.cpp:174 +msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)" +msgstr "" + +#: backends/updates/macosx/macosx-updates.mm:67 msgid "Check for Updates..." msgstr "" @@ -3060,6 +3150,9 @@ msgstr "" msgid "Clicking Disabled" msgstr "" +#~ msgid "Enable Roland GS Mode" +#~ msgstr "Aktiver Roland GS-modus" + #~ msgid "Hercules Green" #~ msgstr "Hercules Grønn" diff --git a/po/pl_PL.po b/po/pl_PL.po index 1bf44d1a66..706f298ec9 100644 --- a/po/pl_PL.po +++ b/po/pl_PL.po @@ -1,13 +1,13 @@ # Polish translation for ScummVM. -# Copyright (C) 2010-2012 ScummVM Team +# Copyright (C) 2010-2013 ScummVM Team # This file is distributed under the same license as the ScummVM package. -# Grajpopolsku.pl <grajpopolsku@gmail.com>, 2011-2012. +# Grajpopolsku.pl <grajpopolsku@gmail.com>, 2011-2013. # msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-08-12 14:57+0200\n" +"POT-Creation-Date: 2013-02-07 23:11+0000\n" "PO-Revision-Date: 2012-07-29 15:49+0100\n" "Last-Translator: Micha³ Zi±bkowski <mziab@o2.pl>\n" "Language-Team: Grajpopolsku.pl <grajpopolsku@gmail.com>\n" @@ -20,45 +20,55 @@ msgstr "" "X-Poedit-Language: Polish\n" "X-Poedit-Country: POLAND\n" -#: gui/about.cpp:91 +#: gui/about.cpp:93 #, c-format msgid "(built on %s)" msgstr "(skompilowany %s)" -#: gui/about.cpp:98 +#: gui/about.cpp:100 msgid "Features compiled in:" msgstr "Wkompilowane funkcje:" -#: gui/about.cpp:107 +#: gui/about.cpp:109 msgid "Available engines:" msgstr "Dostêpne silniki:" -#: gui/browser.cpp:66 +#: gui/browser.cpp:67 +#, fuzzy +msgid "Show hidden files" +msgstr "Schowaj / poka¿ konsolê" + +#: gui/browser.cpp:67 +msgid "Show files marked with the hidden attribute" +msgstr "" + +#: gui/browser.cpp:71 msgid "Go up" msgstr "W górê" -#: gui/browser.cpp:66 gui/browser.cpp:68 +#: gui/browser.cpp:71 gui/browser.cpp:73 msgid "Go to previous directory level" msgstr "Przejd¼ do poprzedniego katalogu" -#: gui/browser.cpp:68 +#: gui/browser.cpp:73 msgctxt "lowres" msgid "Go up" msgstr "W górê" -#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 -#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 -#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 -#: gui/themebrowser.cpp:54 engines/engine.cpp:442 -#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 +#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238 +#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275 +#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919 +#: gui/themebrowser.cpp:54 engines/engine.cpp:447 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:190 +#: engines/sword1/control.cpp:867 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" msgstr "Anuluj" -#: gui/browser.cpp:70 gui/chooser.cpp:46 gui/themebrowser.cpp:55 +#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55 msgid "Choose" msgstr "Wybierz" @@ -73,15 +83,15 @@ msgstr "Zamknij" msgid "Mouse click" msgstr "Klikniêcie" -#: gui/gui-manager.cpp:122 base/main.cpp:300 +#: gui/gui-manager.cpp:122 base/main.cpp:301 msgid "Display keyboard" msgstr "Wy¶wietl klawiaturê" -#: gui/gui-manager.cpp:126 base/main.cpp:304 +#: gui/gui-manager.cpp:126 base/main.cpp:305 msgid "Remap keys" msgstr "Dostosuj klawisze" -#: gui/gui-manager.cpp:129 base/main.cpp:307 +#: gui/gui-manager.cpp:129 base/main.cpp:308 msgid "Toggle FullScreen" msgstr "W³±cz/wy³±cz pe³ny ekran" @@ -94,17 +104,18 @@ msgid "Map" msgstr "Przypisz" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 -#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 -#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 -#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 -#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 -#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 -#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 -#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 -#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 -#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 +#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239 +#: gui/saveload-dialog.cpp:920 engines/engine.cpp:366 engines/engine.cpp:377 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192 +#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558 +#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 +#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519 +#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550 +#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:867 +#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419 +#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449 +#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -175,8 +186,8 @@ msgid "" "English" msgstr "Jêzyk gry. Nie zmieni to hiszpañskiej wersji gry w angielsk±." -#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:80 -#: gui/options.cpp:730 gui/options.cpp:743 gui/options.cpp:1199 +#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86 +#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209 #: audio/null.cpp:40 msgid "<default>" msgstr "<domy¶lne>" @@ -198,11 +209,11 @@ msgstr "Platforma:" msgid "Engine" msgstr "Silnik" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "Graphics" msgstr "Grafika" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "GFX" msgstr "Grafika" @@ -215,7 +226,7 @@ msgctxt "lowres" msgid "Override global graphic settings" msgstr "U¿yj w³asnych ustawieñ grafiki" -#: gui/launcher.cpp:251 gui/options.cpp:1085 +#: gui/launcher.cpp:251 gui/options.cpp:1095 msgid "Audio" msgstr "D¼wiêk" @@ -228,11 +239,11 @@ msgctxt "lowres" msgid "Override global audio settings" msgstr "U¿yj w³asnych ustawieñ d¼wiêku" -#: gui/launcher.cpp:265 gui/options.cpp:1090 +#: gui/launcher.cpp:265 gui/options.cpp:1100 msgid "Volume" msgstr "G³o¶no¶æ" -#: gui/launcher.cpp:267 gui/options.cpp:1092 +#: gui/launcher.cpp:267 gui/options.cpp:1102 msgctxt "lowres" msgid "Volume" msgstr "G³o¶no¶æ" @@ -246,7 +257,7 @@ msgctxt "lowres" msgid "Override global volume settings" msgstr "U¿yj w³asnych ustawieñ g³o¶no¶ci" -#: gui/launcher.cpp:280 gui/options.cpp:1100 +#: gui/launcher.cpp:280 gui/options.cpp:1110 msgid "MIDI" msgstr "MIDI" @@ -259,7 +270,7 @@ msgctxt "lowres" msgid "Override global MIDI settings" msgstr "U¿yj w³asnych ustawieñ MIDI" -#: gui/launcher.cpp:294 gui/options.cpp:1106 +#: gui/launcher.cpp:294 gui/options.cpp:1116 msgid "MT-32" msgstr "MT-32" @@ -272,11 +283,11 @@ msgctxt "lowres" msgid "Override global MT-32 settings" msgstr "U¿yj w³asnych ustawieñ MT-32" -#: gui/launcher.cpp:308 gui/options.cpp:1113 +#: gui/launcher.cpp:308 gui/options.cpp:1123 msgid "Paths" msgstr "¦cie¿ki" -#: gui/launcher.cpp:310 gui/options.cpp:1115 +#: gui/launcher.cpp:310 gui/options.cpp:1125 msgctxt "lowres" msgid "Paths" msgstr "¦cie¿ki" @@ -290,7 +301,7 @@ msgctxt "lowres" msgid "Game Path:" msgstr "¦cie¿ka gry:" -#: gui/launcher.cpp:324 gui/options.cpp:1139 +#: gui/launcher.cpp:324 gui/options.cpp:1149 msgid "Extra Path:" msgstr "¦c. dodatków:" @@ -298,42 +309,42 @@ msgstr "¦c. dodatków:" msgid "Specifies path to additional data used the game" msgstr "Okre¶la ¶cie¿kê dodatkowych danych gry" -#: gui/launcher.cpp:326 gui/options.cpp:1141 +#: gui/launcher.cpp:326 gui/options.cpp:1151 msgctxt "lowres" msgid "Extra Path:" msgstr "¦c. dodatków:" -#: gui/launcher.cpp:333 gui/options.cpp:1123 +#: gui/launcher.cpp:333 gui/options.cpp:1133 msgid "Save Path:" msgstr "¦cie¿ka zapisów:" #: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 -#: gui/options.cpp:1123 gui/options.cpp:1125 gui/options.cpp:1126 +#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136 msgid "Specifies where your savegames are put" msgstr "Okre¶la gdzie zapisywaæ stan gry" -#: gui/launcher.cpp:335 gui/options.cpp:1125 +#: gui/launcher.cpp:335 gui/options.cpp:1135 msgctxt "lowres" msgid "Save Path:" msgstr "¦cie¿ka zapisów:" #: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 -#: gui/launcher.cpp:565 gui/options.cpp:1134 gui/options.cpp:1142 -#: gui/options.cpp:1151 gui/options.cpp:1258 gui/options.cpp:1264 -#: gui/options.cpp:1272 gui/options.cpp:1302 gui/options.cpp:1308 -#: gui/options.cpp:1315 gui/options.cpp:1408 gui/options.cpp:1411 -#: gui/options.cpp:1423 +#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152 +#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282 +#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326 +#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429 +#: gui/options.cpp:1441 msgctxt "path" msgid "None" msgstr "Brak" #: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 -#: gui/options.cpp:1252 gui/options.cpp:1296 gui/options.cpp:1414 +#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Domy¶lnie" -#: gui/launcher.cpp:504 gui/options.cpp:1417 +#: gui/launcher.cpp:504 gui/options.cpp:1435 msgid "Select SoundFont" msgstr "Wybierz SoundFont" @@ -357,7 +368,7 @@ msgstr "Identyfikator jest ju¿ zajêty. Wybierz inny." msgid "~Q~uit" msgstr "~Z~akoñcz" -#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:96 +#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95 msgid "Quit ScummVM" msgstr "Zakoñcz ScummVM" @@ -365,7 +376,7 @@ msgstr "Zakoñcz ScummVM" msgid "A~b~out..." msgstr "I~n~formacje..." -#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:70 +#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69 msgid "About ScummVM" msgstr "Ksi±¿ka ScummVM" @@ -442,12 +453,14 @@ msgstr "Szukaj" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 +#: engines/pegasus/pegasus.cpp:345 msgid "Load game:" msgstr "Wczytaj grê:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:345 +#: backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Wczytaj" @@ -531,133 +544,133 @@ msgstr "Przeskanowano %d katalogów ..." msgid "Discovered %d new games, ignored %d previously added games ..." msgstr "Wykryto %d nowych gier, zignorowano %d poprzednio dodanych..." -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "Never" msgstr "Nigdy" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 5 mins" msgstr "co 5 min" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 10 mins" msgstr "co 10 min" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 15 mins" msgstr "co 15 min" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 30 mins" msgstr "co 30 min" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "8 kHz" msgstr "8 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "11kHz" msgstr "11 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "22 kHz" msgstr "22 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "44 kHz" msgstr "44 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:248 gui/options.cpp:474 gui/options.cpp:575 -#: gui/options.cpp:644 gui/options.cpp:852 +#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581 +#: gui/options.cpp:650 gui/options.cpp:858 msgctxt "soundfont" msgid "None" msgstr "Brak" -#: gui/options.cpp:382 +#: gui/options.cpp:388 msgid "Failed to apply some of the graphic options changes:" msgstr "Nie uda³o siê zastosowaæ czê¶ci zmian opcji grafiki:" -#: gui/options.cpp:394 +#: gui/options.cpp:400 msgid "the video mode could not be changed." msgstr "nie uda³o siê zmieniæ trybu wideo." -#: gui/options.cpp:400 +#: gui/options.cpp:406 msgid "the fullscreen setting could not be changed" msgstr "nie uda³o siê zmieniæ trybu pe³noekranowego" -#: gui/options.cpp:406 +#: gui/options.cpp:412 msgid "the aspect ratio setting could not be changed" msgstr "nie uda³o siê zmieniæ formatu obrazu" -#: gui/options.cpp:727 +#: gui/options.cpp:733 msgid "Graphics mode:" msgstr "Tryb grafiki:" -#: gui/options.cpp:741 +#: gui/options.cpp:747 msgid "Render mode:" msgstr "Renderer:" -#: gui/options.cpp:741 gui/options.cpp:742 +#: gui/options.cpp:747 gui/options.cpp:748 msgid "Special dithering modes supported by some games" msgstr "Specjalne tryby ditheringu wspierane przez niektóre gry" -#: gui/options.cpp:753 +#: gui/options.cpp:759 #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476 msgid "Fullscreen mode" msgstr "Pe³ny ekran" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Aspect ratio correction" msgstr "Korekcja formatu obrazu" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Correct aspect ratio for 320x200 games" msgstr "Korekcja formatu obrazu dla gier 320x200" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Preferred Device:" msgstr "Pref. urz±dzenie:" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Music Device:" msgstr "Urz. muzyczne:" -#: gui/options.cpp:764 gui/options.cpp:766 +#: gui/options.cpp:770 gui/options.cpp:772 msgid "Specifies preferred sound device or sound card emulator" msgstr "Okre¶la preferowane urz±dzenie d¼wiêkowe lub emulator karty d¼wiêkowej" -#: gui/options.cpp:764 gui/options.cpp:766 gui/options.cpp:767 +#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773 msgid "Specifies output sound device or sound card emulator" msgstr "Okre¶la wyj¶ciowe urz±dzenie d¼wiêkowe lub emulator karty d¼wiêkowej" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Preferred Dev.:" msgstr "Pref. urz±dzenie:" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Music Device:" msgstr "Urz. muzyczne:" -#: gui/options.cpp:793 +#: gui/options.cpp:799 msgid "AdLib emulator:" msgstr "Emulator AdLib:" -#: gui/options.cpp:793 gui/options.cpp:794 +#: gui/options.cpp:799 gui/options.cpp:800 msgid "AdLib is used for music in many games" msgstr "AdLib jest u¿ywany do muzyki w wielu grach" -#: gui/options.cpp:804 +#: gui/options.cpp:810 msgid "Output rate:" msgstr "Czêst. wyj.:" -#: gui/options.cpp:804 gui/options.cpp:805 +#: gui/options.cpp:810 gui/options.cpp:811 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -665,63 +678,67 @@ msgstr "" "Wy¿sze warto¶ci daj± lepsz± jako¶æ d¼wiêku, ale mog± byæ nieobs³ugiwane " "przez twoj± kartê d¼wiêkow±" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "GM Device:" msgstr "Urz±dzenie GM:" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "Specifies default sound device for General MIDI output" msgstr "Okre¶la domy¶lne urz±dzenie d¼wiêkowe dla wyj¶cia General MIDI" -#: gui/options.cpp:826 +#: gui/options.cpp:832 msgid "Don't use General MIDI music" msgstr "Nie u¿ywaj muzyki General MIDI" -#: gui/options.cpp:837 gui/options.cpp:899 +#: gui/options.cpp:843 gui/options.cpp:909 msgid "Use first available device" msgstr "U¿yj pierwszego dostêpnego urz±dzenia" -#: gui/options.cpp:849 +#: gui/options.cpp:855 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 +#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "SoundFont jest wspierany przez niektóre karty d¼wiêkowe, Fluidsynth i " "Timidity" -#: gui/options.cpp:851 +#: gui/options.cpp:857 msgctxt "lowres" msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Mixed AdLib/MIDI mode" msgstr "Tryb miksowanego AdLib/MIDI" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Use both MIDI and AdLib sound generation" msgstr "U¿ywaj obu generatorów d¼wiêku, MIDI i AdLib, jednocze¶nie" -#: gui/options.cpp:860 +#: gui/options.cpp:866 msgid "MIDI gain:" msgstr "Wzm. MIDI:" -#: gui/options.cpp:870 +#: gui/options.cpp:873 +msgid "FluidSynth Settings" +msgstr "" + +#: gui/options.cpp:880 msgid "MT-32 Device:" msgstr "Urz±dzenie MT-32:" -#: gui/options.cpp:870 +#: gui/options.cpp:880 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" "Okre¶la domy¶lne urz±dzenie d¼wiêku dla wyj¶cia Roland MT-32/LAPC1/CM32l/CM64" -#: gui/options.cpp:875 +#: gui/options.cpp:885 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Prawdziwy Roland MT-32 (wy³±cz emulacjê GM)" -#: gui/options.cpp:875 gui/options.cpp:877 +#: gui/options.cpp:885 gui/options.cpp:887 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -729,191 +746,192 @@ msgstr "" "Zaznacz, je¶li chcesz u¿ywaæ swojej prawdziwej karty kompatybilnej z Roland " "pod³±czonej do twojego komputera" -#: gui/options.cpp:877 +#: gui/options.cpp:887 msgctxt "lowres" msgid "True Roland MT-32 (no GM emulation)" msgstr "Prawdziwy Roland MT-32 (brak emulacji GM)" -#: gui/options.cpp:880 -msgid "Enable Roland GS Mode" -msgstr "W³±cz tryb Roland GS" +#: gui/options.cpp:890 +#, fuzzy +msgid "Roland GS Mode (disable GM mapping)" +msgstr "Prawdziwy Roland MT-32 (wy³±cz emulacjê GM)" -#: gui/options.cpp:880 +#: gui/options.cpp:890 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "Wy³±cza mapowanie General MIDI dla gier ze ¶cie¿k± d¼wiêkow± Roland MT-32" -#: gui/options.cpp:889 +#: gui/options.cpp:899 msgid "Don't use Roland MT-32 music" msgstr "Nie u¿ywaj muzyki Roland MT-32" -#: gui/options.cpp:916 +#: gui/options.cpp:926 msgid "Text and Speech:" msgstr "Tekst i mowa:" -#: gui/options.cpp:920 gui/options.cpp:930 +#: gui/options.cpp:930 gui/options.cpp:940 msgid "Speech" msgstr "Mowa" -#: gui/options.cpp:921 gui/options.cpp:931 +#: gui/options.cpp:931 gui/options.cpp:941 msgid "Subtitles" msgstr "Napisy" -#: gui/options.cpp:922 +#: gui/options.cpp:932 msgid "Both" msgstr "Oba" -#: gui/options.cpp:924 +#: gui/options.cpp:934 msgid "Subtitle speed:" msgstr "Prêd. napisów:" -#: gui/options.cpp:926 +#: gui/options.cpp:936 msgctxt "lowres" msgid "Text and Speech:" msgstr "Tekst i mowa:" -#: gui/options.cpp:930 +#: gui/options.cpp:940 msgid "Spch" msgstr "Mowa" -#: gui/options.cpp:931 +#: gui/options.cpp:941 msgid "Subs" msgstr "Napisy" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgctxt "lowres" msgid "Both" msgstr "Oba" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgid "Show subtitles and play speech" msgstr "Wy¶wietlaj napisy i odtwarzaj mowê" -#: gui/options.cpp:934 +#: gui/options.cpp:944 msgctxt "lowres" msgid "Subtitle speed:" msgstr "Prêd. napisów:" -#: gui/options.cpp:950 +#: gui/options.cpp:960 msgid "Music volume:" msgstr "G³o¶no¶æ muzyki:" -#: gui/options.cpp:952 +#: gui/options.cpp:962 msgctxt "lowres" msgid "Music volume:" msgstr "G³o¶no¶æ muzyki:" -#: gui/options.cpp:959 +#: gui/options.cpp:969 msgid "Mute All" msgstr "Wycisz" -#: gui/options.cpp:962 +#: gui/options.cpp:972 msgid "SFX volume:" msgstr "G³. efekt. d¼w.:" -#: gui/options.cpp:962 gui/options.cpp:964 gui/options.cpp:965 +#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975 msgid "Special sound effects volume" msgstr "G³o¶no¶æ efektów d¼w." -#: gui/options.cpp:964 +#: gui/options.cpp:974 msgctxt "lowres" msgid "SFX volume:" msgstr "G³. efekt. d¼w.:" -#: gui/options.cpp:972 +#: gui/options.cpp:982 msgid "Speech volume:" msgstr "G³o¶no¶æ mowy:" -#: gui/options.cpp:974 +#: gui/options.cpp:984 msgctxt "lowres" msgid "Speech volume:" msgstr "G³o¶no¶æ mowy:" -#: gui/options.cpp:1131 +#: gui/options.cpp:1141 msgid "Theme Path:" msgstr "¦cie¿ka stylu:" -#: gui/options.cpp:1133 +#: gui/options.cpp:1143 msgctxt "lowres" msgid "Theme Path:" msgstr "¦cie¿ka stylu:" -#: gui/options.cpp:1139 gui/options.cpp:1141 gui/options.cpp:1142 +#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "Okre¶la ¶cie¿kê dla dodatkowych danych dla wszystkich gier lub ScummVM" -#: gui/options.cpp:1148 +#: gui/options.cpp:1158 msgid "Plugins Path:" msgstr "¦cie¿ka wtyczek:" -#: gui/options.cpp:1150 +#: gui/options.cpp:1160 msgctxt "lowres" msgid "Plugins Path:" msgstr "¦cie¿ka wtyczek:" -#: gui/options.cpp:1159 +#: gui/options.cpp:1169 msgid "Misc" msgstr "Ró¿ne" -#: gui/options.cpp:1161 +#: gui/options.cpp:1171 msgctxt "lowres" msgid "Misc" msgstr "Ró¿ne" -#: gui/options.cpp:1163 +#: gui/options.cpp:1173 msgid "Theme:" msgstr "Styl:" -#: gui/options.cpp:1167 +#: gui/options.cpp:1177 msgid "GUI Renderer:" msgstr "Renderer interf.:" -#: gui/options.cpp:1179 +#: gui/options.cpp:1189 msgid "Autosave:" msgstr "Autozapis:" -#: gui/options.cpp:1181 +#: gui/options.cpp:1191 msgctxt "lowres" msgid "Autosave:" msgstr "Autozapis:" -#: gui/options.cpp:1189 +#: gui/options.cpp:1199 msgid "Keys" msgstr "Klawisze" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "GUI Language:" msgstr "Jêzyk interfejsu:" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "Language of ScummVM GUI" msgstr "Jêzyk interfejsu ScummVM" -#: gui/options.cpp:1347 +#: gui/options.cpp:1365 msgid "You have to restart ScummVM before your changes will take effect." msgstr "Musisz zrestartowaæ ScummVM, by zmiany zosta³y uwzglêdnione." -#: gui/options.cpp:1360 +#: gui/options.cpp:1378 msgid "Select directory for savegames" msgstr "Wybierz katalog zapisów" -#: gui/options.cpp:1367 +#: gui/options.cpp:1385 msgid "The chosen directory cannot be written to. Please select another one." msgstr "Ten katalog jest zabezpieczony przed zapisem. Wybierz inny." -#: gui/options.cpp:1376 +#: gui/options.cpp:1394 msgid "Select directory for GUI themes" msgstr "Wybierz katalog dla stylów GUI." -#: gui/options.cpp:1386 +#: gui/options.cpp:1404 msgid "Select directory for extra files" msgstr "Wybierz katalog dla dodatkowych plików" -#: gui/options.cpp:1397 +#: gui/options.cpp:1415 msgid "Select directory for plugins" msgstr "Wybierz katalog dla wtyczek" -#: gui/options.cpp:1450 +#: gui/options.cpp:1468 msgid "" "The theme you selected does not support your current language. If you want " "to use this theme you need to switch to another language first." @@ -921,74 +939,74 @@ msgstr "" "Wybrany styl nie obs³uguje obecnego jêzyka. Je¶li chcesz go u¿ywaæ, zmieñ " "najpierw swój jêzyk." -#: gui/saveload-dialog.cpp:158 +#: gui/saveload-dialog.cpp:166 msgid "List view" msgstr "" -#: gui/saveload-dialog.cpp:159 +#: gui/saveload-dialog.cpp:167 msgid "Grid view" msgstr "" -#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 +#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358 msgid "No date saved" msgstr "Brak daty" -#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359 msgid "No time saved" msgstr "Brak godziny" -#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 +#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360 msgid "No playtime saved" msgstr "Brak czasu gry" -#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275 msgid "Delete" msgstr "Skasuj" -#: gui/saveload-dialog.cpp:266 +#: gui/saveload-dialog.cpp:274 msgid "Do you really want to delete this savegame?" msgstr "Na pewno chcesz skasowaæ ten zapis?" -#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 +#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872 msgid "Date: " msgstr "Data: " -#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 +#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878 msgid "Time: " msgstr "Czas: " -#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 +#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886 msgid "Playtime: " msgstr "Czas gry: " -#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 +#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494 msgid "Untitled savestate" msgstr "Zapis bez nazwy" -#: gui/saveload-dialog.cpp:517 +#: gui/saveload-dialog.cpp:546 msgid "Next" msgstr "" -#: gui/saveload-dialog.cpp:520 +#: gui/saveload-dialog.cpp:549 msgid "Prev" msgstr "" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 #, fuzzy msgid "New Save" msgstr "Zapisz" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 #, fuzzy msgid "Create a new save game" msgstr "Nie uda³o siê zapisaæ stanu gry" -#: gui/saveload-dialog.cpp:789 +#: gui/saveload-dialog.cpp:865 #, fuzzy msgid "Name: " msgstr "Nazwa:" -#: gui/saveload-dialog.cpp:861 +#: gui/saveload-dialog.cpp:937 #, c-format msgid "Enter a description for slot %d:" msgstr "" @@ -1026,35 +1044,35 @@ msgstr "Wyg³adzany (16bpp)" msgid "Clear value" msgstr "Wyczy¶æ" -#: base/main.cpp:209 +#: base/main.cpp:210 #, c-format msgid "Engine does not support debug level '%s'" msgstr "Silnik nie wspiera poziomu debugowania '%s'" -#: base/main.cpp:287 +#: base/main.cpp:288 msgid "Menu" msgstr "Menu" -#: base/main.cpp:290 backends/platform/symbian/src/SymbianActions.cpp:45 +#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:45 #: backends/platform/wince/CEActionsSmartphone.cpp:46 msgid "Skip" msgstr "Pomiñ" -#: base/main.cpp:293 backends/platform/symbian/src/SymbianActions.cpp:50 +#: base/main.cpp:294 backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:42 msgid "Pause" msgstr "Wstrzymaj" -#: base/main.cpp:296 +#: base/main.cpp:297 msgid "Skip line" msgstr "Pomiñ liniê" -#: base/main.cpp:467 +#: base/main.cpp:468 msgid "Error running game:" msgstr "B³±d podczas uruchamiania gry:" -#: base/main.cpp:491 +#: base/main.cpp:492 msgid "Could not find any engine capable of running the selected game" msgstr "Nie uda³o siê znale¼æ silnika zdolnego do uruchomienia zaznaczonej gry" @@ -1169,13 +1187,16 @@ msgid "~R~eturn to Launcher" msgstr "~P~owrót do launchera" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284 +#: engines/pegasus/pegasus.cpp:369 msgid "Save game:" msgstr "Zapis:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:369 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1204,12 +1225,12 @@ msgstr "" "dowiedzieæ jak szukaæ dalszej pomocy, sprawd¼ plik README." #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 -#: engines/mohawk/dialogs.cpp:174 +#: engines/mohawk/dialogs.cpp:170 msgid "~O~K" msgstr "" #: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 -#: engines/mohawk/dialogs.cpp:175 +#: engines/mohawk/dialogs.cpp:171 msgid "~C~ancel" msgstr "~A~nuluj" @@ -1217,23 +1238,23 @@ msgstr "~A~nuluj" msgid "~K~eys" msgstr "~K~lawisze" -#: engines/engine.cpp:235 +#: engines/engine.cpp:240 msgid "Could not initialize color format." msgstr "Nie uda³o siê zainicjalizowaæ formatu kolorów." -#: engines/engine.cpp:243 +#: engines/engine.cpp:248 msgid "Could not switch to video mode: '" msgstr "Nie uda³o siê prze³±czyæ w tryb wideo: '" -#: engines/engine.cpp:252 +#: engines/engine.cpp:257 msgid "Could not apply aspect ratio setting." msgstr "Nie uda³o siê zastosowaæ ustawienia formatu obrazu." -#: engines/engine.cpp:257 +#: engines/engine.cpp:262 msgid "Could not apply fullscreen setting." msgstr "Nie uda³o siê zastosowaæ ustawienia pe³nego ekranu." -#: engines/engine.cpp:357 +#: engines/engine.cpp:362 msgid "" "You appear to be playing this game directly\n" "from the CD. This is known to cause problems,\n" @@ -1245,7 +1266,7 @@ msgstr "" "znane problemów. St±d zalecane jest skopiowanie plików gry na twardy dysk.\n" "Dalsze informacje s± dostêpne w pliku README." -#: engines/engine.cpp:368 +#: engines/engine.cpp:373 msgid "" "This game has audio tracks in its disk. These\n" "tracks need to be ripped from the disk using\n" @@ -1257,7 +1278,7 @@ msgstr "" "skopiowaæ na dysk za pomoc± odpowiedniego rippera CD audio.\n" "Dalsze informacje s± dostêpne w pliku README." -#: engines/engine.cpp:426 +#: engines/engine.cpp:431 #, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " @@ -1266,7 +1287,7 @@ msgstr "" "Odczyt stanu gry nie powiód³ siê (%s)! Aby uzyskaæ podstawowe informacje " "oraz dowiedzieæ jak szukaæ dalszej pomocy, sprawd¼ plik README." -#: engines/engine.cpp:439 +#: engines/engine.cpp:444 msgid "" "WARNING: The game you are about to start is not yet fully supported by " "ScummVM. As such, it is likely to be unstable, and any saves you make might " @@ -1276,28 +1297,51 @@ msgstr "" "ScummVM. W zwi±zku z tym mo¿e byæ ona niestabilna, a wszelkie zapisy, " "których dokonasz, mog± byæ nieobs³ugiwane w przysz³ych wersjach ScummVM." -#: engines/engine.cpp:442 +#: engines/engine.cpp:447 msgid "Start anyway" msgstr "W³±cz mimo tego" -#: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 -#: engines/sci/detection.cpp:390 +#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270 +#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393 +#: engines/toltecs/detection.cpp:173 msgid "Use original save/load screens" msgstr "U¿yj oryginalnych ekranów odczytu/zapisu" -#: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 -#: engines/sci/detection.cpp:391 +#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271 +#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394 +#: engines/toltecs/detection.cpp:174 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "U¿yj oryginalnych ekranów odczytu/zapisu zamiast tych ze ScummVM" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore game:" msgstr "Wznów grê:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore" msgstr "Wznów" +#: engines/drascula/saveload.cpp:49 +#, fuzzy +msgid "" +"ScummVM found that you have old savefiles for Drascula that should be " +"converted.\n" +"The old save game format is no longer supported, so you will not be able to " +"load your games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" +msgstr "" +"ScummVM znalaz³ stare zapisy z Broken Sword 1, które nale¿y " +"przekonwertowaæ.\n" +"Stary format zapisu nie jest ju¿ obs³ugiwany. Nie bêdziesz móg³ wczytaæ " +"zapisów, je¶li ich nie przekonwertujesz.\n" +"\n" +"Naci¶nij OK, ¿eby je teraz przekonwertowaæ. W przeciwnym wypadku zostaniesz " +"zapytany ponownie przy nastêpnym w³±czeniu gry.\n" + #: engines/dreamweb/detection.cpp:57 msgid "Use bright palette mode" msgstr "U¿yj trybu jasnej palety" @@ -1306,27 +1350,27 @@ msgstr "U¿yj trybu jasnej palety" msgid "Display graphics using the game's bright palette" msgstr "Wy¶wietlaj grafikê za pomoc± jasnej palety gry" -#: engines/sci/detection.cpp:370 +#: engines/sci/detection.cpp:373 msgid "EGA undithering" msgstr "Anty-dithering EGA" -#: engines/sci/detection.cpp:371 +#: engines/sci/detection.cpp:374 msgid "Enable undithering in EGA games" msgstr "W³±cz anty-dithering we wspieranych grach EGA" -#: engines/sci/detection.cpp:380 +#: engines/sci/detection.cpp:383 msgid "Prefer digital sound effects" msgstr "Preferuj cyfrowe efekty d¼wiêkowe" -#: engines/sci/detection.cpp:381 +#: engines/sci/detection.cpp:384 msgid "Prefer digital sound effects instead of synthesized ones" msgstr "Preferuj cyfrowe efekty d¼wiêkowe zamiast syntezowanych" -#: engines/sci/detection.cpp:400 +#: engines/sci/detection.cpp:403 msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "U¿yj IMF/Yamaha FB-01 dla wyj¶cia MIDI" -#: engines/sci/detection.cpp:401 +#: engines/sci/detection.cpp:404 msgid "" "Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" @@ -1334,29 +1378,29 @@ msgstr "" "U¿yj karty IBM Music Feature lub modu³u syntezy FM Yamaha FB-01 dla wyj¶cia " "MIDI" -#: engines/sci/detection.cpp:411 +#: engines/sci/detection.cpp:414 msgid "Use CD audio" msgstr "U¿yj CD audio" -#: engines/sci/detection.cpp:412 +#: engines/sci/detection.cpp:415 msgid "Use CD audio instead of in-game audio, if available" msgstr "U¿yj CD audio zamiast muzyki w grze, je¶li jest dostêpne" -#: engines/sci/detection.cpp:422 +#: engines/sci/detection.cpp:425 msgid "Use Windows cursors" msgstr "U¿yj windowsowych kursorów" -#: engines/sci/detection.cpp:423 +#: engines/sci/detection.cpp:426 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "" "U¿yj windowsowych kursorów (mniejsze i monochromatyczne) zamiast DOS-owych" -#: engines/sci/detection.cpp:433 +#: engines/sci/detection.cpp:436 msgid "Use silver cursors" msgstr "U¿yj srebrnych kursorów" -#: engines/sci/detection.cpp:434 +#: engines/sci/detection.cpp:437 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "" @@ -2009,7 +2053,7 @@ msgstr "Leæ w prawo" msgid "Fly to lower right" msgstr "Leæ w dó³, w prawo" -#: engines/scumm/scumm.cpp:1773 +#: engines/scumm/scumm.cpp:1776 #, c-format msgid "" "Native MIDI support requires the Roland Upgrade from LucasArts,\n" @@ -2018,7 +2062,7 @@ msgstr "" "Natywne wsparcie MIDI wymaga aktualizacji Rolanda od LucasArts,\n" "ale brakuje %s. Prze³±czam na tryb AdLib." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 +#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2029,7 +2073,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 +#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2040,7 +2084,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 +#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2051,7 +2095,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2512 +#: engines/scumm/scumm.cpp:2537 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2062,7 +2106,7 @@ msgstr "" "ScummVM i wybierz podkatalog \"Maniac\" z katalogu gry Tentacle." #. I18N: Option for fast scene switching -#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171 +#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167 msgid "~Z~ip Mode Activated" msgstr "~T~ryb turbo aktywny" @@ -2083,11 +2127,11 @@ msgstr "~P~oka¿ mapê" msgid "~M~ain Menu" msgstr "~M~enu g³ówne" -#: engines/mohawk/dialogs.cpp:172 +#: engines/mohawk/dialogs.cpp:168 msgid "~W~ater Effect Enabled" msgstr "~E~fekty wody w³±czone" -#: engines/agos/animation.cpp:560 +#: engines/agos/animation.cpp:557 #, c-format msgid "Cutscene file '%s' not found!" msgstr "Nie znaleziono pliku przerywnika '%s'!" @@ -2105,6 +2149,15 @@ msgstr "Nie uda³o siê zapisaæ stanu gry do pliku." msgid "Failed to delete file." msgstr "Nie uda³o siê usun±æ pliku." +#: engines/groovie/detection.cpp:312 +#, fuzzy +msgid "Fast movie speed" +msgstr "Tryb szybki" + +#: engines/groovie/detection.cpp:313 +msgid "Play movies at an increased speed" +msgstr "" + #: engines/groovie/script.cpp:420 msgid "Failed to save game" msgstr "Nie uda³o siê zapisaæ stanu gry" @@ -2195,11 +2248,11 @@ msgstr "¦lizg w lewo" msgid "Slide Right" msgstr "¦lizg w prawo" -#: engines/kyra/lol.cpp:485 +#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2412 msgid "Turn Left" msgstr "Obrót w lewo" -#: engines/kyra/lol.cpp:486 +#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2413 msgid "Turn Right" msgstr "Obrót w prawo" @@ -2215,7 +2268,7 @@ msgstr "Opcje" msgid "Choose Spell" msgstr "Wybierz zaklêcie" -#: engines/kyra/sound_midi.cpp:475 +#: engines/kyra/sound_midi.cpp:477 msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2261,29 +2314,29 @@ msgstr "Intro z wersji dyskietkowej" msgid "Use the floppy version's intro (CD version only)" msgstr "U¿yj intra z wersji dyskietkowej (tylko dla wersji CD)" -#: engines/sword1/animation.cpp:539 +#: engines/sword1/animation.cpp:519 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "" "Przerywnik w formacie strumieniowym PSX '%s' nie mo¿e zostaæ odtworzony w " "trybie indeksowanym" -#: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 +#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439 msgid "DXA cutscenes found but ScummVM has been built without zlib support" msgstr "" "Znaleziono przerywniki w formacie DXA, ale ScummVM jest skompilowany bez " "obs³ugi zlib" -#: engines/sword1/animation.cpp:570 engines/sword2/animation.cpp:465 +#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449 msgid "MPEG2 cutscenes are no longer supported" msgstr "Przerywniki w formacie MPEG2 nie s± ju¿ obs³ugiwane" -#: engines/sword1/animation.cpp:576 engines/sword2/animation.cpp:473 +#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457 #, c-format msgid "Cutscene '%s' not found" msgstr "Nie znaleziono przerywnika '%s'" -#: engines/sword1/control.cpp:863 +#: engines/sword1/control.cpp:865 msgid "" "ScummVM found that you have old savefiles for Broken Sword 1 that should be " "converted.\n" @@ -2301,7 +2354,7 @@ msgstr "" "Naci¶nij OK, ¿eby je teraz przekonwertowaæ. W przeciwnym wypadku zostaniesz " "zapytany ponownie przy nastêpnym w³±czeniu gry.\n" -#: engines/sword1/control.cpp:1232 +#: engines/sword1/control.cpp:1234 #, c-format msgid "" "Target new save game already exists!\n" @@ -2310,11 +2363,11 @@ msgstr "" "Docelowy plik nowego zapisu ju¿ istnieje!\n" "Chcesz zachowaæ stary zapis (%s) czy nowy (%s)?\n" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the old one" msgstr "Zachowaj stary" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the new one" msgstr "Zachowaj nowy" @@ -2322,7 +2375,7 @@ msgstr "Zachowaj nowy" msgid "This is the end of the Broken Sword 1 Demo" msgstr "To koniec dema Broken Sword 1" -#: engines/sword2/animation.cpp:435 +#: engines/sword2/animation.cpp:419 msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" @@ -2337,12 +2390,12 @@ msgstr "Poka¿ etykiety obiektów" msgid "Show labels for objects on mouse hover" msgstr "Poka¿ etykiety obiektów przy najechaniu myszk±" -#: engines/teenagent/resources.cpp:68 +#: engines/teenagent/resources.cpp:94 msgid "" "You're missing the 'teenagent.dat' file. Get it from the ScummVM website" msgstr "" -#: engines/teenagent/resources.cpp:89 +#: engines/teenagent/resources.cpp:115 msgid "" "The teenagent.dat file is compressed and zlib hasn't been included in this " "executable. Please decompress it" @@ -2397,6 +2450,47 @@ msgstr "" "\n" "Prosimy o zg³oszenie tego zespo³owi." +#: engines/pegasus/pegasus.cpp:675 +msgid "Invalid save file name" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2410 +msgid "Up/Zoom In/Move Forward/Open Doors" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2411 +#, fuzzy +msgid "Down/Zoom Out" +msgstr "Przybli¿" + +#: engines/pegasus/pegasus.cpp:2414 +msgid "Display/Hide Inventory Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2415 +msgid "Display/Hide Biochip Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2416 +msgid "Action/Select" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2417 +msgid "Toggle Center Data Display" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2418 +msgid "Display/Hide Info Screen" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2419 +msgid "Display/Hide Pause Menu" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2420 +msgid "???" +msgstr "" + #: audio/fmopl.cpp:49 msgid "MAME OPL emulator" msgstr "Emulator OPL MAME" @@ -2454,7 +2548,7 @@ msgstr "Brak muzyki" msgid "Amiga Audio Emulator" msgstr "Emulator d¼wiêku Amigi" -#: audio/softsynth/adlib.cpp:1593 +#: audio/softsynth/adlib.cpp:2284 msgid "AdLib Emulator" msgstr "Emulator AdLib" @@ -2466,11 +2560,11 @@ msgstr "Emulator Apple II GS (NIE ZAIMPLEMENTOWANY)" msgid "C64 Audio Emulator" msgstr "Emulator d¼wiêku C64" -#: audio/softsynth/mt32.cpp:293 +#: audio/softsynth/mt32.cpp:205 msgid "Initializing MT-32 Emulator" msgstr "Inicjalizacja emulatora MT-32" -#: audio/softsynth/mt32.cpp:512 +#: audio/softsynth/mt32.cpp:431 msgid "MT-32 Emulator" msgstr "Emulator MT-32" @@ -2621,24 +2715,24 @@ msgstr "¦rodkowy przycisk" msgid "Right Click" msgstr "Klikniêcie PPM" -#: backends/platform/sdl/macosx/appmenu_osx.mm:78 +#: backends/platform/sdl/macosx/appmenu_osx.mm:77 msgid "Hide ScummVM" msgstr "Ukryj ScummVM" -#: backends/platform/sdl/macosx/appmenu_osx.mm:83 +#: backends/platform/sdl/macosx/appmenu_osx.mm:82 msgid "Hide Others" msgstr "Ukryj pozosta³e" -#: backends/platform/sdl/macosx/appmenu_osx.mm:88 +#: backends/platform/sdl/macosx/appmenu_osx.mm:87 msgid "Show All" msgstr "Poka¿ wszystkie" -#: backends/platform/sdl/macosx/appmenu_osx.mm:110 -#: backends/platform/sdl/macosx/appmenu_osx.mm:121 +#: backends/platform/sdl/macosx/appmenu_osx.mm:109 +#: backends/platform/sdl/macosx/appmenu_osx.mm:120 msgid "Window" msgstr "Okno" -#: backends/platform/sdl/macosx/appmenu_osx.mm:115 +#: backends/platform/sdl/macosx/appmenu_osx.mm:114 msgid "Minimize" msgstr "Miniaturka" @@ -2652,12 +2746,12 @@ msgid "Normal (no scaling)" msgstr "Zwyk³y (bez skalowania)" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537 msgid "Enabled aspect ratio correction" msgstr "W³±czono korekcjê formatu obrazu" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542 msgid "Disabled aspect ratio correction" msgstr "Wy³±czono korekcjê formatu obrazu" @@ -2666,7 +2760,7 @@ msgid "Active graphics filter:" msgstr "Aktywny filtr graficzny:" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481 msgid "Windowed mode" msgstr "Okno" @@ -2690,11 +2784,11 @@ msgstr "Obecny tryb wideo" msgid "Current scale" msgstr "Aktualne powiêkszenie" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:558 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562 msgid "Active filter mode: Linear" msgstr "Aktywny tryb filtru: dwuliniowy" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:560 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564 msgid "Active filter mode: Nearest" msgstr "Aktywny tryb filtru: najbli¿szy s±siad" @@ -3018,19 +3112,19 @@ msgstr "Na pewno chcesz wyj¶æ?" #: backends/events/gph/gph-events.cpp:386 #: backends/events/gph/gph-events.cpp:429 -#: backends/events/openpandora/op-events.cpp:139 +#: backends/events/openpandora/op-events.cpp:168 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "Dotkniêcie ekranu - klikniêcie LPM" #: backends/events/gph/gph-events.cpp:388 #: backends/events/gph/gph-events.cpp:431 -#: backends/events/openpandora/op-events.cpp:141 +#: backends/events/openpandora/op-events.cpp:170 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "Dotkniêcie ekranu - klikniêcie PPM" #: backends/events/gph/gph-events.cpp:390 #: backends/events/gph/gph-events.cpp:433 -#: backends/events/openpandora/op-events.cpp:143 +#: backends/events/openpandora/op-events.cpp:172 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "Dotkniêcie ekranu - brak klikniêcia" @@ -3050,7 +3144,12 @@ msgstr "Minimalna g³o¶no¶æ" msgid "Decreasing Volume" msgstr "Zmniejszenie g³o¶no¶ci" -#: backends/updates/macosx/macosx-updates.mm:65 +#: backends/events/openpandora/op-events.cpp:174 +#, fuzzy +msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)" +msgstr "Dotkniêcie ekranu - brak klikniêcia" + +#: backends/updates/macosx/macosx-updates.mm:67 msgid "Check for Updates..." msgstr "Sprawd¼ aktualizacjê..." @@ -3086,6 +3185,9 @@ msgstr "Klikanie w³±czone" msgid "Clicking Disabled" msgstr "Klikanie wy³±czone" +#~ msgid "Enable Roland GS Mode" +#~ msgstr "W³±cz tryb Roland GS" + #~ msgid "Hercules Green" #~ msgstr "Zielony Hercules" diff --git a/po/pt_BR.po b/po/pt_BR.po index f41aa7d59f..77263dc02c 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -1,5 +1,5 @@ # Portuguese (Brazilian) translation for ScummVM. -# Copyright (C) 2010-2012 ScummVM Team +# Copyright (C) 2010-2013 ScummVM Team # This file is distributed under the same license as the ScummVM package. # Saulo Benigno <saulobenigno@gmail.com>, 2010. # @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-08-12 14:57+0200\n" +"POT-Creation-Date: 2013-02-07 23:11+0000\n" "PO-Revision-Date: 2011-10-21 21:30-0300\n" "Last-Translator: Saulo Benigno <saulobenigno@gmail.com>\n" "Language-Team: ScummBR (www.scummbr.com) <scummbr@yahoo.com.br>\n" @@ -20,45 +20,55 @@ msgstr "" "X-Poedit-Country: BRAZIL\n" "X-Poedit-SourceCharset: iso-8859-1\n" -#: gui/about.cpp:91 +#: gui/about.cpp:93 #, c-format msgid "(built on %s)" msgstr "(desenvolvido em %s)" -#: gui/about.cpp:98 +#: gui/about.cpp:100 msgid "Features compiled in:" msgstr "Funções compiladas em:" -#: gui/about.cpp:107 +#: gui/about.cpp:109 msgid "Available engines:" msgstr "Programas disponíveis:" -#: gui/browser.cpp:66 +#: gui/browser.cpp:67 +#, fuzzy +msgid "Show hidden files" +msgstr "Mostrar / Ocultar console" + +#: gui/browser.cpp:67 +msgid "Show files marked with the hidden attribute" +msgstr "" + +#: gui/browser.cpp:71 msgid "Go up" msgstr "Acima" -#: gui/browser.cpp:66 gui/browser.cpp:68 +#: gui/browser.cpp:71 gui/browser.cpp:73 msgid "Go to previous directory level" msgstr "Ir para o diretório anterior" -#: gui/browser.cpp:68 +#: gui/browser.cpp:73 msgctxt "lowres" msgid "Go up" msgstr "Acima" -#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 -#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 -#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 -#: gui/themebrowser.cpp:54 engines/engine.cpp:442 -#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 +#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238 +#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275 +#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919 +#: gui/themebrowser.cpp:54 engines/engine.cpp:447 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:190 +#: engines/sword1/control.cpp:867 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" msgstr "Cancelar" -#: gui/browser.cpp:70 gui/chooser.cpp:46 gui/themebrowser.cpp:55 +#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55 msgid "Choose" msgstr "Escolher" @@ -73,15 +83,15 @@ msgstr "Fechar" msgid "Mouse click" msgstr "Clique do mouse" -#: gui/gui-manager.cpp:122 base/main.cpp:300 +#: gui/gui-manager.cpp:122 base/main.cpp:301 msgid "Display keyboard" msgstr "Mostrar teclado" -#: gui/gui-manager.cpp:126 base/main.cpp:304 +#: gui/gui-manager.cpp:126 base/main.cpp:305 msgid "Remap keys" msgstr "Remapear teclas" -#: gui/gui-manager.cpp:129 base/main.cpp:307 +#: gui/gui-manager.cpp:129 base/main.cpp:308 #, fuzzy msgid "Toggle FullScreen" msgstr "Habilita Tela Cheia" @@ -95,17 +105,18 @@ msgid "Map" msgstr "Mapear" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 -#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 -#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 -#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 -#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 -#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 -#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 -#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 -#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 -#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 +#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239 +#: gui/saveload-dialog.cpp:920 engines/engine.cpp:366 engines/engine.cpp:377 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192 +#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558 +#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 +#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519 +#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550 +#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:867 +#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419 +#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449 +#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -176,8 +187,8 @@ msgid "" "English" msgstr "Idioma do jogo. Isto não irá passar seu jogo Inglês para Português" -#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:80 -#: gui/options.cpp:730 gui/options.cpp:743 gui/options.cpp:1199 +#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86 +#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209 #: audio/null.cpp:40 msgid "<default>" msgstr "<padrão>" @@ -200,11 +211,11 @@ msgstr "Sistema:" msgid "Engine" msgstr "Examinar" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "Graphics" msgstr "Gráficos" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "GFX" msgstr "GFX" @@ -217,7 +228,7 @@ msgctxt "lowres" msgid "Override global graphic settings" msgstr "Sobrepor configuração global de gráficos" -#: gui/launcher.cpp:251 gui/options.cpp:1085 +#: gui/launcher.cpp:251 gui/options.cpp:1095 msgid "Audio" msgstr "Áudio" @@ -230,11 +241,11 @@ msgctxt "lowres" msgid "Override global audio settings" msgstr "Sobrepor configuração global de áudio" -#: gui/launcher.cpp:265 gui/options.cpp:1090 +#: gui/launcher.cpp:265 gui/options.cpp:1100 msgid "Volume" msgstr "Volume" -#: gui/launcher.cpp:267 gui/options.cpp:1092 +#: gui/launcher.cpp:267 gui/options.cpp:1102 msgctxt "lowres" msgid "Volume" msgstr "Volume" @@ -248,7 +259,7 @@ msgctxt "lowres" msgid "Override global volume settings" msgstr "Sobrepor configuração global de volume" -#: gui/launcher.cpp:280 gui/options.cpp:1100 +#: gui/launcher.cpp:280 gui/options.cpp:1110 msgid "MIDI" msgstr "MIDI" @@ -261,7 +272,7 @@ msgctxt "lowres" msgid "Override global MIDI settings" msgstr "Sobrepor configuração global de MIDI" -#: gui/launcher.cpp:294 gui/options.cpp:1106 +#: gui/launcher.cpp:294 gui/options.cpp:1116 msgid "MT-32" msgstr "MT-32" @@ -274,11 +285,11 @@ msgctxt "lowres" msgid "Override global MT-32 settings" msgstr "Sobrepor configuração global de MT-32" -#: gui/launcher.cpp:308 gui/options.cpp:1113 +#: gui/launcher.cpp:308 gui/options.cpp:1123 msgid "Paths" msgstr "Pastas" -#: gui/launcher.cpp:310 gui/options.cpp:1115 +#: gui/launcher.cpp:310 gui/options.cpp:1125 msgctxt "lowres" msgid "Paths" msgstr "Pastas" @@ -292,7 +303,7 @@ msgctxt "lowres" msgid "Game Path:" msgstr "Pasta do Jogo:" -#: gui/launcher.cpp:324 gui/options.cpp:1139 +#: gui/launcher.cpp:324 gui/options.cpp:1149 msgid "Extra Path:" msgstr "Pasta de Extras" @@ -300,42 +311,42 @@ msgstr "Pasta de Extras" msgid "Specifies path to additional data used the game" msgstr "Especifique a pasta para dados utilizados no jogo" -#: gui/launcher.cpp:326 gui/options.cpp:1141 +#: gui/launcher.cpp:326 gui/options.cpp:1151 msgctxt "lowres" msgid "Extra Path:" msgstr "Pasta de Extras" -#: gui/launcher.cpp:333 gui/options.cpp:1123 +#: gui/launcher.cpp:333 gui/options.cpp:1133 msgid "Save Path:" msgstr "Pasta para Salvar" #: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 -#: gui/options.cpp:1123 gui/options.cpp:1125 gui/options.cpp:1126 +#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136 msgid "Specifies where your savegames are put" msgstr "Especifique onde guardar seus jogos salvos" -#: gui/launcher.cpp:335 gui/options.cpp:1125 +#: gui/launcher.cpp:335 gui/options.cpp:1135 msgctxt "lowres" msgid "Save Path:" msgstr "Pasta para Salvar" #: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 -#: gui/launcher.cpp:565 gui/options.cpp:1134 gui/options.cpp:1142 -#: gui/options.cpp:1151 gui/options.cpp:1258 gui/options.cpp:1264 -#: gui/options.cpp:1272 gui/options.cpp:1302 gui/options.cpp:1308 -#: gui/options.cpp:1315 gui/options.cpp:1408 gui/options.cpp:1411 -#: gui/options.cpp:1423 +#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152 +#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282 +#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326 +#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429 +#: gui/options.cpp:1441 msgctxt "path" msgid "None" msgstr "Nenhum(a)" #: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 -#: gui/options.cpp:1252 gui/options.cpp:1296 gui/options.cpp:1414 +#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Padrão" -#: gui/launcher.cpp:504 gui/options.cpp:1417 +#: gui/launcher.cpp:504 gui/options.cpp:1435 msgid "Select SoundFont" msgstr "Selecione o SoundFont" @@ -359,7 +370,7 @@ msgstr "Este código já esta sendo utilizado. Por favor, escolha outro." msgid "~Q~uit" msgstr "~S~air" -#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:96 +#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95 msgid "Quit ScummVM" msgstr "Sair do ScummVM" @@ -367,7 +378,7 @@ msgstr "Sair do ScummVM" msgid "A~b~out..." msgstr "So~b~re..." -#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:70 +#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69 msgid "About ScummVM" msgstr "Sobre o ScumnmVM" @@ -445,12 +456,14 @@ msgstr "Pesquisar:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 +#: engines/pegasus/pegasus.cpp:345 msgid "Load game:" msgstr "Carregar jogo:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:345 +#: backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Carregar" @@ -541,133 +554,133 @@ msgstr "" "Encontrado(s) %d novo(s) jogo(s, ignorados %d previamente adicionados " "jogos..." -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "Never" msgstr "Nunca" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 5 mins" msgstr "a cada 5 mins" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 10 mins" msgstr "a cada 10 mins" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 15 mins" msgstr "a cada 15 mins" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 30 mins" msgstr "a cada 30 mins" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "8 kHz" msgstr "8 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "11kHz" msgstr "11 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "22 kHz" msgstr "22 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "44 kHz" msgstr "44 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:248 gui/options.cpp:474 gui/options.cpp:575 -#: gui/options.cpp:644 gui/options.cpp:852 +#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581 +#: gui/options.cpp:650 gui/options.cpp:858 msgctxt "soundfont" msgid "None" msgstr "Nenhum(a)" -#: gui/options.cpp:382 +#: gui/options.cpp:388 msgid "Failed to apply some of the graphic options changes:" msgstr "Falha ao aplicar algumas mudanças nas opções de gráfico:" -#: gui/options.cpp:394 +#: gui/options.cpp:400 msgid "the video mode could not be changed." msgstr "o modo de vídeo não pôde ser alterado." -#: gui/options.cpp:400 +#: gui/options.cpp:406 msgid "the fullscreen setting could not be changed" msgstr "a configuração de tela cheia não pôde ser mudada" -#: gui/options.cpp:406 +#: gui/options.cpp:412 msgid "the aspect ratio setting could not be changed" msgstr "a configuração de proporção não pôde ser mudada" -#: gui/options.cpp:727 +#: gui/options.cpp:733 msgid "Graphics mode:" msgstr "Modo gráfico:" -#: gui/options.cpp:741 +#: gui/options.cpp:747 msgid "Render mode:" msgstr "Renderização" -#: gui/options.cpp:741 gui/options.cpp:742 +#: gui/options.cpp:747 gui/options.cpp:748 msgid "Special dithering modes supported by some games" msgstr "Modos especiais de dithering suportados por alguns jogos" -#: gui/options.cpp:753 +#: gui/options.cpp:759 #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476 msgid "Fullscreen mode" msgstr "Modo Tela Cheia" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Aspect ratio correction" msgstr "Correção de proporção" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Correct aspect ratio for 320x200 games" msgstr "Correção de proporção para jogos 320x200" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Preferred Device:" msgstr "Dispositivo pref.:" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Music Device:" msgstr "Disp. de música:" -#: gui/options.cpp:764 gui/options.cpp:766 +#: gui/options.cpp:770 gui/options.cpp:772 msgid "Specifies preferred sound device or sound card emulator" msgstr "Especifica o dispositivo de som preferido ou emulador de placa de som" -#: gui/options.cpp:764 gui/options.cpp:766 gui/options.cpp:767 +#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773 msgid "Specifies output sound device or sound card emulator" msgstr "Especifica o dispositivo de saída de som ou emulador de placa de som" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Preferred Dev.:" msgstr "Dispositivo pref.:" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Music Device:" msgstr "Dispositivo de música:" -#: gui/options.cpp:793 +#: gui/options.cpp:799 msgid "AdLib emulator:" msgstr "Emulador AdLib:" -#: gui/options.cpp:793 gui/options.cpp:794 +#: gui/options.cpp:799 gui/options.cpp:800 msgid "AdLib is used for music in many games" msgstr "AdLib é utilizado para música em vários jogos" -#: gui/options.cpp:804 +#: gui/options.cpp:810 msgid "Output rate:" msgstr "Taxa de saída:" -#: gui/options.cpp:804 gui/options.cpp:805 +#: gui/options.cpp:810 gui/options.cpp:811 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -675,62 +688,66 @@ msgstr "" "Maior valor especifica melhor qualidade de som, mas pode não ser suportado " "por sua placa de som" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "GM Device:" msgstr "Dispositivo GM:" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "Specifies default sound device for General MIDI output" msgstr "Especifique o dispositivo de som padrão para a saída General MIDI" -#: gui/options.cpp:826 +#: gui/options.cpp:832 msgid "Don't use General MIDI music" msgstr "Não usar música General MIDI" -#: gui/options.cpp:837 gui/options.cpp:899 +#: gui/options.cpp:843 gui/options.cpp:909 msgid "Use first available device" msgstr "Usar o primeiro dispositivo disponível" -#: gui/options.cpp:849 +#: gui/options.cpp:855 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 +#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "SoundFont é suportado por algumas placas de som, Fluidsynth e Timidity" -#: gui/options.cpp:851 +#: gui/options.cpp:857 msgctxt "lowres" msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Mixed AdLib/MIDI mode" msgstr "Mixar AdLib/MIDI" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Use both MIDI and AdLib sound generation" msgstr "Usar MIDI e AdLib juntos na geração de som" -#: gui/options.cpp:860 +#: gui/options.cpp:866 msgid "MIDI gain:" msgstr "Ganho MIDI:" -#: gui/options.cpp:870 +#: gui/options.cpp:873 +msgid "FluidSynth Settings" +msgstr "" + +#: gui/options.cpp:880 msgid "MT-32 Device:" msgstr "Dispositivo MT-32:" -#: gui/options.cpp:870 +#: gui/options.cpp:880 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" "Especifique o dispositivo de som padrão para a saída Roland MT-32/LAPC1/" "CM32l/CM64" -#: gui/options.cpp:875 +#: gui/options.cpp:885 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Roland MT-32 real (desligar emulação GM)" -#: gui/options.cpp:875 gui/options.cpp:877 +#: gui/options.cpp:885 gui/options.cpp:887 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -738,193 +755,194 @@ msgstr "" "Verifique se você quer usar o seu dispositivo de hardware de som compatível " "com Roland" -#: gui/options.cpp:877 +#: gui/options.cpp:887 msgctxt "lowres" msgid "True Roland MT-32 (no GM emulation)" msgstr "Roland MT-32 real (sem emulação GM)" -#: gui/options.cpp:880 -msgid "Enable Roland GS Mode" -msgstr "Ligar modo Roland GS" +#: gui/options.cpp:890 +#, fuzzy +msgid "Roland GS Mode (disable GM mapping)" +msgstr "Roland MT-32 real (desligar emulação GM)" -#: gui/options.cpp:880 +#: gui/options.cpp:890 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "Desliga o mapeamento General MIDI para jogos com trilha sonora Roland MT-32" -#: gui/options.cpp:889 +#: gui/options.cpp:899 msgid "Don't use Roland MT-32 music" msgstr "Não usar música Roland MT-32" -#: gui/options.cpp:916 +#: gui/options.cpp:926 msgid "Text and Speech:" msgstr "Texto e Voz:" -#: gui/options.cpp:920 gui/options.cpp:930 +#: gui/options.cpp:930 gui/options.cpp:940 msgid "Speech" msgstr "Voz" -#: gui/options.cpp:921 gui/options.cpp:931 +#: gui/options.cpp:931 gui/options.cpp:941 msgid "Subtitles" msgstr "Legendas" -#: gui/options.cpp:922 +#: gui/options.cpp:932 msgid "Both" msgstr "Ambos" -#: gui/options.cpp:924 +#: gui/options.cpp:934 msgid "Subtitle speed:" msgstr "Rapidez legendas:" -#: gui/options.cpp:926 +#: gui/options.cpp:936 msgctxt "lowres" msgid "Text and Speech:" msgstr "Texto e Voz:" -#: gui/options.cpp:930 +#: gui/options.cpp:940 msgid "Spch" msgstr "Voz" -#: gui/options.cpp:931 +#: gui/options.cpp:941 msgid "Subs" msgstr "Legs" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgctxt "lowres" msgid "Both" msgstr "Ambos" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgid "Show subtitles and play speech" msgstr "Mostrar legenda e vozes (dublagem)" -#: gui/options.cpp:934 +#: gui/options.cpp:944 msgctxt "lowres" msgid "Subtitle speed:" msgstr "Velocidade das legendas:" -#: gui/options.cpp:950 +#: gui/options.cpp:960 msgid "Music volume:" msgstr "Volume da Música:" -#: gui/options.cpp:952 +#: gui/options.cpp:962 msgctxt "lowres" msgid "Music volume:" msgstr "Volume da Música:" -#: gui/options.cpp:959 +#: gui/options.cpp:969 msgid "Mute All" msgstr "Mudo" -#: gui/options.cpp:962 +#: gui/options.cpp:972 msgid "SFX volume:" msgstr "Volume dos Sons:" -#: gui/options.cpp:962 gui/options.cpp:964 gui/options.cpp:965 +#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975 msgid "Special sound effects volume" msgstr "Volume dos efeitos sonoros especiais" -#: gui/options.cpp:964 +#: gui/options.cpp:974 msgctxt "lowres" msgid "SFX volume:" msgstr "Volume dos Sons:" -#: gui/options.cpp:972 +#: gui/options.cpp:982 msgid "Speech volume:" msgstr "Volume da Voz:" -#: gui/options.cpp:974 +#: gui/options.cpp:984 msgctxt "lowres" msgid "Speech volume:" msgstr "Volume da Voz:" -#: gui/options.cpp:1131 +#: gui/options.cpp:1141 msgid "Theme Path:" msgstr "Pasta do Tema" -#: gui/options.cpp:1133 +#: gui/options.cpp:1143 msgctxt "lowres" msgid "Theme Path:" msgstr "Pasta do Tema" -#: gui/options.cpp:1139 gui/options.cpp:1141 gui/options.cpp:1142 +#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "Especifica a pasta para os dados adicionais usados por todos os jogos ou " "ScummVM" -#: gui/options.cpp:1148 +#: gui/options.cpp:1158 msgid "Plugins Path:" msgstr "Pasta de Plugins:" -#: gui/options.cpp:1150 +#: gui/options.cpp:1160 msgctxt "lowres" msgid "Plugins Path:" msgstr "Pasta de Plugins:" -#: gui/options.cpp:1159 +#: gui/options.cpp:1169 msgid "Misc" msgstr "Outros" -#: gui/options.cpp:1161 +#: gui/options.cpp:1171 msgctxt "lowres" msgid "Misc" msgstr "Outros" -#: gui/options.cpp:1163 +#: gui/options.cpp:1173 msgid "Theme:" msgstr "Tema:" -#: gui/options.cpp:1167 +#: gui/options.cpp:1177 msgid "GUI Renderer:" msgstr "Renderizador GUI:" -#: gui/options.cpp:1179 +#: gui/options.cpp:1189 msgid "Autosave:" msgstr "Auto-Salvar:" -#: gui/options.cpp:1181 +#: gui/options.cpp:1191 msgctxt "lowres" msgid "Autosave:" msgstr "Auto-Salvar:" -#: gui/options.cpp:1189 +#: gui/options.cpp:1199 msgid "Keys" msgstr "Teclas" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "GUI Language:" msgstr "Idioma do GUI:" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "Language of ScummVM GUI" msgstr "Linguagem do ScummVM GUI" -#: gui/options.cpp:1347 +#: gui/options.cpp:1365 msgid "You have to restart ScummVM before your changes will take effect." msgstr "Você tem que reiniciar o ScummVM para funcionar." -#: gui/options.cpp:1360 +#: gui/options.cpp:1378 msgid "Select directory for savegames" msgstr "Selecione a pasta para o jogos salvos" -#: gui/options.cpp:1367 +#: gui/options.cpp:1385 msgid "The chosen directory cannot be written to. Please select another one." msgstr "O diretório escolhido não pode ser usado. Por favor, selecione outro." -#: gui/options.cpp:1376 +#: gui/options.cpp:1394 msgid "Select directory for GUI themes" msgstr "Selecione a pasta para os temas da Interface de Uso Gráfico" -#: gui/options.cpp:1386 +#: gui/options.cpp:1404 msgid "Select directory for extra files" msgstr "Selecione a pasta para os arquivos extras" -#: gui/options.cpp:1397 +#: gui/options.cpp:1415 msgid "Select directory for plugins" msgstr "Selecione a pasta para os plugins" -#: gui/options.cpp:1450 +#: gui/options.cpp:1468 msgid "" "The theme you selected does not support your current language. If you want " "to use this theme you need to switch to another language first." @@ -932,74 +950,74 @@ msgstr "" "O tema que você selecionou não suporta seu idioma atual. Se você quiser usar " "este tema você precisa mudar para outro idioma." -#: gui/saveload-dialog.cpp:158 +#: gui/saveload-dialog.cpp:166 msgid "List view" msgstr "" -#: gui/saveload-dialog.cpp:159 +#: gui/saveload-dialog.cpp:167 msgid "Grid view" msgstr "" -#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 +#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358 msgid "No date saved" msgstr "Sem data salva" -#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359 msgid "No time saved" msgstr "Sem hora salva" -#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 +#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360 msgid "No playtime saved" msgstr "Sem tempo de jogo salvo" -#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275 msgid "Delete" msgstr "Excluir" -#: gui/saveload-dialog.cpp:266 +#: gui/saveload-dialog.cpp:274 msgid "Do you really want to delete this savegame?" msgstr "Você realmente quer excluir este jogo salvo?" -#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 +#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872 msgid "Date: " msgstr "Data:" -#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 +#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878 msgid "Time: " msgstr "Hora:" -#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 +#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886 msgid "Playtime: " msgstr "Tempo de jogo:" -#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 +#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494 msgid "Untitled savestate" msgstr "Não-titulado arquivo de save" -#: gui/saveload-dialog.cpp:517 +#: gui/saveload-dialog.cpp:546 msgid "Next" msgstr "" -#: gui/saveload-dialog.cpp:520 +#: gui/saveload-dialog.cpp:549 msgid "Prev" msgstr "" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 #, fuzzy msgid "New Save" msgstr "Salvar" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 #, fuzzy msgid "Create a new save game" msgstr "Falha ao salvar o jogo" -#: gui/saveload-dialog.cpp:789 +#: gui/saveload-dialog.cpp:865 #, fuzzy msgid "Name: " msgstr "Nome:" -#: gui/saveload-dialog.cpp:861 +#: gui/saveload-dialog.cpp:937 #, c-format msgid "Enter a description for slot %d:" msgstr "" @@ -1037,35 +1055,35 @@ msgstr "Anti-Serrilhamento (16bpp)" msgid "Clear value" msgstr "Limpar valor" -#: base/main.cpp:209 +#: base/main.cpp:210 #, c-format msgid "Engine does not support debug level '%s'" msgstr "Esse programa não suporta o nível de debug '%s'" -#: base/main.cpp:287 +#: base/main.cpp:288 msgid "Menu" msgstr "Menu" -#: base/main.cpp:290 backends/platform/symbian/src/SymbianActions.cpp:45 +#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:45 #: backends/platform/wince/CEActionsSmartphone.cpp:46 msgid "Skip" msgstr "Pular" -#: base/main.cpp:293 backends/platform/symbian/src/SymbianActions.cpp:50 +#: base/main.cpp:294 backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:42 msgid "Pause" msgstr "Pausar" -#: base/main.cpp:296 +#: base/main.cpp:297 msgid "Skip line" msgstr "Pula linha" -#: base/main.cpp:467 +#: base/main.cpp:468 msgid "Error running game:" msgstr "Erro ao executar o jogo:" -#: base/main.cpp:491 +#: base/main.cpp:492 msgid "Could not find any engine capable of running the selected game" msgstr "" "Não foi possível encontrar qualquer programa capaz de rodar o jogo " @@ -1183,13 +1201,16 @@ msgid "~R~eturn to Launcher" msgstr "~V~oltar ao menu" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284 +#: engines/pegasus/pegasus.cpp:369 msgid "Save game:" msgstr "Salvar jogo:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:369 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1219,12 +1240,12 @@ msgstr "" "instruções sobre como obter assistência adicional." #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 -#: engines/mohawk/dialogs.cpp:174 +#: engines/mohawk/dialogs.cpp:170 msgid "~O~K" msgstr "~O~K" #: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 -#: engines/mohawk/dialogs.cpp:175 +#: engines/mohawk/dialogs.cpp:171 msgid "~C~ancel" msgstr "~C~ancelar" @@ -1232,23 +1253,23 @@ msgstr "~C~ancelar" msgid "~K~eys" msgstr "~T~eclas" -#: engines/engine.cpp:235 +#: engines/engine.cpp:240 msgid "Could not initialize color format." msgstr "Não foi possível inicializar o formato de cor." -#: engines/engine.cpp:243 +#: engines/engine.cpp:248 msgid "Could not switch to video mode: '" msgstr "Não foi possível alternar o modo de vídeo atual:" -#: engines/engine.cpp:252 +#: engines/engine.cpp:257 msgid "Could not apply aspect ratio setting." msgstr "Não foi possível aplicar a correção de proporção" -#: engines/engine.cpp:257 +#: engines/engine.cpp:262 msgid "Could not apply fullscreen setting." msgstr "Não foi possível aplicar a configuração de tela cheia." -#: engines/engine.cpp:357 +#: engines/engine.cpp:362 msgid "" "You appear to be playing this game directly\n" "from the CD. This is known to cause problems,\n" @@ -1262,7 +1283,7 @@ msgstr "" "os arquivos de dados para o disco rígido.\n" "Consulte o arquivo README para mais detalhes." -#: engines/engine.cpp:368 +#: engines/engine.cpp:373 msgid "" "This game has audio tracks in its disk. These\n" "tracks need to be ripped from the disk using\n" @@ -1276,7 +1297,7 @@ msgstr "" "para ouvir a música do jogo.\n" "Consulte o arquivo README para mais detalhes." -#: engines/engine.cpp:426 +#: engines/engine.cpp:431 #, fuzzy, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " @@ -1286,7 +1307,7 @@ msgstr "" "Por favor, consulte o README para obter informações básicas, e para obter " "instruções sobre como obter assistência adicional." -#: engines/engine.cpp:439 +#: engines/engine.cpp:444 msgid "" "WARNING: The game you are about to start is not yet fully supported by " "ScummVM. As such, it is likely to be unstable, and any saves you make might " @@ -1296,28 +1317,51 @@ msgstr "" "suportado pelo ScummVM. Como tal, é provável que seja instável, e qualquer " "jogo salvo que você fizer pode não funcionar em futuras versões do ScummVM." -#: engines/engine.cpp:442 +#: engines/engine.cpp:447 msgid "Start anyway" msgstr "Iniciar de qualquer maneira" -#: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 -#: engines/sci/detection.cpp:390 +#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270 +#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393 +#: engines/toltecs/detection.cpp:173 msgid "Use original save/load screens" msgstr "" -#: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 -#: engines/sci/detection.cpp:391 +#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271 +#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394 +#: engines/toltecs/detection.cpp:174 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore game:" msgstr "Restaurar jogo:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore" msgstr "Restaurar" +#: engines/drascula/saveload.cpp:49 +#, fuzzy +msgid "" +"ScummVM found that you have old savefiles for Drascula that should be " +"converted.\n" +"The old save game format is no longer supported, so you will not be able to " +"load your games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" +msgstr "" +"ScummVM encontrou que você tem jogos salvos velhos do Broken Sword 1 que " +"devem ser convertidos.\n" +"O formato antigo do jogo salvo não é mais suportado, então você não será " +"capaz de carregar os seus jogos se você não convertê-los.\n" +"\n" +"Pressione OK para convertê-los agora, caso contrário você será solicitado " +"novamente na próxima vez que você iniciar o jogo.\n" + #: engines/dreamweb/detection.cpp:57 #, fuzzy msgid "Use bright palette mode" @@ -1327,57 +1371,57 @@ msgstr "Item da direita superior" msgid "Display graphics using the game's bright palette" msgstr "" -#: engines/sci/detection.cpp:370 +#: engines/sci/detection.cpp:373 msgid "EGA undithering" msgstr "EGA sem dithering" -#: engines/sci/detection.cpp:371 +#: engines/sci/detection.cpp:374 #, fuzzy msgid "Enable undithering in EGA games" msgstr "Habilita EGA sem dithering em jogos com suporte" -#: engines/sci/detection.cpp:380 +#: engines/sci/detection.cpp:383 #, fuzzy msgid "Prefer digital sound effects" msgstr "Volume dos efeitos sonoros especiais" -#: engines/sci/detection.cpp:381 +#: engines/sci/detection.cpp:384 msgid "Prefer digital sound effects instead of synthesized ones" msgstr "" -#: engines/sci/detection.cpp:400 +#: engines/sci/detection.cpp:403 msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "" -#: engines/sci/detection.cpp:401 +#: engines/sci/detection.cpp:404 msgid "" "Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" -#: engines/sci/detection.cpp:411 +#: engines/sci/detection.cpp:414 msgid "Use CD audio" msgstr "" -#: engines/sci/detection.cpp:412 +#: engines/sci/detection.cpp:415 msgid "Use CD audio instead of in-game audio, if available" msgstr "" -#: engines/sci/detection.cpp:422 +#: engines/sci/detection.cpp:425 msgid "Use Windows cursors" msgstr "" -#: engines/sci/detection.cpp:423 +#: engines/sci/detection.cpp:426 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "" -#: engines/sci/detection.cpp:433 +#: engines/sci/detection.cpp:436 #, fuzzy msgid "Use silver cursors" msgstr "Cursor normal" -#: engines/sci/detection.cpp:434 +#: engines/sci/detection.cpp:437 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "" @@ -2030,7 +2074,7 @@ msgstr "Voar para direita" msgid "Fly to lower right" msgstr "Voar para direita inferior" -#: engines/scumm/scumm.cpp:1773 +#: engines/scumm/scumm.cpp:1776 #, c-format msgid "" "Native MIDI support requires the Roland Upgrade from LucasArts,\n" @@ -2040,7 +2084,7 @@ msgstr "" "LucasArts,\n" "mas %s está faltando. Utilizando AdLib ao invés." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 +#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2051,7 +2095,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 +#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2062,7 +2106,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 +#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2073,7 +2117,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2512 +#: engines/scumm/scumm.cpp:2537 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2085,7 +2129,7 @@ msgstr "" "dentro da pasta do jogo Day of the Tentacle." #. I18N: Option for fast scene switching -#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171 +#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167 msgid "~Z~ip Mode Activated" msgstr "Modo ~Z~ip ativado" @@ -2106,11 +2150,11 @@ msgstr "~E~xibir Mapa" msgid "~M~ain Menu" msgstr "~M~enu Principal ScummVM" -#: engines/mohawk/dialogs.cpp:172 +#: engines/mohawk/dialogs.cpp:168 msgid "~W~ater Effect Enabled" msgstr "Modo ~E~feitos de água ativado" -#: engines/agos/animation.cpp:560 +#: engines/agos/animation.cpp:557 #, c-format msgid "Cutscene file '%s' not found!" msgstr "Arquivo de vídeo '%s' não encontrado!" @@ -2134,6 +2178,15 @@ msgstr "" msgid "Failed to delete file." msgstr "Falha ao excluir arquivo." +#: engines/groovie/detection.cpp:312 +#, fuzzy +msgid "Fast movie speed" +msgstr "Modo rápido" + +#: engines/groovie/detection.cpp:313 +msgid "Play movies at an increased speed" +msgstr "" + #: engines/groovie/script.cpp:420 msgid "Failed to save game" msgstr "Falha ao salvar o jogo" @@ -2227,12 +2280,12 @@ msgstr "" msgid "Slide Right" msgstr "Direita" -#: engines/kyra/lol.cpp:485 +#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2412 #, fuzzy msgid "Turn Left" msgstr "Desligar" -#: engines/kyra/lol.cpp:486 +#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2413 #, fuzzy msgid "Turn Right" msgstr "Cursor para a direita" @@ -2252,7 +2305,7 @@ msgstr "~O~pções" msgid "Choose Spell" msgstr "Escolher" -#: engines/kyra/sound_midi.cpp:475 +#: engines/kyra/sound_midi.cpp:477 #, fuzzy msgid "" "You appear to be using a General MIDI device,\n" @@ -2299,27 +2352,27 @@ msgstr "" msgid "Use the floppy version's intro (CD version only)" msgstr "" -#: engines/sword1/animation.cpp:539 +#: engines/sword1/animation.cpp:519 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "" -#: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 +#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439 msgid "DXA cutscenes found but ScummVM has been built without zlib support" msgstr "" "Vídeos no formato DXA foram encontrados, mas o ScummVM foi compilado sem " "suporte a zlib" -#: engines/sword1/animation.cpp:570 engines/sword2/animation.cpp:465 +#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449 msgid "MPEG2 cutscenes are no longer supported" msgstr "Vídeos em MPEG2 não são mais suportados" -#: engines/sword1/animation.cpp:576 engines/sword2/animation.cpp:473 +#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457 #, c-format msgid "Cutscene '%s' not found" msgstr "Vídeo '%s' não encontrado" -#: engines/sword1/control.cpp:863 +#: engines/sword1/control.cpp:865 msgid "" "ScummVM found that you have old savefiles for Broken Sword 1 that should be " "converted.\n" @@ -2337,7 +2390,7 @@ msgstr "" "Pressione OK para convertê-los agora, caso contrário você será solicitado " "novamente na próxima vez que você iniciar o jogo.\n" -#: engines/sword1/control.cpp:1232 +#: engines/sword1/control.cpp:1234 #, c-format msgid "" "Target new save game already exists!\n" @@ -2346,11 +2399,11 @@ msgstr "" "Já existe um jogo salvo no destino!\n" "Você gostaria de manter o jogo salvo (%s) ou o novo (%s)?\n" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the old one" msgstr "Mantenha o antigo" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the new one" msgstr "Mantenha o novo" @@ -2358,7 +2411,7 @@ msgstr "Mantenha o novo" msgid "This is the end of the Broken Sword 1 Demo" msgstr "Este é o fim do demo de Broken Sword 1" -#: engines/sword2/animation.cpp:435 +#: engines/sword2/animation.cpp:419 #, fuzzy msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" @@ -2374,12 +2427,12 @@ msgstr "" msgid "Show labels for objects on mouse hover" msgstr "" -#: engines/teenagent/resources.cpp:68 +#: engines/teenagent/resources.cpp:94 msgid "" "You're missing the 'teenagent.dat' file. Get it from the ScummVM website" msgstr "" -#: engines/teenagent/resources.cpp:89 +#: engines/teenagent/resources.cpp:115 msgid "" "The teenagent.dat file is compressed and zlib hasn't been included in this " "executable. Please decompress it" @@ -2435,6 +2488,47 @@ msgstr "" "\n" "Por favor, reporte para a equipe." +#: engines/pegasus/pegasus.cpp:675 +msgid "Invalid save file name" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2410 +msgid "Up/Zoom In/Move Forward/Open Doors" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2411 +#, fuzzy +msgid "Down/Zoom Out" +msgstr "Zoom para cima" + +#: engines/pegasus/pegasus.cpp:2414 +msgid "Display/Hide Inventory Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2415 +msgid "Display/Hide Biochip Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2416 +msgid "Action/Select" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2417 +msgid "Toggle Center Data Display" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2418 +msgid "Display/Hide Info Screen" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2419 +msgid "Display/Hide Pause Menu" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2420 +msgid "???" +msgstr "" + #: audio/fmopl.cpp:49 msgid "MAME OPL emulator" msgstr "Emulador MAME OPL" @@ -2492,7 +2586,7 @@ msgstr "Sem música" msgid "Amiga Audio Emulator" msgstr "Emulador Som Amiga" -#: audio/softsynth/adlib.cpp:1593 +#: audio/softsynth/adlib.cpp:2284 msgid "AdLib Emulator" msgstr "Emulador AdLib" @@ -2504,11 +2598,11 @@ msgstr "Emulador Apple II GS (NÃO IMPLEMENTADO)" msgid "C64 Audio Emulator" msgstr "Emulador Som C64" -#: audio/softsynth/mt32.cpp:293 +#: audio/softsynth/mt32.cpp:205 msgid "Initializing MT-32 Emulator" msgstr "Inicializando Emulador MT-32" -#: audio/softsynth/mt32.cpp:512 +#: audio/softsynth/mt32.cpp:431 msgid "MT-32 Emulator" msgstr "Emulador MT-32" @@ -2661,24 +2755,24 @@ msgstr "Item do meio na esquerda" msgid "Right Click" msgstr "Clique com o botão direito" -#: backends/platform/sdl/macosx/appmenu_osx.mm:78 +#: backends/platform/sdl/macosx/appmenu_osx.mm:77 msgid "Hide ScummVM" msgstr "Ocultar ScummVM" -#: backends/platform/sdl/macosx/appmenu_osx.mm:83 +#: backends/platform/sdl/macosx/appmenu_osx.mm:82 msgid "Hide Others" msgstr "Ocultar Outros" -#: backends/platform/sdl/macosx/appmenu_osx.mm:88 +#: backends/platform/sdl/macosx/appmenu_osx.mm:87 msgid "Show All" msgstr "Mostrar Tudo" -#: backends/platform/sdl/macosx/appmenu_osx.mm:110 -#: backends/platform/sdl/macosx/appmenu_osx.mm:121 +#: backends/platform/sdl/macosx/appmenu_osx.mm:109 +#: backends/platform/sdl/macosx/appmenu_osx.mm:120 msgid "Window" msgstr "Janela" -#: backends/platform/sdl/macosx/appmenu_osx.mm:115 +#: backends/platform/sdl/macosx/appmenu_osx.mm:114 msgid "Minimize" msgstr "Minimizar" @@ -2692,12 +2786,12 @@ msgid "Normal (no scaling)" msgstr "Normal (sem escala)" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537 msgid "Enabled aspect ratio correction" msgstr "Correção de proporção habilitada" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542 msgid "Disabled aspect ratio correction" msgstr "Correção de proporção desabilitada" @@ -2706,7 +2800,7 @@ msgid "Active graphics filter:" msgstr "Ativa os filtros gráficos" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481 msgid "Windowed mode" msgstr "Modo janela" @@ -2730,11 +2824,11 @@ msgstr "Modo de vídeo atual" msgid "Current scale" msgstr "Escala atual" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:558 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562 msgid "Active filter mode: Linear" msgstr "Filtro de imagem ativo: Linear" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:560 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564 msgid "Active filter mode: Nearest" msgstr "Filtro de imagem ativo: Nearest" @@ -3061,19 +3155,19 @@ msgstr "Você realmente deseja sair?" #: backends/events/gph/gph-events.cpp:386 #: backends/events/gph/gph-events.cpp:429 -#: backends/events/openpandora/op-events.cpp:139 +#: backends/events/openpandora/op-events.cpp:168 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "Touchscreen 'Modo Toque' - Clique Esquerdo" #: backends/events/gph/gph-events.cpp:388 #: backends/events/gph/gph-events.cpp:431 -#: backends/events/openpandora/op-events.cpp:141 +#: backends/events/openpandora/op-events.cpp:170 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "Touchscreen 'Modo Toque' - Clique Direito" #: backends/events/gph/gph-events.cpp:390 #: backends/events/gph/gph-events.cpp:433 -#: backends/events/openpandora/op-events.cpp:143 +#: backends/events/openpandora/op-events.cpp:172 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "Touchscreen 'Modo Toque' - Acima (Sem Clicar)" @@ -3093,7 +3187,12 @@ msgstr "Volume mínimo" msgid "Decreasing Volume" msgstr "Diminuindo Volume" -#: backends/updates/macosx/macosx-updates.mm:65 +#: backends/events/openpandora/op-events.cpp:174 +#, fuzzy +msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)" +msgstr "Touchscreen 'Modo Toque' - Acima (Sem Clicar)" + +#: backends/updates/macosx/macosx-updates.mm:67 msgid "Check for Updates..." msgstr "Procurar por Atualizações..." @@ -3129,6 +3228,9 @@ msgstr "Clicando Habilitado" msgid "Clicking Disabled" msgstr "Clicando Desabilitado" +#~ msgid "Enable Roland GS Mode" +#~ msgstr "Ligar modo Roland GS" + #~ msgid "Hercules Green" #~ msgstr "Hercules Green" diff --git a/po/ru_RU.po b/po/ru_RU.po index 2774dc8c74..be476667d5 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -1,5 +1,5 @@ # Russian translation for ScummVM. -# Copyright (C) 2010-2012 ScummVM Team +# Copyright (C) 2010-2013 ScummVM Team # This file is distributed under the same license as the ScummVM package. # Eugene Sandulenko <sev@scummvm.org>, 2010. # @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-08-12 14:57+0200\n" +"POT-Creation-Date: 2013-02-07 23:11+0000\n" "PO-Revision-Date: 2012-07-08 22:00+0200+0200\n" "Last-Translator: Eugene Sandulenko <sev@scummvm.org>\n" "Language-Team: Russian\n" @@ -18,45 +18,55 @@ msgstr "" "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:91 +#: gui/about.cpp:93 #, c-format msgid "(built on %s)" msgstr "(áÞÑàÐÝ %s)" -#: gui/about.cpp:98 +#: gui/about.cpp:100 msgid "Features compiled in:" msgstr "²ÚÛîçÕÝÝëÕ Ò ÑØÛÔ ÞßæØØ:" -#: gui/about.cpp:107 +#: gui/about.cpp:109 msgid "Available engines:" msgstr "´ÞáâãßÝëÕ ÔÒØÖÚØ:" -#: gui/browser.cpp:66 +#: gui/browser.cpp:67 +#, fuzzy +msgid "Show hidden files" +msgstr "¿ÞÚÐ×Ðâì / ÃÑàÐâì ÚÞÝáÞÛì" + +#: gui/browser.cpp:67 +msgid "Show files marked with the hidden attribute" +msgstr "" + +#: gui/browser.cpp:71 msgid "Go up" msgstr "²ÒÕàå" -#: gui/browser.cpp:66 gui/browser.cpp:68 +#: gui/browser.cpp:71 gui/browser.cpp:73 msgid "Go to previous directory level" msgstr "¿ÕàÕÙâØ ÝÐ ÔØàÕÚâÞàØî ãàÞÒÝÕÜ ÒëèÕ" -#: gui/browser.cpp:68 +#: gui/browser.cpp:73 msgctxt "lowres" msgid "Go up" msgstr "²ÒÕàå" -#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 -#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 -#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 -#: gui/themebrowser.cpp:54 engines/engine.cpp:442 -#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 +#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238 +#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275 +#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919 +#: gui/themebrowser.cpp:54 engines/engine.cpp:447 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:190 +#: engines/sword1/control.cpp:867 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" msgstr "¾âÜÕÝÐ" -#: gui/browser.cpp:70 gui/chooser.cpp:46 gui/themebrowser.cpp:55 +#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55 msgid "Choose" msgstr "²ëÑàÐâì" @@ -71,15 +81,15 @@ msgstr "·ÐÚàëâì" msgid "Mouse click" msgstr "ºÛØÚ Üëèìî" -#: gui/gui-manager.cpp:122 base/main.cpp:300 +#: gui/gui-manager.cpp:122 base/main.cpp:301 msgid "Display keyboard" msgstr "¿ÞÚÐ×Ðâì ÚÛÐÒØÐâãàã" -#: gui/gui-manager.cpp:126 base/main.cpp:304 +#: gui/gui-manager.cpp:126 base/main.cpp:305 msgid "Remap keys" msgstr "¿ÕàÕÝÐ×ÝÐçØâì ÚÛÐÒØèØ" -#: gui/gui-manager.cpp:129 base/main.cpp:307 +#: gui/gui-manager.cpp:129 base/main.cpp:308 msgid "Toggle FullScreen" msgstr "¿ÕàÕÚÛîçÕÝØÕ ÝÐ ÒÕáì íÚàÐÝ" @@ -92,17 +102,18 @@ msgid "Map" msgstr "½Ð×ÝÐçØâì" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 -#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 -#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 -#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 -#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 -#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 -#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 -#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 -#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 -#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 +#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239 +#: gui/saveload-dialog.cpp:920 engines/engine.cpp:366 engines/engine.cpp:377 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192 +#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558 +#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 +#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519 +#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550 +#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:867 +#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419 +#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449 +#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -174,8 +185,8 @@ msgid "" msgstr "" "Ï×ëÚ ØÓàë. ¸×ÜÕÝÕÝØÕ íâÞÙ ÝÐáâàÞÙÚØ ÝÕ ßàÕÒàÐâØâ ØÓàã ÝÐ ÐÝÓÛØÙáÚÞÜ Ò àãááÚãî" -#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:80 -#: gui/options.cpp:730 gui/options.cpp:743 gui/options.cpp:1199 +#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86 +#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209 #: audio/null.cpp:40 msgid "<default>" msgstr "<ßÞ ãÜÞÛçÐÝØî>" @@ -197,11 +208,11 @@ msgstr "¿ÛÐâäÞàÜÐ:" msgid "Engine" msgstr "´ÒØÖÞÚ" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "Graphics" msgstr "³àÐäØÚÐ" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "GFX" msgstr "³àä" @@ -214,7 +225,7 @@ msgctxt "lowres" msgid "Override global graphic settings" msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÓàÐäØÚØ" -#: gui/launcher.cpp:251 gui/options.cpp:1085 +#: gui/launcher.cpp:251 gui/options.cpp:1095 msgid "Audio" msgstr "°ãÔØÞ" @@ -227,11 +238,11 @@ msgctxt "lowres" msgid "Override global audio settings" msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÐãÔØÞ" -#: gui/launcher.cpp:265 gui/options.cpp:1090 +#: gui/launcher.cpp:265 gui/options.cpp:1100 msgid "Volume" msgstr "³àÞÜÚÞáâì" -#: gui/launcher.cpp:267 gui/options.cpp:1092 +#: gui/launcher.cpp:267 gui/options.cpp:1102 msgctxt "lowres" msgid "Volume" msgstr "³àÞÜÚ" @@ -245,7 +256,7 @@ msgctxt "lowres" msgid "Override global volume settings" msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÓàÞÜÚÞáâØ" -#: gui/launcher.cpp:280 gui/options.cpp:1100 +#: gui/launcher.cpp:280 gui/options.cpp:1110 msgid "MIDI" msgstr "MIDI" @@ -258,7 +269,7 @@ msgctxt "lowres" msgid "Override global MIDI settings" msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ MIDI" -#: gui/launcher.cpp:294 gui/options.cpp:1106 +#: gui/launcher.cpp:294 gui/options.cpp:1116 msgid "MT-32" msgstr "MT-32" @@ -271,11 +282,11 @@ msgctxt "lowres" msgid "Override global MT-32 settings" msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ MT-32" -#: gui/launcher.cpp:308 gui/options.cpp:1113 +#: gui/launcher.cpp:308 gui/options.cpp:1123 msgid "Paths" msgstr "¿ãâØ" -#: gui/launcher.cpp:310 gui/options.cpp:1115 +#: gui/launcher.cpp:310 gui/options.cpp:1125 msgctxt "lowres" msgid "Paths" msgstr "¿ãâØ" @@ -289,7 +300,7 @@ msgctxt "lowres" msgid "Game Path:" msgstr "³ÔÕ ØÓàÐ:" -#: gui/launcher.cpp:324 gui/options.cpp:1139 +#: gui/launcher.cpp:324 gui/options.cpp:1149 msgid "Extra Path:" msgstr "´Þß. ßãâì:" @@ -297,42 +308,42 @@ msgstr "´Þß. ßãâì:" msgid "Specifies path to additional data used the game" msgstr "ÃÚÐ×ëÒÐÕâ ßãâì Ú ÔÞßÞÛÝØâÕÛìÝëÜ äÐÙÛÐÜ ÔÐÝÝëå ÔÛï ØÓàë" -#: gui/launcher.cpp:326 gui/options.cpp:1141 +#: gui/launcher.cpp:326 gui/options.cpp:1151 msgctxt "lowres" msgid "Extra Path:" msgstr "´Þß. ßãâì:" -#: gui/launcher.cpp:333 gui/options.cpp:1123 +#: gui/launcher.cpp:333 gui/options.cpp:1133 msgid "Save Path:" msgstr "ÁÞåàÐÝÕÝØï ØÓà:" #: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 -#: gui/options.cpp:1123 gui/options.cpp:1125 gui/options.cpp:1126 +#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136 msgid "Specifies where your savegames are put" msgstr "ÃÚÐ×ëÒÐÕâ ßãâì Ú áÞåàÐÝÕÝØïÜ ØÓàë" -#: gui/launcher.cpp:335 gui/options.cpp:1125 +#: gui/launcher.cpp:335 gui/options.cpp:1135 msgctxt "lowres" msgid "Save Path:" msgstr "¿ãâì áÞåà:" #: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 -#: gui/launcher.cpp:565 gui/options.cpp:1134 gui/options.cpp:1142 -#: gui/options.cpp:1151 gui/options.cpp:1258 gui/options.cpp:1264 -#: gui/options.cpp:1272 gui/options.cpp:1302 gui/options.cpp:1308 -#: gui/options.cpp:1315 gui/options.cpp:1408 gui/options.cpp:1411 -#: gui/options.cpp:1423 +#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152 +#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282 +#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326 +#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429 +#: gui/options.cpp:1441 msgctxt "path" msgid "None" msgstr "½Õ ×ÐÔÐÝ" #: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 -#: gui/options.cpp:1252 gui/options.cpp:1296 gui/options.cpp:1414 +#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "¿Þ ãÜÞÛçÐÝØî" -#: gui/launcher.cpp:504 gui/options.cpp:1417 +#: gui/launcher.cpp:504 gui/options.cpp:1435 msgid "Select SoundFont" msgstr "²ëÑÕàØâÕ SoundFont" @@ -356,7 +367,7 @@ msgstr "ÍâÞâ ID ØÓàë ãÖÕ ØáßÞÛì×ãÕâáï. ¿ÞÖÐÛãÙáâÐ, ÒëÑÕàØâÕ ÔàãÓÞÙ." msgid "~Q~uit" msgstr "~²~ëåÞÔ" -#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:96 +#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95 msgid "Quit ScummVM" msgstr "·ÐÒÕàèØâì ScummVM" @@ -364,7 +375,7 @@ msgstr "·ÐÒÕàèØâì ScummVM" msgid "A~b~out..." msgstr "¾ ß~à~ÞÓàÐÜÜÕ..." -#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:70 +#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69 msgid "About ScummVM" msgstr "¾ ßàÞÓàÐÜÜÕ ScummVM" @@ -441,12 +452,14 @@ msgstr "¿ÞØáÚ:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 +#: engines/pegasus/pegasus.cpp:345 msgid "Load game:" msgstr "·ÐÓàãרâì ØÓàã:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:345 +#: backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "·ÐÓàãרâì" @@ -531,134 +544,134 @@ msgstr "¿àÞáÜÞâàÕÝÞ %d ÔØàÕÚâÞàØÙ ..." msgid "Discovered %d new games, ignored %d previously added games ..." msgstr "½ÐÙÔÕÝÞ %d ÝÞÒëå ØÓà, ßàÞßãéÕÝÞ %d àÐÝÕÕ ÔÞÑÐÒÛÕÝÝëå ØÓà ..." -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "Never" msgstr "½ØÚÞÓÔÐ" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 5 mins" msgstr "ÚÐÖÔëÕ 5 ÜØÝãâ" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 10 mins" msgstr "ÚÐÖÔëÕ 10 ÜØÝãâ" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 15 mins" msgstr "ÚÐÖÔëÕ 15 ÜØÝãâ" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 30 mins" msgstr "ÚÐÖÔëÕ 30 ÜØÝãâ" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "8 kHz" msgstr "8 Ú³æ" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "11kHz" msgstr "11 Ú³æ" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "22 kHz" msgstr "22 Ú³æ" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "44 kHz" msgstr "44 Ú³æ" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "48 kHz" msgstr "48 Ú³æ" -#: gui/options.cpp:248 gui/options.cpp:474 gui/options.cpp:575 -#: gui/options.cpp:644 gui/options.cpp:852 +#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581 +#: gui/options.cpp:650 gui/options.cpp:858 msgctxt "soundfont" msgid "None" msgstr "½Õ ×ÐÔÐÝ" -#: gui/options.cpp:382 +#: gui/options.cpp:388 msgid "Failed to apply some of the graphic options changes:" msgstr "½Õ ãÔÐÛÞáì ßàØÜÕÝØâì Ø×ÜÕÝÕÝØï ÝÕÚâÞàëå ÓàÐäØçÕáÚØå ÝÐáâàÞÕÚ:" -#: gui/options.cpp:394 +#: gui/options.cpp:400 msgid "the video mode could not be changed." msgstr "ÒØÔÕÞàÕÖØÜ ÝÕ ÜÞÖÕâ Ñëâì Ø×ÜÕÝñÝ." -#: gui/options.cpp:400 +#: gui/options.cpp:406 msgid "the fullscreen setting could not be changed" msgstr "ßÞÛÝÞíÚàÐÝÝëÙ àÕÖØÜ ÝÕ ÜÞÖÕâ Ñëâì Ø×ÜÕÝñÝ" -#: gui/options.cpp:406 +#: gui/options.cpp:412 msgid "the aspect ratio setting could not be changed" msgstr "àÕÖØÜ ÚÞààÕÚâØàÞÒÚØ áÞÞâÝÞèÕÝØï áâÞàÞÝ ÝÕ ÜÞÖÕâ Ñëâì Ø×ÜÕÝñÝ" -#: gui/options.cpp:727 +#: gui/options.cpp:733 msgid "Graphics mode:" msgstr "³àÐä. àÕÖØÜ:" -#: gui/options.cpp:741 +#: gui/options.cpp:747 msgid "Render mode:" msgstr "ÀÕÖØÜ àÐáâàÐ:" -#: gui/options.cpp:741 gui/options.cpp:742 +#: gui/options.cpp:747 gui/options.cpp:748 msgid "Special dithering modes supported by some games" msgstr "ÁßÕæØÐÛìÝëÕ àÕÖØÜë àÕÝÔÕàØÝÓÐ, ßÞÔÔÕàÖØÒÐÕÜëÕ ÝÕÚÞâÞàëÜØ ØÓàÐÜØ" -#: gui/options.cpp:753 +#: gui/options.cpp:759 #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476 msgid "Fullscreen mode" msgstr "¿ÞÛÝÞíÚàÐÝÝëÙ àÕÖØÜ" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Aspect ratio correction" msgstr "ºÞààÕÚæØï áÞÞâÝÞèÕÝØï áâÞàÞÝ" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Correct aspect ratio for 320x200 games" msgstr "ºÞààÕÚâØàÞÒÐâì áÞÞâÝÞèÕÝØÕ áâÞàÞÝ ÔÛï ØÓà á àÐ×àÕèÕÝØÕÜ 320x200" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Preferred Device:" msgstr "¿àÕÔßÞçØâÐÕÜÞÕ:" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Music Device:" msgstr "·ÒãÚÞÒÞÕ ãáâ-ÒÞ:" -#: gui/options.cpp:764 gui/options.cpp:766 +#: gui/options.cpp:770 gui/options.cpp:772 msgid "Specifies preferred sound device or sound card emulator" msgstr "" "ÃÚÐ×ëÒÐÕâ ßàÕÔßÞçØâÐÕÜÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ØÛØ íÜãÛïâÞà ×ÒãÚÞÒÞÙ ÚÐàâë" -#: gui/options.cpp:764 gui/options.cpp:766 gui/options.cpp:767 +#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773 msgid "Specifies output sound device or sound card emulator" msgstr "ÃÚÐ×ëÒÐÕâ ÒëåÞÔÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ØÛØ íÜãÛïâÞà ×ÒãÚÞÒÞÙ ÚÐàâë" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Preferred Dev.:" msgstr "¿àÕÔßÞçØâÐÕÜÞÕ:" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Music Device:" msgstr "·ÒãÚÞÒÞÕ ãáâ-ÒÞ:" -#: gui/options.cpp:793 +#: gui/options.cpp:799 msgid "AdLib emulator:" msgstr "ÍÜãÛïâÞà AdLib:" -#: gui/options.cpp:793 gui/options.cpp:794 +#: gui/options.cpp:799 gui/options.cpp:800 msgid "AdLib is used for music in many games" msgstr "·ÒãÚÞÒÐï ÚÐàâÐ AdLib ØáßÞÛì×ãÕâáï ÜÝÞÓØÜØ ØÓàÐÜØ" -#: gui/options.cpp:804 +#: gui/options.cpp:810 msgid "Output rate:" msgstr "ÇÐáâÞâÐ ×ÒãÚÐ:" -#: gui/options.cpp:804 gui/options.cpp:805 +#: gui/options.cpp:810 gui/options.cpp:811 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -666,63 +679,67 @@ msgstr "" "±¾ÛìèØÕ ×ÝÐçÕÝØï ×ÐÔÐîâ ÛãçèÕÕ ÚÐçÕáâÒÞ ×ÒãÚÐ, ÞÔÝÐÚÞ ÞÝØ ÜÞÓãâ ÝÕ " "ßÞÔÔÕàÖØÒÐâìáï ÒÐèÕÙ ×ÒãÚÞÒÞÙ ÚÐàâÞÙ" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "GM Device:" msgstr "ÃáâàÞÙáâÒÞ GM:" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "Specifies default sound device for General MIDI output" msgstr "ÃÚÐ×ëÒÐÕâ ÒëåÞÔÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ÔÛï MIDI" -#: gui/options.cpp:826 +#: gui/options.cpp:832 msgid "Don't use General MIDI music" msgstr "½Õ ØáßÞÛì×ÞÒÐâì Üã×ëÚã ÔÛï General MIDI" -#: gui/options.cpp:837 gui/options.cpp:899 +#: gui/options.cpp:843 gui/options.cpp:909 msgid "Use first available device" msgstr "¸áßÞÛì×ÞÒÐâì ßÕàÒÞÕ ÔÞáâãßÝÞÕ ãáâàÞÙáâÒÞ" -#: gui/options.cpp:849 +#: gui/options.cpp:855 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 +#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "SoundFontë ßÞÔÔÕàÖØÒÐîâáï ÝÕÚÞâÞàëÜØ ×ÒãÚÞÒëÜØ ÚÐàâÐÜØ, Fluidsynth Ø Timidity" -#: gui/options.cpp:851 +#: gui/options.cpp:857 msgctxt "lowres" msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Mixed AdLib/MIDI mode" msgstr "ÁÜÕèÐÝÝëÙ àÕÖØÜ AdLib/MIDI" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Use both MIDI and AdLib sound generation" msgstr "¸áßÞÛì×ÞÒÐâì Ø MIDI Ø AdLib ÔÛï ÓÕÝÕàÐæØØ ×ÒãÚÐ" -#: gui/options.cpp:860 +#: gui/options.cpp:866 msgid "MIDI gain:" msgstr "ÃáØÛÕÝØÕ MIDI:" -#: gui/options.cpp:870 +#: gui/options.cpp:873 +msgid "FluidSynth Settings" +msgstr "" + +#: gui/options.cpp:880 msgid "MT-32 Device:" msgstr "Ãáâà. MT-32:" -#: gui/options.cpp:870 +#: gui/options.cpp:880 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" "ÃÚÐ×ëÒÐÕâ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ßÞ ãÜÞÛçÐÝØî ÔÛï ÒëÒÞÔÐ ÝÐ Roland MT-32/LAPC1/" "CM32l/CM64" -#: gui/options.cpp:875 +#: gui/options.cpp:885 msgid "True Roland MT-32 (disable GM emulation)" msgstr "½ÐáâÞïéØÙ Roland MT-32 (×ÐßàÕâØâì íÜãÛïæØî GM)" -#: gui/options.cpp:875 gui/options.cpp:877 +#: gui/options.cpp:885 gui/options.cpp:887 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -730,194 +747,195 @@ msgstr "" "¾âÜÕâìâÕ, ÕáÛØ ã ÒÐá ßÞÔÚÛîçÕÝÞ Roland-áÞÒÜÕáâØÜÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ Ø Òë " "åÞâØâÕ ÕÓÞ ØáßÞÛì×ÞÒÐâì" -#: gui/options.cpp:877 +#: gui/options.cpp:887 msgctxt "lowres" msgid "True Roland MT-32 (no GM emulation)" msgstr "½ÐáâÞïéØÙ Roland MT-32 (×ÐßàÕâØâì GM)" -#: gui/options.cpp:880 -msgid "Enable Roland GS Mode" -msgstr "²ÚÛîçØâì àÕÖØÜ Roland GS" +#: gui/options.cpp:890 +#, fuzzy +msgid "Roland GS Mode (disable GM mapping)" +msgstr "½ÐáâÞïéØÙ Roland MT-32 (×ÐßàÕâØâì íÜãÛïæØî GM)" -#: gui/options.cpp:880 +#: gui/options.cpp:890 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "²ëÚÛîçÐÕâ áÞßÞáâÐÒÛÕÝØÕ General MIDI ÔÛï ØÓà á ×ÒãÚÞÒÞÙ ÔÞàÞÖÚÞÙ ÔÛï Roland " "MT-32" -#: gui/options.cpp:889 +#: gui/options.cpp:899 msgid "Don't use Roland MT-32 music" msgstr "½Õ ØáßÞÛì×ÞÒÐâì Üã×ëÚã ÔÛï MT-32" -#: gui/options.cpp:916 +#: gui/options.cpp:926 msgid "Text and Speech:" msgstr "ÂÕÚáâ Ø Þ×ÒãçÚÐ:" -#: gui/options.cpp:920 gui/options.cpp:930 +#: gui/options.cpp:930 gui/options.cpp:940 msgid "Speech" msgstr "¾×ÒãçÚÐ" -#: gui/options.cpp:921 gui/options.cpp:931 +#: gui/options.cpp:931 gui/options.cpp:941 msgid "Subtitles" msgstr "ÁãÑâØâàë" -#: gui/options.cpp:922 +#: gui/options.cpp:932 msgid "Both" msgstr "¾ÑÐ" -#: gui/options.cpp:924 +#: gui/options.cpp:934 msgid "Subtitle speed:" msgstr "ÁÚÞàÞáâì âØâàÞÒ:" -#: gui/options.cpp:926 +#: gui/options.cpp:936 msgctxt "lowres" msgid "Text and Speech:" msgstr "ÂÕÚáâ Ø Þ×ÒãçÚÐ:" -#: gui/options.cpp:930 +#: gui/options.cpp:940 msgid "Spch" msgstr "¾×Ò" -#: gui/options.cpp:931 +#: gui/options.cpp:941 msgid "Subs" msgstr "ÁãÑ" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgctxt "lowres" msgid "Both" msgstr "¾ÑÐ" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgid "Show subtitles and play speech" msgstr "¿ÞÚÐ×ëÒÐâì áãÑâØâàë Ø ÒÞáßàÞØ×ÒÞÔØâì àÕçì" -#: gui/options.cpp:934 +#: gui/options.cpp:944 msgctxt "lowres" msgid "Subtitle speed:" msgstr "ÁÚÞàÞáâì âØâàÞÒ:" -#: gui/options.cpp:950 +#: gui/options.cpp:960 msgid "Music volume:" msgstr "³àÞÜÚ. Üã×ëÚØ:" -#: gui/options.cpp:952 +#: gui/options.cpp:962 msgctxt "lowres" msgid "Music volume:" msgstr "³àÞÜÚ. Üã×ëÚØ:" -#: gui/options.cpp:959 +#: gui/options.cpp:969 msgid "Mute All" msgstr "²ëÚÛ. Òáñ" -#: gui/options.cpp:962 +#: gui/options.cpp:972 msgid "SFX volume:" msgstr "³àÞÜÚÞáâì SFX:" -#: gui/options.cpp:962 gui/options.cpp:964 gui/options.cpp:965 +#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975 msgid "Special sound effects volume" msgstr "³àÞÜÚÞáâì áßÕæØÐÛìÝëå ×ÒãÚÞÒëå íääÕÚâÞÒ" -#: gui/options.cpp:964 +#: gui/options.cpp:974 msgctxt "lowres" msgid "SFX volume:" msgstr "³àÞÜÚ. SFX:" -#: gui/options.cpp:972 +#: gui/options.cpp:982 msgid "Speech volume:" msgstr "³àÞÜÚ. Þ×ÒãçÚØ:" -#: gui/options.cpp:974 +#: gui/options.cpp:984 msgctxt "lowres" msgid "Speech volume:" msgstr "³àÞÜÚ. Þ×ÒãçÚØ:" -#: gui/options.cpp:1131 +#: gui/options.cpp:1141 msgid "Theme Path:" msgstr "¿ãâì Ú âÕÜÐÜ:" -#: gui/options.cpp:1133 +#: gui/options.cpp:1143 msgctxt "lowres" msgid "Theme Path:" msgstr "³ÔÕ âÕÜë:" -#: gui/options.cpp:1139 gui/options.cpp:1141 gui/options.cpp:1142 +#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "ÃÚÐ×ëÒÐÕâ ßãâì Ú ÔÞßÞÛÝØâÕÛìÝëÜ äÐÙÛÐÜ ÔÐÝÝëå, ØáßÞÛì×ãÕÜëå ÒáÕÜØ ØÓàÐÜØ, " "ÛØÑÞ ScummVM" -#: gui/options.cpp:1148 +#: gui/options.cpp:1158 msgid "Plugins Path:" msgstr "¿ãâì Ú ßÛÐÓØÝÐÜ:" -#: gui/options.cpp:1150 +#: gui/options.cpp:1160 msgctxt "lowres" msgid "Plugins Path:" msgstr "¿ãâì Ú ßÛÐÓØÝÐÜ:" -#: gui/options.cpp:1159 +#: gui/options.cpp:1169 msgid "Misc" msgstr "ÀÐ×ÝÞÕ" -#: gui/options.cpp:1161 +#: gui/options.cpp:1171 msgctxt "lowres" msgid "Misc" msgstr "ÀÐ×ÝÞÕ" -#: gui/options.cpp:1163 +#: gui/options.cpp:1173 msgid "Theme:" msgstr "ÂÕÜÐ:" -#: gui/options.cpp:1167 +#: gui/options.cpp:1177 msgid "GUI Renderer:" msgstr "ÀØáÞÒÐÛÚÐ GUI:" -#: gui/options.cpp:1179 +#: gui/options.cpp:1189 msgid "Autosave:" msgstr "°ÒâÞáÞåàÐÝÕÝØÕ:" -#: gui/options.cpp:1181 +#: gui/options.cpp:1191 msgctxt "lowres" msgid "Autosave:" msgstr "°ÒâÞáÞåà.:" -#: gui/options.cpp:1189 +#: gui/options.cpp:1199 msgid "Keys" msgstr "ºÛÐÒØèØ" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "GUI Language:" msgstr "Ï×ëÚ GUI:" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "Language of ScummVM GUI" msgstr "Ï×ëÚ ÓàÐäØçÕáÚÞÓÞ ØÝâÕàäÕÙáÐ ScummVM" -#: gui/options.cpp:1347 +#: gui/options.cpp:1365 msgid "You have to restart ScummVM before your changes will take effect." msgstr "²ë ÔÞÛÖÝë ßÕàÕ×ÐßãáâØâì ScummVM çâÞÑë ßàØÜÕÝØâì Ø×ÜÕÝÕÝØï." -#: gui/options.cpp:1360 +#: gui/options.cpp:1378 msgid "Select directory for savegames" msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî ÔÛï áÞåàÐÝÕÝØÙ" -#: gui/options.cpp:1367 +#: gui/options.cpp:1385 msgid "The chosen directory cannot be written to. Please select another one." msgstr "½Õ ÜÞÓã ߨáÐâì Ò ÒëÑàÐÝÝãî ÔØàÕÚâÞàØî. ¿ÞÖÐÛãÙáâÐ, ãÚÐÖØâÕ ÔàãÓãî." -#: gui/options.cpp:1376 +#: gui/options.cpp:1394 msgid "Select directory for GUI themes" msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî ÔÛï âÕÜ GUI" -#: gui/options.cpp:1386 +#: gui/options.cpp:1404 msgid "Select directory for extra files" msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî á ÔÞßÞÛÝØâÕÛìÝëÜØ äÐÙÛÐÜØ" -#: gui/options.cpp:1397 +#: gui/options.cpp:1415 msgid "Select directory for plugins" msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî á ßÛÐÓØÝÐÜØ" -#: gui/options.cpp:1450 +#: gui/options.cpp:1468 msgid "" "The theme you selected does not support your current language. If you want " "to use this theme you need to switch to another language first." @@ -925,71 +943,71 @@ msgstr "" "ÂÕÜÐ, ÒëÑàÐÝÝÐï ÒÐÜØ, ÝÕ ßÞÔÔÕàÖØÒÐÕâ âÕÚãéØÙ ï×ëÚ. µáÛØ Òë åÞâØâÕ " "ØáßÞÛì×ÞÒÐâì íâã âÕÜã, ÒÐÜ ÝÕÞÑåÞÔØÜÞ áÝÐçÐÛÐ ßÕàÕÚÛîçØâìáï ÝÐ ÔàãÓÞÙ ï×ëÚ." -#: gui/saveload-dialog.cpp:158 +#: gui/saveload-dialog.cpp:166 msgid "List view" msgstr "²ØÔ áߨáÚÐ" -#: gui/saveload-dialog.cpp:159 +#: gui/saveload-dialog.cpp:167 msgid "Grid view" msgstr "²ØÔ áÕâÚØ" -#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 +#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358 msgid "No date saved" msgstr "´ÐâÐ ÝÕ ×ÐߨáÐÝÐ" -#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359 msgid "No time saved" msgstr "²àÕÜï ÝÕ ×ÐߨáÐÝÞ" -#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 +#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360 msgid "No playtime saved" msgstr "²àÕÜï ØÓàë ÝÕ ×ÐߨáÐÝÞ" -#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275 msgid "Delete" msgstr "ÃÔÐÛØâì" -#: gui/saveload-dialog.cpp:266 +#: gui/saveload-dialog.cpp:274 msgid "Do you really want to delete this savegame?" msgstr "²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ãÔÐÛØâì íâÞ áÞåàÐÝÕÝØÕ?" -#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 +#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872 msgid "Date: " msgstr "´ÐâÐ: " -#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 +#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878 msgid "Time: " msgstr "²àÕÜï: " -#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 +#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886 msgid "Playtime: " msgstr "²àÕÜï ØÓàë: " -#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 +#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494 msgid "Untitled savestate" msgstr "ÁÞåàÐÝÕÝØÕ ÑÕ× ØÜÕÝØ" -#: gui/saveload-dialog.cpp:517 +#: gui/saveload-dialog.cpp:546 msgid "Next" msgstr "ÁÛÕÔãîéØÙ" -#: gui/saveload-dialog.cpp:520 +#: gui/saveload-dialog.cpp:549 msgid "Prev" msgstr "¿àÕÔëÔãéØÙ" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 msgid "New Save" msgstr "½ÞÒÞÕ áÞåàÐÝÕÝØÕ" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 msgid "Create a new save game" msgstr "ÁÞ×ÔÐâì ÝÞÒãî ×Ðߨáì ØÓàë" -#: gui/saveload-dialog.cpp:789 +#: gui/saveload-dialog.cpp:865 msgid "Name: " msgstr "½Ð×ÒÐÝØÕ: " -#: gui/saveload-dialog.cpp:861 +#: gui/saveload-dialog.cpp:937 #, c-format msgid "Enter a description for slot %d:" msgstr "²ÒÕÔØâÕ ÞߨáÐÝØÕ áÛÞâÐ %d:" @@ -1027,35 +1045,35 @@ msgstr "ÀÐáâÕàØ×ÐâÞà áÞ áÓÛÐÖØÒÐÝØÕÜ (16bpp)" msgid "Clear value" msgstr "¾çØáâØâì ×ÝÐçÕÝØÕ" -#: base/main.cpp:209 +#: base/main.cpp:210 #, c-format msgid "Engine does not support debug level '%s'" msgstr "´ÒØÖÞÚ ÝÕ ßÞÔÔÕàÖØÒÐÕâ ãàÞÒÕÝì ÞâÛÐÔÚØ '%s'" -#: base/main.cpp:287 +#: base/main.cpp:288 msgid "Menu" msgstr "¼ÕÝî" -#: base/main.cpp:290 backends/platform/symbian/src/SymbianActions.cpp:45 +#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:45 #: backends/platform/wince/CEActionsSmartphone.cpp:46 msgid "Skip" msgstr "¿àÞßãáâØâì" -#: base/main.cpp:293 backends/platform/symbian/src/SymbianActions.cpp:50 +#: base/main.cpp:294 backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:42 msgid "Pause" msgstr "¿Ðã×Ð" -#: base/main.cpp:296 +#: base/main.cpp:297 msgid "Skip line" msgstr "¿àÞßãáâØâì áâàÞÚã" -#: base/main.cpp:467 +#: base/main.cpp:468 msgid "Error running game:" msgstr "¾èØÑÚÐ ×ÐßãáÚÐ ØÓàë:" -#: base/main.cpp:491 +#: base/main.cpp:492 msgid "Could not find any engine capable of running the selected game" msgstr "½Õ ÜÞÓã ÝÐÙâØ ÔÒØÖÞÚ ÔÛï ×ÐßãáÚÐ ÒëÑàÐÝÝÞÙ ØÓàë" @@ -1171,13 +1189,16 @@ msgid "~R~eturn to Launcher" msgstr "~²~ ÓÛÐÒÝÞÕ ÜÕÝî" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284 +#: engines/pegasus/pegasus.cpp:369 msgid "Save game:" msgstr "ÁÞåàÐÝØâì ØÓàã:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:369 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1207,12 +1228,12 @@ msgstr "" "ßÞÜÞéì." #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 -#: engines/mohawk/dialogs.cpp:174 +#: engines/mohawk/dialogs.cpp:170 msgid "~O~K" msgstr "~O~K" #: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 -#: engines/mohawk/dialogs.cpp:175 +#: engines/mohawk/dialogs.cpp:171 msgid "~C~ancel" msgstr "¾~â~ÜÕÝÐ" @@ -1220,23 +1241,23 @@ msgstr "¾~â~ÜÕÝÐ" msgid "~K~eys" msgstr "~º~ÛÐÒØèØ" -#: engines/engine.cpp:235 +#: engines/engine.cpp:240 msgid "Could not initialize color format." msgstr "½Õ ÜÞÓã ØÝØæØÐÛØ×ØàÞÒÐâì äÞàÜÐâ æÒÕâÐ." -#: engines/engine.cpp:243 +#: engines/engine.cpp:248 msgid "Could not switch to video mode: '" msgstr "½Õ ãÔÐÛÞáì ßÕàÕÚÛîçØâì ÒØÔÕÞàÕÖØÜ: '" -#: engines/engine.cpp:252 +#: engines/engine.cpp:257 msgid "Could not apply aspect ratio setting." msgstr "½Õ ãÔÐÛÞáì ØáßÞÛì×ÞÒÐâì ÚÞààÕÚæØî áÞÞâÝÞèÕÝØï áâÞàÞÝ." -#: engines/engine.cpp:257 +#: engines/engine.cpp:262 msgid "Could not apply fullscreen setting." msgstr "½Õ ÜÞÓã ßàØÜÕÝØâì ßÞÛÝÞíÚàÐÝÝëÙ àÕÖØÜ." -#: engines/engine.cpp:357 +#: engines/engine.cpp:362 msgid "" "You appear to be playing this game directly\n" "from the CD. This is known to cause problems,\n" @@ -1250,7 +1271,7 @@ msgstr "" "ÝÐ ÖñáâÚØÙ ÔØáÚ. ¿ÞÔàÞÑÝÞáâØ ÜÞÖÝÞ ÝÐÙâØ Ò\n" "äÐÙÛÕ README." -#: engines/engine.cpp:368 +#: engines/engine.cpp:373 msgid "" "This game has audio tracks in its disk. These\n" "tracks need to be ripped from the disk using\n" @@ -1265,7 +1286,7 @@ msgstr "" "ßÞïÒØâáï Üã×ëÚÐ. ¿ÞÔàÞÑÝÞáâØ ÜÞÖÝÞ ÝÐÙâØ Ò\n" "äÐÙÛÕ README." -#: engines/engine.cpp:426 +#: engines/engine.cpp:431 #, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " @@ -1275,7 +1296,7 @@ msgstr "" "README ×Ð ÑÐ×ÞÒÞÙ ØÝäÞàÜÐæØÕÙ, Ð âÐÚÖÕ ØÝáâàãÚæØïÜØ Þ âÞÜ, ÚÐÚ ßÞÛãçØâì " "ÔÐÛìÝÕÙèãî ßÞÜÞéì." -#: engines/engine.cpp:439 +#: engines/engine.cpp:444 msgid "" "WARNING: The game you are about to start is not yet fully supported by " "ScummVM. As such, it is likely to be unstable, and any saves you make might " @@ -1285,30 +1306,52 @@ msgstr "" "ScummVM ßÞÛÝÞáâìî. ¾ÝÐ áÚÞàÕÕ ÒáÕÓÞ ÝÕ ÑãÔÕâ àÐÑÞâÐâì áâÐÑØÛìÝÞ, Ø " "áÞåàÐÝÕÝØï ØÓà ÜÞÓãâ ÝÕ àÐÑÞâÐâì Ò ÑãÔãéØå ÒÕàáØïå ScummVM." -#: engines/engine.cpp:442 +#: engines/engine.cpp:447 msgid "Start anyway" msgstr "²áñ àÐÒÝÞ ×ÐßãáâØâì" -#: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 -#: engines/sci/detection.cpp:390 +#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270 +#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393 +#: engines/toltecs/detection.cpp:173 msgid "Use original save/load screens" msgstr "¸áßÞÛì×ÞÒÐâì ÞàØÓØÝÐÛìÝëÕ íÚàÐÝë ×ÐߨáØ/çâÕÝØï ØÓàë" -#: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 -#: engines/sci/detection.cpp:391 +#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271 +#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394 +#: engines/toltecs/detection.cpp:174 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" "¸áßÞÛì×ÞÒÐâì ÞàØÓØÝÐÛìÝëÕ íÚàÐÝë ×ÐßØáØ Ø áÞåàÐÝÕÝØï ØÓàë ÒÜÕáâÞ áÔÕÛÐÝÝëå Ò " "ScummVM" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore game:" msgstr "²ÞááâÐÝÞÒØâì ØÓàã:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore" msgstr "²ÞááâÐÝÞÒØâì" +#: engines/drascula/saveload.cpp:49 +#, fuzzy +msgid "" +"ScummVM found that you have old savefiles for Drascula that should be " +"converted.\n" +"The old save game format is no longer supported, so you will not be able to " +"load your games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" +msgstr "" +"ScummVM ÞÑÝÐàãÖØÛ ã ÒÐá áÞåàÐÝÕÝØï ØÓàë ÁÛÞÜÐÝÝëÙ ¼Õç Ò áâÐàÞÜ äÞàÜÐâÕ.\n" +"ÁâÐàëÙ äÞàÜÐâ ÑÞÛìèÕ ÝÕ ßÞÔÔÕàÖØÒÐÕâáï, Ø çâÞÑë ×ÐÓàãרâì áÞåàÐÝÕÝØï, ÞÝØ " +"ÔÞÛÖÝë Ñëâì ßÕàÕÒÕÔÕÝë Ò ÝÞÒëÙ äÞàÜÐâ.\n" +"\n" +"½ÐÖÜØâÕ ¾º, çâÞÑë ßÕàÕÒÕáâØ Øå Ò ÝÞÒëÙ äÞàÜÐâ áÕÙçÐá, Ò ßàÞâØÒÝÞÜ áÛãçÐÕ íâÞ " +"áÞÞÑéÕÝØÕ ßÞïÒØâáï áÝÞÒÐ ßàØ áÛÕÔãîéÕÜ ×ÐßãáÚÕ ØÓàë.\n" + #: engines/dreamweb/detection.cpp:57 msgid "Use bright palette mode" msgstr "¸áßÞÛì×ÞÒÐâì àÕÖØÜ ïàÚÞÙ ßÐÛØâàë" @@ -1317,28 +1360,28 @@ msgstr "¸áßÞÛì×ÞÒÐâì àÕÖØÜ ïàÚÞÙ ßÐÛØâàë" msgid "Display graphics using the game's bright palette" msgstr "ÀØáãÕâ ÓàÐäØÚã á ØáßÞÛì×ÞÒÐÝØÕÜ ïàÚÞÙ ßÐÛØâàë ØÓàë" -#: engines/sci/detection.cpp:370 +#: engines/sci/detection.cpp:373 msgid "EGA undithering" msgstr "EGA ÑÕ× àÐáâàÐ" -#: engines/sci/detection.cpp:371 +#: engines/sci/detection.cpp:374 msgid "Enable undithering in EGA games" msgstr "²ÚÛîçÐÕâ àÕÖØÜ ÑÕ× àÐáâàØàÞÒÐÝØï Ò EGA ØÓàÐå" -#: engines/sci/detection.cpp:380 +#: engines/sci/detection.cpp:383 msgid "Prefer digital sound effects" msgstr "¿àÕÔßÞçØâÐâì æØäàÞÒëÕ ×ÒãÚÞÒëÕ íääÕÚâë" -#: engines/sci/detection.cpp:381 +#: engines/sci/detection.cpp:384 msgid "Prefer digital sound effects instead of synthesized ones" msgstr "" "¾âÔÐÒÐâì ßàÕÔßÞçâÕÝØÕ æØäàÞÒëÜ ×ÒãÚÞÒëÜ íääÕÚâÐÜ ÒÜÕáâÞ áØÝâÕרàÞÒÐÝÝëå" -#: engines/sci/detection.cpp:400 +#: engines/sci/detection.cpp:403 msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "¸áßÞÛì×ÞÒÐâì IMF/Yamaha FB-01 ÔÛï ÒëÒÞÔÐ MIDI" -#: engines/sci/detection.cpp:401 +#: engines/sci/detection.cpp:404 msgid "" "Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" @@ -1346,32 +1389,32 @@ msgstr "" "¸áßÞÛì×ÒÞÒÐâì ×ÒãÚÞÒãî ÚÐàâÚã IBM Music Feature ØÛØ ÜÞÔãÛì áØÝâÕ×Ð Yamaha " "FB-01 FM ÔÛï MIDI" -#: engines/sci/detection.cpp:411 +#: engines/sci/detection.cpp:414 msgid "Use CD audio" msgstr "¸áßÞÛì×ÞÒÐâì CD ÐãÔØÞ" -#: engines/sci/detection.cpp:412 +#: engines/sci/detection.cpp:415 msgid "Use CD audio instead of in-game audio, if available" msgstr "" "¸áßÞÛì×ÞÒÐâì ×ÒãÚÞÒëÕ ÔÞàÞÖÚØ á CD ÒÜÕáâÞ Üã×ëÚØ Ø× äÐÙÛÞÒ ØÓàë (ÕáÛØ " "ÔÞáâãßÝÞ)" -#: engines/sci/detection.cpp:422 +#: engines/sci/detection.cpp:425 msgid "Use Windows cursors" msgstr "¸áßÞÛì×ÞÒÐâì ÚãàáÞàë Windows" -#: engines/sci/detection.cpp:423 +#: engines/sci/detection.cpp:426 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "" "¸áßÞÛì×ÞÒÐâì ÚãàáÞàë Windows (ÜÕÝìèØÕ ßÞ àÐ×ÜÕàã Ø ÞÔÝÞæÒÕâÝëÕ) ÒÜÕáâÞ " "ÚãàáÞàÞÒ DOS" -#: engines/sci/detection.cpp:433 +#: engines/sci/detection.cpp:436 msgid "Use silver cursors" msgstr "¸áßÞÛì×ÞÒÐâì áÕàÕÑàïÝÝëÕ ÚãàáÞàë" -#: engines/sci/detection.cpp:434 +#: engines/sci/detection.cpp:437 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "" @@ -2024,7 +2067,7 @@ msgstr "»ÕâÕâì ÒßàÐÒÞ" msgid "Fly to lower right" msgstr "»ÕâÕâì ÒßàÐÒÞ-ÒÝØ×" -#: engines/scumm/scumm.cpp:1773 +#: engines/scumm/scumm.cpp:1776 #, c-format msgid "" "Native MIDI support requires the Roland Upgrade from LucasArts,\n" @@ -2033,7 +2076,7 @@ msgstr "" "ÀÕÖØÜ \"àÞÔÝÞÓÞ\" MIDI âàÕÑãÕâ ÞÑÝÞÒÛÕÝØÕ Roland Upgrade Þâ\n" "LucasArts, ÝÞ ÝÕ åÒÐâÐÕâ %s. ¿ÕàÕÚÛîçÐîáì ÝÐ AdLib." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 +#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2044,7 +2087,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 +#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2055,7 +2098,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 +#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2066,7 +2109,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2512 +#: engines/scumm/scumm.cpp:2537 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2077,7 +2120,7 @@ msgstr "" "ÒëÑÕàØâÕ ÔØàÕÚâÞàØî Maniac ÒÝãâàØ ÔØàÕÚâÞàØØ á ØÓàÞÙ Tentacle." #. I18N: Option for fast scene switching -#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171 +#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167 msgid "~Z~ip Mode Activated" msgstr "ÀÕÖØÜ ÑëáâàÞÓÞ ßÕàÕåÞÔÐ ÐÚâØÒØàÞÒÐÝ" @@ -2098,11 +2141,11 @@ msgstr "¿ÞÚÐ×Ðâì ÚÐàâã" msgid "~M~ain Menu" msgstr "³ÛÐÒÝÞÕ ÜÕÝî" -#: engines/mohawk/dialogs.cpp:172 +#: engines/mohawk/dialogs.cpp:168 msgid "~W~ater Effect Enabled" msgstr "ÍääÕÚâë ÒÞÔë ÒÚÛîçÕÝë" -#: engines/agos/animation.cpp:560 +#: engines/agos/animation.cpp:557 #, c-format msgid "Cutscene file '%s' not found!" msgstr "ÄÐÙÛ ×ÐáâÐÒÚØ '%s' ÝÕ ÝÐÙÔÕÝ!" @@ -2120,6 +2163,15 @@ msgstr "½Õ ãÔÐÛÞáì áÞåàÐÝØâì ØÓàã Ò äÐÙÛ." msgid "Failed to delete file." msgstr "½Õ ãÔÐÛÞáì ãÔÐÛØâì äÐÙÛ." +#: engines/groovie/detection.cpp:312 +#, fuzzy +msgid "Fast movie speed" +msgstr "±ëáâàëÙ àÕÖØÜ" + +#: engines/groovie/detection.cpp:313 +msgid "Play movies at an increased speed" +msgstr "" + #: engines/groovie/script.cpp:420 msgid "Failed to save game" msgstr "½Õ ãÔÐÛÞáì áÞåàÐÝØâì ØÓàã" @@ -2210,11 +2262,11 @@ msgstr "ÁÚÞÛìרâì ÒÛÕÒÞ" msgid "Slide Right" msgstr "ÁÚÞÛìרâì ÒßàÐÒÞ" -#: engines/kyra/lol.cpp:485 +#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2412 msgid "Turn Left" msgstr "¿ÞÒÞàÞâ ÝÐÛÕÒÞ" -#: engines/kyra/lol.cpp:486 +#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2413 msgid "Turn Right" msgstr "¿ÞÒÞàÞâ ÝÐßàÐÒÞ" @@ -2230,7 +2282,7 @@ msgstr "¾ßæØØ" msgid "Choose Spell" msgstr "²ëÑàÐâì ×ÐÚÛØÝÐÝØÕ" -#: engines/kyra/sound_midi.cpp:475 +#: engines/kyra/sound_midi.cpp:477 msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2277,26 +2329,26 @@ msgstr "²áâãßÛÕÝØÕ á äÛÞßߨÚÞÒ" msgid "Use the floppy version's intro (CD version only)" msgstr "¸áßÞÛì×ÞÒÐâì ÒáâãßÛÕÝØÕ á ÓØÑÚØå ÔØáÚÞÒ (âÞÛìÚÞ ÔÛï CD ÒÕàáØØ ØÓàë)" -#: engines/sword1/animation.cpp:539 +#: engines/sword1/animation.cpp:519 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "·ÐáâÐÒÚÐ PSX '%s' ÝÕ ÜÞÖÕâ Ñëâì ßàÞØÓàÐÝÐ Ò àÕÖØÜÕ á ßÐÛØâàÞÙ" -#: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 +#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439 msgid "DXA cutscenes found but ScummVM has been built without zlib support" msgstr "" "½ÐÙÔÕÝë ×ÐáâÐÒÚØ Ò äÞàÜÐâÕ DXA, ÝÞ ScummVM ÑëÛ áÞÑàÐÝ ÑÕ× ßÞÔÔÕàÖÚØ zlib" -#: engines/sword1/animation.cpp:570 engines/sword2/animation.cpp:465 +#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449 msgid "MPEG2 cutscenes are no longer supported" msgstr "·ÐáâÐÒÚØ Ò äÞàÜÐâÕ MPEG2 ÑÞÛìèÕ ÝÕ ßÞÔÔÕàÖØÒÐîâáï" -#: engines/sword1/animation.cpp:576 engines/sword2/animation.cpp:473 +#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457 #, c-format msgid "Cutscene '%s' not found" msgstr "·ÐáâÐÒÚÐ '%s' ÝÕ ÝÐÙÔÕÝÐ" -#: engines/sword1/control.cpp:863 +#: engines/sword1/control.cpp:865 msgid "" "ScummVM found that you have old savefiles for Broken Sword 1 that should be " "converted.\n" @@ -2313,7 +2365,7 @@ msgstr "" "½ÐÖÜØâÕ ¾º, çâÞÑë ßÕàÕÒÕáâØ Øå Ò ÝÞÒëÙ äÞàÜÐâ áÕÙçÐá, Ò ßàÞâØÒÝÞÜ áÛãçÐÕ íâÞ " "áÞÞÑéÕÝØÕ ßÞïÒØâáï áÝÞÒÐ ßàØ áÛÕÔãîéÕÜ ×ÐßãáÚÕ ØÓàë.\n" -#: engines/sword1/control.cpp:1232 +#: engines/sword1/control.cpp:1234 #, c-format msgid "" "Target new save game already exists!\n" @@ -2322,11 +2374,11 @@ msgstr "" "ÁÞåàÐÝÕÝØÕ ØÓàë á âÐÚØÜ ØÜÕÝÕÜ ãÖÕ áãéÕáâÒãÕâ!\n" "²ë åÞâØâÕ ÞáâÐÒØâì áâÐàÞÕ ÝÐ×ÒÐÝØÕ (%s) ØÛØ áÔÕÛÐâì ÝÞÒÞÕ (%s)?\n" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the old one" msgstr "¾áâÐÒØâì áâÐàÞÕ" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the new one" msgstr "ÁÔÕÛÐâì ÝÞÒÞÕ" @@ -2334,7 +2386,7 @@ msgstr "ÁÔÕÛÐâì ÝÞÒÞÕ" msgid "This is the end of the Broken Sword 1 Demo" msgstr "ÍâÞ ×ÐÒÕàèÕÝØÕ ÔÕÜÞ ÁÛÞÜÐÝÝÞÓÞ ¼ÕçÐ 1" -#: engines/sword2/animation.cpp:435 +#: engines/sword2/animation.cpp:419 msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" @@ -2349,13 +2401,13 @@ msgstr "¿ÞÚÐ×ëÒÐâì ÝÐ×ÒÐÝØï ÞÑêÕÚâÞÒ" msgid "Show labels for objects on mouse hover" msgstr "¿ÞÚÐ×ëÒÐÕâ ÝÐ×ÒÐÝØï ÞÑêÕÚâÞÒ ßà ØÝÐÒÕÔÕÝØØ ÚãàáÞàÐ ÜëèØ" -#: engines/teenagent/resources.cpp:68 +#: engines/teenagent/resources.cpp:94 msgid "" "You're missing the 'teenagent.dat' file. Get it from the ScummVM website" msgstr "" "à ÒÐá ÞâáãâáâÒãÕâ äÐÙÛ 'teenagent.dat'. ÁÚÐçÐÙâÕ ÕÓÞ á ÒÕÑ-áÐÙâÐ ScummVM" -#: engines/teenagent/resources.cpp:89 +#: engines/teenagent/resources.cpp:115 msgid "" "The teenagent.dat file is compressed and zlib hasn't been included in this " "executable. Please decompress it" @@ -2412,6 +2464,47 @@ msgstr "" "\n" "¿ÞÖÐÛãÙáâÐ, áÞÞÑéØâÕ ÞÑ íâÞÜ ÚÞÜÐÝÔÕ ScummVM." +#: engines/pegasus/pegasus.cpp:675 +msgid "Invalid save file name" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2410 +msgid "Up/Zoom In/Move Forward/Open Doors" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2411 +#, fuzzy +msgid "Down/Zoom Out" +msgstr "ÃÒÕÛ. ÜÐáèâÐÑ" + +#: engines/pegasus/pegasus.cpp:2414 +msgid "Display/Hide Inventory Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2415 +msgid "Display/Hide Biochip Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2416 +msgid "Action/Select" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2417 +msgid "Toggle Center Data Display" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2418 +msgid "Display/Hide Info Screen" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2419 +msgid "Display/Hide Pause Menu" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2420 +msgid "???" +msgstr "" + #: audio/fmopl.cpp:49 msgid "MAME OPL emulator" msgstr "ÍÜãÛïâÞà MAME OPL" @@ -2469,7 +2562,7 @@ msgstr "±Õ× Üã×ëÚØ" msgid "Amiga Audio Emulator" msgstr "ÍÜãÛïâÞà ×ÒãÚÐ Amiga" -#: audio/softsynth/adlib.cpp:1593 +#: audio/softsynth/adlib.cpp:2284 msgid "AdLib Emulator" msgstr "ÍÜãÛïâÞà AdLib" @@ -2481,11 +2574,11 @@ msgstr "ÍÜãÛïâÞà Apple II GS (ÞâáãâáâÒãÕâ)" msgid "C64 Audio Emulator" msgstr "ÍÜãÛïâÞà ×ÒãÚÐ C64" -#: audio/softsynth/mt32.cpp:293 +#: audio/softsynth/mt32.cpp:205 msgid "Initializing MT-32 Emulator" msgstr "½ÐáâàÐØÒÐî íÜãÛïâÞà MT-32" -#: audio/softsynth/mt32.cpp:512 +#: audio/softsynth/mt32.cpp:431 msgid "MT-32 Emulator" msgstr "ÍÜãÛïâÞà MT-32" @@ -2636,24 +2729,24 @@ msgstr "ÁàÕÔÝØÙ éÕÛçÞÚ" msgid "Right Click" msgstr "¿àÐÒëÙ éÕÛçÞÚ" -#: backends/platform/sdl/macosx/appmenu_osx.mm:78 +#: backends/platform/sdl/macosx/appmenu_osx.mm:77 msgid "Hide ScummVM" msgstr "ÁÚàëâì ScummVM" -#: backends/platform/sdl/macosx/appmenu_osx.mm:83 +#: backends/platform/sdl/macosx/appmenu_osx.mm:82 msgid "Hide Others" msgstr "ÁÚàëâì ÞáâÐÛìÝëÕ" -#: backends/platform/sdl/macosx/appmenu_osx.mm:88 +#: backends/platform/sdl/macosx/appmenu_osx.mm:87 msgid "Show All" msgstr "¿ÞÚÐ×Ðâì ÒáÕ" -#: backends/platform/sdl/macosx/appmenu_osx.mm:110 -#: backends/platform/sdl/macosx/appmenu_osx.mm:121 +#: backends/platform/sdl/macosx/appmenu_osx.mm:109 +#: backends/platform/sdl/macosx/appmenu_osx.mm:120 msgid "Window" msgstr "¾ÚÝÞ" -#: backends/platform/sdl/macosx/appmenu_osx.mm:115 +#: backends/platform/sdl/macosx/appmenu_osx.mm:114 msgid "Minimize" msgstr "ÃÑàÐâì Ò Dock" @@ -2667,12 +2760,12 @@ msgid "Normal (no scaling)" msgstr "±Õ× ãÒÕÛØçÕÝØï" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537 msgid "Enabled aspect ratio correction" msgstr "ºÞààÕÚæØï áÞÞâÝÞèÕÝØï áâÞàÞÝ ÒÚÛîçÕÝÐ" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542 msgid "Disabled aspect ratio correction" msgstr "ºÞààÕÚæØï áÞÞâÝÞèÕÝØï áâÞàÞÝ ÒëÚÛîçÕÝÐ" @@ -2681,7 +2774,7 @@ msgid "Active graphics filter:" msgstr "°ÚâØÒÝëÙ ÓàÐäØçÕáÚØÙ äØÛìâà:" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481 msgid "Windowed mode" msgstr "¾ÚÞÝÝëÙ àÕÖØÜ" @@ -2705,11 +2798,11 @@ msgstr "ÂÕÚãéØÙ ÒØÔÕÞàÕÖØÜ" msgid "Current scale" msgstr "ÂÕÚãéØÙ ÜÐáèâÐÑ" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:558 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562 msgid "Active filter mode: Linear" msgstr "°ÚâØÒÝëÙ àÕÖØÜ äØÛìâàÐ: »ØÝÕÙÝëÙ" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:560 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564 msgid "Active filter mode: Nearest" msgstr "°ÚâØÒÝëÙ àÕÖØÜ äØÛìâàÐ: ±ÛØÖÐÙèØÙ" @@ -3033,19 +3126,19 @@ msgstr "²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ÒëÙâØ?" #: backends/events/gph/gph-events.cpp:386 #: backends/events/gph/gph-events.cpp:429 -#: backends/events/openpandora/op-events.cpp:139 +#: backends/events/openpandora/op-events.cpp:168 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "ÀÕÖØÜ 'ÚÐáÐÝØÙ' âÐçáÚàØÝÐ - »ÕÒëÙ ÚÛØÚ" #: backends/events/gph/gph-events.cpp:388 #: backends/events/gph/gph-events.cpp:431 -#: backends/events/openpandora/op-events.cpp:141 +#: backends/events/openpandora/op-events.cpp:170 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "ÀÕÖØÜ 'ÚÐáÐÝØÙ' âÐçáÚàØÝÐ - ¿àÐÒëÙ ÚÛØÚ" #: backends/events/gph/gph-events.cpp:390 #: backends/events/gph/gph-events.cpp:433 -#: backends/events/openpandora/op-events.cpp:143 +#: backends/events/openpandora/op-events.cpp:172 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "ÀÕÖØÜ 'ÚÐáÐÝØÙ' âÐçáÚàØÝÐ - ¿àÞÛñâ (ÑÕ× ÚÛØÚÐ)" @@ -3065,7 +3158,12 @@ msgstr "¼ØÝØÜÐÛìÝÐï ÓàÞÜÚÞáâì" msgid "Decreasing Volume" msgstr "ÃÜÕÝìèÕÝØÕ ÓàÞÜÚÞáâØ" -#: backends/updates/macosx/macosx-updates.mm:65 +#: backends/events/openpandora/op-events.cpp:174 +#, fuzzy +msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)" +msgstr "ÀÕÖØÜ 'ÚÐáÐÝØÙ' âÐçáÚàØÝÐ - ¿àÞÛñâ (ÑÕ× ÚÛØÚÐ)" + +#: backends/updates/macosx/macosx-updates.mm:67 msgid "Check for Updates..." msgstr "¿àÞÒÕàïî ÞÑÝÞÒÛÕÝØï..." @@ -3101,6 +3199,9 @@ msgstr "ÉÕÛçÚØ ÒÚÛîçÕÝë" msgid "Clicking Disabled" msgstr "ÉÕÛçÚØ ÒëÚÛîçÕÝë" +#~ msgid "Enable Roland GS Mode" +#~ msgstr "²ÚÛîçØâì àÕÖØÜ Roland GS" + #~ msgid "Hercules Green" #~ msgstr "Hercules ·ÕÛñÝëÙ" diff --git a/po/scummvm.pot b/po/scummvm.pot index de270cef27..a8d35e9382 100644 --- a/po/scummvm.pot +++ b/po/scummvm.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.6.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-08-12 14:57+0200\n" +"POT-Creation-Date: 2013-02-07 23:11+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -17,45 +17,54 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: gui/about.cpp:91 +#: gui/about.cpp:93 #, c-format msgid "(built on %s)" msgstr "" -#: gui/about.cpp:98 +#: gui/about.cpp:100 msgid "Features compiled in:" msgstr "" -#: gui/about.cpp:107 +#: gui/about.cpp:109 msgid "Available engines:" msgstr "" -#: gui/browser.cpp:66 +#: gui/browser.cpp:67 +msgid "Show hidden files" +msgstr "" + +#: gui/browser.cpp:67 +msgid "Show files marked with the hidden attribute" +msgstr "" + +#: gui/browser.cpp:71 msgid "Go up" msgstr "" -#: gui/browser.cpp:66 gui/browser.cpp:68 +#: gui/browser.cpp:71 gui/browser.cpp:73 msgid "Go to previous directory level" msgstr "" -#: gui/browser.cpp:68 +#: gui/browser.cpp:73 msgctxt "lowres" msgid "Go up" msgstr "" -#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 -#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 -#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 -#: gui/themebrowser.cpp:54 engines/engine.cpp:442 -#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 +#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238 +#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275 +#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919 +#: gui/themebrowser.cpp:54 engines/engine.cpp:447 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:190 +#: engines/sword1/control.cpp:867 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" msgstr "" -#: gui/browser.cpp:70 gui/chooser.cpp:46 gui/themebrowser.cpp:55 +#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55 msgid "Choose" msgstr "" @@ -70,15 +79,15 @@ msgstr "" msgid "Mouse click" msgstr "" -#: gui/gui-manager.cpp:122 base/main.cpp:300 +#: gui/gui-manager.cpp:122 base/main.cpp:301 msgid "Display keyboard" msgstr "" -#: gui/gui-manager.cpp:126 base/main.cpp:304 +#: gui/gui-manager.cpp:126 base/main.cpp:305 msgid "Remap keys" msgstr "" -#: gui/gui-manager.cpp:129 base/main.cpp:307 +#: gui/gui-manager.cpp:129 base/main.cpp:308 msgid "Toggle FullScreen" msgstr "" @@ -91,17 +100,18 @@ msgid "Map" msgstr "" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 -#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 -#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 -#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 -#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 -#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 -#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 -#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 -#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 -#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 +#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239 +#: gui/saveload-dialog.cpp:920 engines/engine.cpp:366 engines/engine.cpp:377 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192 +#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558 +#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 +#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519 +#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550 +#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:867 +#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419 +#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449 +#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "" @@ -170,8 +180,8 @@ msgid "" "English" msgstr "" -#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:80 -#: gui/options.cpp:730 gui/options.cpp:743 gui/options.cpp:1199 +#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86 +#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209 #: audio/null.cpp:40 msgid "<default>" msgstr "" @@ -193,11 +203,11 @@ msgstr "" msgid "Engine" msgstr "" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "Graphics" msgstr "" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "GFX" msgstr "" @@ -210,7 +220,7 @@ msgctxt "lowres" msgid "Override global graphic settings" msgstr "" -#: gui/launcher.cpp:251 gui/options.cpp:1085 +#: gui/launcher.cpp:251 gui/options.cpp:1095 msgid "Audio" msgstr "" @@ -223,11 +233,11 @@ msgctxt "lowres" msgid "Override global audio settings" msgstr "" -#: gui/launcher.cpp:265 gui/options.cpp:1090 +#: gui/launcher.cpp:265 gui/options.cpp:1100 msgid "Volume" msgstr "" -#: gui/launcher.cpp:267 gui/options.cpp:1092 +#: gui/launcher.cpp:267 gui/options.cpp:1102 msgctxt "lowres" msgid "Volume" msgstr "" @@ -241,7 +251,7 @@ msgctxt "lowres" msgid "Override global volume settings" msgstr "" -#: gui/launcher.cpp:280 gui/options.cpp:1100 +#: gui/launcher.cpp:280 gui/options.cpp:1110 msgid "MIDI" msgstr "" @@ -254,7 +264,7 @@ msgctxt "lowres" msgid "Override global MIDI settings" msgstr "" -#: gui/launcher.cpp:294 gui/options.cpp:1106 +#: gui/launcher.cpp:294 gui/options.cpp:1116 msgid "MT-32" msgstr "" @@ -267,11 +277,11 @@ msgctxt "lowres" msgid "Override global MT-32 settings" msgstr "" -#: gui/launcher.cpp:308 gui/options.cpp:1113 +#: gui/launcher.cpp:308 gui/options.cpp:1123 msgid "Paths" msgstr "" -#: gui/launcher.cpp:310 gui/options.cpp:1115 +#: gui/launcher.cpp:310 gui/options.cpp:1125 msgctxt "lowres" msgid "Paths" msgstr "" @@ -285,7 +295,7 @@ msgctxt "lowres" msgid "Game Path:" msgstr "" -#: gui/launcher.cpp:324 gui/options.cpp:1139 +#: gui/launcher.cpp:324 gui/options.cpp:1149 msgid "Extra Path:" msgstr "" @@ -293,42 +303,42 @@ msgstr "" msgid "Specifies path to additional data used the game" msgstr "" -#: gui/launcher.cpp:326 gui/options.cpp:1141 +#: gui/launcher.cpp:326 gui/options.cpp:1151 msgctxt "lowres" msgid "Extra Path:" msgstr "" -#: gui/launcher.cpp:333 gui/options.cpp:1123 +#: gui/launcher.cpp:333 gui/options.cpp:1133 msgid "Save Path:" msgstr "" #: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 -#: gui/options.cpp:1123 gui/options.cpp:1125 gui/options.cpp:1126 +#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136 msgid "Specifies where your savegames are put" msgstr "" -#: gui/launcher.cpp:335 gui/options.cpp:1125 +#: gui/launcher.cpp:335 gui/options.cpp:1135 msgctxt "lowres" msgid "Save Path:" msgstr "" #: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 -#: gui/launcher.cpp:565 gui/options.cpp:1134 gui/options.cpp:1142 -#: gui/options.cpp:1151 gui/options.cpp:1258 gui/options.cpp:1264 -#: gui/options.cpp:1272 gui/options.cpp:1302 gui/options.cpp:1308 -#: gui/options.cpp:1315 gui/options.cpp:1408 gui/options.cpp:1411 -#: gui/options.cpp:1423 +#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152 +#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282 +#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326 +#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429 +#: gui/options.cpp:1441 msgctxt "path" msgid "None" msgstr "" #: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 -#: gui/options.cpp:1252 gui/options.cpp:1296 gui/options.cpp:1414 +#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "" -#: gui/launcher.cpp:504 gui/options.cpp:1417 +#: gui/launcher.cpp:504 gui/options.cpp:1435 msgid "Select SoundFont" msgstr "" @@ -352,7 +362,7 @@ msgstr "" msgid "~Q~uit" msgstr "" -#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:96 +#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95 msgid "Quit ScummVM" msgstr "" @@ -360,7 +370,7 @@ msgstr "" msgid "A~b~out..." msgstr "" -#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:70 +#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69 msgid "About ScummVM" msgstr "" @@ -437,12 +447,14 @@ msgstr "" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 +#: engines/pegasus/pegasus.cpp:345 msgid "Load game:" msgstr "" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:345 +#: backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "" @@ -525,451 +537,455 @@ msgstr "" msgid "Discovered %d new games, ignored %d previously added games ..." msgstr "" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "Never" msgstr "" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 5 mins" msgstr "" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 10 mins" msgstr "" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 15 mins" msgstr "" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 30 mins" msgstr "" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "8 kHz" msgstr "" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "11kHz" msgstr "" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "22 kHz" msgstr "" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "44 kHz" msgstr "" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "48 kHz" msgstr "" -#: gui/options.cpp:248 gui/options.cpp:474 gui/options.cpp:575 -#: gui/options.cpp:644 gui/options.cpp:852 +#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581 +#: gui/options.cpp:650 gui/options.cpp:858 msgctxt "soundfont" msgid "None" msgstr "" -#: gui/options.cpp:382 +#: gui/options.cpp:388 msgid "Failed to apply some of the graphic options changes:" msgstr "" -#: gui/options.cpp:394 +#: gui/options.cpp:400 msgid "the video mode could not be changed." msgstr "" -#: gui/options.cpp:400 +#: gui/options.cpp:406 msgid "the fullscreen setting could not be changed" msgstr "" -#: gui/options.cpp:406 +#: gui/options.cpp:412 msgid "the aspect ratio setting could not be changed" msgstr "" -#: gui/options.cpp:727 +#: gui/options.cpp:733 msgid "Graphics mode:" msgstr "" -#: gui/options.cpp:741 +#: gui/options.cpp:747 msgid "Render mode:" msgstr "" -#: gui/options.cpp:741 gui/options.cpp:742 +#: gui/options.cpp:747 gui/options.cpp:748 msgid "Special dithering modes supported by some games" msgstr "" -#: gui/options.cpp:753 +#: gui/options.cpp:759 #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476 msgid "Fullscreen mode" msgstr "" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Aspect ratio correction" msgstr "" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Correct aspect ratio for 320x200 games" msgstr "" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Preferred Device:" msgstr "" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Music Device:" msgstr "" -#: gui/options.cpp:764 gui/options.cpp:766 +#: gui/options.cpp:770 gui/options.cpp:772 msgid "Specifies preferred sound device or sound card emulator" msgstr "" -#: gui/options.cpp:764 gui/options.cpp:766 gui/options.cpp:767 +#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773 msgid "Specifies output sound device or sound card emulator" msgstr "" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Preferred Dev.:" msgstr "" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Music Device:" msgstr "" -#: gui/options.cpp:793 +#: gui/options.cpp:799 msgid "AdLib emulator:" msgstr "" -#: gui/options.cpp:793 gui/options.cpp:794 +#: gui/options.cpp:799 gui/options.cpp:800 msgid "AdLib is used for music in many games" msgstr "" -#: gui/options.cpp:804 +#: gui/options.cpp:810 msgid "Output rate:" msgstr "" -#: gui/options.cpp:804 gui/options.cpp:805 +#: gui/options.cpp:810 gui/options.cpp:811 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" msgstr "" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "GM Device:" msgstr "" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "Specifies default sound device for General MIDI output" msgstr "" -#: gui/options.cpp:826 +#: gui/options.cpp:832 msgid "Don't use General MIDI music" msgstr "" -#: gui/options.cpp:837 gui/options.cpp:899 +#: gui/options.cpp:843 gui/options.cpp:909 msgid "Use first available device" msgstr "" -#: gui/options.cpp:849 +#: gui/options.cpp:855 msgid "SoundFont:" msgstr "" -#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 +#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" -#: gui/options.cpp:851 +#: gui/options.cpp:857 msgctxt "lowres" msgid "SoundFont:" msgstr "" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Mixed AdLib/MIDI mode" msgstr "" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Use both MIDI and AdLib sound generation" msgstr "" -#: gui/options.cpp:860 +#: gui/options.cpp:866 msgid "MIDI gain:" msgstr "" -#: gui/options.cpp:870 +#: gui/options.cpp:873 +msgid "FluidSynth Settings" +msgstr "" + +#: gui/options.cpp:880 msgid "MT-32 Device:" msgstr "" -#: gui/options.cpp:870 +#: gui/options.cpp:880 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" -#: gui/options.cpp:875 +#: gui/options.cpp:885 msgid "True Roland MT-32 (disable GM emulation)" msgstr "" -#: gui/options.cpp:875 gui/options.cpp:877 +#: gui/options.cpp:885 gui/options.cpp:887 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" msgstr "" -#: gui/options.cpp:877 +#: gui/options.cpp:887 msgctxt "lowres" msgid "True Roland MT-32 (no GM emulation)" msgstr "" -#: gui/options.cpp:880 -msgid "Enable Roland GS Mode" +#: gui/options.cpp:890 +msgid "Roland GS Mode (disable GM mapping)" msgstr "" -#: gui/options.cpp:880 +#: gui/options.cpp:890 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" -#: gui/options.cpp:889 +#: gui/options.cpp:899 msgid "Don't use Roland MT-32 music" msgstr "" -#: gui/options.cpp:916 +#: gui/options.cpp:926 msgid "Text and Speech:" msgstr "" -#: gui/options.cpp:920 gui/options.cpp:930 +#: gui/options.cpp:930 gui/options.cpp:940 msgid "Speech" msgstr "" -#: gui/options.cpp:921 gui/options.cpp:931 +#: gui/options.cpp:931 gui/options.cpp:941 msgid "Subtitles" msgstr "" -#: gui/options.cpp:922 +#: gui/options.cpp:932 msgid "Both" msgstr "" -#: gui/options.cpp:924 +#: gui/options.cpp:934 msgid "Subtitle speed:" msgstr "" -#: gui/options.cpp:926 +#: gui/options.cpp:936 msgctxt "lowres" msgid "Text and Speech:" msgstr "" -#: gui/options.cpp:930 +#: gui/options.cpp:940 msgid "Spch" msgstr "" -#: gui/options.cpp:931 +#: gui/options.cpp:941 msgid "Subs" msgstr "" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgctxt "lowres" msgid "Both" msgstr "" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgid "Show subtitles and play speech" msgstr "" -#: gui/options.cpp:934 +#: gui/options.cpp:944 msgctxt "lowres" msgid "Subtitle speed:" msgstr "" -#: gui/options.cpp:950 +#: gui/options.cpp:960 msgid "Music volume:" msgstr "" -#: gui/options.cpp:952 +#: gui/options.cpp:962 msgctxt "lowres" msgid "Music volume:" msgstr "" -#: gui/options.cpp:959 +#: gui/options.cpp:969 msgid "Mute All" msgstr "" -#: gui/options.cpp:962 +#: gui/options.cpp:972 msgid "SFX volume:" msgstr "" -#: gui/options.cpp:962 gui/options.cpp:964 gui/options.cpp:965 +#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975 msgid "Special sound effects volume" msgstr "" -#: gui/options.cpp:964 +#: gui/options.cpp:974 msgctxt "lowres" msgid "SFX volume:" msgstr "" -#: gui/options.cpp:972 +#: gui/options.cpp:982 msgid "Speech volume:" msgstr "" -#: gui/options.cpp:974 +#: gui/options.cpp:984 msgctxt "lowres" msgid "Speech volume:" msgstr "" -#: gui/options.cpp:1131 +#: gui/options.cpp:1141 msgid "Theme Path:" msgstr "" -#: gui/options.cpp:1133 +#: gui/options.cpp:1143 msgctxt "lowres" msgid "Theme Path:" msgstr "" -#: gui/options.cpp:1139 gui/options.cpp:1141 gui/options.cpp:1142 +#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" -#: gui/options.cpp:1148 +#: gui/options.cpp:1158 msgid "Plugins Path:" msgstr "" -#: gui/options.cpp:1150 +#: gui/options.cpp:1160 msgctxt "lowres" msgid "Plugins Path:" msgstr "" -#: gui/options.cpp:1159 +#: gui/options.cpp:1169 msgid "Misc" msgstr "" -#: gui/options.cpp:1161 +#: gui/options.cpp:1171 msgctxt "lowres" msgid "Misc" msgstr "" -#: gui/options.cpp:1163 +#: gui/options.cpp:1173 msgid "Theme:" msgstr "" -#: gui/options.cpp:1167 +#: gui/options.cpp:1177 msgid "GUI Renderer:" msgstr "" -#: gui/options.cpp:1179 +#: gui/options.cpp:1189 msgid "Autosave:" msgstr "" -#: gui/options.cpp:1181 +#: gui/options.cpp:1191 msgctxt "lowres" msgid "Autosave:" msgstr "" -#: gui/options.cpp:1189 +#: gui/options.cpp:1199 msgid "Keys" msgstr "" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "GUI Language:" msgstr "" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "Language of ScummVM GUI" msgstr "" -#: gui/options.cpp:1347 +#: gui/options.cpp:1365 msgid "You have to restart ScummVM before your changes will take effect." msgstr "" -#: gui/options.cpp:1360 +#: gui/options.cpp:1378 msgid "Select directory for savegames" msgstr "" -#: gui/options.cpp:1367 +#: gui/options.cpp:1385 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" -#: gui/options.cpp:1376 +#: gui/options.cpp:1394 msgid "Select directory for GUI themes" msgstr "" -#: gui/options.cpp:1386 +#: gui/options.cpp:1404 msgid "Select directory for extra files" msgstr "" -#: gui/options.cpp:1397 +#: gui/options.cpp:1415 msgid "Select directory for plugins" msgstr "" -#: gui/options.cpp:1450 +#: gui/options.cpp:1468 msgid "" "The theme you selected does not support your current language. If you want " "to use this theme you need to switch to another language first." msgstr "" -#: gui/saveload-dialog.cpp:158 +#: gui/saveload-dialog.cpp:166 msgid "List view" msgstr "" -#: gui/saveload-dialog.cpp:159 +#: gui/saveload-dialog.cpp:167 msgid "Grid view" msgstr "" -#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 +#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358 msgid "No date saved" msgstr "" -#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359 msgid "No time saved" msgstr "" -#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 +#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360 msgid "No playtime saved" msgstr "" -#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275 msgid "Delete" msgstr "" -#: gui/saveload-dialog.cpp:266 +#: gui/saveload-dialog.cpp:274 msgid "Do you really want to delete this savegame?" msgstr "" -#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 +#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872 msgid "Date: " msgstr "" -#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 +#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878 msgid "Time: " msgstr "" -#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 +#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886 msgid "Playtime: " msgstr "" -#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 +#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494 msgid "Untitled savestate" msgstr "" -#: gui/saveload-dialog.cpp:517 +#: gui/saveload-dialog.cpp:546 msgid "Next" msgstr "" -#: gui/saveload-dialog.cpp:520 +#: gui/saveload-dialog.cpp:549 msgid "Prev" msgstr "" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 msgid "New Save" msgstr "" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 msgid "Create a new save game" msgstr "" -#: gui/saveload-dialog.cpp:789 +#: gui/saveload-dialog.cpp:865 msgid "Name: " msgstr "" -#: gui/saveload-dialog.cpp:861 +#: gui/saveload-dialog.cpp:937 #, c-format msgid "Enter a description for slot %d:" msgstr "" @@ -1007,35 +1023,35 @@ msgstr "" msgid "Clear value" msgstr "" -#: base/main.cpp:209 +#: base/main.cpp:210 #, c-format msgid "Engine does not support debug level '%s'" msgstr "" -#: base/main.cpp:287 +#: base/main.cpp:288 msgid "Menu" msgstr "" -#: base/main.cpp:290 backends/platform/symbian/src/SymbianActions.cpp:45 +#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:45 #: backends/platform/wince/CEActionsSmartphone.cpp:46 msgid "Skip" msgstr "" -#: base/main.cpp:293 backends/platform/symbian/src/SymbianActions.cpp:50 +#: base/main.cpp:294 backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:42 msgid "Pause" msgstr "" -#: base/main.cpp:296 +#: base/main.cpp:297 msgid "Skip line" msgstr "" -#: base/main.cpp:467 +#: base/main.cpp:468 msgid "Error running game:" msgstr "" -#: base/main.cpp:491 +#: base/main.cpp:492 msgid "Could not find any engine capable of running the selected game" msgstr "" @@ -1150,13 +1166,16 @@ msgid "~R~eturn to Launcher" msgstr "" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284 +#: engines/pegasus/pegasus.cpp:369 msgid "Save game:" msgstr "" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:369 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1180,12 +1199,12 @@ msgid "" msgstr "" #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 -#: engines/mohawk/dialogs.cpp:174 +#: engines/mohawk/dialogs.cpp:170 msgid "~O~K" msgstr "" #: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 -#: engines/mohawk/dialogs.cpp:175 +#: engines/mohawk/dialogs.cpp:171 msgid "~C~ancel" msgstr "" @@ -1193,23 +1212,23 @@ msgstr "" msgid "~K~eys" msgstr "" -#: engines/engine.cpp:235 +#: engines/engine.cpp:240 msgid "Could not initialize color format." msgstr "" -#: engines/engine.cpp:243 +#: engines/engine.cpp:248 msgid "Could not switch to video mode: '" msgstr "" -#: engines/engine.cpp:252 +#: engines/engine.cpp:257 msgid "Could not apply aspect ratio setting." msgstr "" -#: engines/engine.cpp:257 +#: engines/engine.cpp:262 msgid "Could not apply fullscreen setting." msgstr "" -#: engines/engine.cpp:357 +#: engines/engine.cpp:362 msgid "" "You appear to be playing this game directly\n" "from the CD. This is known to cause problems,\n" @@ -1218,7 +1237,7 @@ msgid "" "See the README file for details." msgstr "" -#: engines/engine.cpp:368 +#: engines/engine.cpp:373 msgid "" "This game has audio tracks in its disk. These\n" "tracks need to be ripped from the disk using\n" @@ -1227,42 +1246,57 @@ msgid "" "See the README file for details." msgstr "" -#: engines/engine.cpp:426 +#: engines/engine.cpp:431 #, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -#: engines/engine.cpp:439 +#: engines/engine.cpp:444 msgid "" "WARNING: The game you are about to start is not yet fully supported by " "ScummVM. As such, it is likely to be unstable, and any saves you make might " "not work in future versions of ScummVM." msgstr "" -#: engines/engine.cpp:442 +#: engines/engine.cpp:447 msgid "Start anyway" msgstr "" -#: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 -#: engines/sci/detection.cpp:390 +#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270 +#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393 +#: engines/toltecs/detection.cpp:173 msgid "Use original save/load screens" msgstr "" -#: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 -#: engines/sci/detection.cpp:391 +#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271 +#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394 +#: engines/toltecs/detection.cpp:174 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore game:" msgstr "" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore" msgstr "" +#: engines/drascula/saveload.cpp:49 +msgid "" +"ScummVM found that you have old savefiles for Drascula that should be " +"converted.\n" +"The old save game format is no longer supported, so you will not be able to " +"load your games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" +msgstr "" + #: engines/dreamweb/detection.cpp:57 msgid "Use bright palette mode" msgstr "" @@ -1271,54 +1305,54 @@ msgstr "" msgid "Display graphics using the game's bright palette" msgstr "" -#: engines/sci/detection.cpp:370 +#: engines/sci/detection.cpp:373 msgid "EGA undithering" msgstr "" -#: engines/sci/detection.cpp:371 +#: engines/sci/detection.cpp:374 msgid "Enable undithering in EGA games" msgstr "" -#: engines/sci/detection.cpp:380 +#: engines/sci/detection.cpp:383 msgid "Prefer digital sound effects" msgstr "" -#: engines/sci/detection.cpp:381 +#: engines/sci/detection.cpp:384 msgid "Prefer digital sound effects instead of synthesized ones" msgstr "" -#: engines/sci/detection.cpp:400 +#: engines/sci/detection.cpp:403 msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "" -#: engines/sci/detection.cpp:401 +#: engines/sci/detection.cpp:404 msgid "" "Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" -#: engines/sci/detection.cpp:411 +#: engines/sci/detection.cpp:414 msgid "Use CD audio" msgstr "" -#: engines/sci/detection.cpp:412 +#: engines/sci/detection.cpp:415 msgid "Use CD audio instead of in-game audio, if available" msgstr "" -#: engines/sci/detection.cpp:422 +#: engines/sci/detection.cpp:425 msgid "Use Windows cursors" msgstr "" -#: engines/sci/detection.cpp:423 +#: engines/sci/detection.cpp:426 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "" -#: engines/sci/detection.cpp:433 +#: engines/sci/detection.cpp:436 msgid "Use silver cursors" msgstr "" -#: engines/sci/detection.cpp:434 +#: engines/sci/detection.cpp:437 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "" @@ -1970,14 +2004,14 @@ msgstr "" msgid "Fly to lower right" msgstr "" -#: engines/scumm/scumm.cpp:1773 +#: engines/scumm/scumm.cpp:1776 #, c-format msgid "" "Native MIDI support requires the Roland Upgrade from LucasArts,\n" "but %s is missing. Using AdLib instead." msgstr "" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 +#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -1985,7 +2019,7 @@ msgid "" "%s" msgstr "" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 +#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -1993,7 +2027,7 @@ msgid "" "%s" msgstr "" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 +#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2001,7 +2035,7 @@ msgid "" "%s" msgstr "" -#: engines/scumm/scumm.cpp:2512 +#: engines/scumm/scumm.cpp:2537 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2009,7 +2043,7 @@ msgid "" msgstr "" #. I18N: Option for fast scene switching -#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171 +#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167 msgid "~Z~ip Mode Activated" msgstr "" @@ -2030,11 +2064,11 @@ msgstr "" msgid "~M~ain Menu" msgstr "" -#: engines/mohawk/dialogs.cpp:172 +#: engines/mohawk/dialogs.cpp:168 msgid "~W~ater Effect Enabled" msgstr "" -#: engines/agos/animation.cpp:560 +#: engines/agos/animation.cpp:557 #, c-format msgid "Cutscene file '%s' not found!" msgstr "" @@ -2052,6 +2086,14 @@ msgstr "" msgid "Failed to delete file." msgstr "" +#: engines/groovie/detection.cpp:312 +msgid "Fast movie speed" +msgstr "" + +#: engines/groovie/detection.cpp:313 +msgid "Play movies at an increased speed" +msgstr "" + #: engines/groovie/script.cpp:420 msgid "Failed to save game" msgstr "" @@ -2142,11 +2184,11 @@ msgstr "" msgid "Slide Right" msgstr "" -#: engines/kyra/lol.cpp:485 +#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2412 msgid "Turn Left" msgstr "" -#: engines/kyra/lol.cpp:486 +#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2413 msgid "Turn Right" msgstr "" @@ -2162,7 +2204,7 @@ msgstr "" msgid "Choose Spell" msgstr "" -#: engines/kyra/sound_midi.cpp:475 +#: engines/kyra/sound_midi.cpp:477 msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2199,25 +2241,25 @@ msgstr "" msgid "Use the floppy version's intro (CD version only)" msgstr "" -#: engines/sword1/animation.cpp:539 +#: engines/sword1/animation.cpp:519 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "" -#: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 +#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439 msgid "DXA cutscenes found but ScummVM has been built without zlib support" msgstr "" -#: engines/sword1/animation.cpp:570 engines/sword2/animation.cpp:465 +#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449 msgid "MPEG2 cutscenes are no longer supported" msgstr "" -#: engines/sword1/animation.cpp:576 engines/sword2/animation.cpp:473 +#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457 #, c-format msgid "Cutscene '%s' not found" msgstr "" -#: engines/sword1/control.cpp:863 +#: engines/sword1/control.cpp:865 msgid "" "ScummVM found that you have old savefiles for Broken Sword 1 that should be " "converted.\n" @@ -2228,18 +2270,18 @@ msgid "" "time you start the game.\n" msgstr "" -#: engines/sword1/control.cpp:1232 +#: engines/sword1/control.cpp:1234 #, c-format msgid "" "Target new save game already exists!\n" "Would you like to keep the old save game (%s) or the new one (%s)?\n" msgstr "" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the old one" msgstr "" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the new one" msgstr "" @@ -2247,7 +2289,7 @@ msgstr "" msgid "This is the end of the Broken Sword 1 Demo" msgstr "" -#: engines/sword2/animation.cpp:435 +#: engines/sword2/animation.cpp:419 msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" @@ -2260,12 +2302,12 @@ msgstr "" msgid "Show labels for objects on mouse hover" msgstr "" -#: engines/teenagent/resources.cpp:68 +#: engines/teenagent/resources.cpp:94 msgid "" "You're missing the 'teenagent.dat' file. Get it from the ScummVM website" msgstr "" -#: engines/teenagent/resources.cpp:89 +#: engines/teenagent/resources.cpp:115 msgid "" "The teenagent.dat file is compressed and zlib hasn't been included in this " "executable. Please decompress it" @@ -2308,6 +2350,46 @@ msgid "" "Please report to the team." msgstr "" +#: engines/pegasus/pegasus.cpp:675 +msgid "Invalid save file name" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2410 +msgid "Up/Zoom In/Move Forward/Open Doors" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2411 +msgid "Down/Zoom Out" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2414 +msgid "Display/Hide Inventory Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2415 +msgid "Display/Hide Biochip Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2416 +msgid "Action/Select" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2417 +msgid "Toggle Center Data Display" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2418 +msgid "Display/Hide Info Screen" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2419 +msgid "Display/Hide Pause Menu" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2420 +msgid "???" +msgstr "" + #: audio/fmopl.cpp:49 msgid "MAME OPL emulator" msgstr "" @@ -2357,7 +2439,7 @@ msgstr "" msgid "Amiga Audio Emulator" msgstr "" -#: audio/softsynth/adlib.cpp:1593 +#: audio/softsynth/adlib.cpp:2284 msgid "AdLib Emulator" msgstr "" @@ -2369,11 +2451,11 @@ msgstr "" msgid "C64 Audio Emulator" msgstr "" -#: audio/softsynth/mt32.cpp:293 +#: audio/softsynth/mt32.cpp:205 msgid "Initializing MT-32 Emulator" msgstr "" -#: audio/softsynth/mt32.cpp:512 +#: audio/softsynth/mt32.cpp:431 msgid "MT-32 Emulator" msgstr "" @@ -2524,24 +2606,24 @@ msgstr "" msgid "Right Click" msgstr "" -#: backends/platform/sdl/macosx/appmenu_osx.mm:78 +#: backends/platform/sdl/macosx/appmenu_osx.mm:77 msgid "Hide ScummVM" msgstr "" -#: backends/platform/sdl/macosx/appmenu_osx.mm:83 +#: backends/platform/sdl/macosx/appmenu_osx.mm:82 msgid "Hide Others" msgstr "" -#: backends/platform/sdl/macosx/appmenu_osx.mm:88 +#: backends/platform/sdl/macosx/appmenu_osx.mm:87 msgid "Show All" msgstr "" -#: backends/platform/sdl/macosx/appmenu_osx.mm:110 -#: backends/platform/sdl/macosx/appmenu_osx.mm:121 +#: backends/platform/sdl/macosx/appmenu_osx.mm:109 +#: backends/platform/sdl/macosx/appmenu_osx.mm:120 msgid "Window" msgstr "" -#: backends/platform/sdl/macosx/appmenu_osx.mm:115 +#: backends/platform/sdl/macosx/appmenu_osx.mm:114 msgid "Minimize" msgstr "" @@ -2555,12 +2637,12 @@ msgid "Normal (no scaling)" msgstr "" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537 msgid "Enabled aspect ratio correction" msgstr "" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542 msgid "Disabled aspect ratio correction" msgstr "" @@ -2569,7 +2651,7 @@ msgid "Active graphics filter:" msgstr "" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481 msgid "Windowed mode" msgstr "" @@ -2593,11 +2675,11 @@ msgstr "" msgid "Current scale" msgstr "" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:558 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562 msgid "Active filter mode: Linear" msgstr "" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:560 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564 msgid "Active filter mode: Nearest" msgstr "" @@ -2919,19 +3001,19 @@ msgstr "" #: backends/events/gph/gph-events.cpp:386 #: backends/events/gph/gph-events.cpp:429 -#: backends/events/openpandora/op-events.cpp:139 +#: backends/events/openpandora/op-events.cpp:168 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "" #: backends/events/gph/gph-events.cpp:388 #: backends/events/gph/gph-events.cpp:431 -#: backends/events/openpandora/op-events.cpp:141 +#: backends/events/openpandora/op-events.cpp:170 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "" #: backends/events/gph/gph-events.cpp:390 #: backends/events/gph/gph-events.cpp:433 -#: backends/events/openpandora/op-events.cpp:143 +#: backends/events/openpandora/op-events.cpp:172 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "" @@ -2951,7 +3033,11 @@ msgstr "" msgid "Decreasing Volume" msgstr "" -#: backends/updates/macosx/macosx-updates.mm:65 +#: backends/events/openpandora/op-events.cpp:174 +msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)" +msgstr "" + +#: backends/updates/macosx/macosx-updates.mm:67 msgid "Check for Updates..." msgstr "" diff --git a/po/se_SE.po b/po/se_SE.po index 02f2ab44f4..dae9415dcf 100644 --- a/po/se_SE.po +++ b/po/se_SE.po @@ -1,5 +1,5 @@ # Swedish translation for ScummVM. -# Copyright (C) 2011-2012 ScummVM Team +# Copyright (C) 2011-2013 ScummVM Team # This file is distributed under the same license as the ScummVM package. # Hampus Flink <hampus.flink@gmail.com>, 2011. # @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.5.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-08-12 14:57+0200\n" +"POT-Creation-Date: 2013-02-07 23:11+0000\n" "PO-Revision-Date: 2012-07-08 18:03+0100\n" "Last-Translator: Hampus Flink <hampus.flink@gmail.com>\n" "Language-Team: \n" @@ -20,45 +20,55 @@ msgstr "" "X-Poedit-Country: SWEDEN\n" "X-Poedit-SourceCharset: iso-8859-1\n" -#: gui/about.cpp:91 +#: gui/about.cpp:93 #, c-format msgid "(built on %s)" msgstr "(byggt %s)" -#: gui/about.cpp:98 +#: gui/about.cpp:100 msgid "Features compiled in:" msgstr "Funktioner kompilerade i:" -#: gui/about.cpp:107 +#: gui/about.cpp:109 msgid "Available engines:" msgstr "Tillgängliga motorer" -#: gui/browser.cpp:66 +#: gui/browser.cpp:67 +#, fuzzy +msgid "Show hidden files" +msgstr "Visa / göm konsol" + +#: gui/browser.cpp:67 +msgid "Show files marked with the hidden attribute" +msgstr "" + +#: gui/browser.cpp:71 msgid "Go up" msgstr "Uppåt" -#: gui/browser.cpp:66 gui/browser.cpp:68 +#: gui/browser.cpp:71 gui/browser.cpp:73 msgid "Go to previous directory level" msgstr "Gå till föregående katalognivå" -#: gui/browser.cpp:68 +#: gui/browser.cpp:73 msgctxt "lowres" msgid "Go up" msgstr "Uppåt" -#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 -#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 -#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 -#: gui/themebrowser.cpp:54 engines/engine.cpp:442 -#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 +#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238 +#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275 +#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919 +#: gui/themebrowser.cpp:54 engines/engine.cpp:447 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:190 +#: engines/sword1/control.cpp:867 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" msgstr "Avbryt" -#: gui/browser.cpp:70 gui/chooser.cpp:46 gui/themebrowser.cpp:55 +#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55 msgid "Choose" msgstr "Välj" @@ -73,15 +83,15 @@ msgstr "Stäng" msgid "Mouse click" msgstr "Musklick" -#: gui/gui-manager.cpp:122 base/main.cpp:300 +#: gui/gui-manager.cpp:122 base/main.cpp:301 msgid "Display keyboard" msgstr "Visa tangentbord" -#: gui/gui-manager.cpp:126 base/main.cpp:304 +#: gui/gui-manager.cpp:126 base/main.cpp:305 msgid "Remap keys" msgstr "Ställ in tangenter" -#: gui/gui-manager.cpp:129 base/main.cpp:307 +#: gui/gui-manager.cpp:129 base/main.cpp:308 msgid "Toggle FullScreen" msgstr "Fullskärmsläge" @@ -94,17 +104,18 @@ msgid "Map" msgstr "Ställ in" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 -#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 -#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 -#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 -#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 -#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 -#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 -#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 -#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 -#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 +#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239 +#: gui/saveload-dialog.cpp:920 engines/engine.cpp:366 engines/engine.cpp:377 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192 +#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558 +#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 +#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519 +#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550 +#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:867 +#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419 +#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449 +#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -177,8 +188,8 @@ msgstr "" "Spelets språk. Den här inställningen omvandlar inte din spanska spelversion " "till en engelsk" -#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:80 -#: gui/options.cpp:730 gui/options.cpp:743 gui/options.cpp:1199 +#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86 +#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209 #: audio/null.cpp:40 msgid "<default>" msgstr "<standard>" @@ -200,11 +211,11 @@ msgstr "Plattform:" msgid "Engine" msgstr "Motor" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "Graphics" msgstr "Grafik" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "GFX" msgstr "GFX" @@ -217,7 +228,7 @@ msgctxt "lowres" msgid "Override global graphic settings" msgstr "Överskrid globala grafikinställningar" -#: gui/launcher.cpp:251 gui/options.cpp:1085 +#: gui/launcher.cpp:251 gui/options.cpp:1095 msgid "Audio" msgstr "Ljud" @@ -230,11 +241,11 @@ msgctxt "lowres" msgid "Override global audio settings" msgstr "Överskrid globala ljudinställningar" -#: gui/launcher.cpp:265 gui/options.cpp:1090 +#: gui/launcher.cpp:265 gui/options.cpp:1100 msgid "Volume" msgstr "Volym" -#: gui/launcher.cpp:267 gui/options.cpp:1092 +#: gui/launcher.cpp:267 gui/options.cpp:1102 msgctxt "lowres" msgid "Volume" msgstr "Volym" @@ -248,7 +259,7 @@ msgctxt "lowres" msgid "Override global volume settings" msgstr "Överskrid globala volyminställningar" -#: gui/launcher.cpp:280 gui/options.cpp:1100 +#: gui/launcher.cpp:280 gui/options.cpp:1110 msgid "MIDI" msgstr "MIDI" @@ -261,7 +272,7 @@ msgctxt "lowres" msgid "Override global MIDI settings" msgstr "Överskrid globala MIDI-inställningar" -#: gui/launcher.cpp:294 gui/options.cpp:1106 +#: gui/launcher.cpp:294 gui/options.cpp:1116 msgid "MT-32" msgstr "MT-32" @@ -274,11 +285,11 @@ msgctxt "lowres" msgid "Override global MT-32 settings" msgstr "Överskrid globala MT-32 inställningar" -#: gui/launcher.cpp:308 gui/options.cpp:1113 +#: gui/launcher.cpp:308 gui/options.cpp:1123 msgid "Paths" msgstr "Sökvägar" -#: gui/launcher.cpp:310 gui/options.cpp:1115 +#: gui/launcher.cpp:310 gui/options.cpp:1125 msgctxt "lowres" msgid "Paths" msgstr "Sökvägar" @@ -292,7 +303,7 @@ msgctxt "lowres" msgid "Game Path:" msgstr "Sökv. spel:" -#: gui/launcher.cpp:324 gui/options.cpp:1139 +#: gui/launcher.cpp:324 gui/options.cpp:1149 msgid "Extra Path:" msgstr "Sökv. extra:" @@ -300,42 +311,42 @@ msgstr "Sökv. extra:" msgid "Specifies path to additional data used the game" msgstr "Bestämmer sökvägen till ytterligare data som spelet använder" -#: gui/launcher.cpp:326 gui/options.cpp:1141 +#: gui/launcher.cpp:326 gui/options.cpp:1151 msgctxt "lowres" msgid "Extra Path:" msgstr "Sökv. extra:" -#: gui/launcher.cpp:333 gui/options.cpp:1123 +#: gui/launcher.cpp:333 gui/options.cpp:1133 msgid "Save Path:" msgstr "Sökv. sparat:" #: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 -#: gui/options.cpp:1123 gui/options.cpp:1125 gui/options.cpp:1126 +#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136 msgid "Specifies where your savegames are put" msgstr "Bestämmer var dina spardata lagras" -#: gui/launcher.cpp:335 gui/options.cpp:1125 +#: gui/launcher.cpp:335 gui/options.cpp:1135 msgctxt "lowres" msgid "Save Path:" msgstr "Sökv. sparat:" #: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 -#: gui/launcher.cpp:565 gui/options.cpp:1134 gui/options.cpp:1142 -#: gui/options.cpp:1151 gui/options.cpp:1258 gui/options.cpp:1264 -#: gui/options.cpp:1272 gui/options.cpp:1302 gui/options.cpp:1308 -#: gui/options.cpp:1315 gui/options.cpp:1408 gui/options.cpp:1411 -#: gui/options.cpp:1423 +#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152 +#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282 +#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326 +#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429 +#: gui/options.cpp:1441 msgctxt "path" msgid "None" msgstr "Ingen" #: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 -#: gui/options.cpp:1252 gui/options.cpp:1296 gui/options.cpp:1414 +#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Standard" -#: gui/launcher.cpp:504 gui/options.cpp:1417 +#: gui/launcher.cpp:504 gui/options.cpp:1435 msgid "Select SoundFont" msgstr "Välj SoundFont" @@ -359,7 +370,7 @@ msgstr "Detta ID-namn är upptaget. Var god välj ett annat." msgid "~Q~uit" msgstr "~A~vsluta" -#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:96 +#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95 msgid "Quit ScummVM" msgstr "Avsluta ScummVM" @@ -367,7 +378,7 @@ msgstr "Avsluta ScummVM" msgid "A~b~out..." msgstr "O~m~..." -#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:70 +#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69 msgid "About ScummVM" msgstr "Om ScummVM" @@ -444,12 +455,14 @@ msgstr "Sök:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 +#: engines/pegasus/pegasus.cpp:345 msgid "Load game:" msgstr "Ladda spel:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:345 +#: backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Ladda" @@ -535,133 +548,133 @@ msgstr "Kataloger scannade: %d ..." msgid "Discovered %d new games, ignored %d previously added games ..." msgstr "Upptäckte %d nya spel, ignorerade %d tidigare tillagda spel ..." -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "Never" msgstr "Aldrig" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 5 mins" msgstr "var 5:e minut" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 10 mins" msgstr "var 10:e minut" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 15 mins" msgstr "var 15:e minut" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 30 mins" msgstr "var 30:e minut" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "8 kHz" msgstr "8 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "11kHz" msgstr "11 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "22 kHz" msgstr "22 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "44 kHz" msgstr "44 kHz" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:248 gui/options.cpp:474 gui/options.cpp:575 -#: gui/options.cpp:644 gui/options.cpp:852 +#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581 +#: gui/options.cpp:650 gui/options.cpp:858 msgctxt "soundfont" msgid "None" msgstr "Ingen" -#: gui/options.cpp:382 +#: gui/options.cpp:388 msgid "Failed to apply some of the graphic options changes:" msgstr "Kunde inte verkställa några av grafikinställningarna:" -#: gui/options.cpp:394 +#: gui/options.cpp:400 msgid "the video mode could not be changed." msgstr "videoläget kunde inte ändras." -#: gui/options.cpp:400 +#: gui/options.cpp:406 msgid "the fullscreen setting could not be changed" msgstr "fullskärmsinställningen kunde inte ändras." -#: gui/options.cpp:406 +#: gui/options.cpp:412 msgid "the aspect ratio setting could not be changed" msgstr "inställningen för bildförhållandet kunde inte ändras." -#: gui/options.cpp:727 +#: gui/options.cpp:733 msgid "Graphics mode:" msgstr "Grafikläge:" -#: gui/options.cpp:741 +#: gui/options.cpp:747 msgid "Render mode:" msgstr "Renderingsläge:" -#: gui/options.cpp:741 gui/options.cpp:742 +#: gui/options.cpp:747 gui/options.cpp:748 msgid "Special dithering modes supported by some games" msgstr "Speciella gitterlägen stödda av vissa spel" -#: gui/options.cpp:753 +#: gui/options.cpp:759 #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476 msgid "Fullscreen mode" msgstr "Fullskärmsläge" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Aspect ratio correction" msgstr "Korrektion av bildförhållande" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Correct aspect ratio for 320x200 games" msgstr "Korrigerar bildförhållanden för 320x200-spel" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Preferred Device:" msgstr "Föredragen enhet:" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Music Device:" msgstr "Musikenhet:" -#: gui/options.cpp:764 gui/options.cpp:766 +#: gui/options.cpp:770 gui/options.cpp:772 msgid "Specifies preferred sound device or sound card emulator" msgstr "Bestämmer din föredragna emulator för ljudenhet eller ljudkort" -#: gui/options.cpp:764 gui/options.cpp:766 gui/options.cpp:767 +#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773 msgid "Specifies output sound device or sound card emulator" msgstr "Bestämmer emulator för ljudenhet eller ljudkort" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Preferred Dev.:" msgstr "Föredr. enhet:" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Music Device:" msgstr "Musikenhet:" -#: gui/options.cpp:793 +#: gui/options.cpp:799 msgid "AdLib emulator:" msgstr "AdLib-emulator:" -#: gui/options.cpp:793 gui/options.cpp:794 +#: gui/options.cpp:799 gui/options.cpp:800 msgid "AdLib is used for music in many games" msgstr "AdLib används för musik i många spel" -#: gui/options.cpp:804 +#: gui/options.cpp:810 msgid "Output rate:" msgstr "Ljudfrekvens:" -#: gui/options.cpp:804 gui/options.cpp:805 +#: gui/options.cpp:810 gui/options.cpp:811 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -669,61 +682,65 @@ msgstr "" "Ett högre värde betecknar bättre ljudkvalitet men stöds kanske inte av ditt " "ljudkort" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "GM Device:" msgstr "GM-enhet:" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "Specifies default sound device for General MIDI output" msgstr "Bestämmer standardenheten för General MIDI-uppspelning" -#: gui/options.cpp:826 +#: gui/options.cpp:832 msgid "Don't use General MIDI music" msgstr "Använd inte General MIDI-musik" -#: gui/options.cpp:837 gui/options.cpp:899 +#: gui/options.cpp:843 gui/options.cpp:909 msgid "Use first available device" msgstr "Använd första tillgängliga enhet" -#: gui/options.cpp:849 +#: gui/options.cpp:855 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 +#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "SoundFont stöds endast av vissa ljudkort, Fluidsynth och Timidity" -#: gui/options.cpp:851 +#: gui/options.cpp:857 msgctxt "lowres" msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Mixed AdLib/MIDI mode" msgstr "Blandat AdLib/MIDI-läge" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Use both MIDI and AdLib sound generation" msgstr "Använd både MIDI och AdLib för ljudgeneration" -#: gui/options.cpp:860 +#: gui/options.cpp:866 msgid "MIDI gain:" msgstr "MIDI gain:" -#: gui/options.cpp:870 +#: gui/options.cpp:873 +msgid "FluidSynth Settings" +msgstr "" + +#: gui/options.cpp:880 msgid "MT-32 Device:" msgstr "MT-32 enhet:" -#: gui/options.cpp:870 +#: gui/options.cpp:880 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" "Bestämmer standardenheten för Roland MT-32/LAPC1/CM32I/CM64-uppspelning" -#: gui/options.cpp:875 +#: gui/options.cpp:885 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Äkta Roland MT-32 (inaktivera GM-emulation)" -#: gui/options.cpp:875 gui/options.cpp:877 +#: gui/options.cpp:885 gui/options.cpp:887 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -731,193 +748,194 @@ msgstr "" "Aktivera om du vill använda din verkliga Roland-kompatibla och dator-" "anslutna ljudenhet" -#: gui/options.cpp:877 +#: gui/options.cpp:887 msgctxt "lowres" msgid "True Roland MT-32 (no GM emulation)" msgstr "Äkta Roland MT-32 (ingen GM-emulation)" -#: gui/options.cpp:880 -msgid "Enable Roland GS Mode" -msgstr "Aktivera Roland GS-läge" +#: gui/options.cpp:890 +#, fuzzy +msgid "Roland GS Mode (disable GM mapping)" +msgstr "Äkta Roland MT-32 (inaktivera GM-emulation)" -#: gui/options.cpp:880 +#: gui/options.cpp:890 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "Stänger av General MIDI-kartläggning för spel med Roland MT-32 soundtrack" -#: gui/options.cpp:889 +#: gui/options.cpp:899 msgid "Don't use Roland MT-32 music" msgstr "Använd inte Roland MT-32 musik" -#: gui/options.cpp:916 +#: gui/options.cpp:926 msgid "Text and Speech:" msgstr "Undertext och tal:" -#: gui/options.cpp:920 gui/options.cpp:930 +#: gui/options.cpp:930 gui/options.cpp:940 msgid "Speech" msgstr "Tal" -#: gui/options.cpp:921 gui/options.cpp:931 +#: gui/options.cpp:931 gui/options.cpp:941 msgid "Subtitles" msgstr "Undertexter" -#: gui/options.cpp:922 +#: gui/options.cpp:932 msgid "Both" msgstr "Båda" -#: gui/options.cpp:924 +#: gui/options.cpp:934 msgid "Subtitle speed:" msgstr "Texthastighet:" -#: gui/options.cpp:926 +#: gui/options.cpp:936 msgctxt "lowres" msgid "Text and Speech:" msgstr "Text och tal:" -#: gui/options.cpp:930 +#: gui/options.cpp:940 msgid "Spch" msgstr "Tal" -#: gui/options.cpp:931 +#: gui/options.cpp:941 msgid "Subs" msgstr "Text" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgctxt "lowres" msgid "Both" msgstr "Båda" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgid "Show subtitles and play speech" msgstr "Visa undertexter och spela upp tal" -#: gui/options.cpp:934 +#: gui/options.cpp:944 msgctxt "lowres" msgid "Subtitle speed:" msgstr "Texthastighet:" -#: gui/options.cpp:950 +#: gui/options.cpp:960 msgid "Music volume:" msgstr "Musikvolym:" -#: gui/options.cpp:952 +#: gui/options.cpp:962 msgctxt "lowres" msgid "Music volume:" msgstr "Musikvolym:" -#: gui/options.cpp:959 +#: gui/options.cpp:969 msgid "Mute All" msgstr "Ljud av" -#: gui/options.cpp:962 +#: gui/options.cpp:972 msgid "SFX volume:" msgstr "SFX-volym:" -#: gui/options.cpp:962 gui/options.cpp:964 gui/options.cpp:965 +#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975 msgid "Special sound effects volume" msgstr "Volym för specialeffekter" -#: gui/options.cpp:964 +#: gui/options.cpp:974 msgctxt "lowres" msgid "SFX volume:" msgstr "SFX-volym:" -#: gui/options.cpp:972 +#: gui/options.cpp:982 msgid "Speech volume:" msgstr "Talvolym:" -#: gui/options.cpp:974 +#: gui/options.cpp:984 msgctxt "lowres" msgid "Speech volume:" msgstr "Talvolym:" -#: gui/options.cpp:1131 +#: gui/options.cpp:1141 msgid "Theme Path:" msgstr "Sökv. tema:" -#: gui/options.cpp:1133 +#: gui/options.cpp:1143 msgctxt "lowres" msgid "Theme Path:" msgstr "Sökv. tema:" -#: gui/options.cpp:1139 gui/options.cpp:1141 gui/options.cpp:1142 +#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "Bestämmer sökväg till andra data som används av alla spel eller ScummVM" -#: gui/options.cpp:1148 +#: gui/options.cpp:1158 msgid "Plugins Path:" msgstr "Sökv. tillägg:" -#: gui/options.cpp:1150 +#: gui/options.cpp:1160 msgctxt "lowres" msgid "Plugins Path:" msgstr "Sökv. tillägg:" -#: gui/options.cpp:1159 +#: gui/options.cpp:1169 msgid "Misc" msgstr "Diverse" -#: gui/options.cpp:1161 +#: gui/options.cpp:1171 msgctxt "lowres" msgid "Misc" msgstr "Diverse" -#: gui/options.cpp:1163 +#: gui/options.cpp:1173 msgid "Theme:" msgstr "Tema:" -#: gui/options.cpp:1167 +#: gui/options.cpp:1177 msgid "GUI Renderer:" msgstr "GUI-rendering:" -#: gui/options.cpp:1179 +#: gui/options.cpp:1189 msgid "Autosave:" msgstr "Autospara:" -#: gui/options.cpp:1181 +#: gui/options.cpp:1191 msgctxt "lowres" msgid "Autosave:" msgstr "Autospara:" -#: gui/options.cpp:1189 +#: gui/options.cpp:1199 msgid "Keys" msgstr "Tangenter" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "GUI Language:" msgstr "GUI-språk:" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "Language of ScummVM GUI" msgstr "Språk för ScummVM:s användargränssnitt" -#: gui/options.cpp:1347 +#: gui/options.cpp:1365 msgid "You have to restart ScummVM before your changes will take effect." msgstr "Du måste starta om ScummVM för att ändringarna ska få effekt." -#: gui/options.cpp:1360 +#: gui/options.cpp:1378 msgid "Select directory for savegames" msgstr "Välj katalog för spardata" -#: gui/options.cpp:1367 +#: gui/options.cpp:1385 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" "Det går inte att skriva till den valda katalogen. Var god välj en annan." -#: gui/options.cpp:1376 +#: gui/options.cpp:1394 msgid "Select directory for GUI themes" msgstr "Välj katalog för GUI-teman" -#: gui/options.cpp:1386 +#: gui/options.cpp:1404 msgid "Select directory for extra files" msgstr "Välj katalog för extra filer" -#: gui/options.cpp:1397 +#: gui/options.cpp:1415 msgid "Select directory for plugins" msgstr "Välj katalog för tillägg" -#: gui/options.cpp:1450 +#: gui/options.cpp:1468 msgid "" "The theme you selected does not support your current language. If you want " "to use this theme you need to switch to another language first." @@ -925,74 +943,74 @@ msgstr "" "Temat du valde stöder inte ditt språk. Om du vill använda det här temat " "måste först byta till ett annat språk." -#: gui/saveload-dialog.cpp:158 +#: gui/saveload-dialog.cpp:166 msgid "List view" msgstr "" -#: gui/saveload-dialog.cpp:159 +#: gui/saveload-dialog.cpp:167 msgid "Grid view" msgstr "" -#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 +#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358 msgid "No date saved" msgstr "Inget datum sparat" -#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359 msgid "No time saved" msgstr "Ingen tid sparad" -#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 +#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360 msgid "No playtime saved" msgstr "Ingen speltid sparad" -#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275 msgid "Delete" msgstr "Radera" -#: gui/saveload-dialog.cpp:266 +#: gui/saveload-dialog.cpp:274 msgid "Do you really want to delete this savegame?" msgstr "Vill du verkligen radera den här spardatan?" -#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 +#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872 msgid "Date: " msgstr "Datum:" -#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 +#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878 msgid "Time: " msgstr "Tid:" -#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 +#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886 msgid "Playtime: " msgstr "Speltid:" -#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 +#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494 msgid "Untitled savestate" msgstr "Namnlös spardata" -#: gui/saveload-dialog.cpp:517 +#: gui/saveload-dialog.cpp:546 msgid "Next" msgstr "" -#: gui/saveload-dialog.cpp:520 +#: gui/saveload-dialog.cpp:549 msgid "Prev" msgstr "" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 #, fuzzy msgid "New Save" msgstr "Spara" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 #, fuzzy msgid "Create a new save game" msgstr "Kunde inte spara spelet." -#: gui/saveload-dialog.cpp:789 +#: gui/saveload-dialog.cpp:865 #, fuzzy msgid "Name: " msgstr "Namn:" -#: gui/saveload-dialog.cpp:861 +#: gui/saveload-dialog.cpp:937 #, c-format msgid "Enter a description for slot %d:" msgstr "" @@ -1030,35 +1048,35 @@ msgstr "Antialiserad (16 bpp)" msgid "Clear value" msgstr "Töm sökfältet" -#: base/main.cpp:209 +#: base/main.cpp:210 #, c-format msgid "Engine does not support debug level '%s'" msgstr "Motorn stöder inte debug-nivå '%s'" -#: base/main.cpp:287 +#: base/main.cpp:288 msgid "Menu" msgstr "Meny" -#: base/main.cpp:290 backends/platform/symbian/src/SymbianActions.cpp:45 +#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:45 #: backends/platform/wince/CEActionsSmartphone.cpp:46 msgid "Skip" msgstr "Skippa" -#: base/main.cpp:293 backends/platform/symbian/src/SymbianActions.cpp:50 +#: base/main.cpp:294 backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:42 msgid "Pause" msgstr "Paus" -#: base/main.cpp:296 +#: base/main.cpp:297 msgid "Skip line" msgstr "Skippa rad" -#: base/main.cpp:467 +#: base/main.cpp:468 msgid "Error running game:" msgstr "Fel under körning av spel:" -#: base/main.cpp:491 +#: base/main.cpp:492 msgid "Could not find any engine capable of running the selected game" msgstr "Kunde inte hitta en motor kapabel till att köra det valda spelet" @@ -1174,13 +1192,16 @@ msgid "~R~eturn to Launcher" msgstr "Åte~r~vänd till launcher" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284 +#: engines/pegasus/pegasus.cpp:369 msgid "Save game:" msgstr "Spara spelet:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:369 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1207,12 +1228,12 @@ msgid "" msgstr "Spar" #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 -#: engines/mohawk/dialogs.cpp:174 +#: engines/mohawk/dialogs.cpp:170 msgid "~O~K" msgstr "~O~K" #: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 -#: engines/mohawk/dialogs.cpp:175 +#: engines/mohawk/dialogs.cpp:171 msgid "~C~ancel" msgstr "A~v~bryt" @@ -1220,23 +1241,23 @@ msgstr "A~v~bryt" msgid "~K~eys" msgstr "~T~angenter" -#: engines/engine.cpp:235 +#: engines/engine.cpp:240 msgid "Could not initialize color format." msgstr "Kunde inte initialisera färgformat." -#: engines/engine.cpp:243 +#: engines/engine.cpp:248 msgid "Could not switch to video mode: '" msgstr "Kunde inte byta till videoläget: '" -#: engines/engine.cpp:252 +#: engines/engine.cpp:257 msgid "Could not apply aspect ratio setting." msgstr "Kunde inte ändra inställningen för bildförhållanden." -#: engines/engine.cpp:257 +#: engines/engine.cpp:262 msgid "Could not apply fullscreen setting." msgstr "Kunde inte applicera fullskärmsinställning." -#: engines/engine.cpp:357 +#: engines/engine.cpp:362 msgid "" "You appear to be playing this game directly\n" "from the CD. This is known to cause problems,\n" @@ -1250,7 +1271,7 @@ msgstr "" "datafilerna till din hårddisk istället.\n" "Se README-filen för detaljer." -#: engines/engine.cpp:368 +#: engines/engine.cpp:373 msgid "" "This game has audio tracks in its disk. These\n" "tracks need to be ripped from the disk using\n" @@ -1264,7 +1285,7 @@ msgstr "" "för att kunna lyssna på spelets musik.\n" "Se README-filen för detaljer." -#: engines/engine.cpp:426 +#: engines/engine.cpp:431 #, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " @@ -1273,7 +1294,7 @@ msgstr "" "Kunde inte ladda spardata (%s)! Hänvisa till README-filen för grundläggande " "information och instruktioner för ytterligare assistans." -#: engines/engine.cpp:439 +#: engines/engine.cpp:444 msgid "" "WARNING: The game you are about to start is not yet fully supported by " "ScummVM. As such, it is likely to be unstable, and any saves you make might " @@ -1283,28 +1304,51 @@ msgstr "" "ScummVM. Därför är det troligtvis instabilt och om du skapar spardata kan de " "möjligtvis vara inkompatibla med framtida versioner av ScummVM." -#: engines/engine.cpp:442 +#: engines/engine.cpp:447 msgid "Start anyway" msgstr "Starta ändå" -#: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 -#: engines/sci/detection.cpp:390 +#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270 +#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393 +#: engines/toltecs/detection.cpp:173 msgid "Use original save/load screens" msgstr "Använd originalskärmar för spara/ladda" -#: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 -#: engines/sci/detection.cpp:391 +#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271 +#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394 +#: engines/toltecs/detection.cpp:174 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "Använder originalskärmarna för spara/ladda istället för ScummVM:s" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore game:" msgstr "Återställ spel:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore" msgstr "Återställ" +#: engines/drascula/saveload.cpp:49 +#, fuzzy +msgid "" +"ScummVM found that you have old savefiles for Drascula that should be " +"converted.\n" +"The old save game format is no longer supported, so you will not be able to " +"load your games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" +msgstr "" +"ScummVM upptäckte att du har gamla spardata för Broken Sword 1 som borde " +"konverteras.\n" +"Det gamla spardataformatet stöds inte längre, så du kommer inte kunna ladda " +"dina data om du inte konverterar dem.\n" +"\n" +"Tryck \"OK\" för att konvertera dem nu, annars kommer du tillfrågas igen " +"nästa gång du startar spelet.\n" + #: engines/dreamweb/detection.cpp:57 msgid "Use bright palette mode" msgstr "Använd ljus palett-läge" @@ -1313,27 +1357,27 @@ msgstr "Använd ljus palett-läge" msgid "Display graphics using the game's bright palette" msgstr "Visa grafik med spelets ljusa palett" -#: engines/sci/detection.cpp:370 +#: engines/sci/detection.cpp:373 msgid "EGA undithering" msgstr "EGA anti-gitter" -#: engines/sci/detection.cpp:371 +#: engines/sci/detection.cpp:374 msgid "Enable undithering in EGA games" msgstr "Aktivera anti-gitter i EGA-spel" -#: engines/sci/detection.cpp:380 +#: engines/sci/detection.cpp:383 msgid "Prefer digital sound effects" msgstr "Föredra digitala ljudeffekter" -#: engines/sci/detection.cpp:381 +#: engines/sci/detection.cpp:384 msgid "Prefer digital sound effects instead of synthesized ones" msgstr "Föredra digitala ljudeffekter istället för syntetiserade" -#: engines/sci/detection.cpp:400 +#: engines/sci/detection.cpp:403 msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "Använd IMF/Yamaha FB-01 för MIDI-uppspelning" -#: engines/sci/detection.cpp:401 +#: engines/sci/detection.cpp:404 msgid "" "Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" @@ -1341,29 +1385,29 @@ msgstr "" "Använd ett IMB Music Feature-kort eller en Yamaha FB-01 FM synthmodul för " "MIDI-uppspelning" -#: engines/sci/detection.cpp:411 +#: engines/sci/detection.cpp:414 msgid "Use CD audio" msgstr "Använd CD-ljud" -#: engines/sci/detection.cpp:412 +#: engines/sci/detection.cpp:415 msgid "Use CD audio instead of in-game audio, if available" msgstr "Använd CD-ljud istället för spelets ljud, om tillgängligt" -#: engines/sci/detection.cpp:422 +#: engines/sci/detection.cpp:425 msgid "Use Windows cursors" msgstr "Använd Windows muspekare" -#: engines/sci/detection.cpp:423 +#: engines/sci/detection.cpp:426 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "" "Använd Windows muspekare (mindre och svartvit) istället för DOS-pekaren" -#: engines/sci/detection.cpp:433 +#: engines/sci/detection.cpp:436 msgid "Use silver cursors" msgstr "Använd silverpekare" -#: engines/sci/detection.cpp:434 +#: engines/sci/detection.cpp:437 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "" @@ -2016,7 +2060,7 @@ msgstr "Flyg åt höger" msgid "Fly to lower right" msgstr "Flyg åt nedre höger" -#: engines/scumm/scumm.cpp:1773 +#: engines/scumm/scumm.cpp:1776 #, c-format msgid "" "Native MIDI support requires the Roland Upgrade from LucasArts,\n" @@ -2025,7 +2069,7 @@ msgstr "" "Stöd för Native MIDI kräver Roland-uppdateringen från LucasArts,\n" "men %s saknas. Använder AdLib istället." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 +#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2036,7 +2080,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 +#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2047,7 +2091,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 +#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2058,7 +2102,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2512 +#: engines/scumm/scumm.cpp:2537 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2069,7 +2113,7 @@ msgstr "" "och välj \"Maniac\"-katalogen inuti \"Tentacle\" katalogen." #. I18N: Option for fast scene switching -#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171 +#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167 msgid "~Z~ip Mode Activated" msgstr "~Z~ipläge aktiverat" @@ -2090,11 +2134,11 @@ msgstr "~V~isa karta" msgid "~M~ain Menu" msgstr "Huvud~m~eny" -#: engines/mohawk/dialogs.cpp:172 +#: engines/mohawk/dialogs.cpp:168 msgid "~W~ater Effect Enabled" msgstr "~V~atteneffekt aktiverad" -#: engines/agos/animation.cpp:560 +#: engines/agos/animation.cpp:557 #, c-format msgid "Cutscene file '%s' not found!" msgstr "Filmscensfilen '%s' hittades ej!" @@ -2112,6 +2156,15 @@ msgstr "Kunde inte skriva spardata till filen." msgid "Failed to delete file." msgstr "Kunde inte radera filen." +#: engines/groovie/detection.cpp:312 +#, fuzzy +msgid "Fast movie speed" +msgstr "Snabbläge" + +#: engines/groovie/detection.cpp:313 +msgid "Play movies at an increased speed" +msgstr "" + #: engines/groovie/script.cpp:420 msgid "Failed to save game" msgstr "Kunde inte spara spelet." @@ -2202,11 +2255,11 @@ msgstr "Glid vänster" msgid "Slide Right" msgstr "Glid höger" -#: engines/kyra/lol.cpp:485 +#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2412 msgid "Turn Left" msgstr "Sväng vänster" -#: engines/kyra/lol.cpp:486 +#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2413 msgid "Turn Right" msgstr "Sväng höger" @@ -2222,7 +2275,7 @@ msgstr "Inställningar" msgid "Choose Spell" msgstr "Välj trollformel" -#: engines/kyra/sound_midi.cpp:475 +#: engines/kyra/sound_midi.cpp:477 msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2269,25 +2322,25 @@ msgstr "Diskettintro" msgid "Use the floppy version's intro (CD version only)" msgstr "Använd diskettversionens intro (endast CD-version)" -#: engines/sword1/animation.cpp:539 +#: engines/sword1/animation.cpp:519 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "PSX-filmscenen '%s' kan inte visas i palettläget" -#: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 +#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439 msgid "DXA cutscenes found but ScummVM has been built without zlib support" msgstr "DXA filmscener hittades men ScummVM har byggts utan stöd för zlib" -#: engines/sword1/animation.cpp:570 engines/sword2/animation.cpp:465 +#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449 msgid "MPEG2 cutscenes are no longer supported" msgstr "MPEG2 filmscener stöds inte längre" -#: engines/sword1/animation.cpp:576 engines/sword2/animation.cpp:473 +#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457 #, c-format msgid "Cutscene '%s' not found" msgstr "Filmscenen '%s' hittades ej" -#: engines/sword1/control.cpp:863 +#: engines/sword1/control.cpp:865 msgid "" "ScummVM found that you have old savefiles for Broken Sword 1 that should be " "converted.\n" @@ -2305,7 +2358,7 @@ msgstr "" "Tryck \"OK\" för att konvertera dem nu, annars kommer du tillfrågas igen " "nästa gång du startar spelet.\n" -#: engines/sword1/control.cpp:1232 +#: engines/sword1/control.cpp:1234 #, c-format msgid "" "Target new save game already exists!\n" @@ -2314,11 +2367,11 @@ msgstr "" "Den valda spardatan existerar redan!\n" "Vill du behålla den gamla spardatan (%s) eller den nya (%s)?\n" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the old one" msgstr "Behåll den gamla" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the new one" msgstr "Behåll den nya" @@ -2326,7 +2379,7 @@ msgstr "Behåll den nya" msgid "This is the end of the Broken Sword 1 Demo" msgstr "Här slutar Broken Sword 1 demon" -#: engines/sword2/animation.cpp:435 +#: engines/sword2/animation.cpp:419 msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "PSX-filmscener hittades men ScummVM har byggts utan stöd för RGB-färg" @@ -2339,12 +2392,12 @@ msgstr "Visa etiketter" msgid "Show labels for objects on mouse hover" msgstr "Visar etiketter för objekten som musen pekar på" -#: engines/teenagent/resources.cpp:68 +#: engines/teenagent/resources.cpp:94 msgid "" "You're missing the 'teenagent.dat' file. Get it from the ScummVM website" msgstr "" -#: engines/teenagent/resources.cpp:89 +#: engines/teenagent/resources.cpp:115 msgid "" "The teenagent.dat file is compressed and zlib hasn't been included in this " "executable. Please decompress it" @@ -2400,6 +2453,47 @@ msgstr "" "\n" "Var god rapportera till teamet." +#: engines/pegasus/pegasus.cpp:675 +msgid "Invalid save file name" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2410 +msgid "Up/Zoom In/Move Forward/Open Doors" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2411 +#, fuzzy +msgid "Down/Zoom Out" +msgstr "Zooma upp" + +#: engines/pegasus/pegasus.cpp:2414 +msgid "Display/Hide Inventory Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2415 +msgid "Display/Hide Biochip Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2416 +msgid "Action/Select" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2417 +msgid "Toggle Center Data Display" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2418 +msgid "Display/Hide Info Screen" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2419 +msgid "Display/Hide Pause Menu" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2420 +msgid "???" +msgstr "" + #: audio/fmopl.cpp:49 msgid "MAME OPL emulator" msgstr "MAME OPL-emulator" @@ -2457,7 +2551,7 @@ msgstr "Ingen musik" msgid "Amiga Audio Emulator" msgstr "Amiga ljudemulator" -#: audio/softsynth/adlib.cpp:1593 +#: audio/softsynth/adlib.cpp:2284 msgid "AdLib Emulator" msgstr "AdLib-emulator" @@ -2469,11 +2563,11 @@ msgstr "Apple II GS-emulator (INTE IMPLEMENTERAD)" msgid "C64 Audio Emulator" msgstr "C64 ljudemulator" -#: audio/softsynth/mt32.cpp:293 +#: audio/softsynth/mt32.cpp:205 msgid "Initializing MT-32 Emulator" msgstr "Initialiserar MT-32 emulator" -#: audio/softsynth/mt32.cpp:512 +#: audio/softsynth/mt32.cpp:431 msgid "MT-32 Emulator" msgstr "MT-32 emulator" @@ -2624,24 +2718,24 @@ msgstr "Mittenklick" msgid "Right Click" msgstr "Högerklick" -#: backends/platform/sdl/macosx/appmenu_osx.mm:78 +#: backends/platform/sdl/macosx/appmenu_osx.mm:77 msgid "Hide ScummVM" msgstr "Göm ScummVM" -#: backends/platform/sdl/macosx/appmenu_osx.mm:83 +#: backends/platform/sdl/macosx/appmenu_osx.mm:82 msgid "Hide Others" msgstr "Göm övriga" -#: backends/platform/sdl/macosx/appmenu_osx.mm:88 +#: backends/platform/sdl/macosx/appmenu_osx.mm:87 msgid "Show All" msgstr "Visa alla" -#: backends/platform/sdl/macosx/appmenu_osx.mm:110 -#: backends/platform/sdl/macosx/appmenu_osx.mm:121 +#: backends/platform/sdl/macosx/appmenu_osx.mm:109 +#: backends/platform/sdl/macosx/appmenu_osx.mm:120 msgid "Window" msgstr "Fönster" -#: backends/platform/sdl/macosx/appmenu_osx.mm:115 +#: backends/platform/sdl/macosx/appmenu_osx.mm:114 msgid "Minimize" msgstr "Minimera" @@ -2655,12 +2749,12 @@ msgid "Normal (no scaling)" msgstr "Normalt (ingen skalning)" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537 msgid "Enabled aspect ratio correction" msgstr "Korrektion av bildförhållande på" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542 msgid "Disabled aspect ratio correction" msgstr "Korrektion av bildförhållande av" @@ -2669,7 +2763,7 @@ msgid "Active graphics filter:" msgstr "Aktivt grafikfilter:" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481 msgid "Windowed mode" msgstr "Fönsterläge" @@ -2693,11 +2787,11 @@ msgstr "Nuvarande visningsläge" msgid "Current scale" msgstr "Nuvarande skala" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:558 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562 msgid "Active filter mode: Linear" msgstr "Aktivt filterläge: Linjärt" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:560 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564 msgid "Active filter mode: Nearest" msgstr "Aktivt filterläge: Närmast" @@ -3024,19 +3118,19 @@ msgstr "Vill du verkligen avsluta?" #: backends/events/gph/gph-events.cpp:386 #: backends/events/gph/gph-events.cpp:429 -#: backends/events/openpandora/op-events.cpp:139 +#: backends/events/openpandora/op-events.cpp:168 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "Touchscreen \"Tap-läge\" - Vänsterklick" #: backends/events/gph/gph-events.cpp:388 #: backends/events/gph/gph-events.cpp:431 -#: backends/events/openpandora/op-events.cpp:141 +#: backends/events/openpandora/op-events.cpp:170 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "Touchscren \"Tap-läge\" - Högerklick" #: backends/events/gph/gph-events.cpp:390 #: backends/events/gph/gph-events.cpp:433 -#: backends/events/openpandora/op-events.cpp:143 +#: backends/events/openpandora/op-events.cpp:172 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "Touchscreen \"Tap-läge\" - Hover (utan klick)" @@ -3056,7 +3150,12 @@ msgstr "Min. volym" msgid "Decreasing Volume" msgstr "Sänka volymen" -#: backends/updates/macosx/macosx-updates.mm:65 +#: backends/events/openpandora/op-events.cpp:174 +#, fuzzy +msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)" +msgstr "Touchscreen \"Tap-läge\" - Hover (utan klick)" + +#: backends/updates/macosx/macosx-updates.mm:67 msgid "Check for Updates..." msgstr "Sök efter uppdateringar..." @@ -3092,6 +3191,9 @@ msgstr "Klickning aktiverad" msgid "Clicking Disabled" msgstr "Klickning deaktiverad" +#~ msgid "Enable Roland GS Mode" +#~ msgstr "Aktivera Roland GS-läge" + #~ msgid "Hercules Green" #~ msgstr "Herkules grön" diff --git a/po/uk_UA.po b/po/uk_UA.po index ea71a51d52..1fe0537c19 100644 --- a/po/uk_UA.po +++ b/po/uk_UA.po @@ -1,5 +1,5 @@ # Ukrainian translation for ScummVM. -# Copyright (C) 2010-2012 ScummVM Team +# Copyright (C) 2010-2013 ScummVM Team # This file is distributed under the same license as the ScummVM package. # Lubomyr Lisen, 2010. # @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-08-12 14:57+0200\n" +"POT-Creation-Date: 2013-02-07 23:11+0000\n" "PO-Revision-Date: 2012-06-29 20:19+0200\n" "Last-Translator: lubomyr <lubomyr31@gmail.com>\n" "Language-Team: Ukrainian\n" @@ -18,45 +18,55 @@ msgstr "" "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:91 +#: gui/about.cpp:93 #, c-format msgid "(built on %s)" msgstr "(×öÑàÐÝØÙ %s)" -#: gui/about.cpp:98 +#: gui/about.cpp:100 msgid "Features compiled in:" msgstr "²ÚÛîçÕÝö Ò ÑöÛÔ Þßæö÷:" -#: gui/about.cpp:107 +#: gui/about.cpp:109 msgid "Available engines:" msgstr "´ÞáâãßÝö ÔÒØÖÚØ:" -#: gui/browser.cpp:66 +#: gui/browser.cpp:67 +#, fuzzy +msgid "Show hidden files" +msgstr "¿ÞÚÐ×ÐâØ / cåÞÒÐâØ ÚÞÝáÞÛì" + +#: gui/browser.cpp:67 +msgid "Show files marked with the hidden attribute" +msgstr "" + +#: gui/browser.cpp:71 msgid "Go up" msgstr "²ÓÞàã" -#: gui/browser.cpp:66 gui/browser.cpp:68 +#: gui/browser.cpp:71 gui/browser.cpp:73 msgid "Go to previous directory level" msgstr "¿ÕàÕÙâØ ÝÐ ßÐßÚã àöÒÝÕÜ ÒØéÕ" -#: gui/browser.cpp:68 +#: gui/browser.cpp:73 msgctxt "lowres" msgid "Go up" msgstr "²ÓÞàã" -#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 -#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 -#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 -#: gui/themebrowser.cpp:54 engines/engine.cpp:442 -#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 +#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238 +#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275 +#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919 +#: gui/themebrowser.cpp:54 engines/engine.cpp:447 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:190 +#: engines/sword1/control.cpp:867 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" msgstr "²öÔÜöÝÐ" -#: gui/browser.cpp:70 gui/chooser.cpp:46 gui/themebrowser.cpp:55 +#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55 msgid "Choose" msgstr "²ØÑàÐâØ" @@ -71,15 +81,15 @@ msgstr "·ÐÚàØâØ" msgid "Mouse click" msgstr "ºÛöÚ ÜØèÚÞî" -#: gui/gui-manager.cpp:122 base/main.cpp:300 +#: gui/gui-manager.cpp:122 base/main.cpp:301 msgid "Display keyboard" msgstr "¿ÞÚÐ×ÐâØ ÚÛÐÒöÐâãàã" -#: gui/gui-manager.cpp:126 base/main.cpp:304 +#: gui/gui-manager.cpp:126 base/main.cpp:305 msgid "Remap keys" msgstr "¿ÕàÕßàØ×ÝÐçØâØ ÚÛÐÒöèö" -#: gui/gui-manager.cpp:129 base/main.cpp:307 +#: gui/gui-manager.cpp:129 base/main.cpp:308 msgid "Toggle FullScreen" msgstr "¿ÕàÕÜÚÝãâØ ßÞÒÝÞÕÚàÐÝÝØÙ àÕÖØÜ" @@ -92,17 +102,18 @@ msgid "Map" msgstr "¿àØ×ÝÐçØâØ" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 -#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 -#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 -#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 -#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 -#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 -#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 -#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 -#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 -#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 -#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 +#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239 +#: gui/saveload-dialog.cpp:920 engines/engine.cpp:366 engines/engine.cpp:377 +#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192 +#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558 +#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 +#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519 +#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550 +#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:867 +#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419 +#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449 +#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274 +#: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -175,8 +186,8 @@ msgstr "" "¼ÞÒÐ ÓàØ. ·ÜöÝÐ æìÞÓÞ ÝÐÛÐèâãÒÐÝÝï ÝÕ ßÕàÕâÒÞàØâì Óàã ÐÝÓÛöÙáìÚÞî ÝÐ " "ãÚàÐ÷ÝáìÚã" -#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:80 -#: gui/options.cpp:730 gui/options.cpp:743 gui/options.cpp:1199 +#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86 +#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209 #: audio/null.cpp:40 msgid "<default>" msgstr "<×Ð ãÜÞÒçÐÝÝïÜ>" @@ -198,11 +209,11 @@ msgstr "¿ÛÐâäÞàÜÐ:" msgid "Engine" msgstr "´ÒØÖÞÚ" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "Graphics" msgstr "³àÐäöÚÐ" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089 msgid "GFX" msgstr "³àä" @@ -215,7 +226,7 @@ msgctxt "lowres" msgid "Override global graphic settings" msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ ÓàÐäöÚØ" -#: gui/launcher.cpp:251 gui/options.cpp:1085 +#: gui/launcher.cpp:251 gui/options.cpp:1095 msgid "Audio" msgstr "°ãÔöÞ" @@ -228,11 +239,11 @@ msgctxt "lowres" msgid "Override global audio settings" msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ ÐãÔöÞ" -#: gui/launcher.cpp:265 gui/options.cpp:1090 +#: gui/launcher.cpp:265 gui/options.cpp:1100 msgid "Volume" msgstr "³ãçÝöáâì" -#: gui/launcher.cpp:267 gui/options.cpp:1092 +#: gui/launcher.cpp:267 gui/options.cpp:1102 msgctxt "lowres" msgid "Volume" msgstr "³ãçÝ." @@ -246,7 +257,7 @@ msgctxt "lowres" msgid "Override global volume settings" msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ ÓãçÝÞáâö" -#: gui/launcher.cpp:280 gui/options.cpp:1100 +#: gui/launcher.cpp:280 gui/options.cpp:1110 msgid "MIDI" msgstr "MIDI" @@ -259,7 +270,7 @@ msgctxt "lowres" msgid "Override global MIDI settings" msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ MIDI" -#: gui/launcher.cpp:294 gui/options.cpp:1106 +#: gui/launcher.cpp:294 gui/options.cpp:1116 msgid "MT-32" msgstr "MT-32" @@ -272,11 +283,11 @@ msgctxt "lowres" msgid "Override global MT-32 settings" msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ MT-32" -#: gui/launcher.cpp:308 gui/options.cpp:1113 +#: gui/launcher.cpp:308 gui/options.cpp:1123 msgid "Paths" msgstr "ÈÛïåØ" -#: gui/launcher.cpp:310 gui/options.cpp:1115 +#: gui/launcher.cpp:310 gui/options.cpp:1125 msgctxt "lowres" msgid "Paths" msgstr "ÈÛïåØ" @@ -290,7 +301,7 @@ msgctxt "lowres" msgid "Game Path:" msgstr "ÈÛïå ÔÞ ÓàØ:" -#: gui/launcher.cpp:324 gui/options.cpp:1139 +#: gui/launcher.cpp:324 gui/options.cpp:1149 msgid "Extra Path:" msgstr "´ÞÔÐâÚ. èÛïå:" @@ -298,42 +309,42 @@ msgstr "´ÞÔÐâÚ. èÛïå:" msgid "Specifies path to additional data used the game" msgstr "²ÚÐ×ãô èÛïå ÔÞ ÔÞÔÐâÚÞÒØå äÐÙÛöÒ ÔÐÝØå ÔÛï ÓàØ" -#: gui/launcher.cpp:326 gui/options.cpp:1141 +#: gui/launcher.cpp:326 gui/options.cpp:1151 msgctxt "lowres" msgid "Extra Path:" msgstr "´ÞÔ. èÛïå:" -#: gui/launcher.cpp:333 gui/options.cpp:1123 +#: gui/launcher.cpp:333 gui/options.cpp:1133 msgid "Save Path:" msgstr "ÈÛïå ×ÑÕà.:" #: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 -#: gui/options.cpp:1123 gui/options.cpp:1125 gui/options.cpp:1126 +#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136 msgid "Specifies where your savegames are put" msgstr "²ÚÐ×ãô èÛïå ÔÞ ×ÑÕàÕÖÕÝì ÓàØ" -#: gui/launcher.cpp:335 gui/options.cpp:1125 +#: gui/launcher.cpp:335 gui/options.cpp:1135 msgctxt "lowres" msgid "Save Path:" msgstr "ÈÛïå ×ÑÕà.:" #: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 -#: gui/launcher.cpp:565 gui/options.cpp:1134 gui/options.cpp:1142 -#: gui/options.cpp:1151 gui/options.cpp:1258 gui/options.cpp:1264 -#: gui/options.cpp:1272 gui/options.cpp:1302 gui/options.cpp:1308 -#: gui/options.cpp:1315 gui/options.cpp:1408 gui/options.cpp:1411 -#: gui/options.cpp:1423 +#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152 +#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282 +#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326 +#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429 +#: gui/options.cpp:1441 msgctxt "path" msgid "None" msgstr "½Õ ×ÐÒÔÐÝØÙ" #: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 -#: gui/options.cpp:1252 gui/options.cpp:1296 gui/options.cpp:1414 +#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "·Ð ãÜÞÒçÐÝÝïÜ" -#: gui/launcher.cpp:504 gui/options.cpp:1417 +#: gui/launcher.cpp:504 gui/options.cpp:1435 msgid "Select SoundFont" msgstr "²ØÑÕàöâì SoundFont" @@ -357,7 +368,7 @@ msgstr "ÆÕÙ ID ÓàØ ÒÖÕ ÒØÚÞàØáâÞÒãôâìáï. ±ãÔì ÛÐáÚÐ, ÒØÑÕàöâì öÝèØÙ." msgid "~Q~uit" msgstr "~²~ØåöÔ" -#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:96 +#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95 msgid "Quit ScummVM" msgstr "²ØåöÔ ×ö ScummVM" @@ -365,7 +376,7 @@ msgstr "²ØåöÔ ×ö ScummVM" msgid "A~b~out..." msgstr "¿àÞ ß~à~ÞÓàÐÜã..." -#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:70 +#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69 msgid "About ScummVM" msgstr "¿àÞ ScummVM" @@ -442,12 +453,14 @@ msgstr "¿ÞèãÚ:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 +#: engines/pegasus/pegasus.cpp:345 msgid "Load game:" msgstr "·ÐÒÐÝâÐÖØâØ Óàã:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:345 +#: backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "·ÐÒÐÝâÐÖØâØ" @@ -532,133 +545,133 @@ msgstr "¿àÞÓÛïÝãâÞ %d ßÐßÞÚ ..." msgid "Discovered %d new games, ignored %d previously added games ..." msgstr "·ÝÐÙÔÕÝÞ %d ÝÞÒØå öÓÞà, ßàÞßãéÕÝÞ %d ßÞßÕàÕÔÝìÞ ÔÞÔÐÝØå öÓÞà ..." -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "Never" msgstr "½öÚÞÛØ" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 5 mins" msgstr "ÚÞÖÝö 5 åÒ" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 10 mins" msgstr "ÚÞÖÝö 10 åÒ" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 15 mins" msgstr "ÚÞÖÝö 15 åÒ" -#: gui/options.cpp:78 +#: gui/options.cpp:84 msgid "every 30 mins" msgstr "ÚÞÖÝö 30 åÒ" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "8 kHz" msgstr "8 Ú³æ" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "11kHz" msgstr "11 Ú³æ" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "22 kHz" msgstr "22 Ú³æ" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "44 kHz" msgstr "44 Ú³æ" -#: gui/options.cpp:80 +#: gui/options.cpp:86 msgid "48 kHz" msgstr "48 Ú³æ" -#: gui/options.cpp:248 gui/options.cpp:474 gui/options.cpp:575 -#: gui/options.cpp:644 gui/options.cpp:852 +#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581 +#: gui/options.cpp:650 gui/options.cpp:858 msgctxt "soundfont" msgid "None" msgstr "½Õ ×ÐÔÐÝØÙ" -#: gui/options.cpp:382 +#: gui/options.cpp:388 msgid "Failed to apply some of the graphic options changes:" msgstr "½Õ ÒÔÐÛÞáï ×ÐáâÞáãÒÐâØ ÔÕïÚö ×ö ×ÜöÝ ÓàÐäöçÝØå ÝÐÛÐèâãÒÐÝì:" -#: gui/options.cpp:394 +#: gui/options.cpp:400 msgid "the video mode could not be changed." msgstr "ÝÕ ÒÔÐÛÞáï ×ÜöÝØâØ ÓàÐäöçÝØÙ àÕÖØÜ." -#: gui/options.cpp:400 +#: gui/options.cpp:406 msgid "the fullscreen setting could not be changed" msgstr "ÝÕ ÒÔÐÛÞáï ×ÜöÝØâØ àÕÖØÜ ßÞÒÝÞÓÞ ÕÚàÐÝã" -#: gui/options.cpp:406 +#: gui/options.cpp:412 msgid "the aspect ratio setting could not be changed" msgstr "ÝÕ ÒÔÐÛÞáï ×ÜöÝØâØ àÕÖØÜ ÚÞàÕÚæö÷ áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ" -#: gui/options.cpp:727 +#: gui/options.cpp:733 msgid "Graphics mode:" msgstr "³àÐäöçÝ. àÕÖØÜ:" -#: gui/options.cpp:741 +#: gui/options.cpp:747 msgid "Render mode:" msgstr "ÀÕÖØÜ àÐáâàãÒ.:" -#: gui/options.cpp:741 gui/options.cpp:742 +#: gui/options.cpp:747 gui/options.cpp:748 msgid "Special dithering modes supported by some games" msgstr "ÁßÕæöÐÛìÝö àÕÖØÜØ àÐáâàãÒÐÝÝï, ïÚö ßöÔâàØÜãîâì ÔÕïÚö öÓàØ" -#: gui/options.cpp:753 +#: gui/options.cpp:759 #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476 msgid "Fullscreen mode" msgstr "¿ÞÒÝÞÕÚàÐÝÝØÙ àÕÖØÜ" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Aspect ratio correction" msgstr "ºÞàÕÚæöï áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ" -#: gui/options.cpp:756 +#: gui/options.cpp:762 msgid "Correct aspect ratio for 320x200 games" msgstr "ºÞàØÓãÒÐâØ áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ ÔÛï öÓÞà × ÓàÐäöÚÞî 320x200" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Preferred Device:" msgstr "ÃßÞÔÞÑÐÝØÙ ßàØáâàöÙ:" -#: gui/options.cpp:764 +#: gui/options.cpp:770 msgid "Music Device:" msgstr "¼ãרç. ßàØáâàöÙ:" -#: gui/options.cpp:764 gui/options.cpp:766 +#: gui/options.cpp:770 gui/options.cpp:772 msgid "Specifies preferred sound device or sound card emulator" msgstr "²ÚÐ×ãô ãßÞÔÞÑÐÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ÐÑÞ ÕÜãÛïâÞà ×ÒãÚÞÒÞ÷ ÚÐàâØ" -#: gui/options.cpp:764 gui/options.cpp:766 gui/options.cpp:767 +#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773 msgid "Specifies output sound device or sound card emulator" msgstr "²ÚÐ×ãô ÒØåöÔÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ÐÑÞ ÕÜãÛïâÞà ×ÒãÚÞÒÞ÷ ÚÐàâØ" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Preferred Dev.:" msgstr "ÃßÞÔÞÑ. ßàØáâàöÙ:" -#: gui/options.cpp:766 +#: gui/options.cpp:772 msgctxt "lowres" msgid "Music Device:" msgstr "¼ãרçÝØÙ ßàØáâàöÙ:" -#: gui/options.cpp:793 +#: gui/options.cpp:799 msgid "AdLib emulator:" msgstr "µÜãÛïâÞà AdLib:" -#: gui/options.cpp:793 gui/options.cpp:794 +#: gui/options.cpp:799 gui/options.cpp:800 msgid "AdLib is used for music in many games" msgstr "·ÒãÚÞÒÐ ÚÐàâÐ AdLib ÒØÚÞàØáâÞÒãôâìáï ÑÐÓÐâìÜÐ öÓàÐÜØ" -#: gui/options.cpp:804 +#: gui/options.cpp:810 msgid "Output rate:" msgstr "²ØåöÔÝÐ çÐáâÞâÐ:" -#: gui/options.cpp:804 gui/options.cpp:805 +#: gui/options.cpp:810 gui/options.cpp:811 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -666,63 +679,67 @@ msgstr "" "²ÕÛØÚö ×ÝÐçÕÝÝï ×ÐÔÐîâì ÚàÐéã ïÚöáâì ×ÒãÚã, ßàÞâÕ ÒÞÝØ ÜÞÖãâì ÝÕ " "ßöÔâàØÜãÒÐâØáï ÒÐèÞî ×ÒãÚÞÒÞî ÚÐàâÞî" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "GM Device:" msgstr "¿àØáâàöÙ GM:" -#: gui/options.cpp:815 +#: gui/options.cpp:821 msgid "Specifies default sound device for General MIDI output" msgstr "²ÚÐ×ãô ÒØåöÔÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ÔÛï General MIDI" -#: gui/options.cpp:826 +#: gui/options.cpp:832 msgid "Don't use General MIDI music" msgstr "½Õ ÒØÚÞàØáâÞÒãÒÐâØ ÜãרÚã General MIDI" -#: gui/options.cpp:837 gui/options.cpp:899 +#: gui/options.cpp:843 gui/options.cpp:909 msgid "Use first available device" msgstr "²ØÚÞàØáâÞÒãÒÐâØ ßÕàèØÙ ÝÐïÒÝØÙ ßàØáâàöÙ" -#: gui/options.cpp:849 +#: gui/options.cpp:855 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 +#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "SoundFont ßöÔâàØÜãôâìáï ÔÕïÚØÜØ ×ÒãÚÞÒØÜØ ÚÐàâÐÜØ, Fluidsynth âÐ Timidity" -#: gui/options.cpp:851 +#: gui/options.cpp:857 msgctxt "lowres" msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Mixed AdLib/MIDI mode" msgstr "·ÜöèÐÝØÙ àÕÖØÜ AdLib/MIDI" -#: gui/options.cpp:857 +#: gui/options.cpp:863 msgid "Use both MIDI and AdLib sound generation" msgstr "²ØÚÞàØáâÞÒãÒÐâØ ö MIDI ö AdLib ÔÛï ÓÕÝÕàÐæö÷ ×ÒãÚã" -#: gui/options.cpp:860 +#: gui/options.cpp:866 msgid "MIDI gain:" msgstr "¿ÞáØÛÕÝÝï MIDI:" -#: gui/options.cpp:870 +#: gui/options.cpp:873 +msgid "FluidSynth Settings" +msgstr "" + +#: gui/options.cpp:880 msgid "MT-32 Device:" msgstr "¿àØáâàöÙ MT-32:" -#: gui/options.cpp:870 +#: gui/options.cpp:880 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" "²ÚÐ×ãô ×ÒãÚÞÒØÙ ßàØáâàöÙ ×Ð ãÜÞÒçÐÝÝïÜ ÔÛï ÒØÒÞÔã ÝÐ Roland MT-32/LAPC1/" "CM32l/CM64" -#: gui/options.cpp:875 +#: gui/options.cpp:885 msgid "True Roland MT-32 (disable GM emulation)" msgstr "ÁßàÐÒÖÝöÙ Roland MT-32 (ÒØÜÚÝãâØ ÕÜãÛïæØî GM)" -#: gui/options.cpp:875 gui/options.cpp:877 +#: gui/options.cpp:885 gui/options.cpp:887 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -730,193 +747,194 @@ msgstr "" "²öÔÜöâìâÕ, ïÚéÞ ã ÒÐá ßöÔÚÛîçÕÝÞ Roland-áãÜöáÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ö ÒØ " "åÞçÕâÕ ÙÞÓÞ ÒØÚÞàØáâÞÒãÒÐâØ" -#: gui/options.cpp:877 +#: gui/options.cpp:887 msgctxt "lowres" msgid "True Roland MT-32 (no GM emulation)" msgstr "ÁßàÐÒÖÝöÙ Roland MT-32 (ÒØÜÚÝãâØ ÕÜãÛïæØî GM)" -#: gui/options.cpp:880 -msgid "Enable Roland GS Mode" -msgstr "ÃÒöÜÚÝãâØ àÕÖØÜ Roland GS" +#: gui/options.cpp:890 +#, fuzzy +msgid "Roland GS Mode (disable GM mapping)" +msgstr "ÁßàÐÒÖÝöÙ Roland MT-32 (ÒØÜÚÝãâØ ÕÜãÛïæØî GM)" -#: gui/options.cpp:880 +#: gui/options.cpp:890 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "²ØÜØÚÐô ÜÐßöÝÓ General MIDI ÔÛï öÓÞà ×ö ×ÒãÚÞÒÞî ÔÞàöÖÚÞî ÔÛï Roland MT-32" -#: gui/options.cpp:889 +#: gui/options.cpp:899 msgid "Don't use Roland MT-32 music" msgstr "½Õ ÒØÚÞàØáâÞÒãÒÐâØ Roland MT-32" -#: gui/options.cpp:916 +#: gui/options.cpp:926 msgid "Text and Speech:" msgstr "ÂÕÚáâ ö Þ×ÒãçÚÐ:" -#: gui/options.cpp:920 gui/options.cpp:930 +#: gui/options.cpp:930 gui/options.cpp:940 msgid "Speech" msgstr "¾×ÒãçÚÐ" -#: gui/options.cpp:921 gui/options.cpp:931 +#: gui/options.cpp:931 gui/options.cpp:941 msgid "Subtitles" msgstr "ÁãÑâØâàØ" -#: gui/options.cpp:922 +#: gui/options.cpp:932 msgid "Both" msgstr "²áÕ" -#: gui/options.cpp:924 +#: gui/options.cpp:934 msgid "Subtitle speed:" msgstr "ÈÒØÔ. áãÑâØâàöÒ:" -#: gui/options.cpp:926 +#: gui/options.cpp:936 msgctxt "lowres" msgid "Text and Speech:" msgstr "ÂÕÚáâ ö Þ×ÒãçÚÐ:" -#: gui/options.cpp:930 +#: gui/options.cpp:940 msgid "Spch" msgstr "¾×Ò" -#: gui/options.cpp:931 +#: gui/options.cpp:941 msgid "Subs" msgstr "ÁãÑ" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgctxt "lowres" msgid "Both" msgstr "²áÕ" -#: gui/options.cpp:932 +#: gui/options.cpp:942 msgid "Show subtitles and play speech" msgstr "¿ÞÚÐ×ãÒÐâØ áãÑâØâàØ ö ÒöÔâÒÞàîÒÐâØ ÜÞÒã" -#: gui/options.cpp:934 +#: gui/options.cpp:944 msgctxt "lowres" msgid "Subtitle speed:" msgstr "ÈÒØÔ. áãÑâØâàöÒ:" -#: gui/options.cpp:950 +#: gui/options.cpp:960 msgid "Music volume:" msgstr "³ãçÝöáâì Üã×ØÚØ:" -#: gui/options.cpp:952 +#: gui/options.cpp:962 msgctxt "lowres" msgid "Music volume:" msgstr "³ãçÝöáâì Üã×ØÚØ:" -#: gui/options.cpp:959 +#: gui/options.cpp:969 msgid "Mute All" msgstr "²ØÜÚÝãâØ ÒáÕ" -#: gui/options.cpp:962 +#: gui/options.cpp:972 msgid "SFX volume:" msgstr "³ãçÝöáâì ÕäÕÚâöÒ:" -#: gui/options.cpp:962 gui/options.cpp:964 gui/options.cpp:965 +#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975 msgid "Special sound effects volume" msgstr "³ãçÝöáâì áßÕæöÐÛìÝØå ×ÒãÚÞÒØå ÕäÕÚâöÒ" -#: gui/options.cpp:964 +#: gui/options.cpp:974 msgctxt "lowres" msgid "SFX volume:" msgstr "³ãçÝ. ÕäÕÚâöÒ:" -#: gui/options.cpp:972 +#: gui/options.cpp:982 msgid "Speech volume:" msgstr "³ãçÝöáâì Þ×ÒãçÚØ:" -#: gui/options.cpp:974 +#: gui/options.cpp:984 msgctxt "lowres" msgid "Speech volume:" msgstr "³ãçÝ. Þ×ÒãçÚØ:" -#: gui/options.cpp:1131 +#: gui/options.cpp:1141 msgid "Theme Path:" msgstr "ÈÛïå ÔÞ âÕÜ:" -#: gui/options.cpp:1133 +#: gui/options.cpp:1143 msgctxt "lowres" msgid "Theme Path:" msgstr "ÈÛïå ÔÞ âÕÜ:" -#: gui/options.cpp:1139 gui/options.cpp:1141 gui/options.cpp:1142 +#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "²ÚÐ×ãô èÛïå ÔÞ ÔÞÔÐâÚÞÒØå äÐÙÛöÒ ÔÐÝØå, ïÚö ÒØÚÞàØáâÞÒãîâìáï ãáöÜÐ öÓàÐÜØ " "ÐÑÞ ScummVM" -#: gui/options.cpp:1148 +#: gui/options.cpp:1158 msgid "Plugins Path:" msgstr "ÈÛïå ÔÞ ÒâãÛÚöÒ:" -#: gui/options.cpp:1150 +#: gui/options.cpp:1160 msgctxt "lowres" msgid "Plugins Path:" msgstr "ÈÛïå ÔÞ ÒâãÛÚöÒ:" -#: gui/options.cpp:1159 +#: gui/options.cpp:1169 msgid "Misc" msgstr "Àö×ÝÕ" -#: gui/options.cpp:1161 +#: gui/options.cpp:1171 msgctxt "lowres" msgid "Misc" msgstr "Àö×ÝÕ" -#: gui/options.cpp:1163 +#: gui/options.cpp:1173 msgid "Theme:" msgstr "ÂÕÜÐ:" -#: gui/options.cpp:1167 +#: gui/options.cpp:1177 msgid "GUI Renderer:" msgstr "ÀÐáâÕà. GUI:" -#: gui/options.cpp:1179 +#: gui/options.cpp:1189 msgid "Autosave:" msgstr "°ÒâÞ×ÑÕàÕÖÕÝÝï:" -#: gui/options.cpp:1181 +#: gui/options.cpp:1191 msgctxt "lowres" msgid "Autosave:" msgstr "°ÒâÞ×ÑÕàÕÖ.:" -#: gui/options.cpp:1189 +#: gui/options.cpp:1199 msgid "Keys" msgstr "ºÛÐÒöèö" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "GUI Language:" msgstr "¼ÞÒÐ öÝâÕàä.:" -#: gui/options.cpp:1196 +#: gui/options.cpp:1206 msgid "Language of ScummVM GUI" msgstr "¼ÞÒÐ ÓàÐäöçÝÞÓÞ öÝâÕàäÕÙáã ScummVM" -#: gui/options.cpp:1347 +#: gui/options.cpp:1365 msgid "You have to restart ScummVM before your changes will take effect." msgstr "²Ø ßÞÒØÝÝö ßÕàÕ×ÐßãáâØâØ ScummVM éÞÑ ×ÐáâÞáãÒÐâØ ×ÜöÝØ." -#: gui/options.cpp:1360 +#: gui/options.cpp:1378 msgid "Select directory for savegames" msgstr "²ØÑÕàöâì ßÐßÚã ÔÛï ×ÑÕàÕÖÕÝì" -#: gui/options.cpp:1367 +#: gui/options.cpp:1385 msgid "The chosen directory cannot be written to. Please select another one." msgstr "½Õ ÜÞÖã ߨáÐâØ ã ÒØÑàÐÝã ßÐßÚã. ±ãÔì ÛÐáÚÐ, ÒÚÐÖöâì öÝèã." -#: gui/options.cpp:1376 +#: gui/options.cpp:1394 msgid "Select directory for GUI themes" msgstr "²ØÑÕàöâì ßÐßÚã ÔÛï âÕÜ GUI" -#: gui/options.cpp:1386 +#: gui/options.cpp:1404 msgid "Select directory for extra files" msgstr "²ØÑÕàöâì ßÐßÚã × ÔÞÔÐâÚÞÒØÜØ äÐÙÛÐÜØ" -#: gui/options.cpp:1397 +#: gui/options.cpp:1415 msgid "Select directory for plugins" msgstr "²ØÑÕàöâì ßÐßÚã ×ö ÒâãÛÚÐÜØ" -#: gui/options.cpp:1450 +#: gui/options.cpp:1468 msgid "" "The theme you selected does not support your current language. If you want " "to use this theme you need to switch to another language first." @@ -924,71 +942,71 @@ msgstr "" "²ØÑàÐÝÐ âÕÜÐ ÝÕ ßöÔâàØÜãô ßÞâÞçÝã ÜÞÒã. ÏÚéÞ ÒØ åÞçÕâÕ ÒØÚÞàØáâÞÒãÒÐâØ æî " "âÕÜã, ßÞâàöÑÝÞ Ò ßÕàèã çÕàÓã ×ÜöÝØâØ ÜÞÒã." -#: gui/saveload-dialog.cpp:158 +#: gui/saveload-dialog.cpp:166 msgid "List view" msgstr "²ØÓÛïÔ áߨáÚã" -#: gui/saveload-dialog.cpp:159 +#: gui/saveload-dialog.cpp:167 msgid "Grid view" msgstr "²ØÓÛïÔ áöâÚØ" -#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 +#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358 msgid "No date saved" msgstr "´Ðâã ÝÕ ×ÐߨáÐÝÞ" -#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359 msgid "No time saved" msgstr "ÇÐá ÝÕ ×ÐߨáÐÝÞ" -#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 +#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360 msgid "No playtime saved" msgstr "ÇÐá ÓàØ ÝÕ ×ÐߨáÐÝÞ" -#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275 msgid "Delete" msgstr "²ØÔÐÛØâØ" -#: gui/saveload-dialog.cpp:266 +#: gui/saveload-dialog.cpp:274 msgid "Do you really want to delete this savegame?" msgstr "²Ø ÔöÙáÝÞ åÞçÕâÕ ÒØÔÐ󯉯 æÕ ×ÑÕàÕÖÕÝÝï?" -#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 +#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872 msgid "Date: " msgstr "´ÐâÐ: " -#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 +#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878 msgid "Time: " msgstr "ÇÐá: " -#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 +#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886 msgid "Playtime: " msgstr "ÇÐá ÓàØ: " -#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 +#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494 msgid "Untitled savestate" msgstr "·ÑÕàÕÖÕÝÝï ÑÕ× öÜÕÝö" -#: gui/saveload-dialog.cpp:517 +#: gui/saveload-dialog.cpp:546 msgid "Next" msgstr "½ÐáãâßÝØÙ" -#: gui/saveload-dialog.cpp:520 +#: gui/saveload-dialog.cpp:549 msgid "Prev" msgstr "¿ÞßÕàÕÔÝöÙ" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 msgid "New Save" msgstr "½ÞÒÕ ×ÑÕàÕÖÕÝÝï" -#: gui/saveload-dialog.cpp:684 +#: gui/saveload-dialog.cpp:736 msgid "Create a new save game" msgstr "ÁâÒÞàØâØ ÝÞÒØÙ ×Ðߨá ÓàØ" -#: gui/saveload-dialog.cpp:789 +#: gui/saveload-dialog.cpp:865 msgid "Name: " msgstr "½Ð×ÒÐ: " -#: gui/saveload-dialog.cpp:861 +#: gui/saveload-dialog.cpp:937 #, c-format msgid "Enter a description for slot %d:" msgstr "²ÒÕÔöâì Þߨá ÔÛï áÛÞâã %d:" @@ -1026,35 +1044,35 @@ msgstr "ÀÐáâÕàØ×ÐâÞà ×ö ×ÓÛÐÔÖãÒÐÝÝïÜ (16bpp)" msgid "Clear value" msgstr "¾çØáâØâØ ×ÝÐçÕÝÝï" -#: base/main.cpp:209 +#: base/main.cpp:210 #, c-format msgid "Engine does not support debug level '%s'" msgstr "´ÒØÖÞÚ ÝÕ ßöÔâàØÜãô àöÒÕÝì ÒöÔÛÐÔÚØ '%s'" -#: base/main.cpp:287 +#: base/main.cpp:288 msgid "Menu" msgstr "¼ÕÝî" -#: base/main.cpp:290 backends/platform/symbian/src/SymbianActions.cpp:45 +#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:45 #: backends/platform/wince/CEActionsSmartphone.cpp:46 msgid "Skip" msgstr "¿àÞßãáâØâØ" -#: base/main.cpp:293 backends/platform/symbian/src/SymbianActions.cpp:50 +#: base/main.cpp:294 backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:42 msgid "Pause" msgstr "¿Ðã×Ð" -#: base/main.cpp:296 +#: base/main.cpp:297 msgid "Skip line" msgstr "¿àÞßãáâØâØ àïÔÞÚ" -#: base/main.cpp:467 +#: base/main.cpp:468 msgid "Error running game:" msgstr "¿ÞÜØÛÚÐ ×ÐßãáÚã ÓàØ:" -#: base/main.cpp:491 +#: base/main.cpp:492 msgid "Could not find any engine capable of running the selected game" msgstr "½Õ ÜÞÖã ×ÝÐÙâØ ÔÒØÖÞÚ ÔÛï ×ÐßãáÚã ÒØÑàÐÝÞ÷ ÓàØ" @@ -1169,13 +1187,16 @@ msgid "~R~eturn to Launcher" msgstr "~¿~ÞÒÕà.Ò ÓÞÛÞÒÝÕ ÜÕÝî" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284 +#: engines/pegasus/pegasus.cpp:369 msgid "Save game:" msgstr "·ÑÕàÕÓâØ Óàã: " #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:742 +#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 +#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:369 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1204,12 +1225,12 @@ msgstr "" "ÞáÝÞÒÝÞ÷ öÝÞàÜÐæö÷, Ð âÐÚÞÖ öÝáâàãÚæöÙ, ïÚ ÞâàØÜÐâØ ßÞÔÐÛìèã ÔÞßÞÜÞÓã." #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 -#: engines/mohawk/dialogs.cpp:174 +#: engines/mohawk/dialogs.cpp:170 msgid "~O~K" msgstr "~O~K" #: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 -#: engines/mohawk/dialogs.cpp:175 +#: engines/mohawk/dialogs.cpp:171 msgid "~C~ancel" msgstr "²ö~Ô~ÜöÝÐ" @@ -1217,23 +1238,23 @@ msgstr "²ö~Ô~ÜöÝÐ" msgid "~K~eys" msgstr "~º~ÛÐÒöèö" -#: engines/engine.cpp:235 +#: engines/engine.cpp:240 msgid "Could not initialize color format." msgstr "½Õ ÜÞÖã ÝÐÛÐèâãÒÐâØ äÞàÜÐâ ÚÞÛìÞàã." -#: engines/engine.cpp:243 +#: engines/engine.cpp:248 msgid "Could not switch to video mode: '" msgstr "½Õ ÒÔÐÛÞáï ßÕàÕÚÛîçØâØ ÒöÔÕÞàÕÖØÜ: '" -#: engines/engine.cpp:252 +#: engines/engine.cpp:257 msgid "Could not apply aspect ratio setting." msgstr "½Õ ÒÔÐÛÞáï ×ÐáâÞáãÒÐâØ ÚÞàÕÚæöî áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ." -#: engines/engine.cpp:257 +#: engines/engine.cpp:262 msgid "Could not apply fullscreen setting." msgstr "½Õ ÒÔÐÛÞáï ×ÐáâÞáãÒÐâØ ßÞÒÝÞÕÚàÐÝÝØÙ àÕÖØÜ." -#: engines/engine.cpp:357 +#: engines/engine.cpp:362 msgid "" "You appear to be playing this game directly\n" "from the CD. This is known to cause problems,\n" @@ -1247,7 +1268,7 @@ msgstr "" "ÓàØ ÝÐ ÖÞàáâÚØÙ ÔØáÚ.\n" "´ØÒöâìáï äÐÙÛ README ÔÛï ßÞÔÐÛìèØå öÝáâàãÚæöÙ." -#: engines/engine.cpp:368 +#: engines/engine.cpp:373 msgid "" "This game has audio tracks in its disk. These\n" "tracks need to be ripped from the disk using\n" @@ -1261,7 +1282,7 @@ msgstr "" "âÞÓÞ, éÞÑ ÜÞÖÝÐ ÑãÛÞ áÛãåÐâØ ÜãרÚã ã Óàö.\n" "´ØÒöâìáï äÐÙÛ README ÔÛï ßÞÔÐÛìèØå öÝáâàãÚæöÙ." -#: engines/engine.cpp:426 +#: engines/engine.cpp:431 #, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " @@ -1270,7 +1291,7 @@ msgstr "" "·ÐÒÐÝâÐÖÕÝÝï áâÐÝã ÓàØ ÝÕ ÒÔÐÛÞáï (%s)! . ±ãÔì-ÛÐáÚÐ, ÔØÒöâìáï äÐÙÛ README " "ÔÛï ÞáÝÞÒÝÞ÷ öÝÞàÜÐæö÷, Ð âÐÚÞÖ öÝáâàãÚæöÙ, ïÚ ÞâàØÜÐâØ ßÞÔÐÛìèã ÔÞßÞÜÞÓã." -#: engines/engine.cpp:439 +#: engines/engine.cpp:444 msgid "" "WARNING: The game you are about to start is not yet fully supported by " "ScummVM. As such, it is likely to be unstable, and any saves you make might " @@ -1280,29 +1301,51 @@ msgstr "" "ScummVM. ÁÚÞàèÕ ×Ð ÒáÕ ÒÞÝÐ ÝÕ ÑãÔÕ ßàÐæîÒÐâØ áâÐÑöÛìÝÞ, ö ×ÑÕàÕÖÕÝÝï öÓÞà, " "ïÚö ÒØ ×àÞÑØâÕ, ÜÞÖãâì ÝÕ ßàÐæîÒÐâØ ã ßÞÔÐÛìèØå ÒÕàáöïå ScummVM." -#: engines/engine.cpp:442 +#: engines/engine.cpp:447 msgid "Start anyway" msgstr "²áÕ ÞÔÝÞ ×ÐßãáâØâØ" -#: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 -#: engines/sci/detection.cpp:390 +#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270 +#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393 +#: engines/toltecs/detection.cpp:173 msgid "Use original save/load screens" msgstr "²ØÚÞàØáâÞÒãÒÐâØ ÞàØÓ. ×ÑÕàÕÖÕÝÝï/×ÐÒÐÝâÐÖÕÝÝï ÕÚàÐÝØ" -#: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 -#: engines/sci/detection.cpp:391 +#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271 +#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394 +#: engines/toltecs/detection.cpp:174 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" "²ØÚÞàØáâÞÒãÒÐâØ ÞàØÓöÝÐÛìÝö ×ÑÕàÕÖÕÝÝï/×ÐÒÐÝâÐÖÕÝÝï ÕÚàÐÝØ, ×ÐÜöáâì ScummVM" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore game:" msgstr "²öÔÝÞ񯉯 Óàã:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 +#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351 +#: engines/sci/engine/kfile.cpp:838 engines/toltecs/menu.cpp:259 msgid "Restore" msgstr "²öÔÝÞÒØâØ" +#: engines/drascula/saveload.cpp:49 +#, fuzzy +msgid "" +"ScummVM found that you have old savefiles for Drascula that should be " +"converted.\n" +"The old save game format is no longer supported, so you will not be able to " +"load your games if you don't convert them.\n" +"\n" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" +msgstr "" +"ScummVM ×ÝÐÙèÞÒ, éÞ ²Ø ÜÐôâÕ áâÐàö ×ÑÕàÕÖÕÝÝï öÓÞà ÔÛï Broken Sword 1.\n" +"·ÑÕàÕÖÕÝÝï ã áâÐàÞÜã äÞàÜÐâö ÝÕ ßöÔâàØÜãîâìáï, ö ²Ø ÝÕ ×ÜÞÖÕâÕ ÷å " +"×ÐÒÐÝâÐÖØâØ, ïÚéÞ ÝÕ ßÕàÕÒÕÔÕâÕ ã ÝÞÒØÙ äÞàÜÐâ.\n" +"\n" +"½ÐâØáÝöâì ¾º, éÞÑ ßÕàÕÒÕáâØ ÷å ×ÐàÐ×, öÝÐÚèÕ ãÕ ßÞÒöÔÞÜÛÕÝÝï ×'ïÒØâìáï ßàØ " +"ÝÐáâãßÝÞÜã ×ÐßãáÚã ÓàØ.\n" + #: engines/dreamweb/detection.cpp:57 msgid "Use bright palette mode" msgstr "²ØÚÞàØáâÞÒãÒÐâØ ïáÚàÐÒØÙ àÕÖØÜ ßÐÛöâàØ" @@ -1311,56 +1354,56 @@ msgstr "²ØÚÞàØáâÞÒãÒÐâØ ïáÚàÐÒØÙ àÕÖØÜ ßÐÛöâàØ" msgid "Display graphics using the game's bright palette" msgstr "²öÔÞÑàÐÖÕÝÝï ÓàÐäöÚØ × ÒØÚÞàØáâÐÝÝïÜ ïáÚàÐÒÞ÷ ßÐÛöâàØ öÓà" -#: engines/sci/detection.cpp:370 +#: engines/sci/detection.cpp:373 msgid "EGA undithering" msgstr "EGA ÑÕ× àÐáâàãÒÐÝÝï" -#: engines/sci/detection.cpp:371 +#: engines/sci/detection.cpp:374 msgid "Enable undithering in EGA games" msgstr "ÃÒöÜÚÝãâØ ÐÝâØ-×ÓÛÐÔÖãÒÐÝÝï Ò EGA öÓàÐå" -#: engines/sci/detection.cpp:380 +#: engines/sci/detection.cpp:383 msgid "Prefer digital sound effects" msgstr "½ÐÔÐÒÐâØ ßÕàÕÒÐÓã æØäàÞÒØÜ ×ÒãÚÞÒØÜ ÕäÕÚâÐÜ" -#: engines/sci/detection.cpp:381 +#: engines/sci/detection.cpp:384 msgid "Prefer digital sound effects instead of synthesized ones" msgstr "²öÔÔÐÒÐâØ ßÕàÕÒÐÓã æØäàÞÒØÜ ×ÒãÚÞÒØÜ ÕäÕÚâÐÜ, Ð ÝÕ áØÝâÕ×ÞÒÐÝØÜ" -#: engines/sci/detection.cpp:400 +#: engines/sci/detection.cpp:403 msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "²ØÚÞàØáâÞÒãÒÐâØ IMF/Yahama FB-01 ÔÛï MIDI ÒØåÞÔã" -#: engines/sci/detection.cpp:401 +#: engines/sci/detection.cpp:404 msgid "" "Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" -"²ØÚÞàØáâÞÒãÒÐâØ ÔÛïÒ ÒØÒÞÔã MIDI àÕÖØÜ ÚÐàâØ IBM Feature ÐÑÞ FM " -"áöÝâÕ× Yamaha FB-01" +"²ØÚÞàØáâÞÒãÒÐâØ ÔÛïÒ ÒØÒÞÔã MIDI àÕÖØÜ ÚÐàâØ IBM Feature ÐÑÞ FM áöÝâÕ× " +"Yamaha FB-01" -#: engines/sci/detection.cpp:411 +#: engines/sci/detection.cpp:414 msgid "Use CD audio" msgstr "²ØÚÞàØáâÞÒãÒÐâØ CD ÐãÔöÞ" -#: engines/sci/detection.cpp:412 +#: engines/sci/detection.cpp:415 msgid "Use CD audio instead of in-game audio, if available" msgstr "²ØÚÞàØáâÞÒãÒÐâØ CD ÐãÔöÞ ×ÐÜöáâì ã-Óàö ÐãÔöÞ, ïÚéÞ âÐÚö ô" -#: engines/sci/detection.cpp:422 +#: engines/sci/detection.cpp:425 msgid "Use Windows cursors" msgstr "²ØÚÞàØáâÞÒãÒÐâØ Windows ÚãàáÞàØ" -#: engines/sci/detection.cpp:423 +#: engines/sci/detection.cpp:426 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "²ØÚÞàØáâÞÒãÒÐâØ Windows ÚãàáÞàØ (ÜÕÝèØå ö ÜÞÝÞåàÞÜÝØå), ×ÐÜöáâì DOS" -#: engines/sci/detection.cpp:433 +#: engines/sci/detection.cpp:436 msgid "Use silver cursors" msgstr "²ØÚÞàØáâÞÒãÒÐâØ áàöÑÝö ÚãàáÞàØ" -#: engines/sci/detection.cpp:434 +#: engines/sci/detection.cpp:437 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "" @@ -2014,7 +2057,7 @@ msgstr "»ÕâöâØ ÝÐßàÐÒÞ" msgid "Fly to lower right" msgstr "»ÕâöâØ ÔÞÝØ×ã ÝÐßàÐÒÞ" -#: engines/scumm/scumm.cpp:1773 +#: engines/scumm/scumm.cpp:1776 #, c-format msgid "" "Native MIDI support requires the Roland Upgrade from LucasArts,\n" @@ -2023,7 +2066,7 @@ msgstr "" "ÀÕÖØÜ \"àöÔÝÞÓÞ\" MIDI ßÞâàÕÑãô ßÞÝÞÒÛÕÝÝï Roland Upgrade ÒöÔ\n" "LucasArts, ßàÞâÕ %s ÒöÔáãâÝöÙ. ¿ÕàÕÜØÚÐîáì ÝÐ AdLib." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 +#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2034,7 +2077,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 +#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2045,7 +2088,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 +#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2056,7 +2099,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2512 +#: engines/scumm/scumm.cpp:2537 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2067,7 +2110,7 @@ msgstr "" "ÒØÑÕàöâì ßÐßÚã Maniac ÒáÕàÕÔÕÝö ßÒßÚØ × ÓàÞî Tentacle." #. I18N: Option for fast scene switching -#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171 +#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167 msgid "~Z~ip Mode Activated" msgstr "ÀÕÖØÜ èÒØÔÚÞÓÞ ßÕàÕåÞÔã ÐÚâØÒÞÒÐÝÞ" @@ -2088,11 +2131,11 @@ msgstr "¿ÞÚÐ×ÐâØ ÜÐßã" msgid "~M~ain Menu" msgstr "³ÞÛÞÒÝÕ ÜÕÝî" -#: engines/mohawk/dialogs.cpp:172 +#: engines/mohawk/dialogs.cpp:168 msgid "~W~ater Effect Enabled" msgstr "µäÕÚâØ ÒÞÔØ ãÒöÜÚÝÕÝÞ" -#: engines/agos/animation.cpp:560 +#: engines/agos/animation.cpp:557 #, c-format msgid "Cutscene file '%s' not found!" msgstr "ÄÐÙÛ ×ÐáâÐÒÚØ '%s' ÝÕ ×ÝÐÙÔÕÝÞ!" @@ -2110,6 +2153,15 @@ msgstr "½Õ ÒÔÐÛÞáï ×ÑÕàÕÓâØ áâÐÝ ÓàØ ã äÐÙÛ." msgid "Failed to delete file." msgstr "½Õ ÒÔÐÛÞáï ÒØÔÐ󯉯 äÐÙÛ." +#: engines/groovie/detection.cpp:312 +#, fuzzy +msgid "Fast movie speed" +msgstr "ÈÒØÔÚØÙ àÕÖØÜ" + +#: engines/groovie/detection.cpp:313 +msgid "Play movies at an increased speed" +msgstr "" + #: engines/groovie/script.cpp:420 msgid "Failed to save game" msgstr "½Õ ÒÔÐÛÞáï ×ÐߨáÐâØ Óàã" @@ -2200,11 +2252,11 @@ msgstr "ºÞÒ×ÐâØ ÝÐÛöÒÞ" msgid "Slide Right" msgstr "ºÞÒ×ÐâØ ÝÐßàÐÒÞ" -#: engines/kyra/lol.cpp:485 +#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2412 msgid "Turn Left" msgstr "¿ÞÒÕàÝãâØáï ÝÐÛöÒÞ" -#: engines/kyra/lol.cpp:486 +#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2413 msgid "Turn Right" msgstr "¿ÞÒÕàÝãâØáï ÝÐßàÐÒÞ" @@ -2220,7 +2272,7 @@ msgstr "½ÐÛÐèâãÒÐÝÝï" msgid "Choose Spell" msgstr "²ØÑàÐâØ ×ÐÚÛïââï" -#: engines/kyra/sound_midi.cpp:475 +#: engines/kyra/sound_midi.cpp:477 msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2266,25 +2318,25 @@ msgstr "´ØáÚÕâÝÕ ÒÒÕÔÕÝÝï" msgid "Use the floppy version's intro (CD version only)" msgstr "²ØÚÞàØáâÞÒãÒÐâØ ÔØáÚÕâÝö ÒÕàáö÷ ÒÒÕÔÕÝÝï (âöÛìÚØ CD ÒÕàáöï)" -#: engines/sword1/animation.cpp:539 +#: engines/sword1/animation.cpp:519 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr " àÞÛØÚ PSX ßÞâÞÚã '%s' ÝÕ ÜÞÖãâì ÑãâØ ÒöÔâÒÞàÕÝö ã àÕÖØÜö ßÐÛöâàØ" -#: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 +#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439 msgid "DXA cutscenes found but ScummVM has been built without zlib support" msgstr "·ÝÐÙÔÕÝÞ ×ÐáâÐÒÚØ DXA, ÐÛÕ ScummVM ÑãÒ ßÞÑãÔÞÒÐÝØÙ ÑÕ× ßöÔâàØÜÚØ zlib" -#: engines/sword1/animation.cpp:570 engines/sword2/animation.cpp:465 +#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449 msgid "MPEG2 cutscenes are no longer supported" msgstr "·ÐáâÐÒÚØ MPEG2 ÑöÛìèÕ ÝÕ ßöÔâàØÜãîâìáï" -#: engines/sword1/animation.cpp:576 engines/sword2/animation.cpp:473 +#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457 #, c-format msgid "Cutscene '%s' not found" msgstr "·ÐáâÐÒÚã '%s' ÝÕ ×ÝÐÙÔÕÝÞ" -#: engines/sword1/control.cpp:863 +#: engines/sword1/control.cpp:865 msgid "" "ScummVM found that you have old savefiles for Broken Sword 1 that should be " "converted.\n" @@ -2301,7 +2353,7 @@ msgstr "" "½ÐâØáÝöâì ¾º, éÞÑ ßÕàÕÒÕáâØ ÷å ×ÐàÐ×, öÝÐÚèÕ ãÕ ßÞÒöÔÞÜÛÕÝÝï ×'ïÒØâìáï ßàØ " "ÝÐáâãßÝÞÜã ×ÐßãáÚã ÓàØ.\n" -#: engines/sword1/control.cpp:1232 +#: engines/sword1/control.cpp:1234 #, c-format msgid "" "Target new save game already exists!\n" @@ -2310,11 +2362,11 @@ msgstr "" "·ÑÕàÕÖÕÝÝï ÓàØ × âÐÚÞî ÝÐ×ÒÞî ÒÖÕ öáÝãô!\n" "ÇØ ÒØ åÞçÕâÕ ÛØèØâØ áâÐàÕ ×ÑÕàÕÖÕÝÝï (%s) ÐÑÞ ÝÞÒÕ (%s)?\n" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the old one" msgstr "»ØèØâØ áâÐàÕ" -#: engines/sword1/control.cpp:1235 +#: engines/sword1/control.cpp:1237 msgid "Keep the new one" msgstr "²×ïâØ ÝÞÒÕ" @@ -2322,7 +2374,7 @@ msgstr "²×ïâØ ÝÞÒÕ" msgid "This is the end of the Broken Sword 1 Demo" msgstr "½Ð æìÞÜã ×ÐÚöÝçãôâìáï ÔÕÜÞ Broken Sword 1" -#: engines/sword2/animation.cpp:435 +#: engines/sword2/animation.cpp:419 msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "·ÝÐÙÔÕÝö PSX àÞÛØÚØ, ÐÛÕ ScummVM ÑãÒ ×öÑàÐÝØÙ ÑÕ× ßöÔâàØÜÚØ RGB ÚÞÛöàã" @@ -2335,19 +2387,19 @@ msgstr "¿ÞÚÐ×ãÒÐâØ ÜöâÚØ ÞÑ'ôÚâöÒ" msgid "Show labels for objects on mouse hover" msgstr "¿ÞÚÐ×ãÒÐâØ ÜöâÚØ ÔÛï ÞÑ'ôÚâöÒ ßàØ ÝÐÒÕÔÕÝÝö ÜØèö" -#: engines/teenagent/resources.cpp:68 +#: engines/teenagent/resources.cpp:94 msgid "" "You're missing the 'teenagent.dat' file. Get it from the ScummVM website" msgstr "" "à ÒÐá ÒöÔáâãÝöÙ äÐÙÛ 'teenagent.dat'. ²ö×ìÜöâì ÙÞÓÞ ÝÐ ÒÕÑáÐÙâö ScummVM" -#: engines/teenagent/resources.cpp:89 +#: engines/teenagent/resources.cpp:115 msgid "" "The teenagent.dat file is compressed and zlib hasn't been included in this " "executable. Please decompress it" msgstr "" -"ÄÐÙÛ teenagent.dat ×ÐßÐÚÞÒÐÝÞ, ÐÛÕ zlib ÝÕ ÑãÛÞ ÒÚÛîçÕÝÞ Ò æî ßàÞÓàÐÜÜã." -"±ãÔì-ÛÐáÚÐ àÞ×ßÐÚãÙâÕ ÙÞÓÞ" +"ÄÐÙÛ teenagent.dat ×ÐßÐÚÞÒÐÝÞ, ÐÛÕ zlib ÝÕ ÑãÛÞ ÒÚÛîçÕÝÞ Ò æî ßàÞÓàÐÜÜã.±ãÔì-" +"ÛÐáÚÐ àÞ×ßÐÚãÙâÕ ÙÞÓÞ" #: engines/parallaction/saveload.cpp:133 #, c-format @@ -2398,6 +2450,47 @@ msgstr "" "\n" "±ãÔì ÛÐáÚÐ, ßÞÒöÔÞÜâÕ ßàÞ æÕ ÚÞÜÐÝÔö." +#: engines/pegasus/pegasus.cpp:675 +msgid "Invalid save file name" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2410 +msgid "Up/Zoom In/Move Forward/Open Doors" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2411 +#, fuzzy +msgid "Down/Zoom Out" +msgstr "·ÑöÛ. ÜÐáèâÐÑ" + +#: engines/pegasus/pegasus.cpp:2414 +msgid "Display/Hide Inventory Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2415 +msgid "Display/Hide Biochip Tray" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2416 +msgid "Action/Select" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2417 +msgid "Toggle Center Data Display" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2418 +msgid "Display/Hide Info Screen" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2419 +msgid "Display/Hide Pause Menu" +msgstr "" + +#: engines/pegasus/pegasus.cpp:2420 +msgid "???" +msgstr "" + #: audio/fmopl.cpp:49 msgid "MAME OPL emulator" msgstr "µÜãÛïâÞà MAME OPL:" @@ -2455,7 +2548,7 @@ msgstr "±Õ× Üã×ØÚØ" msgid "Amiga Audio Emulator" msgstr "°ÜöÓÐ °ãÔöÞ µÜãÛïâÞà" -#: audio/softsynth/adlib.cpp:1593 +#: audio/softsynth/adlib.cpp:2284 msgid "AdLib Emulator" msgstr "µÜãÛïâÞà AdLib" @@ -2467,11 +2560,11 @@ msgstr "Apple II GS µÜãÛïâÞà (½µ Àµ°»¦·¾²°½¾)" msgid "C64 Audio Emulator" msgstr "C64 °ãÔöÞ µÜãÛïâÞà" -#: audio/softsynth/mt32.cpp:293 +#: audio/softsynth/mt32.cpp:205 msgid "Initializing MT-32 Emulator" msgstr "½ÐÛÐèâÞÒãî ÕÜãÛïâÞà MT-32" -#: audio/softsynth/mt32.cpp:512 +#: audio/softsynth/mt32.cpp:431 msgid "MT-32 Emulator" msgstr "µÜãÛïâÞà MT-32" @@ -2622,24 +2715,24 @@ msgstr "ÁÕàÕÔÝöÙ ÚÛöÚ" msgid "Right Click" msgstr "¿àÐÒØÙ ÚÛöÚ" -#: backends/platform/sdl/macosx/appmenu_osx.mm:78 +#: backends/platform/sdl/macosx/appmenu_osx.mm:77 msgid "Hide ScummVM" msgstr "ÁåÞÒÐâØ ScummVM" -#: backends/platform/sdl/macosx/appmenu_osx.mm:83 +#: backends/platform/sdl/macosx/appmenu_osx.mm:82 msgid "Hide Others" msgstr "ÁåÞÒÐâØ ¦Ýèö" -#: backends/platform/sdl/macosx/appmenu_osx.mm:88 +#: backends/platform/sdl/macosx/appmenu_osx.mm:87 msgid "Show All" msgstr "¿ÞÚÐ×ÐâØ ²áÕ" -#: backends/platform/sdl/macosx/appmenu_osx.mm:110 -#: backends/platform/sdl/macosx/appmenu_osx.mm:121 +#: backends/platform/sdl/macosx/appmenu_osx.mm:109 +#: backends/platform/sdl/macosx/appmenu_osx.mm:120 msgid "Window" msgstr "²öÚÝÞ" -#: backends/platform/sdl/macosx/appmenu_osx.mm:115 +#: backends/platform/sdl/macosx/appmenu_osx.mm:114 msgid "Minimize" msgstr "¼öÝöÜö×ãÒÐâØ" @@ -2653,12 +2746,12 @@ msgid "Normal (no scaling)" msgstr "±Õ× ×ÑöÛìèÕÝÝï" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537 msgid "Enabled aspect ratio correction" msgstr "ºÞàÕÚæöî áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ ãÒöÜÚÝÕÝÞ" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542 msgid "Disabled aspect ratio correction" msgstr "ºÞàÕÚæöî áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ ÒØÜÚÝÕÝÞ" @@ -2667,7 +2760,7 @@ msgid "Active graphics filter:" msgstr "¿ÞâÞçÝØÙ ÓàÐäöçÝØÙ äöÛìâà:" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481 msgid "Windowed mode" msgstr "²öÚÞÝÝØÙ àÕÖØÜ" @@ -2691,11 +2784,11 @@ msgstr "¿ÞâÞçÝØÙ ÒöÔÕÞàÕÖØÜ" msgid "Current scale" msgstr "¿ÞâÞçÝØÙ ÜÐáèâÐÑ" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:558 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562 msgid "Active filter mode: Linear" msgstr "°ÚâØÒÝØÙ àÕÖØÜ äöÛìâàÐæö÷: »öÝöÙÝØÙ" -#: backends/graphics/openglsdl/openglsdl-graphics.cpp:560 +#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564 msgid "Active filter mode: Nearest" msgstr "°ÚâØÒÝØÙ àÕÖØÜ äöÛìâàÐæö÷: ½ÐÙÑÛØÖçÕ" @@ -3021,19 +3114,19 @@ msgstr "²Ø ÔöÙáÝÞ åÞçÕâÕ ÒØÙâØ?" #: backends/events/gph/gph-events.cpp:386 #: backends/events/gph/gph-events.cpp:429 -#: backends/events/openpandora/op-events.cpp:139 +#: backends/events/openpandora/op-events.cpp:168 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "ÀÕÖØÜ ÔÞâØÚã ã âÐçáÚàöÝö - »öÒØÙ ÚÛöÚ" #: backends/events/gph/gph-events.cpp:388 #: backends/events/gph/gph-events.cpp:431 -#: backends/events/openpandora/op-events.cpp:141 +#: backends/events/openpandora/op-events.cpp:170 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "ÀÕÖØÜ ÔÞâØÚã ã âÐçáÚàöÝö - ¿àÐÒØÙ ÚÛöÚ" #: backends/events/gph/gph-events.cpp:390 #: backends/events/gph/gph-events.cpp:433 -#: backends/events/openpandora/op-events.cpp:143 +#: backends/events/openpandora/op-events.cpp:172 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "ÀÕÖØÜ ÔÞâØÚã ã âÐçáÚàöÝö - ¿àÞÛöâ (ÑÕ× ÚÛöÚã)" @@ -3053,7 +3146,12 @@ msgstr "¼öÝöÜÐÛìÝÐ ³ãçÝöáâì" msgid "Decreasing Volume" msgstr "¿ÞÝØÖÕÝÝï ÓãçÝÞáâö" -#: backends/updates/macosx/macosx-updates.mm:65 +#: backends/events/openpandora/op-events.cpp:174 +#, fuzzy +msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)" +msgstr "ÀÕÖØÜ ÔÞâØÚã ã âÐçáÚàöÝö - ¿àÞÛöâ (ÑÕ× ÚÛöÚã)" + +#: backends/updates/macosx/macosx-updates.mm:67 msgid "Check for Updates..." msgstr "¿ÕàÕÒöàïî ÞÝÞÒÛÕÝÝï..." @@ -3089,6 +3187,9 @@ msgstr "ºÛöÚØ ãÒöÜÚÝÕÝÞ" msgid "Clicking Disabled" msgstr "ºÛöÚØ ÒØÜÚÝÕÝÞ" +#~ msgid "Enable Roland GS Mode" +#~ msgstr "ÃÒöÜÚÝãâØ àÕÖØÜ Roland GS" + #~ msgid "Hercules Green" #~ msgstr "Hercules ·ÕÛÕÝØÙ" @@ -2,12 +2,27 @@ # included by the default (main) Makefile. # - # # POSIX specific # install: $(INSTALL) -d "$(DESTDIR)$(bindir)" + $(INSTALL) -c -m 755 "./$(EXECUTABLE)" "$(DESTDIR)$(bindir)/$(EXECUTABLE)" + $(INSTALL) -d "$(DESTDIR)$(mandir)/man6/" + $(INSTALL) -c -m 644 "$(srcdir)/dists/scummvm.6" "$(DESTDIR)$(mandir)/man6/scummvm.6" + $(INSTALL) -d "$(DESTDIR)$(datarootdir)/pixmaps/" + $(INSTALL) -c -m 644 "$(srcdir)/icons/scummvm.xpm" "$(DESTDIR)$(datarootdir)/pixmaps/scummvm.xpm" + $(INSTALL) -d "$(DESTDIR)$(docdir)" + $(INSTALL) -c -m 644 $(DIST_FILES_DOCS) "$(DESTDIR)$(docdir)" + $(INSTALL) -d "$(DESTDIR)$(datadir)" + $(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) "$(DESTDIR)$(datadir)/" +ifdef DYNAMIC_MODULES + $(INSTALL) -d "$(DESTDIR)$(libdir)/scummvm/" + $(INSTALL) -c -m 644 $(PLUGINS) "$(DESTDIR)$(libdir)/scummvm/" +endif + +install-strip: + $(INSTALL) -d "$(DESTDIR)$(bindir)" $(INSTALL) -c -s -m 755 "./$(EXECUTABLE)" "$(DESTDIR)$(bindir)/$(EXECUTABLE)" $(INSTALL) -d "$(DESTDIR)$(mandir)/man6/" $(INSTALL) -c -m 644 "$(srcdir)/dists/scummvm.6" "$(DESTDIR)$(mandir)/man6/scummvm.6" @@ -310,8 +325,10 @@ endif # Special target to create an AmigaOS snapshot installation aos4dist: $(EXECUTABLE) mkdir -p $(AOS4PATH) + mkdir -p $(AOS4PATH)/themes + mkdir -p $(AOS4PATH)/extras $(STRIP) $(EXECUTABLE) -o $(AOS4PATH)/$(EXECUTABLE) - cp icons/scummvm.info $(AOS4PATH)/$(EXECUTABLE).info + cp ${srcdir}/icons/scummvm.info $(AOS4PATH)/$(EXECUTABLE).info cp $(DIST_FILES_THEMES) $(AOS4PATH)/themes/ ifdef DIST_FILES_ENGINEDATA cp $(DIST_FILES_ENGINEDATA) $(AOS4PATH)/extras/ @@ -339,7 +356,6 @@ endif cp $(srcdir)/dists/ps3/PIC1.PNG ps3pkg/ sfo.py -f $(srcdir)/dists/ps3/sfo.xml ps3pkg/PARAM.SFO pkg.py --contentid UP0001-SCUM12000_00-0000000000000000 ps3pkg/ scummvm-ps3.pkg - package_finalize scummvm-ps3.pkg ps3run: $(EXECUTABLE) $(STRIP) $(EXECUTABLE) @@ -348,4 +364,4 @@ ps3run: $(EXECUTABLE) ps3load $(EXECUTABLE).self # Mark special targets as phony -.PHONY: deb bundle osxsnap win32dist install uninstall ps3pkg +.PHONY: deb bundle osxsnap win32dist install uninstall ps3pkg ps3run diff --git a/test/common/bitstream.h b/test/common/bitstream.h new file mode 100644 index 0000000000..3f6a15fcd8 --- /dev/null +++ b/test/common/bitstream.h @@ -0,0 +1,152 @@ +#include <cxxtest/TestSuite.h> + +#include "common/bitstream.h" +#include "common/memstream.h" + +class BitStreamTestSuite : public CxxTest::TestSuite +{ + public: + void test_get_bit() { + byte contents[] = { 'a' }; + + Common::MemoryReadStream ms(contents, sizeof(contents)); + + Common::BitStream8MSB bs(ms); + TS_ASSERT_EQUALS(bs.pos(), 0u); + TS_ASSERT_EQUALS(bs.getBit(), 0u); + TS_ASSERT_EQUALS(bs.getBit(), 1u); + TS_ASSERT_EQUALS(bs.getBit(), 1u); + TS_ASSERT_EQUALS(bs.pos(), 3u); + TS_ASSERT(!bs.eos()); + } + + void test_get_bits() { + byte contents[] = { 'a', 'b' }; + + Common::MemoryReadStream ms(contents, sizeof(contents)); + + Common::BitStream8MSB bs(ms); + TS_ASSERT_EQUALS(bs.pos(), 0u); + TS_ASSERT_EQUALS(bs.getBits(3), 3u); + TS_ASSERT_EQUALS(bs.pos(), 3u); + TS_ASSERT_EQUALS(bs.getBits(8), 11u); + TS_ASSERT_EQUALS(bs.pos(), 11u); + TS_ASSERT(!bs.eos()); + } + + void test_skip() { + byte contents[] = { 'a', 'b' }; + + Common::MemoryReadStream ms(contents, sizeof(contents)); + + Common::BitStream8MSB bs(ms); + TS_ASSERT_EQUALS(bs.pos(), 0u); + bs.skip(5); + TS_ASSERT_EQUALS(bs.pos(), 5u); + bs.skip(4); + TS_ASSERT_EQUALS(bs.pos(), 9u); + TS_ASSERT_EQUALS(bs.getBits(3), 6u); + TS_ASSERT(!bs.eos()); + } + + void test_rewind() { + byte contents[] = { 'a' }; + + Common::MemoryReadStream ms(contents, sizeof(contents)); + + Common::BitStream8MSB bs(ms); + TS_ASSERT_EQUALS(bs.pos(), 0u); + bs.skip(5); + TS_ASSERT_EQUALS(bs.pos(), 5u); + bs.rewind(); + TS_ASSERT_EQUALS(bs.pos(), 0u); + TS_ASSERT_EQUALS(bs.getBits(3), 3u); + TS_ASSERT(!bs.eos()); + + TS_ASSERT_EQUALS(bs.size(), 8u); + } + + void test_peek_bit() { + byte contents[] = { 'a' }; + + Common::MemoryReadStream ms(contents, sizeof(contents)); + + Common::BitStream8MSB bs(ms); + TS_ASSERT_EQUALS(bs.pos(), 0u); + TS_ASSERT_EQUALS(bs.peekBit(), 0u); + TS_ASSERT_EQUALS(bs.pos(), 0u); + TS_ASSERT_EQUALS(bs.getBit(), 0u); + TS_ASSERT_EQUALS(bs.pos(), 1u); + TS_ASSERT_EQUALS(bs.peekBit(), 1u); + TS_ASSERT_EQUALS(bs.pos(), 1u); + TS_ASSERT(!bs.eos()); + } + + void test_peek_bits() { + byte contents[] = { 'a', 'b' }; + + Common::MemoryReadStream ms(contents, sizeof(contents)); + + Common::BitStream8MSB bs(ms); + TS_ASSERT_EQUALS(bs.pos(), 0u); + TS_ASSERT_EQUALS(bs.peekBits(3), 3u); + TS_ASSERT_EQUALS(bs.pos(), 0u); + bs.skip(3); + TS_ASSERT_EQUALS(bs.pos(), 3u); + TS_ASSERT_EQUALS(bs.peekBits(8), 11u); + TS_ASSERT_EQUALS(bs.pos(), 3u); + bs.skip(8); + TS_ASSERT_EQUALS(bs.pos(), 11u); + TS_ASSERT_EQUALS(bs.peekBits(5), 2u); + TS_ASSERT(!bs.eos()); + } + + void test_eos() { + byte contents[] = { 'a', 'b' }; + + Common::MemoryReadStream ms(contents, sizeof(contents)); + + Common::BitStream8MSB bs(ms); + bs.skip(11); + TS_ASSERT_EQUALS(bs.pos(), 11u); + TS_ASSERT_EQUALS(bs.getBits(5), 2u); + TS_ASSERT(bs.eos()); + + bs.rewind(); + TS_ASSERT_EQUALS(bs.pos(), 0u); + TS_ASSERT(!bs.eos()); + } + + void test_get_bits_lsb() { + byte contents[] = { 'a', 'b' }; + + Common::MemoryReadStream ms(contents, sizeof(contents)); + + Common::BitStream8LSB bs(ms); + TS_ASSERT_EQUALS(bs.pos(), 0u); + TS_ASSERT_EQUALS(bs.getBits(3), 1u); + TS_ASSERT_EQUALS(bs.pos(), 3u); + TS_ASSERT_EQUALS(bs.getBits(8), 76u); + TS_ASSERT_EQUALS(bs.pos(), 11u); + TS_ASSERT(!bs.eos()); + } + + void test_peek_bits_lsb() { + byte contents[] = { 'a', 'b' }; + + Common::MemoryReadStream ms(contents, sizeof(contents)); + + Common::BitStream8LSB bs(ms); + TS_ASSERT_EQUALS(bs.pos(), 0u); + TS_ASSERT_EQUALS(bs.peekBits(3), 1u); + TS_ASSERT_EQUALS(bs.pos(), 0u); + bs.skip(3); + TS_ASSERT_EQUALS(bs.pos(), 3u); + TS_ASSERT_EQUALS(bs.peekBits(8), 76u); + TS_ASSERT_EQUALS(bs.pos(), 3u); + bs.skip(8); + TS_ASSERT_EQUALS(bs.pos(), 11u); + TS_ASSERT_EQUALS(bs.peekBits(5), 12u); + TS_ASSERT(!bs.eos()); + } +}; diff --git a/test/common/bufferedseekablereadstream.h b/test/common/bufferedseekablereadstream.h index 11eb58f3d0..bf21f22f77 100644 --- a/test/common/bufferedseekablereadstream.h +++ b/test/common/bufferedseekablereadstream.h @@ -72,6 +72,13 @@ class BufferedSeekableReadStreamTestSuite : public CxxTest::TestSuite { b = ssrs.readByte(); TS_ASSERT_EQUALS(b, 2); + ssrs.seek(5, SEEK_CUR); + TS_ASSERT_EQUALS(ssrs.pos(), 8); + ssrs.seek(-1, SEEK_CUR); + TS_ASSERT_EQUALS(ssrs.pos(), 7); + b = ssrs.readByte(); + TS_ASSERT_EQUALS(b, 7); + delete &ssrs; } }; diff --git a/video/avi_decoder.cpp b/video/avi_decoder.cpp index 6062049b72..6fe9c773b8 100644 --- a/video/avi_decoder.cpp +++ b/video/avi_decoder.cpp @@ -457,6 +457,10 @@ void AVIDecoder::AVIAudioTrack::queueSound(Common::SeekableReadStream *stream) { flags |= Audio::FLAG_STEREO; _audStream->queueAudioStream(Audio::makeRawStream(stream, _wvInfo.samplesPerSec, flags, DisposeAfterUse::YES), DisposeAfterUse::YES); + } else if (_wvInfo.tag == kWaveFormatMSADPCM) { + _audStream->queueAudioStream(Audio::makeADPCMStream(stream, DisposeAfterUse::YES, stream->size(), Audio::kADPCMMS, _wvInfo.samplesPerSec, _wvInfo.channels, _wvInfo.blockAlign), DisposeAfterUse::YES); + } else if (_wvInfo.tag == kWaveFormatMSIMAADPCM) { + _audStream->queueAudioStream(Audio::makeADPCMStream(stream, DisposeAfterUse::YES, stream->size(), Audio::kADPCMMSIma, _wvInfo.samplesPerSec, _wvInfo.channels, _wvInfo.blockAlign), DisposeAfterUse::YES); } else if (_wvInfo.tag == kWaveFormatDK3) { _audStream->queueAudioStream(Audio::makeADPCMStream(stream, DisposeAfterUse::YES, stream->size(), Audio::kADPCMDK3, _wvInfo.samplesPerSec, _wvInfo.channels, _wvInfo.blockAlign), DisposeAfterUse::YES); } @@ -470,7 +474,7 @@ Audio::AudioStream *AVIDecoder::AVIAudioTrack::getAudioStream() const { } Audio::QueuingAudioStream *AVIDecoder::AVIAudioTrack::createAudioStream() { - if (_wvInfo.tag == kWaveFormatPCM || _wvInfo.tag == kWaveFormatDK3) + if (_wvInfo.tag == kWaveFormatPCM || _wvInfo.tag == kWaveFormatMSADPCM || _wvInfo.tag == kWaveFormatMSIMAADPCM || _wvInfo.tag == kWaveFormatDK3) return Audio::makeQueuingAudioStream(_wvInfo.samplesPerSec, _wvInfo.channels == 2); else if (_wvInfo.tag != kWaveFormatNone) // No sound warning("Unsupported AVI audio format %d", _wvInfo.tag); diff --git a/video/avi_decoder.h b/video/avi_decoder.h index 3bdc0561d1..34a67f4c28 100644 --- a/video/avi_decoder.h +++ b/video/avi_decoder.h @@ -203,7 +203,9 @@ private: enum { kWaveFormatNone = 0, kWaveFormatPCM = 1, - kWaveFormatDK3 = 98 + kWaveFormatMSADPCM = 2, + kWaveFormatMSIMAADPCM = 17, + kWaveFormatDK3 = 98 // rogue format number }; AVIStreamHeader _audsHeader; diff --git a/video/bink_decoder.cpp b/video/bink_decoder.cpp index 1ece22c963..45dec0887b 100644 --- a/video/bink_decoder.cpp +++ b/video/bink_decoder.cpp @@ -557,8 +557,8 @@ void BinkDecoder::BinkVideoTrack::initBundles() { _bundles[i].dataEnd = _bundles[i].data + blocks * 64; } - uint32 cbw[2] = { (_surface.w + 7) >> 3, (_surface.w + 15) >> 4 }; - uint32 cw [2] = { _surface.w , _surface.w >> 1 }; + uint32 cbw[2] = { (uint32)((_surface.w + 7) >> 3), (uint32)((_surface.w + 15) >> 4) }; + uint32 cw [2] = { (uint32)( _surface.w ), (uint32)( _surface.w >> 1) }; // Calculate the lengths of an element count in bits for (int i = 0; i < 2; i++) { diff --git a/video/bink_decoder.h b/video/bink_decoder.h index 27d3aa3691..08800c2223 100644 --- a/video/bink_decoder.h +++ b/video/bink_decoder.h @@ -36,6 +36,8 @@ #include "video/video_decoder.h" +#include "graphics/surface.h" + namespace Audio { class AudioStream; class QueuingAudioStream; diff --git a/video/codecs/cdtoons.h b/video/codecs/cdtoons.h index 8f6d3acb6e..e6b7aab5f8 100644 --- a/video/codecs/cdtoons.h +++ b/video/codecs/cdtoons.h @@ -38,6 +38,12 @@ struct CDToonsBlock { byte *data; }; +/** + * Broderbund CDToons decoder. + * + * Used in video: + * - QuickTimeDecoder + */ class CDToonsDecoder : public Codec { public: CDToonsDecoder(uint16 width, uint16 height); diff --git a/video/codecs/cinepak.cpp b/video/codecs/cinepak.cpp index c197e0cc35..bcf0cf1180 100644 --- a/video/codecs/cinepak.cpp +++ b/video/codecs/cinepak.cpp @@ -34,16 +34,12 @@ namespace Video { -// Convert a color from YUV to RGB colorspace, Cinepak style. -inline static void CPYUV2RGB(byte y, byte u, byte v, byte &r, byte &g, byte &b) { - r = CLIP<int>(y + 2 * (v - 128), 0, 255); - g = CLIP<int>(y - (u - 128) / 2 - (v - 128), 0, 255); - b = CLIP<int>(y + 2 * (u - 128), 0, 255); -} - #define PUT_PIXEL(offset, lum, u, v) \ if (_pixelFormat.bytesPerPixel != 1) { \ - CPYUV2RGB(lum, u, v, r, g, b); \ + byte r = _clipTable[lum + (v << 1)]; \ + byte g = _clipTable[lum - (u >> 1) - v]; \ + byte b = _clipTable[lum + (u << 1)]; \ + \ if (_pixelFormat.bytesPerPixel == 2) \ *((uint16 *)_curFrame.surface->pixels + offset) = _pixelFormat.RGBToColor(r, g, b); \ else \ @@ -60,6 +56,21 @@ CinepakDecoder::CinepakDecoder(int bitsPerPixel) : Codec() { _pixelFormat = Graphics::PixelFormat::createFormatCLUT8(); else _pixelFormat = g_system->getScreenFormat(); + + // Create a lookup for the clip function + // This dramatically improves the performance of the color conversion + _clipTableBuf = new byte[1024]; + + for (uint i = 0; i < 1024; i++) { + if (i <= 512) + _clipTableBuf[i] = 0; + else if (i >= 768) + _clipTableBuf[i] = 255; + else + _clipTableBuf[i] = i - 512; + } + + _clipTable = _clipTableBuf + 512; } CinepakDecoder::~CinepakDecoder() { @@ -69,6 +80,7 @@ CinepakDecoder::~CinepakDecoder() { } delete[] _curFrame.strips; + delete[] _clipTableBuf; } const Graphics::Surface *CinepakDecoder::decodeImage(Common::SeekableReadStream *stream) { @@ -82,15 +94,14 @@ const Graphics::Surface *CinepakDecoder::decodeImage(Common::SeekableReadStream if (_curFrame.strips == NULL) _curFrame.strips = new CinepakStrip[_curFrame.stripCount]; - debug (4, "Cinepak Frame: Width = %d, Height = %d, Strip Count = %d", _curFrame.width, _curFrame.height, _curFrame.stripCount); + debug(4, "Cinepak Frame: Width = %d, Height = %d, Strip Count = %d", _curFrame.width, _curFrame.height, _curFrame.stripCount); // Borrowed from FFMPEG. This should cut out the extra data Cinepak for Sega has (which is useless). // The theory behind this is that this is here to confuse standard Cinepak decoders. But, we won't let that happen! ;) if (_curFrame.length != (uint32)stream->size()) { - uint16 temp = stream->readUint16BE(); - if (temp == 0xFE00) + if (stream->readUint16BE() == 0xFE00) stream->readUint32BE(); - else if (temp != _curFrame.width) + else if ((stream->size() % _curFrame.length) == 0) stream->seek(-2, SEEK_CUR); } @@ -191,14 +202,14 @@ void CinepakDecoder::loadCodebook(Common::SeekableReadStream *stream, uint16 str codebook[i].y[j] = stream->readByte(); if (n == 6) { - codebook[i].u = stream->readByte() + 128; - codebook[i].v = stream->readByte() + 128; + codebook[i].u = stream->readSByte(); + codebook[i].v = stream->readSByte(); } else { // This codebook type indicates either greyscale or // palettized video. For greyscale, default us to - // 128 for both u and v. - codebook[i].u = 128; - codebook[i].v = 128; + // 0 for both u and v. + codebook[i].u = 0; + codebook[i].v = 0; } } } @@ -208,7 +219,6 @@ void CinepakDecoder::decodeVectors(Common::SeekableReadStream *stream, uint16 st uint32 flag = 0, mask = 0; uint32 iy[4]; int32 startPos = stream->pos(); - byte r = 0, g = 0, b = 0; for (uint16 y = _curFrame.strips[strip].rect.top; y < _curFrame.strips[strip].rect.bottom; y += 4) { iy[0] = _curFrame.strips[strip].rect.left + y * _curFrame.width; diff --git a/video/codecs/cinepak.h b/video/codecs/cinepak.h index ca4552fae6..f4adfd50fe 100644 --- a/video/codecs/cinepak.h +++ b/video/codecs/cinepak.h @@ -36,8 +36,9 @@ class SeekableReadStream; namespace Video { struct CinepakCodebook { - byte y[4]; - byte u, v; + // These are not in the normal YUV colorspace, but in the Cinepak YUV colorspace instead. + byte y[4]; // [0, 255] + int8 u, v; // [-128, 127] }; struct CinepakStrip { @@ -58,6 +59,13 @@ struct CinepakFrame { Graphics::Surface *surface; }; +/** + * Cinepak decoder. + * + * Used in video: + * - AVIDecoder + * - QuickTimeDecoder + */ class CinepakDecoder : public Codec { public: CinepakDecoder(int bitsPerPixel = 24); @@ -70,6 +78,7 @@ private: CinepakFrame _curFrame; int32 _y; Graphics::PixelFormat _pixelFormat; + byte *_clipTable, *_clipTableBuf; void loadCodebook(Common::SeekableReadStream *stream, uint16 strip, byte codebookType, byte chunkID, uint32 chunkSize); void decodeVectors(Common::SeekableReadStream *stream, uint16 strip, byte chunkID, uint32 chunkSize); diff --git a/video/codecs/codec.h b/video/codecs/codec.h index 8e4691ca3c..c1194e461b 100644 --- a/video/codecs/codec.h +++ b/video/codecs/codec.h @@ -32,16 +32,48 @@ class SeekableReadStream; namespace Video { +/** + * An abstract representation of a video codec used for decoding + * video frames. + * + * Used in video: + * - AVIDecoder + * - QuickTimeDecoder + * - VMDDecoder + */ class Codec { public: Codec() {} virtual ~Codec() {} + /** + * Decode the frame for the given data and return a pointer to a surface + * containing the decoded frame. + * + * @return a pointer to the decoded frame + * @note stream is not deleted + */ virtual const Graphics::Surface *decodeImage(Common::SeekableReadStream *stream) = 0; + + /** + * Get the format that the surface returned from decodeImage() will + * be in. + */ virtual Graphics::PixelFormat getPixelFormat() const = 0; + /** + * Can this codec's frames contain a palette? + */ virtual bool containsPalette() const { return false; } + + /** + * Get the palette last decoded from decodeImage + */ virtual const byte *getPalette() { return 0; } + + /** + * Does the codec have a dirty palette? + */ virtual bool hasDirtyPalette() const { return false; } }; diff --git a/video/codecs/indeo3.h b/video/codecs/indeo3.h index a07d779dec..880901df13 100644 --- a/video/codecs/indeo3.h +++ b/video/codecs/indeo3.h @@ -36,6 +36,13 @@ namespace Video { +/** + * Intel Indeo 3 decoder. + * + * Used in video: + * - AVIDecoder + * - VMDDecoder + */ class Indeo3Decoder : public Codec { public: Indeo3Decoder(uint16 width, uint16 height); diff --git a/video/codecs/mjpeg.h b/video/codecs/mjpeg.h index 0c3b668a74..d71454799c 100644 --- a/video/codecs/mjpeg.h +++ b/video/codecs/mjpeg.h @@ -36,10 +36,12 @@ struct Surface; namespace Video { -// Motion JPEG Decoder -// Basically a wrapper around JPEG which converts to RGB and also functions -// as a Codec. - +/** + * Motion JPEG decoder. + * + * Used in video: + * - QuickTimeDecoder + */ class JPEGDecoder : public Codec { public: JPEGDecoder(); diff --git a/video/codecs/msrle.h b/video/codecs/msrle.h index 2aea66d113..64ebaaee51 100644 --- a/video/codecs/msrle.h +++ b/video/codecs/msrle.h @@ -27,6 +27,12 @@ namespace Video { +/** + * Microsoft Run-Length Encoding decoder. + * + * Used in video: + * - AVIDecoder + */ class MSRLEDecoder : public Codec { public: MSRLEDecoder(uint16 width, uint16 height, byte bitsPerPixel); diff --git a/video/codecs/msvideo1.h b/video/codecs/msvideo1.h index 767eece580..047d542743 100644 --- a/video/codecs/msvideo1.h +++ b/video/codecs/msvideo1.h @@ -27,6 +27,12 @@ namespace Video { +/** + * Microsoft Video 1 decoder. + * + * Used in video: + * - AVIDecoder + */ class MSVideo1Decoder : public Codec { public: MSVideo1Decoder(uint16 width, uint16 height, byte bitsPerPixel); diff --git a/video/codecs/qtrle.h b/video/codecs/qtrle.h index d9db58ab23..a1dd9c9188 100644 --- a/video/codecs/qtrle.h +++ b/video/codecs/qtrle.h @@ -28,6 +28,12 @@ namespace Video { +/** + * QuickTime Run-Length Encoding decoder. + * + * Used in video: + * - QuickTimeDecoder + */ class QTRLEDecoder : public Codec { public: QTRLEDecoder(uint16 width, uint16 height, byte bitsPerPixel); diff --git a/video/codecs/rpza.cpp b/video/codecs/rpza.cpp index acc1b7f358..0a9f87747e 100644 --- a/video/codecs/rpza.cpp +++ b/video/codecs/rpza.cpp @@ -163,7 +163,7 @@ const Graphics::Surface *RPZADecoder::decodeImage(Common::SeekableReadStream *st blockPtr = rowPtr + pixelPtr; for (byte pixel_y = 0; pixel_y < 4; pixel_y++) { byte index = stream->readByte(); - for (byte pixel_x = 0; pixel_x < 4; pixel_x++){ + for (byte pixel_x = 0; pixel_x < 4; pixel_x++) { byte idx = (index >> (2 * (3 - pixel_x))) & 0x03; PUT_PIXEL(color4[idx]); } @@ -177,7 +177,7 @@ const Graphics::Surface *RPZADecoder::decodeImage(Common::SeekableReadStream *st case 0x00: blockPtr = rowPtr + pixelPtr; for (byte pixel_y = 0; pixel_y < 4; pixel_y++) { - for (byte pixel_x = 0; pixel_x < 4; pixel_x++){ + for (byte pixel_x = 0; pixel_x < 4; pixel_x++) { // We already have color of upper left pixel if (pixel_y != 0 || pixel_x != 0) colorA = stream->readUint16BE(); diff --git a/video/codecs/rpza.h b/video/codecs/rpza.h index f082d25549..67e0699692 100644 --- a/video/codecs/rpza.h +++ b/video/codecs/rpza.h @@ -28,6 +28,12 @@ namespace Video { +/** + * Apple RPZA decoder. + * + * Used in video: + * - QuickTimeDecoder + */ class RPZADecoder : public Codec { public: RPZADecoder(uint16 width, uint16 height); diff --git a/video/codecs/smc.h b/video/codecs/smc.h index f2caca977a..4b9f57410a 100644 --- a/video/codecs/smc.h +++ b/video/codecs/smc.h @@ -34,6 +34,12 @@ enum { COLORS_PER_TABLE = 256 }; +/** + * Apple SMC decoder. + * + * Used in video: + * - QuickTimeDecoder + */ class SMCDecoder : public Codec { public: SMCDecoder(uint16 width, uint16 height); diff --git a/video/codecs/svq1.cpp b/video/codecs/svq1.cpp index 56b376f590..57e84968a3 100644 --- a/video/codecs/svq1.cpp +++ b/video/codecs/svq1.cpp @@ -223,9 +223,9 @@ const Graphics::Surface *SVQ1Decoder::decodeImage(Common::SeekableReadStream *st // Prediction Motion Vector Common::Point *pmv = new Common::Point[(width / 8) + 3]; - byte *previous; + byte *previous = 0; if (frameType == 2) { // B Frame - warning("B Frame not supported currently"); + error("SVQ1 Video: B Frames not supported"); //previous = _next[i]; } else { previous = _last[i]; diff --git a/video/codecs/svq1.h b/video/codecs/svq1.h index e5066abfd4..6667fea344 100644 --- a/video/codecs/svq1.h +++ b/video/codecs/svq1.h @@ -33,6 +33,12 @@ struct Point; namespace Video { +/** + * Sorenson Vector Quantizer 1 decoder. + * + * Used in video: + * - QuickTimeDecoder + */ class SVQ1Decoder : public Codec { public: SVQ1Decoder(uint16 width, uint16 height); diff --git a/video/codecs/truemotion1.h b/video/codecs/truemotion1.h index 628cfa4584..b2a35cf873 100644 --- a/video/codecs/truemotion1.h +++ b/video/codecs/truemotion1.h @@ -32,6 +32,12 @@ namespace Video { +/** + * Duck TrueMotion 1 decoder. + * + * Used in video: + * - AVIDecoder + */ class TrueMotion1Decoder : public Codec { public: TrueMotion1Decoder(uint16 width, uint16 height); diff --git a/video/flic_decoder.cpp b/video/flic_decoder.cpp index 1a0627615b..de545366b1 100644 --- a/video/flic_decoder.cpp +++ b/video/flic_decoder.cpp @@ -152,6 +152,7 @@ Graphics::PixelFormat FlicDecoder::FlicVideoTrack::getPixelFormat() const { #define FLI_SETPAL 4 #define FLI_SS2 7 #define FLI_BRUN 15 +#define FLI_COPY 16 #define PSTAMP 18 #define FRAME_TYPE 0xF1FA @@ -212,6 +213,9 @@ const Graphics::Surface *FlicDecoder::FlicVideoTrack::decodeNextFrame() { case FLI_BRUN: decodeByteRun(data); break; + case FLI_COPY: + copyFrame(data); + break; case PSTAMP: /* PSTAMP - skip for now */ break; @@ -247,6 +251,14 @@ void FlicDecoder::FlicVideoTrack::copyDirtyRectsToBuffer(uint8 *dst, uint pitch) clearDirtyRects(); } +void FlicDecoder::FlicVideoTrack::copyFrame(uint8 *data) { + memcpy((byte *)_surface->pixels, data, getWidth() * getHeight()); + + // Redraw + _dirtyRects.clear(); + _dirtyRects.push_back(Common::Rect(0, 0, getWidth(), getHeight())); +} + void FlicDecoder::FlicVideoTrack::decodeByteRun(uint8 *data) { byte *ptr = (byte *)_surface->pixels; while ((int32)(ptr - (byte *)_surface->pixels) < (getWidth() * getHeight())) { diff --git a/video/flic_decoder.h b/video/flic_decoder.h index 9037af05d6..c20a092a32 100644 --- a/video/flic_decoder.h +++ b/video/flic_decoder.h @@ -97,6 +97,7 @@ private: Common::List<Common::Rect> _dirtyRects; + void copyFrame(uint8 *data); void decodeByteRun(uint8 *data); void decodeDeltaFLC(uint8 *data); void unpackPalette(uint8 *mem); diff --git a/video/qt_decoder.cpp b/video/qt_decoder.cpp index c5fcab4b49..9e26e96c7b 100644 --- a/video/qt_decoder.cpp +++ b/video/qt_decoder.cpp @@ -110,7 +110,7 @@ const Graphics::Surface *QuickTimeDecoder::decodeNextFrame() { return frame; } -Common::QuickTimeParser::SampleDesc *QuickTimeDecoder::readSampleDesc(Common::QuickTimeParser::Track *track, uint32 format) { +Common::QuickTimeParser::SampleDesc *QuickTimeDecoder::readSampleDesc(Common::QuickTimeParser::Track *track, uint32 format, uint32 descSize) { if (track->codecType == CODEC_TYPE_VIDEO) { debug(0, "Video Codec FourCC: \'%s\'", tag2str(format)); @@ -205,7 +205,7 @@ Common::QuickTimeParser::SampleDesc *QuickTimeDecoder::readSampleDesc(Common::Qu } // Pass it on up - return Audio::QuickTimeAudioDecoder::readSampleDesc(track, format); + return Audio::QuickTimeAudioDecoder::readSampleDesc(track, format, descSize); } void QuickTimeDecoder::init() { @@ -333,6 +333,7 @@ QuickTimeDecoder::VideoTrackHandler::VideoTrackHandler(QuickTimeDecoder *decoder _scaledSurface = 0; _curPalette = 0; _dirtyPalette = false; + _reversed = false; } QuickTimeDecoder::VideoTrackHandler::~VideoTrackHandler() { @@ -344,26 +345,26 @@ QuickTimeDecoder::VideoTrackHandler::~VideoTrackHandler() { bool QuickTimeDecoder::VideoTrackHandler::endOfTrack() const { // A track is over when we've finished going through all edits - return _curEdit == _parent->editCount; + return _reversed ? (_curEdit == 0 && _curFrame < 0) : atLastEdit(); } bool QuickTimeDecoder::VideoTrackHandler::seek(const Audio::Timestamp &requestedTime) { uint32 convertedFrames = requestedTime.convertToFramerate(_decoder->_timeScale).totalNumberOfFrames(); - for (_curEdit = 0; !endOfTrack(); _curEdit++) + for (_curEdit = 0; !atLastEdit(); _curEdit++) if (convertedFrames >= _parent->editList[_curEdit].timeOffset && convertedFrames < _parent->editList[_curEdit].timeOffset + _parent->editList[_curEdit].trackDuration) break; // If we did reach the end of the track, break out - if (endOfTrack()) + if (atLastEdit()) return true; // If this track is in an empty edit, position us at the next non-empty // edit. There's nothing else to do after this. if (_parent->editList[_curEdit].mediaTime == -1) { - while (!endOfTrack() && _parent->editList[_curEdit].mediaTime == -1) + while (!atLastEdit() && _parent->editList[_curEdit].mediaTime == -1) _curEdit++; - if (!endOfTrack()) + if (!atLastEdit()) enterNewEditList(true); return true; @@ -372,7 +373,7 @@ bool QuickTimeDecoder::VideoTrackHandler::seek(const Audio::Timestamp &requested enterNewEditList(false); // One extra check for the end of a track - if (endOfTrack()) + if (atLastEdit()) return true; // Now we're in the edit and need to figure out what frame we need @@ -391,17 +392,24 @@ bool QuickTimeDecoder::VideoTrackHandler::seek(const Audio::Timestamp &requested // Compare the starting point for the frame to where we need to be _holdNextFrameStartTime = getRateAdjustedFrameTime() != (uint32)time.totalNumberOfFrames(); - // If we went past the time, go back a frame + // If we went past the time, go back a frame. _curFrame before this point is at the frame + // that should be displayed. This adjustment ensures it is on the frame before the one that + // should be displayed. if (_holdNextFrameStartTime) _curFrame--; - // Handle the keyframe here - int32 destinationFrame = _curFrame + 1; + if (_reversed) { + // Call setReverse again to update + setReverse(true); + } else { + // Handle the keyframe here + int32 destinationFrame = _curFrame + 1; - assert(destinationFrame < (int32)_parent->frameCount); - _curFrame = findKeyFrame(destinationFrame) - 1; - while (_curFrame < destinationFrame - 1) - bufferNextFrame(); + assert(destinationFrame < (int32)_parent->frameCount); + _curFrame = findKeyFrame(destinationFrame) - 1; + while (_curFrame < destinationFrame - 1) + bufferNextFrame(); + } return true; } @@ -438,27 +446,54 @@ const Graphics::Surface *QuickTimeDecoder::VideoTrackHandler::decodeNextFrame() if (endOfTrack()) return 0; + if (_reversed) { + // Subtract one to place us on the frame before the current displayed frame. + _curFrame--; + + // We have one "dummy" frame at the end to so the last frame is displayed + // for the right amount of time. + if (_curFrame < 0) + return 0; + + // Decode from the last key frame to the frame before the one we need. + // TODO: Probably would be wise to do some caching + int targetFrame = _curFrame; + _curFrame = findKeyFrame(targetFrame) - 1; + while (_curFrame != targetFrame - 1) + bufferNextFrame(); + } + const Graphics::Surface *frame = bufferNextFrame(); - if (_holdNextFrameStartTime) { - // Don't set the next frame start time here; we just did a seek - _holdNextFrameStartTime = false; - } else if (_durationOverride >= 0) { - // Use our own duration from the edit list calculation - _nextFrameStartTime += _durationOverride; - _durationOverride = -1; + if (_reversed) { + if (_holdNextFrameStartTime) { + // Don't set the next frame start time here; we just did a seek + _holdNextFrameStartTime = false; + } else { + // Just need to subtract the time + _nextFrameStartTime -= getFrameDuration(); + } } else { - _nextFrameStartTime += getFrameDuration(); - } + if (_holdNextFrameStartTime) { + // Don't set the next frame start time here; we just did a seek + _holdNextFrameStartTime = false; + } else if (_durationOverride >= 0) { + // Use our own duration from the edit list calculation + _nextFrameStartTime += _durationOverride; + _durationOverride = -1; + } else { + _nextFrameStartTime += getFrameDuration(); + } - // Update the edit list, if applicable - // HACK: We're also accepting the time minus one because edit lists - // aren't as accurate as one would hope. - if (!endOfTrack() && getRateAdjustedFrameTime() >= getCurEditTimeOffset() + getCurEditTrackDuration() - 1) { - _curEdit++; + // Update the edit list, if applicable + // HACK: We're also accepting the time minus one because edit lists + // aren't as accurate as one would hope. + if (!atLastEdit() && getRateAdjustedFrameTime() >= getCurEditTimeOffset() + getCurEditTrackDuration() - 1) { + _curEdit++; - if (!endOfTrack()) - enterNewEditList(true); + if (!atLastEdit()) + enterNewEditList(true); + } } if (frame && (_parent->scaleFactorX != 1 || _parent->scaleFactorY != 1)) { @@ -474,6 +509,68 @@ const Graphics::Surface *QuickTimeDecoder::VideoTrackHandler::decodeNextFrame() return frame; } +bool QuickTimeDecoder::VideoTrackHandler::setReverse(bool reverse) { + _reversed = reverse; + + if (_reversed) { + if (_parent->editCount != 1) { + // TODO: Myst's holo.mov needs this :( + warning("Can only set reverse without edits"); + return false; + } + + if (atLastEdit()) { + // If we're at the end of the video, go to the penultimate edit. + // The current frame is set to one beyond the last frame here; + // one "past" the currently displayed frame. + _curEdit = _parent->editCount - 1; + _curFrame = _parent->frameCount; + _nextFrameStartTime = _parent->editList[_curEdit].trackDuration + _parent->editList[_curEdit].timeOffset; + } else if (_holdNextFrameStartTime) { + // We just seeked, so "pivot" around the frame that should be displayed + _curFrame++; + _nextFrameStartTime -= getFrameDuration(); + _curFrame++; + } else { + // We need to put _curFrame to be the one after the one that should be displayed. + // Since we're on the frame that should be displaying right now, add one. + _curFrame++; + } + } else { + // Update the edit list, if applicable + // HACK: We're also accepting the time minus one because edit lists + // aren't as accurate as one would hope. + if (!atLastEdit() && getRateAdjustedFrameTime() >= getCurEditTimeOffset() + getCurEditTrackDuration() - 1) { + _curEdit++; + + if (atLastEdit()) + return true; + } + + if (_holdNextFrameStartTime) { + // We just seeked, so "pivot" around the frame that should be displayed + _curFrame--; + _nextFrameStartTime += getFrameDuration(); + } + + // We need to put _curFrame to be the one before the one that should be displayed. + // Since we're on the frame that should be displaying right now, subtract one. + // (As long as the current frame isn't -1, of course) + if (_curFrame > 0) { + // We then need to handle the keyframe situation + int targetFrame = _curFrame - 1; + _curFrame = findKeyFrame(targetFrame) - 1; + while (_curFrame < targetFrame) + bufferNextFrame(); + } else if (_curFrame == 0) { + // Make us start at the first frame (no keyframe needed) + _curFrame--; + } + } + + return true; +} + Common::Rational QuickTimeDecoder::VideoTrackHandler::getScaledWidth() const { return Common::Rational(_parent->width) / _parent->scaleFactorX; } @@ -555,10 +652,10 @@ uint32 QuickTimeDecoder::VideoTrackHandler::findKeyFrame(uint32 frame) const { void QuickTimeDecoder::VideoTrackHandler::enterNewEditList(bool bufferFrames) { // Bypass all empty edit lists first - while (!endOfTrack() && _parent->editList[_curEdit].mediaTime == -1) + while (!atLastEdit() && _parent->editList[_curEdit].mediaTime == -1) _curEdit++; - if (endOfTrack()) + if (atLastEdit()) return; uint32 frameNum = 0; @@ -675,4 +772,8 @@ uint32 QuickTimeDecoder::VideoTrackHandler::getCurEditTrackDuration() const { return _parent->editList[_curEdit].trackDuration * _parent->timeScale / _decoder->_timeScale; } +bool QuickTimeDecoder::VideoTrackHandler::atLastEdit() const { + return _curEdit == _parent->editCount; +} + } // End of namespace Video diff --git a/video/qt_decoder.h b/video/qt_decoder.h index 45ab155c2c..28314f2e63 100644 --- a/video/qt_decoder.h +++ b/video/qt_decoder.h @@ -70,7 +70,7 @@ public: Audio::Timestamp getDuration() const { return Audio::Timestamp(0, _duration, _timeScale); } protected: - Common::QuickTimeParser::SampleDesc *readSampleDesc(Common::QuickTimeParser::Track *track, uint32 format); + Common::QuickTimeParser::SampleDesc *readSampleDesc(Common::QuickTimeParser::Track *track, uint32 format, uint32 descSize); private: void init(); @@ -136,6 +136,8 @@ private: const Graphics::Surface *decodeNextFrame(); const byte *getPalette() const { _dirtyPalette = false; return _curPalette; } bool hasDirtyPalette() const { return _curPalette; } + bool setReverse(bool reverse); + bool isReversed() const { return _reversed; } Common::Rational getScaledWidth() const; Common::Rational getScaledHeight() const; @@ -151,6 +153,7 @@ private: int32 _durationOverride; const byte *_curPalette; mutable bool _dirtyPalette; + bool _reversed; Common::SeekableReadStream *getNextFramePacket(uint32 &descId); uint32 getFrameDuration(); @@ -160,6 +163,7 @@ private: uint32 getRateAdjustedFrameTime() const; uint32 getCurEditTimeOffset() const; uint32 getCurEditTrackDuration() const; + bool atLastEdit() const; }; }; diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 110afa7755..ebe15c5fc1 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -37,7 +37,7 @@ VideoDecoder::VideoDecoder() { _startTime = 0; _dirtyPalette = false; _palette = 0; - _isPlaying = false; + _playbackRate = 0; _audioVolume = Audio::Mixer::kMaxChannelVolume; _audioBalance = 0; _pauseLevel = 0; @@ -45,6 +45,7 @@ VideoDecoder::VideoDecoder() { _lastTimeChange = 0; _endTime = 0; _endTimeSet = false; + _nextVideoTrack = 0; // Find the best format for output _defaultHighColorFormat = g_system->getScreenFormat(); @@ -71,6 +72,7 @@ void VideoDecoder::close() { _lastTimeChange = 0; _endTime = 0; _endTimeSet = false; + _nextVideoTrack = 0; } bool VideoDecoder::loadFile(const Common::String &filename) { @@ -167,21 +169,44 @@ const Graphics::Surface *VideoDecoder::decodeNextFrame() { _needsUpdate = false; readNextPacket(); - VideoTrack *track = findNextVideoTrack(); - if (!track) + // If we have no next video track at this point, there shouldn't be + // any frame available for us to display. + if (!_nextVideoTrack) return 0; - const Graphics::Surface *frame = track->decodeNextFrame(); + const Graphics::Surface *frame = _nextVideoTrack->decodeNextFrame(); - if (track->hasDirtyPalette()) { - _palette = track->getPalette(); + if (_nextVideoTrack->hasDirtyPalette()) { + _palette = _nextVideoTrack->getPalette(); _dirtyPalette = true; } + // Look for the next video track here for the next decode. + findNextVideoTrack(); + return frame; } +bool VideoDecoder::setReverse(bool reverse) { + // Can only reverse video-only videos + if (reverse && hasAudio()) + return false; + + // Attempt to make sure all the tracks are in the requested direction + for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) { + if ((*it)->getTrackType() == Track::kTrackTypeVideo && ((VideoTrack *)*it)->isReversed() != reverse) { + if (!((VideoTrack *)*it)->setReverse(reverse)) + return false; + + _needsUpdate = true; // force an update + } + } + + findNextVideoTrack(); + return true; +} + const byte *VideoDecoder::getPalette() { _dirtyPalette = false; return _palette; @@ -212,7 +237,7 @@ uint32 VideoDecoder::getTime() const { return _lastTimeChange.msecs(); if (isPaused()) - return _pauseStartTime - _startTime; + return MAX<int>((_playbackRate * (_pauseStartTime - _startTime)).toInt(), 0); if (useAudioSync()) { for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) { @@ -225,25 +250,29 @@ uint32 VideoDecoder::getTime() const { } } - return g_system->getMillis() - _startTime; + return MAX<int>((_playbackRate * (g_system->getMillis() - _startTime)).toInt(), 0); } uint32 VideoDecoder::getTimeToNextFrame() const { - if (endOfVideo() || _needsUpdate) + if (endOfVideo() || _needsUpdate || !_nextVideoTrack) return 0; - const VideoTrack *track = findNextVideoTrack(); + uint32 currentTime = getTime(); + uint32 nextFrameStartTime = _nextVideoTrack->getNextFrameStartTime(); - if (!track) - return 0; + if (_nextVideoTrack->isReversed()) { + // For reversed videos, we need to handle the time difference the opposite way. + if (nextFrameStartTime >= currentTime) + return 0; - uint32 elapsedTime = getTime(); - uint32 nextFrameStartTime = track->getNextFrameStartTime(); + return currentTime - nextFrameStartTime; + } - if (nextFrameStartTime <= elapsedTime) + // Otherwise, handle it normally. + if (nextFrameStartTime <= currentTime) return 0; - return nextFrameStartTime - elapsedTime; + return nextFrameStartTime - currentTime; } bool VideoDecoder::endOfVideo() const { @@ -284,6 +313,7 @@ bool VideoDecoder::rewind() { _lastTimeChange = 0; _startTime = g_system->getMillis(); resetPauseStartTime(); + findNextVideoTrack(); return true; } @@ -316,26 +346,47 @@ bool VideoDecoder::seek(const Audio::Timestamp &time) { // Also reset our start time if (isPlaying()) { startAudio(); - _startTime = g_system->getMillis() - time.msecs(); + _startTime = g_system->getMillis() - (time.msecs() / _playbackRate).toInt(); } resetPauseStartTime(); + findNextVideoTrack(); _needsUpdate = true; return true; } -void VideoDecoder::start() { - if (isPlaying() || !isVideoLoaded()) - return; +bool VideoDecoder::seekToFrame(uint frame) { + VideoTrack *track = 0; - _isPlaying = true; - _startTime = g_system->getMillis(); + for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) { + if (!(*it)->isSeekable()) + return false; - // Adjust start time if we've seeked to something besides zero time - if (_lastTimeChange.totalNumberOfFrames() != 0) - _startTime -= _lastTimeChange.msecs(); + if ((*it)->getTrackType() == Track::kTrackTypeVideo) { + // We only allow seeking by frame when one video track + // is present + if (track) + return false; - startAudio(); + track = (VideoTrack *)*it; + } + } + + // If we didn't find a video track, we can't seek by frame (of course) + if (!track) + return false; + + Audio::Timestamp time = track->getFrameTime(frame); + + if (time < 0) + return false; + + return seek(time); +} + +void VideoDecoder::start() { + if (!isPlaying()) + setRate(1); } void VideoDecoder::stop() { @@ -346,12 +397,12 @@ void VideoDecoder::stop() { stopAudio(); // Keep the time marked down in case we start up again - // We do this before _isPlaying is set so we don't get + // We do this before _playbackRate is set so we don't get // _lastTimeChange returned, but before _pauseLevel is // reset. _lastTimeChange = getTime(); - _isPlaying = false; + _playbackRate = 0; _startTime = 0; _palette = 0; _dirtyPalette = false; @@ -365,6 +416,48 @@ void VideoDecoder::stop() { (*it)->pause(false); } +void VideoDecoder::setRate(const Common::Rational &rate) { + if (!isVideoLoaded() || _playbackRate == rate) + return; + + if (rate == 0) { + stop(); + return; + } else if (rate != 1 && hasAudio()) { + warning("Cannot set custom rate in videos with audio"); + return; + } + + Common::Rational targetRate = rate; + + // Attempt to set the reverse + if (!setReverse(rate < 0)) { + assert(rate < 0); // We shouldn't fail for forward. + warning("Cannot set custom rate to backwards"); + setReverse(false); + targetRate = 1; + + if (_playbackRate == targetRate) + return; + } + + if (_playbackRate != 0) + _lastTimeChange = getTime(); + + _playbackRate = targetRate; + _startTime = g_system->getMillis(); + + // Adjust start time if we've seeked to something besides zero time + if (_lastTimeChange != 0) + _startTime -= (_lastTimeChange.msecs() / _playbackRate).toInt(); + + startAudio(); +} + +bool VideoDecoder::isPlaying() const { + return _playbackRate != 0; +} + Audio::Timestamp VideoDecoder::getDuration() const { Audio::Timestamp maxDuration(0, 1000); @@ -403,21 +496,45 @@ bool VideoDecoder::VideoTrack::endOfTrack() const { return getCurFrame() >= (getFrameCount() - 1); } +Audio::Timestamp VideoDecoder::VideoTrack::getFrameTime(uint frame) const { + // Default implementation: Return an invalid (negative) number + return Audio::Timestamp().addFrames(-1); +} + uint32 VideoDecoder::FixedRateVideoTrack::getNextFrameStartTime() const { if (endOfTrack() || getCurFrame() < 0) return 0; - Common::Rational time = (getCurFrame() + 1) * 1000; - time /= getFrameRate(); - return time.toInt(); + return getFrameTime(getCurFrame() + 1).msecs(); +} + +Audio::Timestamp VideoDecoder::FixedRateVideoTrack::getFrameTime(uint frame) const { + // Try to get as accurate as possible, considering we have a fractional frame rate + // (which Audio::Timestamp doesn't support). + Common::Rational frameRate = getFrameRate(); + + if (frameRate == frameRate.toInt()) // The nice case (a whole number) + return Audio::Timestamp(0, frame, frameRate.toInt()); + + // Just convert to milliseconds. + Common::Rational time = frame * 1000; + time /= frameRate; + return Audio::Timestamp(time.toInt(), 1000); +} + +uint VideoDecoder::FixedRateVideoTrack::getFrameAtTime(const Audio::Timestamp &time) const { + Common::Rational frameRate = getFrameRate(); + + // Easy conversion + if (frameRate == time.framerate()) + return time.totalNumberOfFrames(); + + // Default case + return (time.totalNumberOfFrames() * frameRate / time.framerate()).toInt(); } Audio::Timestamp VideoDecoder::FixedRateVideoTrack::getDuration() const { - // Since Audio::Timestamp doesn't support a fractional frame rate, we're currently - // just converting to milliseconds. - Common::Rational time = getFrameCount() * 1000; - time /= getFrameRate(); - return time.toInt(); + return getFrameTime(getFrameCount()); } bool VideoDecoder::AudioTrack::endOfTrack() const { @@ -527,10 +644,14 @@ bool VideoDecoder::StreamFileAudioTrack::loadFromFile(const Common::String &base void VideoDecoder::addTrack(Track *track) { _tracks.push_back(track); - // Update volume settings if it's an audio track if (track->getTrackType() == Track::kTrackTypeAudio) { + // Update volume settings if it's an audio track ((AudioTrack *)track)->setVolume(_audioVolume); ((AudioTrack *)track)->setBalance(_audioBalance); + } else if (track->getTrackType() == Track::kTrackTypeVideo) { + // If this track has a better time, update _nextVideoTrack + if (!_nextVideoTrack || ((VideoTrack *)track)->getNextFrameStartTime() < _nextVideoTrack->getNextFrameStartTime()) + _nextVideoTrack = (VideoTrack *)track; } // Keep the track paused if we're paused @@ -603,7 +724,7 @@ bool VideoDecoder::endOfVideoTracks() const { } VideoDecoder::VideoTrack *VideoDecoder::findNextVideoTrack() { - VideoTrack *bestTrack = 0; + _nextVideoTrack = 0; uint32 bestTime = 0xFFFFFFFF; for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) { @@ -613,31 +734,12 @@ VideoDecoder::VideoTrack *VideoDecoder::findNextVideoTrack() { if (time < bestTime) { bestTime = time; - bestTrack = track; - } - } - } - - return bestTrack; -} - -const VideoDecoder::VideoTrack *VideoDecoder::findNextVideoTrack() const { - const VideoTrack *bestTrack = 0; - uint32 bestTime = 0xFFFFFFFF; - - for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) { - if ((*it)->getTrackType() == Track::kTrackTypeVideo && !(*it)->endOfTrack()) { - const VideoTrack *track = (const VideoTrack *)*it; - uint32 time = track->getNextFrameStartTime(); - - if (time < bestTime) { - bestTime = time; - bestTrack = track; + _nextVideoTrack = track; } } } - return bestTrack; + return _nextVideoTrack; } void VideoDecoder::startAudio() { @@ -676,4 +778,12 @@ bool VideoDecoder::hasFramesLeft() const { return false; } +bool VideoDecoder::hasAudio() const { + for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) + if ((*it)->getTrackType() == Track::kTrackTypeAudio) + return true; + + return false; +} + } // End of namespace Video diff --git a/video/video_decoder.h b/video/video_decoder.h index cc7d1df51b..d0a6e08005 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -26,6 +26,7 @@ #include "audio/mixer.h" #include "audio/timestamp.h" // TODO: Move this to common/ ? #include "common/array.h" +#include "common/rational.h" #include "common/str.h" #include "graphics/pixelformat.h" @@ -36,7 +37,6 @@ class SeekableAudioStream; } namespace Common { -class Rational; class SeekableReadStream; } @@ -100,7 +100,7 @@ public: ///////////////////////////////////////// /** - * Begin playback of the video. + * Begin playback of the video at normal speed. * * @note This has no effect if the video is already playing. */ @@ -114,6 +114,26 @@ public: void stop(); /** + * Set the rate of playback. + * + * For instance, a rate of 0 would stop the video, while a rate of 1 + * would play the video normally. Passing 2 to this function would + * play the video at twice the normal speed. + * + * @note This function does not work for non-0/1 rates on videos that + * have audio tracks. + * + * @todo This currently does not implement backwards playback, but will + * be implemented soon. + */ + void setRate(const Common::Rational &rate); + + /** + * Returns the rate at which the video is being played. + */ + Common::Rational getRate() const { return _playbackRate; } + + /** * Returns if the video is currently playing or not. * * This is not equivalent to the inverse of endOfVideo(). A video keeps @@ -121,7 +141,7 @@ public: * return true after calling start() and will continue to return true * until stop() (or close()) is called. */ - bool isPlaying() const { return _isPlaying; } + bool isPlaying() const; /** * Returns if a video is rewindable or not. The default implementation @@ -158,6 +178,14 @@ public: virtual bool seek(const Audio::Timestamp &time); /** + * Seek to a given frame. + * + * This only works when one video track is present, and that track + * supports getFrameTime(). This calls seek() internally. + */ + bool seekToFrame(uint frame); + + /** * Pause or resume the video. This should stop/resume any audio playback * and other stuff. The initial pause time is kept so that any timing * variables can be updated appropriately. @@ -325,6 +353,17 @@ public: */ void setDefaultHighColorFormat(const Graphics::PixelFormat &format) { _defaultHighColorFormat = format; } + /** + * Set the video to decode frames in reverse. + * + * By default, VideoDecoder will decode forward. + * + * @note This is used by setRate() + * @note This will not work if an audio track is present + * @param reverse true for reverse, false for forward + * @return true on success, false otherwise + */ + bool setReverse(bool reverse); ///////////////////////////////////////// // Audio Control @@ -367,14 +406,10 @@ public: */ bool addStreamFileTrack(const Common::String &baseName); - - // Future API - //void setRate(const Common::Rational &rate); - //Common::Rational getRate() const; - protected: /** - * An abstract representation of a track in a movie. + * An abstract representation of a track in a movie. Since tracks here are designed + * to work independently, they should not reference any other track(s) in the video. */ class Track { public: @@ -519,6 +554,29 @@ protected: * Does the palette currently in use by this track need to be updated? */ virtual bool hasDirtyPalette() const { return false; } + + /** + * Get the time the given frame should be shown. + * + * By default, this returns a negative (invalid) value. This function + * should only be used by VideoDecoder::seekToFrame(). + */ + virtual Audio::Timestamp getFrameTime(uint frame) const; + + /** + * Set the video track to play in reverse or forward. + * + * By default, a VideoTrack must decode forward. + * + * @param reverse true for reverse, false for forward + * @return true for success, false for failure + */ + virtual bool setReverse(bool reverse) { return !reverse; } + + /** + * Is the video track set to play in reverse? + */ + virtual bool isReversed() const { return false; } }; /** @@ -533,12 +591,19 @@ protected: uint32 getNextFrameStartTime() const; virtual Audio::Timestamp getDuration() const; + Audio::Timestamp getFrameTime(uint frame) const; protected: /** * Get the rate at which this track is played. */ virtual Common::Rational getFrameRate() const = 0; + + /** + * Get the frame that should be displaying at the given time. This is + * helpful for someone implementing seek(). + */ + uint getFrameAtTime(const Audio::Timestamp &time) const; }; /** @@ -685,9 +750,9 @@ protected: /** * Decode enough data for the next frame and enough audio to last that long. * - * This function is used by the decodeNextFrame() function. A subclass + * This function is used by this class' decodeNextFrame() function. A subclass * of a Track may decide to just have its decodeNextFrame() function read - * and decode the frame. + * and decode the frame, but only if it is the only track in the video. */ virtual void readNextPacket() {} @@ -733,16 +798,13 @@ protected: Graphics::PixelFormat getDefaultHighColorFormat() const { return _defaultHighColorFormat; } /** - * Find the video track with the lowest start time for the next frame + * Set _nextVideoTrack to the video track with the lowest start time for the next frame. + * + * @return _nextVideoTrack */ VideoTrack *findNextVideoTrack(); /** - * Find the video track with the lowest start time for the next frame - */ - const VideoTrack *findNextVideoTrack() const; - - /** * Typedef helpers for accessing tracks */ typedef Common::Array<Track *> TrackList; @@ -763,9 +825,11 @@ private: TrackList _tracks; // Current playback status - bool _isPlaying, _needsUpdate; + bool _needsUpdate; Audio::Timestamp _lastTimeChange, _endTime; bool _endTimeSet; + Common::Rational _playbackRate; + VideoTrack *_nextVideoTrack; // Palette settings from individual tracks mutable bool _dirtyPalette; @@ -779,6 +843,7 @@ private: void startAudio(); void startAudioLimit(const Audio::Timestamp &limit); bool hasFramesLeft() const; + bool hasAudio() const; int32 _startTime; uint32 _pauseLevel; |