diff options
177 files changed, 4606 insertions, 1802 deletions
@@ -7,6 +7,7 @@ For a more comprehensive changelog of the latest experimental code, see: - Added support for Sfinx. - Added support for Zork Nemesis: The Forbidden Lands. - Added support for Zork: Grand Inquisitor. + - Added support for Beavis and Butthead in Virtual Stupidity. General: - Updated Munt MT-32 emulation code to version 1.5.0. @@ -35,6 +36,9 @@ For a more comprehensive changelog of the latest experimental code, see: head scene (bug #6728). It may have been happening in other scenes as well. + CinE: + - Added support for music in CD version of Future Wars. + MADE: - Improved AdLib music support in Return to Zork. @@ -50,6 +54,8 @@ For a more comprehensive changelog of the latest experimental code, see: - Improve support for Japanese PC-9801 games. SCUMM: + - Major improvements to Korean versions text rendering. + - Implemented original Maniac Mansion v0-v1 walking code. - It is now possible to play Maniac Mansion from within Day of the Tentacle, with a few caveats. See README for details. diff --git a/audio/decoders/aiff.cpp b/audio/decoders/aiff.cpp index 72baf84582..e1949ebb07 100644 --- a/audio/decoders/aiff.cpp +++ b/audio/decoders/aiff.cpp @@ -102,7 +102,7 @@ RewindableAudioStream *makeAIFFStream(Common::SeekableReadStream *stream, Dispos bool foundSSND = false; uint16 channels = 0, bitsPerSample = 0; - uint32 blockAlign = 0, rate = 0; + uint32 rate = 0; uint32 codec = kCodecPCM; // AIFF default Common::SeekableReadStream *dataStream = 0; @@ -128,7 +128,7 @@ RewindableAudioStream *makeAIFFStream(Common::SeekableReadStream *stream, Dispos case MKTAG('S', 'S', 'N', 'D'): foundSSND = true; /* uint32 offset = */ stream->readUint32BE(); - blockAlign = stream->readUint32BE(); + /* uint32 blockAlign = */ stream->readUint32BE(); dataStream = new Common::SeekableSubReadStream(stream, stream->pos(), stream->pos() + length - 8, disposeAfterUse); break; case MKTAG('F', 'V', 'E', 'R'): diff --git a/audio/decoders/mp3.cpp b/audio/decoders/mp3.cpp index 49d4d856ab..36233a2e13 100644 --- a/audio/decoders/mp3.cpp +++ b/audio/decoders/mp3.cpp @@ -330,8 +330,11 @@ MP3Stream::MP3Stream(Common::SeekableReadStream *inStream, DisposeAfterUse::Flag _inStream(skipID3(inStream, dispose)), _length(0, 1000) { - // Initialize the stream with some data + // Initialize the stream with some data and set the channels and rate + // variables decodeMP3Data(*_inStream); + _channels = MAD_NCHANNELS(&_frame.header); + _rate = _frame.header.samplerate; // Calculate the length of the stream while (_state != MP3_STATE_EOS) @@ -352,12 +355,8 @@ MP3Stream::MP3Stream(Common::SeekableReadStream *inStream, DisposeAfterUse::Flag _state = MP3_STATE_INIT; _inStream->seek(0); - // Decode the first chunk of data. This is necessary so that _frame - // is setup and we can retrieve channels/rate. + // Decode the first chunk of data to set up the stream again. decodeMP3Data(*_inStream); - - _channels = MAD_NCHANNELS(&_frame.header); - _rate = _frame.header.samplerate; } int MP3Stream::readBuffer(int16 *buffer, const int numSamples) { diff --git a/audio/midiparser_xmidi.cpp b/audio/midiparser_xmidi.cpp index 8742d7aad1..042e663a13 100644 --- a/audio/midiparser_xmidi.cpp +++ b/audio/midiparser_xmidi.cpp @@ -146,7 +146,7 @@ void MidiParser_XMIDI::parseNextEvent(EventInfo &info) { break; } - case 0x75: // XMIDI_CONTORLLER_NEXT_BREAK + case 0x75: // XMIDI_CONTROLLER_NEXT_BREAK if (_loopCount >= 0) { if (info.basic.param2 < 64) { // End the current loop. diff --git a/backends/platform/sdl/win32/win32-main.cpp b/backends/platform/sdl/win32/win32-main.cpp index c6c15c00e8..c6339f0c8c 100644 --- a/backends/platform/sdl/win32/win32-main.cpp +++ b/backends/platform/sdl/win32/win32-main.cpp @@ -43,7 +43,12 @@ int __stdcall WinMain(HINSTANCE /*hInst*/, HINSTANCE /*hPrevInst*/, LPSTR /*lpC #if !SDL_VERSION_ATLEAST(2, 0, 0) SDL_SetModuleHandle(GetModuleHandle(NULL)); #endif +// HACK: __argc, __argv are broken and return zero when using mingwrt 4.0+ on MinGW +#if defined(__GNUC__) && defined(__MINGW32__) && !defined(__MINGW64__) + return main(_argc, _argv); +#else return main(__argc, __argv); +#endif } int main(int argc, char *argv[]) { diff --git a/backends/platform/symbian/mmp/config.mmh b/backends/platform/symbian/mmp/config.mmh index f397e5ec64..da91117cf6 100644 --- a/backends/platform/symbian/mmp/config.mmh +++ b/backends/platform/symbian/mmp/config.mmh @@ -29,19 +29,6 @@ // Common EPOC MMP makefiles option storage for ScummVM // -/* - * MACRO REMOVE_UNDEFINED used for bypass this bug - - * http://sourceforge.net/p/scummvm/bugs/6437/ - * Requre change in epoc32\include\libc\sys\unistd.h by - * - * #ifndef REMOVE_UNDEFINED - * #define remove(x) unlink(x) - * #define wremove(x) wunlink(x) - * #endif //REMOVE_UNDEFINED - * - * Affects Avalanche, CGE2 and Tsage - */ - // *** Definitions OPTION MSVC /QIfist /Ob1 /Oy /GF // /QIfist disables use of __ftol2 to avoid linker probs with MS libc: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcrefQIfistSuppress_ftol.asp diff --git a/backends/platform/symbian/mmp/scummvm_avalanche.mmp.in b/backends/platform/symbian/mmp/scummvm_avalanche.mmp.in index 49c73222ca..6d44c66bf7 100644 --- a/backends/platform/symbian/mmp/scummvm_avalanche.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_avalanche.mmp.in @@ -33,7 +33,6 @@ TARGET scummvm_avalanche.lib TARGETTYPE lib -MACRO REMOVE_UNDEFINED #include "config.mmh" //START_AUTO_MACROS_SLAVE// diff --git a/backends/platform/symbian/mmp/scummvm_cge2.mmp.in b/backends/platform/symbian/mmp/scummvm_cge2.mmp.in index 1561b0f479..7c78f47bfd 100644 --- a/backends/platform/symbian/mmp/scummvm_cge2.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_cge2.mmp.in @@ -32,7 +32,6 @@ TARGET scummvm_cge2.lib TARGETTYPE lib -MACRO REMOVE_UNDEFINED #include "config.mmh" //START_AUTO_MACROS_SLAVE// diff --git a/backends/platform/symbian/mmp/scummvm_tsage.mmp.in b/backends/platform/symbian/mmp/scummvm_tsage.mmp.in index 93f278e279..6b57827e1e 100644 --- a/backends/platform/symbian/mmp/scummvm_tsage.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_tsage.mmp.in @@ -32,7 +32,6 @@ TARGET scummvm_tsage.lib TARGETTYPE lib -MACRO REMOVE_UNDEFINED #include "config.mmh" //START_AUTO_MACROS_SLAVE// diff --git a/backends/platform/symbian/src/SymbianOS.cpp b/backends/platform/symbian/src/SymbianOS.cpp index e28b78900c..4d417b5a66 100644 --- a/backends/platform/symbian/src/SymbianOS.cpp +++ b/backends/platform/symbian/src/SymbianOS.cpp @@ -197,7 +197,3 @@ void* scumm_bsearch(const void *key, const void *base, size_t nmemb, size_t size return NULL; } -int remove(const char *path) -{ - return unlink(path); -} diff --git a/backends/platform/symbian/src/portdefs.h b/backends/platform/symbian/src/portdefs.h index 1fb941963b..f9da09d3eb 100644 --- a/backends/platform/symbian/src/portdefs.h +++ b/backends/platform/symbian/src/portdefs.h @@ -58,11 +58,17 @@ typedef signed long int int32; // re-define those data types. #define SCUMMVM_DONT_DEFINE_TYPES +// Hide the macro "remove" defined in unistd.h from anywere except where +// we explicitly require it. This lets us use the name "remove" in engines. +// Must be after including unistd.h . +#ifndef SYMBIAN_USE_SYSTEM_REMOVE +#undef remove +#endif + #define SMALL_SCREEN_DEVICE #define DISABLE_COMMAND_LINE #define USE_RGB_COLOR -int remove(const char *path); #if defined(USE_TREMOR) && !defined(USE_VORBIS) #define USE_VORBIS // make sure this one is defined together with USE_TREMOR! diff --git a/backends/saves/default/default-saves.cpp b/backends/saves/default/default-saves.cpp index 1b955a5021..4f7013724a 100644 --- a/backends/saves/default/default-saves.cpp +++ b/backends/saves/default/default-saves.cpp @@ -20,6 +20,11 @@ * */ +// This define lets us use the system function remove() on Symbian, which +// is disabled by default due to a macro conflict. +// See backends/platform/symbian/src/portdefs.h . +#define SYMBIAN_USE_SYSTEM_REMOVE + #include "common/scummsys.h" #if !defined(DISABLE_DEFAULT_SAVEFILEMANAGER) diff --git a/common/scummsys.h b/common/scummsys.h index 0c4687e03e..b8cf7678a4 100644 --- a/common/scummsys.h +++ b/common/scummsys.h @@ -46,7 +46,7 @@ #if defined(WIN32) - #ifdef _MSC_VER + #if defined(_MSC_VER) && _MSC_VER <= 1800 // FIXME: The placement of the workaround functions for MSVC below // require us to include stdio.h and stdarg.h for MSVC here. This diff --git a/devtools/README b/devtools/README index 509048bfe0..e7ff94dc05 100644 --- a/devtools/README +++ b/devtools/README @@ -72,8 +72,8 @@ create_mort (Strangerke) create_project (LordHoto, Littleboy) -------------- - Creates project files for Visual Studio 2008, 2010, 2012, 2013, Xcode and - Code::Blocks out of the configure / Makefile based build system. + Creates project files for Visual Studio 2008, 2010, 2012, 2013, 2015, + Xcode and Code::Blocks out of the configure / Makefile based build system. It also offers a way to enable or disable certain engines and the use of external libraries similar to configure. Run the tool without any arguments for further help. diff --git a/devtools/create_project/create_project.cpp b/devtools/create_project/create_project.cpp index e4cb67134a..0aba511491 100644 --- a/devtools/create_project/create_project.cpp +++ b/devtools/create_project/create_project.cpp @@ -124,7 +124,7 @@ int main(int argc, char *argv[]) { setup.features = getAllFeatures(); ProjectType projectType = kProjectNone; - int msvcVersion = 9; + int msvcVersion = 12; bool useSDL2 = false; // Parse command line arguments @@ -176,7 +176,7 @@ int main(int argc, char *argv[]) { msvcVersion = atoi(argv[++i]); - if (msvcVersion != 9 && msvcVersion != 10 && msvcVersion != 11 && msvcVersion != 12) { + if (msvcVersion != 9 && msvcVersion != 10 && msvcVersion != 11 && msvcVersion != 12 && msvcVersion != 14) { std::cerr << "ERROR: Unsupported version: \"" << msvcVersion << "\" passed to \"--msvc-version\"!\n"; return -1; } @@ -453,6 +453,9 @@ int main(int argc, char *argv[]) { // 4250 ('class1' : inherits 'class2::member' via dominance) // two or more members have the same name. Should be harmless // + // 4267 ('var' : conversion from 'size_t' to 'type', possible loss of data) + // throws tons and tons of warnings (no immediate plan to fix all usages) + // // 4310 (cast truncates constant value) // used in some engines // @@ -468,6 +471,8 @@ int main(int argc, char *argv[]) { // 4512 ('class' : assignment operator could not be generated) // some classes use const items and the default assignment operator cannot be generated // + // 4577 ('noexcept' used with no exception handling mode specified) + // // 4702 (unreachable code) // mostly thrown after error() calls (marked as NORETURN) // @@ -523,6 +528,11 @@ int main(int argc, char *argv[]) { globalWarnings.push_back("6385"); globalWarnings.push_back("6386"); + if (msvcVersion == 14) { + globalWarnings.push_back("4267"); + globalWarnings.push_back("4577"); + } + projectWarnings["agi"].push_back("4510"); projectWarnings["agi"].push_back("4610"); @@ -636,6 +646,7 @@ void displayHelp(const char *exe) { " 10 stands for \"Visual Studio 2010\"\n" " 11 stands for \"Visual Studio 2012\"\n" " 12 stands for \"Visual Studio 2013\"\n" + " 14 stands for \"Visual Studio 2015\"\n" " The default is \"9\", thus \"Visual Studio 2008\"\n" " --build-events Run custom build events as part of the build\n" " (default: false)\n" @@ -658,9 +669,9 @@ void displayHelp(const char *exe) { "Optional features settings:\n" " --enable-<name> enable inclusion of the feature \"name\"\n" " --disable-<name> disable inclusion of the feature \"name\"\n" - "\n" - "SDL settings:\n" - " --sdl2 link to SDL 2.0, instead of SDL 1.2\n" + "\n" + "SDL settings:\n" + " --sdl2 link to SDL 2.0, instead of SDL 1.2\n" "\n" " There are the following features available:\n" "\n"; @@ -921,7 +932,7 @@ const Feature s_features[] = { { "libz", "USE_ZLIB", "zlib", true, "zlib (compression) support" }, { "mad", "USE_MAD", "libmad", true, "libmad (MP3) support" }, { "vorbis", "USE_VORBIS", "libvorbisfile_static libvorbis_static libogg_static", true, "Ogg Vorbis support" }, - { "flac", "USE_FLAC", "libFLAC_static", true, "FLAC support" }, + { "flac", "USE_FLAC", "libFLAC_static win_utf8_io_static", true, "FLAC support" }, { "png", "USE_PNG", "libpng", true, "libpng support" }, { "faad", "USE_FAAD", "libfaad", false, "AAC support" }, { "mpeg2", "USE_MPEG2", "libmpeg2", false, "MPEG-2 support" }, @@ -1050,7 +1061,7 @@ bool producesObjectFile(const std::string &fileName) { } std::string toString(int num) { - return static_cast<std::ostringstream*>(&(std::ostringstream() << num))->str(); + return static_cast<std::ostringstream*>(&(std::ostringstream() << num))->str(); } /** diff --git a/devtools/create_project/msbuild.cpp b/devtools/create_project/msbuild.cpp index 87c9066199..a326bd721a 100644 --- a/devtools/create_project/msbuild.cpp +++ b/devtools/create_project/msbuild.cpp @@ -55,9 +55,16 @@ int MSBuildProvider::getVisualStudioVersion() { if (_version == 12) return 2013; + if (_version == 14) + return 14; + error("Unsupported version passed to getVisualStudioVersion"); } +int MSBuildProvider::getSolutionVersion() { + return (_version < 14) ? _version + 1 : _version; +} + namespace { inline void outputConfiguration(std::ostream &project, const std::string &config, const std::string &platform) { @@ -116,7 +123,7 @@ void MSBuildProvider::createProjectFile(const std::string &name, const std::stri // Shared configuration project << "\t<Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n"; - std::string version = "v" + toString(_version) + "0"; + std::string version = "v" + toString(_version) + "0"; std::string llvm = "LLVM-vs" + toString(getVisualStudioVersion()); outputConfigurationType(setup, project, name, "Release|Win32", version); @@ -177,6 +184,13 @@ void MSBuildProvider::createProjectFile(const std::string &name, const std::stri project << "\t</ItemGroup>\n"; } + // Visual Studio 2015 automatically imports natvis files that are part of the project + if (name == PROJECT_NAME && _version == 14) { + project << "\t<ItemGroup>\n"; + project << "\t\t<None Include=\"" << setup.srcDir << "/devtools/create_project/scripts/scummvm.natvis\" />\n"; + project << "\t</ItemGroup>\n"; + } + project << "\t<Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n" "\t<ImportGroup Label=\"ExtensionTargets\">\n" "\t</ImportGroup>\n"; @@ -185,7 +199,7 @@ void MSBuildProvider::createProjectFile(const std::string &name, const std::stri // We override the normal target to ignore the exit code (this allows us to have a clean output and not message about the command exit code) project << "\t\t<Target Name=\"PostBuildEvent\">\n" << "\t\t\t<Message Text=\"Description: Run tests\" />\n" - << "\t\t\t<Exec Command=\"$(TargetPath)\" IgnoreExitCode=\"true\" />\n" + << "\t\t\t<Exec Command=\"$(TargetPath)\" IgnoreExitCode=\"true\" />\n" << "\t\t</Target>\n"; } @@ -305,6 +319,12 @@ void MSBuildProvider::outputProjectSettings(std::ofstream &project, const std::s for (StringList::const_iterator i = setup.libraries.begin(); i != setup.libraries.end(); ++i) libraries += *i + ".lib;"; + if (_version == 14) { + std::string debug = isRelease ? "" : "d"; + libraries += "libvcruntime" + debug + ".lib;"; + libraries += "libucrt" + debug + ".lib;"; + } + project << "\t\t<Link>\n" "\t\t\t<OutputFile>$(OutDir)" << ((setup.devTools || setup.tests) ? name : setup.projectName) << ".exe</OutputFile>\n" "\t\t\t<AdditionalDependencies>" << libraries << "%(AdditionalDependencies)</AdditionalDependencies>\n" diff --git a/devtools/create_project/msbuild.h b/devtools/create_project/msbuild.h index 829657beff..f92e68ede8 100644 --- a/devtools/create_project/msbuild.h +++ b/devtools/create_project/msbuild.h @@ -49,6 +49,7 @@ protected: const char *getProjectExtension(); const char *getPropertiesExtension(); int getVisualStudioVersion(); + int getSolutionVersion(); private: struct FileEntry { diff --git a/devtools/create_project/msvc.cpp b/devtools/create_project/msvc.cpp index cdd2d8a7c1..dbfbcc128d 100644 --- a/devtools/create_project/msvc.cpp +++ b/devtools/create_project/msvc.cpp @@ -52,7 +52,7 @@ void MSVCProvider::createWorkspace(const BuildSetup &setup) { if (!solution) error("Could not open \"" + setup.outputDir + '/' + setup.projectName + ".sln\" for writing"); - solution << "Microsoft Visual Studio Solution File, Format Version " << _version + 1 << ".00\n"; + solution << "Microsoft Visual Studio Solution File, Format Version " << getSolutionVersion() << ".00\n"; solution << "# Visual Studio " << getVisualStudioVersion() << "\n"; // Write main project @@ -157,13 +157,17 @@ void MSVCProvider::createGlobalProp(const BuildSetup &setup) { outputGlobalPropFile(setup, properties, 64, x64Defines, convertPathToWin(setup.filePrefix), setup.runBuildEvents); } +int MSVCProvider::getSolutionVersion() { + return _version + 1; +} + std::string MSVCProvider::getPreBuildEvent() const { std::string cmdLine = ""; cmdLine = "@echo off\n" "echo Executing Pre-Build script...\n" - "echo.\n" - "@call "$(SolutionDir)../../devtools/create_project/scripts/prebuild.cmd" "$(SolutionDir)/../.." "$(TargetDir)"\n" + "echo.\n" + "@call "$(SolutionDir)../../devtools/create_project/scripts/prebuild.cmd" "$(SolutionDir)/../.." "$(TargetDir)"\n" "EXIT /B0"; return cmdLine; diff --git a/devtools/create_project/msvc.h b/devtools/create_project/msvc.h index 3a3eb98034..e75e131bd1 100644 --- a/devtools/create_project/msvc.h +++ b/devtools/create_project/msvc.h @@ -83,6 +83,11 @@ protected: virtual int getVisualStudioVersion() = 0; /** + * Get the Solution version (used in the sln file header) + */ + virtual int getSolutionVersion(); + + /** * Get the command line for the revision tool (shared between all Visual Studio based providers) */ std::string getPreBuildEvent() const; diff --git a/devtools/create_project/msvc14/create_project.sln b/devtools/create_project/msvc14/create_project.sln new file mode 100644 index 0000000000..73f0b3569e --- /dev/null +++ b/devtools/create_project/msvc14/create_project.sln @@ -0,0 +1,28 @@ +яЛП +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.22609.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "create_project", "create_project.vcxproj", "{CF177559-077D-4A08-AABE-BE0FD35F6C63}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CF177559-077D-4A08-AABE-BE0FD35F6C63}.Debug|Win32.ActiveCfg = Debug|Win32 + {CF177559-077D-4A08-AABE-BE0FD35F6C63}.Debug|Win32.Build.0 = Debug|Win32 + {CF177559-077D-4A08-AABE-BE0FD35F6C63}.Debug|x64.ActiveCfg = Debug|x64 + {CF177559-077D-4A08-AABE-BE0FD35F6C63}.Debug|x64.Build.0 = Debug|x64 + {CF177559-077D-4A08-AABE-BE0FD35F6C63}.Release|Win32.ActiveCfg = Release|Win32 + {CF177559-077D-4A08-AABE-BE0FD35F6C63}.Release|Win32.Build.0 = Release|Win32 + {CF177559-077D-4A08-AABE-BE0FD35F6C63}.Release|x64.ActiveCfg = Release|x64 + {CF177559-077D-4A08-AABE-BE0FD35F6C63}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/devtools/create_project/msvc14/create_project.vcxproj b/devtools/create_project/msvc14/create_project.vcxproj new file mode 100644 index 0000000000..3c0345f49c --- /dev/null +++ b/devtools/create_project/msvc14/create_project.vcxproj @@ -0,0 +1,223 @@ +яЛП<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{CF177559-077D-4A08-AABE-BE0FD35F6C63}</ProjectGuid> + <RootNamespace>create_project</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <CharacterSet>MultiByte</CharacterSet> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PlatformToolset>v140</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <CharacterSet>MultiByte</CharacterSet> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PlatformToolset>v140</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <CharacterSet>MultiByte</CharacterSet> + <PlatformToolset>v140</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <CharacterSet>MultiByte</CharacterSet> + <PlatformToolset>v140</PlatformToolset> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <Optimization>Disabled</Optimization> + <MinimalRebuild>true</MinimalRebuild> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + <DebugInformationFormat>EditAndContinue</DebugInformationFormat> + <DisableLanguageExtensions>false</DisableLanguageExtensions> + <DisableSpecificWarnings>4003;4512;4127</DisableSpecificWarnings> + <ExceptionHandling>Sync</ExceptionHandling> + </ClCompile> + <Link> + <AdditionalDependencies>Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies> + <GenerateDebugInformation>true</GenerateDebugInformation> + <TargetMachine>MachineX86</TargetMachine> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + </Link> + <PostBuildEvent> + <Command>@echo off +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc14\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc12\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc11\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc10\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc9\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc8\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\codeblocks\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\iphone\"</Command> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <Optimization>Disabled</Optimization> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <DisableLanguageExtensions>false</DisableLanguageExtensions> + <DisableSpecificWarnings>4003;4512;4127</DisableSpecificWarnings> + </ClCompile> + <Link> + <AdditionalDependencies>Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + </Link> + <PostBuildEvent> + <Command>@echo off +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc14\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc12\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc11\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc10\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc9\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc8\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\codeblocks\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\iphone\"</Command> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <Optimization>MaxSpeed</Optimization> + <IntrinsicFunctions>true</IntrinsicFunctions> + <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> + <FunctionLevelLinking>true</FunctionLevelLinking> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <DisableSpecificWarnings>4003;4512;4127</DisableSpecificWarnings> + <SDLCheck>true</SDLCheck> + </ClCompile> + <Link> + <AdditionalDependencies>Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies> + <GenerateDebugInformation>true</GenerateDebugInformation> + <OptimizeReferences>true</OptimizeReferences> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <TargetMachine>MachineX86</TargetMachine> + </Link> + <PostBuildEvent> + <Command>@echo off +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc14\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc12\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc11\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc10\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc9\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc8\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\codeblocks\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\iphone\"</Command> + </PostBuildEvent> + <PreBuildEvent> + <Command> + </Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <Optimization>MaxSpeed</Optimization> + <IntrinsicFunctions>true</IntrinsicFunctions> + <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> + <FunctionLevelLinking>true</FunctionLevelLinking> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <DisableSpecificWarnings>4003;4512;4127</DisableSpecificWarnings> + <SDLCheck>true</SDLCheck> + </ClCompile> + <Link> + <AdditionalDependencies>Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies> + <GenerateDebugInformation>true</GenerateDebugInformation> + <OptimizeReferences>true</OptimizeReferences> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + </Link> + <PostBuildEvent> + <Command>@echo off +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc14\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc12\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc11\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc10\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc9\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc8\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\codeblocks\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\iphone\"</Command> + </PostBuildEvent> + <PreBuildEvent> + <Command> + </Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="..\codeblocks.cpp" /> + <ClCompile Include="..\create_project.cpp" /> + <ClCompile Include="..\msbuild.cpp" /> + <ClCompile Include="..\msvc.cpp" /> + <ClCompile Include="..\visualstudio.cpp" /> + <ClCompile Include="..\xcode.cpp" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\codeblocks.h" /> + <ClInclude Include="..\config.h" /> + <ClInclude Include="..\create_project.h" /> + <ClInclude Include="..\msbuild.h" /> + <ClInclude Include="..\msvc.h" /> + <ClInclude Include="..\visualstudio.h" /> + <ClInclude Include="..\xcode.h" /> + </ItemGroup> + <ItemGroup> + <None Include="..\scripts\installer.vbs" /> + <None Include="..\scripts\postbuild.cmd" /> + <None Include="..\scripts\prebuild.cmd" /> + <None Include="..\scripts\revision.vbs" /> + </ItemGroup> + <ItemGroup> + <Natvis Include="..\scripts\scummvm.natvis" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project>
\ No newline at end of file diff --git a/devtools/create_project/msvc14/create_project.vcxproj.filters b/devtools/create_project/msvc14/create_project.vcxproj.filters new file mode 100644 index 0000000000..16c6df081d --- /dev/null +++ b/devtools/create_project/msvc14/create_project.vcxproj.filters @@ -0,0 +1,76 @@ +яЛП<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Header Files"> + <UniqueIdentifier>{2e3580c8-ec3a-4c81-8351-b668c668db2a}</UniqueIdentifier> + </Filter> + <Filter Include="Source Files"> + <UniqueIdentifier>{31aaf58c-d3cb-4ed6-8eca-163b4a9b31a6}</UniqueIdentifier> + </Filter> + <Filter Include="scripts"> + <UniqueIdentifier>{f980f6fb-41b6-4161-b035-58b200c85cad}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\codeblocks.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\create_project.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\msvc.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\msbuild.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\visualstudio.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\xcode.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\config.h"> + <Filter>Header Files</Filter> + </ClInclude> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\codeblocks.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\create_project.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\msvc.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\msbuild.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\visualstudio.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\xcode.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <None Include="..\scripts\prebuild.cmd"> + <Filter>scripts</Filter> + </None> + <None Include="..\scripts\revision.vbs"> + <Filter>scripts</Filter> + </None> + <None Include="..\scripts\postbuild.cmd"> + <Filter>scripts</Filter> + </None> + <None Include="..\scripts\installer.vbs"> + <Filter>scripts</Filter> + </None> + </ItemGroup> + <ItemGroup> + <Natvis Include="..\scripts\scummvm.natvis"> + <Filter>scripts</Filter> + </Natvis> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/devtools/create_project/visualstudio.cpp b/devtools/create_project/visualstudio.cpp index 9b928bf520..96fdbdf27a 100644 --- a/devtools/create_project/visualstudio.cpp +++ b/devtools/create_project/visualstudio.cpp @@ -230,7 +230,7 @@ void VisualStudioProvider::outputGlobalPropFile(const BuildSetup &setup, std::of "\t\tDisableSpecificWarnings=\"" << warnings << "\"\n" "\t\tAdditionalIncludeDirectories=\".\\;" << prefix << ";" << prefix << "\\engines;$(" << LIBS_DEFINE << ")\\include;$(" << LIBS_DEFINE << ")\\include\\SDL;" << (setup.tests ? prefix + "\\test\\cxxtest;" : "") << "$(TargetDir)\"\n" "\t\tPreprocessorDefinitions=\"" << definesList << "\"\n" - "\t\tExceptionHandling=\"" << ((setup.devTools || setup.tests) ? "1" : "0") << "\"\n"; + "\t\tExceptionHandling=\"" << ((setup.devTools || setup.tests || _version == 14) ? "1" : "0") << "\"\n"; #if NEEDS_RTTI properties << "\t\tRuntimeTypeInfo=\"true\"\n"; diff --git a/devtools/scumm-md5.txt b/devtools/scumm-md5.txt index 187fb78e71..f4301ad0a3 100644 --- a/devtools/scumm-md5.txt +++ b/devtools/scumm-md5.txt @@ -492,6 +492,7 @@ freddi Freddi Fish 1: The Case of the Missing Kelp Seeds 5ebb57234b2fe5c5dff641e00184ad81 -1 fr Windows HE 73 - - gist974 cf8ef3a1fb483c5c4b1c584d1167b2c4 -1 de Windows HE 73 - - Oncer 1f2e62b5a9c50589fc342285a6bb3a27 -1 he Windows HE 73 - - e_orz + 64a22be96d679018696e5c8d3ca8b71d 26375 jp Windows HE 73 - - sev 507bb360688dc4180fdf0d7597352a69 26402 se Windows HE 73 - - Sven Arvidsson df047cc4792150f601290357566d36a6 -1 en All HE 90 Updated - khalek e44ea295a3f8fe4f41983080dab1e9ce -1 fr Mac HE 90 Updated - ThierryFR diff --git a/dists/engine-data/testbed-audiocd-files/TESTBED b/dists/engine-data/testbed-audiocd-files/TESTBED new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/dists/engine-data/testbed-audiocd-files/TESTBED diff --git a/dists/msvc14/create_msvc14.bat b/dists/msvc14/create_msvc14.bat new file mode 100644 index 0000000000..7082ac9680 --- /dev/null +++ b/dists/msvc14/create_msvc14.bat @@ -0,0 +1,105 @@ +@echo off + +echo. +echo Automatic creation of the MSVC14 project files +echo. + +if "%~1"=="/stable" goto stable +if "%~1"=="/STABLE" goto stable +if "%~1"=="/all" goto all +if "%~1"=="/ALL" goto all +if "%~1"=="/tools" goto tools +if "%~1"=="/TOOLS" goto tools +if "%~1"=="/tests" goto tests +if "%~1"=="/TESTS" goto tests +if "%~1"=="/clean" goto clean_check +if "%~1"=="/CLEAN" goto clean_check +if "%~1"=="/help" goto command_help +if "%~1"=="/HELP" goto command_help +if "%~1"=="/?" goto command_help + +if "%~1"=="" goto check_tool + +echo Invalid command parameter: %~1 +echo. + +:command_help +echo Valid command parameters are: +echo stable Generated stable engines project files +echo all Generate all engines project files +echo tools Generate project files for the devtools +echo clean Clean generated project files +echo help Show help message +goto done + +:check_tool +if not exist create_project.exe goto no_tool + +:question +echo. +set batchanswer=S +set /p batchanswer="Enable stable engines only, or all engines? (S/a)" +if "%batchanswer%"=="s" goto stable +if "%batchanswer%"=="S" goto stable +if "%batchanswer%"=="a" goto all +if "%batchanswer%"=="A" goto all +goto question + +:no_tool +echo create_project.exe not found in the current folder. +echo You need to build it first and copy it in this +echo folder +goto done + +:all +echo. +echo Creating project files with all engines enabled (stable and unstable) +echo. +create_project ..\.. --enable-all-engines --msvc --msvc-version 14 --build-events +goto done + +:stable +echo. +echo Creating normal project files, with only the stable engines enabled +echo. +create_project ..\.. --msvc --msvc-version 14 +goto done + +:tools +echo. +echo Creating tools project files +echo. +create_project ..\.. --tools --msvc --msvc-version 14 +goto done + +:tests +echo. +echo Creating tests project files +echo. +create_project ..\.. --tests --msvc --msvc-version 14 +goto done + +:clean_check +echo. +set cleananswer=N +set /p cleananswer="This will remove all project files. Are you sure you want to continue? (N/y)" +if "%cleananswer%"=="n" goto done +if "%cleananswer%"=="N" goto done +if "%cleananswer%"=="y" goto clean +if "%cleananswer%"=="Y" goto clean +goto clean_check + +:clean +echo. +echo Removing all project files +del /Q *.vcxproj* > NUL 2>&1 +del /Q *.props > NUL 2>&1 +del /Q *.sln* > NUL 2>&1 +del /Q scummvm* > NUL 2>&1 +del /Q devtools* > NUL 2>&1 +del /Q test_runner.cpp > NUL 2>&1 +goto done + +:done +echo. +pause diff --git a/dists/msvc14/readme.txt b/dists/msvc14/readme.txt new file mode 100644 index 0000000000..3d16c7b20b --- /dev/null +++ b/dists/msvc14/readme.txt @@ -0,0 +1,6 @@ +The Visual Studio project files can now be created automatically from the GCC +files using the create_project tool inside the /devtools/create_project folder. + +To create the default project files, build create_project.exe, copy it inside +this folder and run the create_msvc14.bat file for a default build. You can run +create_project.exe with no parameters to check the possible command-line options. diff --git a/doc/de/Neues b/doc/de/Neues index 2b67913359..3d155be825 100644 --- a/doc/de/Neues +++ b/doc/de/Neues @@ -17,7 +17,7 @@ Sie auf Englisch unter: AGI: - Es ist nun mУЖglich, die Maus-UnterstУМtzung zu deaktivieren (auУer bei -Amiga-Versionen und Fan-Spielen, die eine Maus benУЖtigen). + Amiga-Versionen und Fan-Spielen, die eine Maus benУЖtigen). - Fehlerhafte LautstУЄrke-DУЄmpfung im PCjr-Sound-Code behoben (Fehler #6858). AGOS: @@ -26,6 +26,8 @@ Amiga-Versionen und Fan-Spielen, die eine Maus benУЖtigen). - Verb-Feld in der Amiga-Version von Simon the Sorcerer 1 repariert. - Accolade AdLib- und MT32-Treiber fУМr folgende Spiele hinzugefУМgt: Elvira 1, Elvira 2, Waxworks und Simon the Sorcerer 1 (Demoversion) + - AdLib-Ausgabe in Simon the Sorcerer 1 hinzugefУМgt. Dies verbessert die AdLib- + Ausgabe erheblich und erhУЖht die Originaltreue. Baphomets Fluch 1: - Erkennung der Byte-Reihenfolge der Sprachausgabe auf Big-Endian-Systemen @@ -34,6 +36,9 @@ Amiga-Versionen und Fan-Spielen, die eine Maus benУЖtigen). das Spiel in der Szene am Bull's Head Hill befindet, behoben (Fehler #6728). Dieser Fehler trat womУЖglich auch in anderen Szenen auf. + CinE: + - UnterstУМtzung fУМr Musik in der CD-Version von Future Wars hinzugefУМgt. + MADE: - UnterstУМtzung fУМr AdLib-Musik in Return to Zork verbessert. diff --git a/engines/bbvs/minigames/bbairguitar.cpp b/engines/bbvs/minigames/bbairguitar.cpp index 26e27a966f..04175f7290 100644 --- a/engines/bbvs/minigames/bbairguitar.cpp +++ b/engines/bbvs/minigames/bbairguitar.cpp @@ -27,6 +27,7 @@ #include "gui/dialog.h" #include "gui/message.h" +#include "gui/filebrowser-dialog.h" namespace Bbvs { @@ -1204,15 +1205,25 @@ void MinigameBbAirGuitar::stopNote(int noteNum) { } bool MinigameBbAirGuitar::getLoadFilename(Common::String &filename) { - // TODO Run dialog and return actual filename - filename = "test.air"; - return true; + GUI::FileBrowserDialog browser(0, "air", GUI::kFBModeLoad); + + if (browser.runModal() > 0) { + filename = browser.getResult(); + return true; + } + + return false; } bool MinigameBbAirGuitar::getSaveFilename(Common::String &filename) { - // TODO Run dialog and return actual filename - filename = "test.air"; - return true; + GUI::FileBrowserDialog browser(0, "air", GUI::kFBModeSave); + + if (browser.runModal() > 0) { + filename = browser.getResult(); + return true; + } + + return false; } bool MinigameBbAirGuitar::querySaveModifiedDialog() { @@ -1240,7 +1251,7 @@ bool MinigameBbAirGuitar::loadTracks() { if (!querySaveModifiedTracks()) return false; - + Common::String filename; if (!getLoadFilename(filename)) return false; diff --git a/engines/cine/cine.cpp b/engines/cine/cine.cpp index a4af8f2201..d2f088dcd8 100644 --- a/engines/cine/cine.cpp +++ b/engines/cine/cine.cpp @@ -22,10 +22,14 @@ #include "common/config-manager.h" #include "common/debug-channels.h" +#include "common/events.h" #include "engines/util.h" #include "graphics/cursorman.h" +#include "graphics/palette.h" + +#include "image/iff.h" #include "cine/cine.h" #include "cine/bg_list.h" @@ -89,9 +93,16 @@ void CineEngine::syncSoundSettings() { } Common::Error CineEngine::run() { + if (g_cine->getGameType() == GType_FW && (g_cine->getFeatures() & GF_CD)) { + showSplashScreen(); + } + // Initialize backend initGraphics(320, 200, false); + if (g_cine->getGameType() == GType_FW && (g_cine->getFeatures() & GF_CD)) + checkCD(); + if (getPlatform() == Common::kPlatformDOS) { g_sound = new PCSound(_mixer, this); } else { @@ -236,4 +247,45 @@ void CineEngine::initialize() { } } +void CineEngine::showSplashScreen() { + Common::File file; + if (!file.open("sony.lbm")) + return; + + Image::IFFDecoder decoder; + if (!decoder.loadStream(file)) + return; + + const Graphics::Surface *surface = decoder.getSurface(); + if (surface->w == 640 && surface->h == 480) { + initGraphics(640, 480, true); + + const byte *palette = decoder.getPalette(); + int paletteColorCount = decoder.getPaletteColorCount(); + g_system->getPaletteManager()->setPalette(palette, 0, paletteColorCount); + + g_system->copyRectToScreen(surface->getPixels(), 640, 0, 0, 640, 480); + g_system->updateScreen(); + + Common::EventManager *eventMan = g_system->getEventManager(); + + bool done = false; + uint32 now = g_system->getMillis(); + + while (!done && g_system->getMillis() - now < 2000) { + Common::Event event; + while (eventMan->pollEvent(event)) { + if (event.type == Common::EVENT_KEYDOWN && event.kbd.keycode == Common::KEYCODE_ESCAPE) { + done = true; + break; + } + if (shouldQuit()) + done = true; + } + } + } + + decoder.destroy(); +} + } // End of namespace Cine diff --git a/engines/cine/cine.h b/engines/cine/cine.h index e620d2ffa5..71a0c242b6 100644 --- a/engines/cine/cine.h +++ b/engines/cine/cine.h @@ -145,6 +145,7 @@ public: private: void initialize(); + void showSplashScreen(); void resetEngine(); bool loadPlainSaveFW(Common::SeekableReadStream &in, CineSaveGameFormat saveGameFormat); bool loadTempSaveOS(Common::SeekableReadStream &in); diff --git a/engines/cine/main_loop.cpp b/engines/cine/main_loop.cpp index 9ce683445f..e52fc464d5 100644 --- a/engines/cine/main_loop.cpp +++ b/engines/cine/main_loop.cpp @@ -31,6 +31,8 @@ #include "cine/bg_list.h" #include "cine/sound.h" +#include "backends/audiocd/audiocd.h" + namespace Cine { struct MouseStatusStruct { @@ -219,6 +221,8 @@ void manageEvents() { mouseData.left = mouseLeft; mouseData.right = mouseRight; + + g_system->getAudioCDManager()->updateCD(); } void getMouseData(uint16 param, uint16 *pButton, uint16 *pX, uint16 *pY) { diff --git a/engines/cine/saveload.cpp b/engines/cine/saveload.cpp index c707c60695..907086a9a1 100644 --- a/engines/cine/saveload.cpp +++ b/engines/cine/saveload.cpp @@ -543,6 +543,15 @@ bool CineEngine::loadTempSaveOS(Common::SeekableReadStream &in) { loadRel(currentRelName); } + // Reset background music in CD version of Future Wars + if (getGameType() == GType_FW && (getFeatures() & GF_CD)) { + if (strlen(bgNames[0])) { + char buffer[20]; + removeExtention(buffer, bgNames[0]); + g_sound->setBgMusic(atoi(buffer + 1)); + } + } + // Load first background (Uses loadBg) if (strlen(bgNames[0])) { loadBg(bgNames[0]); diff --git a/engines/cine/script_fw.cpp b/engines/cine/script_fw.cpp index c0b0c1f5da..6ad38f4433 100644 --- a/engines/cine/script_fw.cpp +++ b/engines/cine/script_fw.cpp @@ -1380,6 +1380,12 @@ int FWScript::o1_loadBg() { debugC(5, kCineDebugScript, "Line: %d: loadBg(\"%s\")", _line, param); + if (g_cine->getGameType() == GType_FW && (g_cine->getFeatures() & GF_CD)) { + char buffer[20]; + removeExtention(buffer, param); + g_sound->setBgMusic(atoi(buffer + 1)); + } + loadBg(param); g_cine->_bgIncrustList.clear(); bgVar0 = 0; diff --git a/engines/cine/sound.cpp b/engines/cine/sound.cpp index 0c788b816c..7cab067371 100644 --- a/engines/cine/sound.cpp +++ b/engines/cine/sound.cpp @@ -32,6 +32,8 @@ #include "cine/cine.h" #include "cine/sound.h" +#include "backends/audiocd/audiocd.h" + #include "audio/audiostream.h" #include "audio/fmopl.h" #include "audio/mididrv.h" @@ -907,6 +909,10 @@ void PCSoundFxPlayer::unload() { PCSound::PCSound(Audio::Mixer *mixer, CineEngine *vm) : Sound(mixer, vm), _soundDriver(0) { + _currentMusic = 0; + _currentMusicStatus = 0; + _currentBgSlot = 0; + const MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB); const MusicType musicType = MidiDriver::getMusicType(dev); if (musicType == MT_MT32 || musicType == MT_GM) { @@ -940,23 +946,98 @@ PCSound::~PCSound() { delete _soundDriver; } +static const char *const musicFileNames[11] = { + "DUGGER.DAT", + "SUITE21.DAT", + "FWARS.DAT", + "SUITE23.DAT", + "SUITE22.DAT", + "ESCAL", + "MOINES.DAT", + "MEDIAVAL.DAT", + "SFUTUR", + "ALIENS", + "TELESONG.DAT", +}; + +static uint8 musicCDTracks[11] = { + 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 22, +}; + void PCSound::loadMusic(const char *name) { debugC(5, kCineDebugSound, "PCSound::loadMusic('%s')", name); - _player->load(name); + if (_vm->getGameType() == GType_FW && (_vm->getFeatures() & GF_CD)) { + _currentMusic = 0; + _currentMusicStatus = 0; + for (int i = 0; i < 11; i++) { + if (!strcmp((const char *)name, musicFileNames[i])) { + _currentMusic = musicCDTracks[i]; + _currentMusicStatus = musicCDTracks[i]; + } + } + } else { + _player->load(name); + } } void PCSound::playMusic() { debugC(5, kCineDebugSound, "PCSound::playMusic()"); - _player->play(); + if (_vm->getGameType() == GType_FW && (_vm->getFeatures() & GF_CD)) { + g_system->getAudioCDManager()->stop(); + g_system->getAudioCDManager()->play(_currentMusic - 1, -1, 0, 0); + } else { + _player->play(); + } +} + +static uint8 bgCDTracks[49] = { + 0, 21, 21, 23, 0, 29, 0, 0, 0, 0, + 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 22, 23, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +void PCSound::setBgMusic(int num) { + debugC(5, kCineDebugSound, "PCSound::setBgMusic(%d)", num); + _currentBgSlot = num; + if (!bgCDTracks[_currentBgSlot]) + return; + + if ((_currentBgSlot == 1) || (_currentMusicStatus == 0 && _currentMusic != bgCDTracks[_currentBgSlot])) { + _currentMusic = bgCDTracks[_currentBgSlot]; + g_system->getAudioCDManager()->stop(); + g_system->getAudioCDManager()->play(bgCDTracks[_currentBgSlot] - 1, -1, 0, 0); + } } void PCSound::stopMusic() { debugC(5, kCineDebugSound, "PCSound::stopMusic()"); + + if (_vm->getGameType() == GType_FW && (_vm->getFeatures() & GF_CD)) { + if (_currentBgSlot != 1) + g_system->getAudioCDManager()->stop(); + } _player->stop(); } void PCSound::fadeOutMusic() { debugC(5, kCineDebugSound, "PCSound::fadeOutMusic()"); + + if (_vm->getGameType() == GType_FW && (_vm->getFeatures() & GF_CD)) { + if (_currentMusicStatus) { + if (_currentBgSlot == 1) { + _currentMusicStatus = 0; + } else { + _currentMusic = 0; + _currentMusicStatus = 0; + g_system->getAudioCDManager()->stop(); + if (bgCDTracks[_currentBgSlot]) { + g_system->getAudioCDManager()->play(_currentBgSlot - 1, -1, 0, 0); + } + } + } + } _player->fadeOut(); } @@ -1056,6 +1137,9 @@ void PaulaSound::stopMusic() { _mixer->stopHandle(_moduleHandle); } +void PaulaSound::setBgMusic(int num) { +} + void PaulaSound::fadeOutMusic() { debugC(5, kCineDebugSound, "PaulaSound::fadeOutMusic()"); Common::StackLock lock(_musicMutex); diff --git a/engines/cine/sound.h b/engines/cine/sound.h index efb3811f9a..0149071ed7 100644 --- a/engines/cine/sound.h +++ b/engines/cine/sound.h @@ -48,6 +48,7 @@ public: virtual void playSound(int channel, int frequency, const uint8 *data, int size, int volumeStep, int stepCount, int volume, int repeat) = 0; virtual void stopSound(int channel) = 0; + virtual void setBgMusic(int num) = 0; protected: @@ -71,11 +72,14 @@ public: virtual void playSound(int channel, int frequency, const uint8 *data, int size, int volumeStep, int stepCount, int volume, int repeat); virtual void stopSound(int channel); + virtual void setBgMusic(int num); protected: PCSoundDriver *_soundDriver; PCSoundFxPlayer *_player; + + uint8 _currentMusic, _currentMusicStatus, _currentBgSlot; }; class PaulaSound : public Sound { @@ -91,6 +95,7 @@ public: virtual void playSound(int channel, int frequency, const uint8 *data, int size, int volumeStep, int stepCount, int volume, int repeat); virtual void stopSound(int channel); + virtual void setBgMusic(int num); enum { PAULA_FREQ = 3579545, diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp index 7815475d37..68b63d398a 100644 --- a/engines/fullpipe/gameloader.cpp +++ b/engines/fullpipe/gameloader.cpp @@ -419,7 +419,7 @@ bool GameLoader::unloadScene(int sceneId) { if (_sc2array[sceneTag]._isLoaded) saveScenePicAniInfos(sceneId); - _sc2array[sceneTag]._motionController->freeItems(); + _sc2array[sceneTag]._motionController->detachAllObjects(); delete tag->_scene; tag->_scene = 0; diff --git a/engines/fullpipe/interaction.cpp b/engines/fullpipe/interaction.cpp index 84e9688e30..4aac3485f4 100644 --- a/engines/fullpipe/interaction.cpp +++ b/engines/fullpipe/interaction.cpp @@ -311,7 +311,7 @@ LABEL_38: if (abs(xpos - subj->_ox) > 1 || abs(ypos - subj->_oy) > 1 || (inter->_staticsId2 != 0 && (subj->_statics == 0 || subj->_statics->_staticsId != inter->_staticsId2))) { - mq = getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->method34(subj, xpos, ypos, 1, inter->_staticsId2); + mq = getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->startMove(subj, xpos, ypos, 1, inter->_staticsId2); if (!mq) return false; diff --git a/engines/fullpipe/lift.cpp b/engines/fullpipe/lift.cpp index 9a3d91540a..d066c89d4a 100644 --- a/engines/fullpipe/lift.cpp +++ b/engines/fullpipe/lift.cpp @@ -324,7 +324,7 @@ void FullpipeEngine::lift_walkAndGo() { ExCommand *ex; if (abs(_liftX - _aniMan->_ox) > 1 || abs(_liftY - _aniMan->_oy) > 1 || _aniMan->_movement || _aniMan->_statics->_staticsId != ST_MAN_UP) { - mq = getCurrSceneSc2MotionController()->method34(_aniMan, _liftX, _liftY, 1, ST_MAN_UP); + mq = getCurrSceneSc2MotionController()->startMove(_aniMan, _liftX, _liftY, 1, ST_MAN_UP); if (mq) { ex = new ExCommand(0, 17, MSG_LIFT_CLICKBUTTON, 0, 0, 0, 1, 0, 0, 0); diff --git a/engines/fullpipe/messagehandlers.cpp b/engines/fullpipe/messagehandlers.cpp index d4f79d1dd8..94754ad22a 100644 --- a/engines/fullpipe/messagehandlers.cpp +++ b/engines/fullpipe/messagehandlers.cpp @@ -781,7 +781,7 @@ int MovGraph_messageHandler(ExCommand *cmd) { int off = (node->_field_14 >> 16) & 0xFF; double off2 = ((link->_movGraphNode2->_field_14 >> 8) & 0xff) - off; - top = off + (int)(sqrt(sq) * off2 / link->_distance); + top = off + (int)(sqrt(sq) * off2 / link->_z); } else { top = (gr->calcOffset(ani->_ox, ani->_oy)->_field_14 >> 8) & 0xff; } diff --git a/engines/fullpipe/motion.cpp b/engines/fullpipe/motion.cpp index 5845ad1501..1a61cb742a 100644 --- a/engines/fullpipe/motion.cpp +++ b/engines/fullpipe/motion.cpp @@ -88,7 +88,7 @@ bool MctlCompound::load(MfcArchive &file) { for (int i = 0; i < count; i++) { debug(6, "CompoundArray[%d]", i); - MctlCompoundArrayItem *obj = new MctlCompoundArrayItem(); + MctlItem *obj = new MctlItem(); obj->_motionControllerObj = (MotionController *)file.readClass(); @@ -114,14 +114,14 @@ bool MctlCompound::load(MfcArchive &file) { return true; } -void MctlCompound::addObject(StaticANIObject *obj) { +void MctlCompound::attachObject(StaticANIObject *obj) { for (uint i = 0; i < _motionControllers.size(); i++) - _motionControllers[i]->_motionControllerObj->addObject(obj); + _motionControllers[i]->_motionControllerObj->attachObject(obj); } -int MctlCompound::removeObject(StaticANIObject *obj) { +int MctlCompound::detachObject(StaticANIObject *obj) { for (uint i = 0; i < _motionControllers.size(); i++) - _motionControllers[i]->_motionControllerObj->removeObject(obj); + _motionControllers[i]->_motionControllerObj->detachObject(obj); return 1; } @@ -150,12 +150,12 @@ void MctlCompound::initMovGraph2() { } } -void MctlCompound::freeItems() { +void MctlCompound::detachAllObjects() { for (uint i = 0; i < _motionControllers.size(); i++) - _motionControllers[i]->_motionControllerObj->freeItems(); + _motionControllers[i]->_motionControllerObj->detachAllObjects(); } -MessageQueue *MctlCompound::method34(StaticANIObject *ani, int sourceX, int sourceY, int fuzzyMatch, int staticsId) { +MessageQueue *MctlCompound::startMove(StaticANIObject *ani, int sourceX, int sourceY, int fuzzyMatch, int staticsId) { int idx = -1; int sourceIdx = -1; @@ -187,7 +187,7 @@ MessageQueue *MctlCompound::method34(StaticANIObject *ani, int sourceX, int sour return 0; if (idx == sourceIdx) - return _motionControllers[idx]->_motionControllerObj->method34(ani, sourceX, sourceY, fuzzyMatch, staticsId); + return _motionControllers[idx]->_motionControllerObj->startMove(ani, sourceX, sourceY, fuzzyMatch, staticsId); double dist; MctlConnectionPoint *cp = findClosestConnectionPoint(ani->_ox, ani->_oy, idx, sourceX, sourceY, sourceIdx, &dist); @@ -195,7 +195,7 @@ MessageQueue *MctlCompound::method34(StaticANIObject *ani, int sourceX, int sour if (!cp) return 0; - MessageQueue *mq = _motionControllers[idx]->_motionControllerObj->doWalkTo(ani, cp->_connectionX, cp->_connectionY, 1, cp->_field_14); + MessageQueue *mq = _motionControllers[idx]->_motionControllerObj->doWalkTo(ani, cp->_connectionX, cp->_connectionY, 1, cp->_mctlmirror); if (!mq) return 0; @@ -264,7 +264,7 @@ MessageQueue *MctlCompound::doWalkTo(StaticANIObject *subj, int xpos, int ypos, if (!closestP) return 0; - MessageQueue *mq = _motionControllers[match1]->_motionControllerObj->doWalkTo(subj, closestP->_connectionX, closestP->_connectionY, 1, closestP->_field_14); + MessageQueue *mq = _motionControllers[match1]->_motionControllerObj->doWalkTo(subj, closestP->_connectionX, closestP->_connectionY, 1, closestP->_mctlmirror); ExCommand *ex; @@ -287,7 +287,7 @@ MessageQueue *MctlCompound::doWalkTo(StaticANIObject *subj, int xpos, int ypos, return mq; } -MctlCompoundArrayItem::~MctlCompoundArrayItem() { +MctlItem::~MctlItem() { delete _movGraphReactObj; delete _motionControllerObj; } @@ -304,7 +304,7 @@ MctlLadder::MctlLadder() { } MctlLadder::~MctlLadder() { - freeItems(); + detachAllObjects(); } int MctlLadder::collisionDetection(StaticANIObject *man) { @@ -326,7 +326,7 @@ int MctlLadder::collisionDetection(StaticANIObject *man) { return res; } -void MctlLadder::addObject(StaticANIObject *obj) { +void MctlLadder::attachObject(StaticANIObject *obj) { if (findObjectPos(obj) < 0) { MctlLadderMovement *movement = new MctlLadderMovement; @@ -391,7 +391,7 @@ bool MctlLadder::initMovement(StaticANIObject *ani, MctlLadderMovement *movement return true; } -void MctlLadder::freeItems() { +void MctlLadder::detachAllObjects() { _mgm.clear(); for (uint i = 0; i < _ladmovements.size(); i++) { @@ -402,7 +402,7 @@ void MctlLadder::freeItems() { _ladmovements.clear(); } -MessageQueue *MctlLadder::method34(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId) { +MessageQueue *MctlLadder::startMove(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId) { MessageQueue *mq = doWalkTo(subj, xpos, ypos, fuzzyMatch, staticsId); if (mq) { @@ -661,7 +661,7 @@ void MctlCompound::replaceNodeX(int from, int to) { node->_x = to; } - gr->calcNodeDistancesAndAngles(); + gr->recalcLinkParams(); } } } @@ -669,10 +669,9 @@ void MctlCompound::replaceNodeX(int from, int to) { MctlConnectionPoint::MctlConnectionPoint() { _connectionX = 0; _connectionY = 0; - _field_C = 0; - _field_10 = 0; - _field_14 = 0; - _field_16 = 0; + _mctlflags = 0; + _mctlstatic = 0; + _mctlmirror = 0; _messageQueueObj = 0; _motionControllerObj = 0; } @@ -779,7 +778,7 @@ bool MovGraph::load(MfcArchive &file) { return true; } -void MovGraph::addObject(StaticANIObject *obj) { +void MovGraph::attachObject(StaticANIObject *obj) { _mgm.clear(); _mgm.addItem(obj->_id); @@ -796,13 +795,13 @@ void MovGraph::addObject(StaticANIObject *obj) { _mgm.addItem(obj->_id); // FIXME: Is it really needed? } -int MovGraph::removeObject(StaticANIObject *obj) { - warning("STUB: MovGraph::removeObject()"); +int MovGraph::detachObject(StaticANIObject *obj) { + warning("STUB: MovGraph::detachObject()"); return 0; } -void MovGraph::freeItems() { +void MovGraph::detachAllObjects() { for (uint i = 0; i < _items.size(); i++) { _items[i]->free(); @@ -812,7 +811,7 @@ void MovGraph::freeItems() { _items.clear(); } -Common::Array<MovItem *> *MovGraph::method28(StaticANIObject *ani, int x, int y, int flag1, int *rescount) { +Common::Array<MovItem *> *MovGraph::getPaths(StaticANIObject *ani, int x, int y, int flag1, int *rescount) { *rescount = 0; if (_items.size() <= 0) @@ -828,7 +827,7 @@ Common::Array<MovItem *> *MovGraph::method28(StaticANIObject *ani, int x, int y, } _items[idx]->free(); - calcNodeDistancesAndAngles(); + recalcLinkParams(); _items[idx]->movarr._movSteps.clear(); @@ -838,7 +837,7 @@ Common::Array<MovItem *> *MovGraph::method28(StaticANIObject *ani, int x, int y, point.y = ani->_oy; if (!calcChunk(idx, ani->_ox, ani->_oy, &_items[idx]->movarr, 0)) - findClosestLink(idx, &point, &_items[idx]->movarr); + getNearestPoint(idx, &point, &_items[idx]->movarr); _items[idx]->count = 0; @@ -873,12 +872,12 @@ Common::Array<MovItem *> *MovGraph::method28(StaticANIObject *ani, int x, int y, return 0; } -bool MovGraph::method2C(StaticANIObject *obj, int x, int y) { +bool MovGraph::setPosImmediate(StaticANIObject *obj, int x, int y) { obj->setOXY(x, y); - return method3C(obj, 1); + return resetPosition(obj, 1); } -MessageQueue *MovGraph::method34(StaticANIObject *ani, int xpos, int ypos, int fuzzyMatch, int staticsId) { +MessageQueue *MovGraph::startMove(StaticANIObject *ani, int xpos, int ypos, int fuzzyMatch, int staticsId) { if (!ani) { if (!_items.size()) return 0; @@ -896,7 +895,7 @@ MessageQueue *MovGraph::method34(StaticANIObject *ani, int xpos, int ypos, int f return 0; int count; - Common::Array<MovItem *> *movitems = method28(ani, xpos, ypos, fuzzyMatch, &count); + Common::Array<MovItem *> *movitems = getPaths(ani, xpos, ypos, fuzzyMatch, &count); if (!movitems) return 0; @@ -941,9 +940,9 @@ MessageQueue *MovGraph::method34(StaticANIObject *ani, int xpos, int ypos, int f int count2; ani->setSomeDynamicPhaseIndex(ex->_field_14); - method28(ani, xpos, ypos, fuzzyMatch, &count2); + getPaths(ani, xpos, ypos, fuzzyMatch, &count2); - int idx = getItemIndexByStaticAni(ani); + int idx = getObjectIndex(ani); count = _items[idx]->count; movitems = _items[idx]->movitems; } @@ -951,12 +950,12 @@ MessageQueue *MovGraph::method34(StaticANIObject *ani, int xpos, int ypos, int f return method50(ani, _callback1(ani, movitems, count), staticsId); } -void MovGraph::changeCallback(MovArr *(*callback1)(StaticANIObject *ani, Common::Array<MovItem *> *items, signed int counter)) { +void MovGraph::setSelFunc(MovArr *(*callback1)(StaticANIObject *ani, Common::Array<MovItem *> *items, signed int counter)) { _callback1 = callback1; } -bool MovGraph::method3C(StaticANIObject *ani, int flag) { - int idx = getItemIndexByStaticAni(ani); +bool MovGraph::resetPosition(StaticANIObject *ani, int flag) { + int idx = getObjectIndex(ani); if (idx == -1) return false; @@ -967,7 +966,7 @@ bool MovGraph::method3C(StaticANIObject *ani, int flag) { point.x = ani->_ox; point.y = ani->_oy; - findClosestLink(idx, &point, &movarr); + getNearestPoint(idx, &point, &movarr); ani->setOXY(point.x, point.y); if (flag) { @@ -990,15 +989,15 @@ bool MovGraph::method3C(StaticANIObject *ani, int flag) { return true; } -bool MovGraph::method44(StaticANIObject *ani, int x, int y) { - int idx = getItemIndexByStaticAni(ani); +bool MovGraph::canDropInventory(StaticANIObject *ani, int x, int y) { + int idx = getObjectIndex(ani); MovArr m; if (idx != -1) { if (x != -1 || y != -1) { int counter; - Common::Array<MovItem *> *movitem = method28(ani, x, y, 0, &counter); + Common::Array<MovItem *> *movitem = getPaths(ani, x, y, 0, &counter); if (movitem) { MovArr *movarr = _callback1(ani, movitem, counter); @@ -1021,13 +1020,13 @@ MessageQueue *MovGraph::doWalkTo(StaticANIObject *subj, int xpos, int ypos, int PicAniInfo picAniInfo; int ss; - Common::Array<MovItem *> *movitem = method28(subj, xpos, ypos, fuzzyMatch, &ss); + Common::Array<MovItem *> *movitem = getPaths(subj, xpos, ypos, fuzzyMatch, &ss); subj->getPicAniInfo(&picAniInfo); if (movitem) { MovArr *goal = _callback1(subj, movitem, ss); - int idx = getItemIndexByStaticAni(subj); + int idx = getObjectIndex(subj); for (int i = 0; i < _items[idx]->count; i++) { if ((*_items[idx]->movitems)[i]->movarr == goal) { @@ -1052,10 +1051,10 @@ MessageQueue *MovGraph::doWalkTo(StaticANIObject *subj, int xpos, int ypos, int } } - movitem = method28(subj, xpos, ypos, fuzzyMatch, &ss); + movitem = getPaths(subj, xpos, ypos, fuzzyMatch, &ss); if (movitem) { MovArr *goal = _callback1(subj, movitem, ss); - int idx = getItemIndexByStaticAni(subj); + int idx = getObjectIndex(subj); if (_items[idx]->count > 0) { int arridx = 0; @@ -1106,7 +1105,7 @@ MessageQueue *MovGraph::sub1(StaticANIObject *ani, int x, int y, int stid, int x int rescount; - Common::Array<MovItem *> *movitems = method28(ani, x1, y1, flag1, &rescount); + Common::Array<MovItem *> *movitems = getPaths(ani, x1, y1, flag1, &rescount); if (!movitems) { ani->setPicAniInfo(&picinfo); @@ -1117,7 +1116,7 @@ MessageQueue *MovGraph::sub1(StaticANIObject *ani, int x, int y, int stid, int x MessageQueue *res = 0; MovArr *goal = _callback1(ani, movitems, rescount); - int idx = getItemIndexByStaticAni(ani); + int idx = getObjectIndex(ani); MovGraphItem *movgitem = _items[idx]; int cnt = movgitem->count; @@ -1177,16 +1176,16 @@ MessageQueue *MovGraph::fillMGMinfo(StaticANIObject *ani, MovArr *movarr, int st if (i == movarr->_movStepCount - 1) { nx = movarr->_point.x; ny = movarr->_point.y; - nd = st->link->_movGraphNode1->_distance; + nd = st->link->_movGraphNode1->_z; } else { if (st->sfield_0) { nx = st->link->_movGraphNode1->_x; ny = st->link->_movGraphNode1->_y; - nd = st->link->_movGraphNode1->_distance; + nd = st->link->_movGraphNode1->_z; } else { nx = st->link->_movGraphNode2->_x; ny = st->link->_movGraphNode2->_y; - nd = st->link->_movGraphNode2->_distance; + nd = st->link->_movGraphNode2->_z; } } @@ -1294,14 +1293,14 @@ double MovGraph::calcDistance(Common::Point *point, MovGraphLink *link, int fuzz double dist2x = (double)(n2x - n1x); double dist2y = (double)(n2y - n1y); double dist1 = sqrt(dist1y * dist1y + dist1x * dist1x); - double dist2 = ((double)(n1y - n2y) * dist1y + dist2x * dist1x) / link->_distance / dist1; + double dist2 = ((double)(n1y - n2y) * dist1y + dist2x * dist1x) / link->_z / dist1; double distm = dist2 * dist1; double res = sqrt(1.0 - dist2 * dist2) * dist1; - if (dist2 <= 0.0 || distm >= link->_distance) { + if (dist2 <= 0.0 || distm >= link->_z) { if (fuzzyMatch) { if (dist2 > 0.0) { - if (distm >= link->_distance) { + if (distm >= link->_z) { point->x = n2x; point->y = n2y; } @@ -1313,14 +1312,14 @@ double MovGraph::calcDistance(Common::Point *point, MovGraphLink *link, int fuzz return -1.0; } } else { - point->x = (int)(n1x + (dist2x * distm / link->_distance)); - point->y = (int)(n1y + (dist2y * distm / link->_distance)); + point->x = (int)(n1x + (dist2x * distm / link->_z)); + point->y = (int)(n1y + (dist2y * distm / link->_z)); } return res; } -void MovGraph::calcNodeDistancesAndAngles() { +void MovGraph::recalcLinkParams() { for (ObList::iterator i = _links.begin(); i != _links.end(); ++i) { assert(((CObject *)*i)->_objtype == kObjTypeMovGraphLink); @@ -1328,11 +1327,11 @@ void MovGraph::calcNodeDistancesAndAngles() { lnk->_flags &= 0x7FFFFFFF; - lnk->calcNodeDistanceAndAngle(); + lnk->recalcLength(); } } -bool MovGraph::findClosestLink(int unusedArg, Common::Point *p, MovArr *movarr) { +bool MovGraph::getNearestPoint(int unusedArg, Common::Point *p, MovArr *movarr) { MovGraphLink *link = 0; double mindist = 1.0e20; int resx = 0, resy = 0; @@ -1348,7 +1347,7 @@ bool MovGraph::findClosestLink(int unusedArg, Common::Point *p, MovArr *movarr) double dx3 = lnk->_movGraphNode2->_x - lnk->_movGraphNode1->_x; double dy3 = lnk->_movGraphNode2->_y - lnk->_movGraphNode1->_y; double sq1 = sqrt(dy1 * dy1 + dx1 * dx1); - double sdist = (dy3 * dy1 + dx3 * dx1) / lnk->_distance / sq1; + double sdist = (dy3 * dy1 + dx3 * dx1) / lnk->_z / sq1; double ldist = sdist * sq1; double dist = sqrt(1.0 - sdist * sdist) * sq1; @@ -1357,14 +1356,14 @@ bool MovGraph::findClosestLink(int unusedArg, Common::Point *p, MovArr *movarr) dist = sqrt(dx1 * dx1 + dy1 * dy1); } - if (ldist > lnk->_distance) { - ldist = lnk->_distance; + if (ldist > lnk->_z) { + ldist = lnk->_z; dist = sqrt(dx2 * dx2 + dy2 * dy2); } - if (ldist >= 0.0 && ldist <= lnk->_distance && dist < mindist) { - resx = lnk->_movGraphNode1->_x + (int)(dx3 * ldist / lnk->_distance); - resy = lnk->_movGraphNode1->_y + (int)(dy3 * ldist / lnk->_distance); + if (ldist >= 0.0 && ldist <= lnk->_z && dist < mindist) { + resx = lnk->_movGraphNode1->_x + (int)(dx3 * ldist / lnk->_z); + resy = lnk->_movGraphNode1->_y + (int)(dy3 * ldist / lnk->_z); mindist = dist; link = lnk; @@ -1387,7 +1386,7 @@ bool MovGraph::findClosestLink(int unusedArg, Common::Point *p, MovArr *movarr) return false; } -int MovGraph::getItemIndexByStaticAni(StaticANIObject *ani) { +int MovGraph::getObjectIndex(StaticANIObject *ani) { for (uint i = 0; i < _items.size(); i++) if (_items[i]->ani == ani) return i; @@ -1418,7 +1417,7 @@ Common::Array<MovArr *> *MovGraph::genMovArr(int x, int y, int *arrSize, int fla movarr->_link = lnk; movarr->_dist = ((double)(lnk->_movGraphNode1->_y - lnk->_movGraphNode2->_y) * (double)(lnk->_movGraphNode1->_y - point.y) + (double)(lnk->_movGraphNode2->_x - lnk->_movGraphNode1->_x) * (double)(point.x - lnk->_movGraphNode1->_x)) / - lnk->_distance / lnk->_distance; + lnk->_z / lnk->_z; movarr->_point = point; arr->push_back(movarr); @@ -1447,7 +1446,7 @@ Common::Array<MovArr *> *MovGraph::genMovArr(int x, int y, int *arrSize, int fla movarr->_link = lnk; movarr->_dist = ((double)(lnk->_movGraphNode1->_y - lnk->_movGraphNode2->_y) * (double)(lnk->_movGraphNode1->_y - y) + (double)(lnk->_movGraphNode2->_x - lnk->_movGraphNode1->_x) * (double)(x - lnk->_movGraphNode1->_x)) / - lnk->_distance / lnk->_distance; + lnk->_z / lnk->_z; movarr->_point.x = x; movarr->_point.y = y; @@ -1548,7 +1547,7 @@ bool MovGraph::calcChunk(int idx, int x, int y, MovArr *arr, int a6) { Common::Array<MovArr *> *movarr = genMovArr(x, y, &arrSize, 0, 1); if (!movarr) - return findClosestLink(idx, 0, arr); + return getNearestPoint(idx, 0, arr); bool res = false; @@ -1777,8 +1776,8 @@ bool MovGraph2::initDirections(StaticANIObject *obj, MovGraph2Item *item) { return true; } -void MovGraph2::addObject(StaticANIObject *obj) { - MovGraph::addObject(obj); +void MovGraph2::attachObject(StaticANIObject *obj) { + MovGraph::attachObject(obj); int id = getItemIndexByGameObjectId(obj->_id); @@ -2031,20 +2030,20 @@ MessageQueue *MovGraph2::buildMovInfo1MessageQueue(MovInfo1 *movInfo) { return mq; } -int MovGraph2::removeObject(StaticANIObject *obj) { - warning("STUB: MovGraph2::removeObject()"); +int MovGraph2::detachObject(StaticANIObject *obj) { + warning("STUB: MovGraph2::detachObject()"); return 0; } -void MovGraph2::freeItems() { +void MovGraph2::detachAllObjects() { for (uint i = 0; i < _items2.size(); i++) delete _items2[i]; _items2.clear(); } -MessageQueue *MovGraph2::method34(StaticANIObject *ani, int xpos, int ypos, int fuzzyMatch, int staticsId) { +MessageQueue *MovGraph2::startMove(StaticANIObject *ani, int xpos, int ypos, int fuzzyMatch, int staticsId) { if (!ani->isIdle()) return 0; @@ -2240,9 +2239,9 @@ MessageQueue *MovGraph2::doWalkTo(StaticANIObject *obj, int xpos, int ypos, int int dx2, dy2; if (linkInfoSource.node) - movInfo1.distance1 = linkInfoSource.node->_distance; + movInfo1.distance1 = linkInfoSource.node->_z; else - movInfo1.distance1 = linkInfoSource.link->_movGraphNode1->_distance; + movInfo1.distance1 = linkInfoSource.link->_movGraphNode1->_z; if (linkInfoDest.node) { dx2 = linkInfoDest.node->_x; @@ -2251,16 +2250,16 @@ MessageQueue *MovGraph2::doWalkTo(StaticANIObject *obj, int xpos, int ypos, int movInfo1.pt2.x = linkInfoDest.node->_x; movInfo1.pt2.y = linkInfoDest.node->_y; - movInfo1.distance2 = linkInfoDest.node->_distance; + movInfo1.distance2 = linkInfoDest.node->_z; } else { movInfo1.pt2.x = xpos; movInfo1.pt2.y = ypos; MovGraphNode *nod = linkInfoDest.link->_movGraphNode1; double dst1 = sqrt((double)((ypos - nod->_y) * (ypos - nod->_y) + (xpos - nod->_x) * (xpos - nod->_x))); - int dst = linkInfoDest.link->_movGraphNode2->_distance - nod->_distance; + int dst = linkInfoDest.link->_movGraphNode2->_z - nod->_z; - movInfo1.distance2 = (int)(nod->_distance + (dst1 * (double)dst / linkInfoDest.link->_distance)); + movInfo1.distance2 = (int)(nod->_z + (dst1 * (double)dst / linkInfoDest.link->_z)); calcDistance(&movInfo1.pt2, linkInfoDest.link, 1); @@ -2397,8 +2396,8 @@ int MovGraph2::findLink(Common::Array<MovGraphLink *> *linkList, int idx, Common rect->bottom = node2->_y; } if (point) { - point->x = node3->_distance; - point->y = node2->_distance; + point->x = node3->_z; + point->y = node2->_z; } if (abs(node3->_x - node2->_x) <= abs(node3->_y - node2->_y)) @@ -2659,7 +2658,7 @@ MovGraphLink *MovGraph2::findLink2(int x, int y) { double n1dx = n1x - x; double n1dy = n1y - y; double dst1 = sqrt(n1dy * n1dy + n1dx * n1dx); - double coeff1 = ((n1y - n2y) * n1dy + (n2x - n1x) * n1dx) / lnk->_distance / dst1; + double coeff1 = ((n1y - n2y) * n1dy + (n2x - n1x) * n1dx) / lnk->_z / dst1; double dst3 = coeff1 * dst1; double dst2 = sqrt(1.0 - coeff1 * coeff1) * dst1; @@ -2667,11 +2666,11 @@ MovGraphLink *MovGraph2::findLink2(int x, int y) { dst3 = 0.0; dst2 = sqrt(n1dy * n1dy + n1dx * n1dx); } - if (dst3 > lnk->_distance) { - dst3 = lnk->_distance; + if (dst3 > lnk->_z) { + dst3 = lnk->_z; dst2 = sqrt((n2x - x) * (n2x - x) + (n2y - y) * (n2y - y)); } - if (dst3 >= 0.0 && dst3 <= lnk->_distance && dst2 < mindist) { + if (dst3 >= 0.0 && dst3 <= lnk->_z && dst2 < mindist) { mindist = dst2; res = lnk; } @@ -2704,11 +2703,11 @@ double MovGraph2::findMinPath(LinkInfo *linkInfoSource, LinkInfo *linkInfoDest, double newDistance = findMinPath(&linkInfoWorkSource, linkInfoDest, &tmpList); - if (newDistance >= 0.0 && (minDistance < 0.0 || newDistance + lnk->_distance < minDistance)) { + if (newDistance >= 0.0 && (minDistance < 0.0 || newDistance + lnk->_z < minDistance)) { listObj->clear(); listObj->push_back(tmpList); - minDistance = newDistance + lnk->_distance; + minDistance = newDistance + lnk->_z; } lnk->_flags &= 0x7FFFFFFF; @@ -2775,7 +2774,7 @@ MovGraphNode *MovGraph::calcOffset(int ox, int oy) { } MovGraphLink::MovGraphLink() { - _distance = 0; + _z = 0; _angle = 0; _flags = 0x10000000; _movGraphNode2 = 0; @@ -2809,10 +2808,10 @@ bool MovGraphLink::load(MfcArchive &file) { debug(8, "GraphNode2"); _movGraphNode2 = (MovGraphNode *)file.readClass(); - _distance = file.readDouble(); + _z = file.readDouble(); _angle = file.readDouble(); - debug(8, "distance: %g, angle: %g", _distance, _angle); + debug(8, "distance: %g, angle: %g", _z, _angle); _movGraphReact = (MovGraphReact *)file.readClass(); _name = file.readPascalString(); @@ -2820,12 +2819,12 @@ bool MovGraphLink::load(MfcArchive &file) { return true; } -void MovGraphLink::calcNodeDistanceAndAngle() { +void MovGraphLink::recalcLength() { if (_movGraphNode1) { double dx = _movGraphNode2->_x - _movGraphNode1->_x; double dy = _movGraphNode2->_y - _movGraphNode1->_y; - _distance = sqrt(dy * dy + dx * dx); + _z = sqrt(dy * dy + dx * dx); _angle = atan2(dx, dy); } } @@ -2836,7 +2835,7 @@ bool MovGraphNode::load(MfcArchive &file) { _field_14 = file.readUint32LE(); _x = file.readUint32LE(); _y = file.readUint32LE(); - _distance = file.readUint32LE(); + _z = file.readUint32LE(); return true; } @@ -3032,7 +3031,7 @@ int startWalkTo(int objId, int objKey, int x, int y, int fuzzyMatch) { MctlCompound *mc = getCurrSceneSc2MotionController(); if (mc) - return (mc->method34(g_fp->_currentScene->getStaticANIObject1ById(objId, objKey), x, y, fuzzyMatch, 0) != 0); + return (mc->startMove(g_fp->_currentScene->getStaticANIObject1ById(objId, objKey), x, y, fuzzyMatch, 0) != 0); return 0; } @@ -3042,7 +3041,7 @@ bool doSomeAnimation(int objId, int objKey, int a3) { MctlCompound *cmp = getCurrSceneSc2MotionController(); if (ani && cmp) - return cmp->method3C(ani, a3); + return cmp->resetPosition(ani, a3); return false; } diff --git a/engines/fullpipe/motion.h b/engines/fullpipe/motion.h index c488039e22..a40d810ffa 100644 --- a/engines/fullpipe/motion.h +++ b/engines/fullpipe/motion.h @@ -48,19 +48,19 @@ public: virtual bool load(MfcArchive &file); virtual void methodC() {} virtual void method10() {} - virtual void clearEnabled() { _isEnabled = false; } - virtual void setEnabled() { _isEnabled = true; } - virtual void addObject(StaticANIObject *obj) {} - virtual int removeObject(StaticANIObject *obj) { return 0; } - virtual void freeItems() {} - virtual Common::Array<MovItem *> *method28(StaticANIObject *ani, int x, int y, int flag1, int *rescount) { return 0; } - virtual bool method2C(StaticANIObject *obj, int x, int y) { return false; } + virtual void deactivate() { _isEnabled = false; } + virtual void activate() { _isEnabled = true; } + virtual void attachObject(StaticANIObject *obj) {} + virtual int detachObject(StaticANIObject *obj) { return 0; } + virtual void detachAllObjects() {} + virtual Common::Array<MovItem *> *getPaths(StaticANIObject *ani, int x, int y, int flag1, int *rescount) { return 0; } + virtual bool setPosImmediate(StaticANIObject *obj, int x, int y) { return false; } virtual int method30() { return 0; } - virtual MessageQueue *method34(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId) { return 0; } - virtual void changeCallback(MovArr *(*_callback1)(StaticANIObject *ani, Common::Array<MovItem *> *items, signed int counter)) {} - virtual bool method3C(StaticANIObject *ani, int flag) { return 0; } + virtual MessageQueue *startMove(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId) { return 0; } + virtual void setSelFunc(MovArr *(*_callback1)(StaticANIObject *ani, Common::Array<MovItem *> *items, signed int counter)) {} + virtual bool resetPosition(StaticANIObject *ani, int flag) { return 0; } virtual int method40() { return 0; } - virtual bool method44(StaticANIObject *ani, int x, int y) { return false; } + virtual bool canDropInventory(StaticANIObject *ani, int x, int y) { return false; } virtual int method48() { return -1; } virtual MessageQueue *doWalkTo(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId) { return 0; } @@ -82,7 +82,7 @@ public: virtual bool pointInRegion(int x, int y); }; -class MctlCompoundArrayItem : public CObject { +class MctlItem : public CObject { public: MotionController *_motionControllerObj; MovGraphReact *_movGraphReactObj; @@ -92,11 +92,11 @@ public: int _field_28; public: - MctlCompoundArrayItem() : _movGraphReactObj(0), _motionControllerObj(0), _field_20(0), _field_24(0), _field_28(0) {} - ~MctlCompoundArrayItem(); + MctlItem() : _movGraphReactObj(0), _motionControllerObj(0), _field_20(0), _field_24(0), _field_28(0) {} + ~MctlItem(); }; -class MctlCompoundArray : public Common::Array<MctlCompoundArrayItem *>, public CObject { +class MctlCompoundArray : public Common::Array<MctlItem *>, public CObject { public: virtual bool load(MfcArchive &file); }; @@ -109,10 +109,10 @@ public: virtual bool load(MfcArchive &file); - virtual void addObject(StaticANIObject *obj); - virtual int removeObject(StaticANIObject *obj); - virtual void freeItems(); - virtual MessageQueue *method34(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId); + virtual void attachObject(StaticANIObject *obj); + virtual int detachObject(StaticANIObject *obj); + virtual void detachAllObjects(); + virtual MessageQueue *startMove(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId); virtual MessageQueue *doWalkTo(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId); void initMovGraph2(); @@ -156,10 +156,10 @@ public: virtual ~MctlLadder(); int collisionDetection(StaticANIObject *man); - virtual void addObject(StaticANIObject *obj); - virtual int removeObject(StaticANIObject *obj) { return 1; } - virtual void freeItems(); - virtual MessageQueue *method34(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId); + virtual void attachObject(StaticANIObject *obj); + virtual int detachObject(StaticANIObject *obj) { return 1; } + virtual void detachAllObjects(); + virtual MessageQueue *startMove(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId); virtual MessageQueue *doWalkTo(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId); MessageQueue *controllerWalkTo(StaticANIObject *ani, int off); @@ -173,12 +173,12 @@ class MovGraphNode : public CObject { public: int _x; int _y; - int _distance; + int _z; int16 _field_10; int _field_14; public: - MovGraphNode() : _x(0), _y(0), _distance(0), _field_10(0), _field_14(0) { _objtype = kObjTypeMovGraphNode; } + MovGraphNode() : _x(0), _y(0), _z(0), _field_10(0), _field_14(0) { _objtype = kObjTypeMovGraphNode; } virtual bool load(MfcArchive &file); }; @@ -225,7 +225,7 @@ class MovGraphLink : public CObject { int _flags; int _field_38; int _field_3C; - double _distance; + double _z; double _angle; MovGraphReact *_movGraphReact; char *_name; @@ -236,7 +236,7 @@ class MovGraphLink : public CObject { virtual bool load(MfcArchive &file); - void calcNodeDistanceAndAngle(); + void recalcLength(); }; struct MovStep { @@ -290,23 +290,23 @@ public: virtual bool load(MfcArchive &file); - virtual void addObject(StaticANIObject *obj); - virtual int removeObject(StaticANIObject *obj); - virtual void freeItems(); - virtual Common::Array<MovItem *> *method28(StaticANIObject *ani, int x, int y, int flag1, int *rescount); - virtual bool method2C(StaticANIObject *obj, int x, int y); - virtual MessageQueue *method34(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId); - virtual void changeCallback(MovArr *(*_callback1)(StaticANIObject *ani, Common::Array<MovItem *> *items, signed int counter)); - virtual bool method3C(StaticANIObject *ani, int flag); - virtual bool method44(StaticANIObject *ani, int x, int y); + virtual void attachObject(StaticANIObject *obj); + virtual int detachObject(StaticANIObject *obj); + virtual void detachAllObjects(); + virtual Common::Array<MovItem *> *getPaths(StaticANIObject *ani, int x, int y, int flag1, int *rescount); + virtual bool setPosImmediate(StaticANIObject *obj, int x, int y); + virtual MessageQueue *startMove(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId); + virtual void setSelFunc(MovArr *(*_callback1)(StaticANIObject *ani, Common::Array<MovItem *> *items, signed int counter)); + virtual bool resetPosition(StaticANIObject *ani, int flag); + virtual bool canDropInventory(StaticANIObject *ani, int x, int y); virtual MessageQueue *doWalkTo(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId); virtual MessageQueue *method50(StaticANIObject *ani, MovArr *movarr, int staticsId); double calcDistance(Common::Point *point, MovGraphLink *link, int fuzzyMatch); - void calcNodeDistancesAndAngles(); - bool findClosestLink(int unusedArg, Common::Point *p, MovArr *movarr); + void recalcLinkParams(); + bool getNearestPoint(int unusedArg, Common::Point *p, MovArr *movarr); MovGraphNode *calcOffset(int ox, int oy); - int getItemIndexByStaticAni(StaticANIObject *ani); + int getObjectIndex(StaticANIObject *ani); Common::Array<MovArr *> *genMovArr(int x, int y, int *arrSize, int flag1, int flag2); void findAllPaths(MovGraphLink *lnk, MovGraphLink *lnk2, Common::Array<MovGraphLink *> &tempObList1, Common::Array<MovGraphLink *> &tempObList2); Common::Array<MovItem *> *calcMovItems(MovArr *movarr1, MovArr *movarr2, int *listCount); @@ -374,10 +374,10 @@ public: Common::Array<MovGraph2Item *> _items2; public: - virtual void addObject(StaticANIObject *obj); - virtual int removeObject(StaticANIObject *obj); - virtual void freeItems(); - virtual MessageQueue *method34(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId); + virtual void attachObject(StaticANIObject *obj); + virtual int detachObject(StaticANIObject *obj); + virtual void detachAllObjects(); + virtual MessageQueue *startMove(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId); virtual MessageQueue *doWalkTo(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId); int getItemIndexByGameObjectId(int objectId); @@ -404,10 +404,9 @@ class MctlConnectionPoint : public CObject { public: int _connectionX; int _connectionY; - int _field_C; - int _field_10; - int16 _field_14; - int16 _field_16; + int _mctlflags; + int _mctlstatic; + int16 _mctlmirror; MessageQueue *_messageQueueObj; int _motionControllerObj; diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp index 13c653ad09..32aa955a61 100644 --- a/engines/fullpipe/scenes.cpp +++ b/engines/fullpipe/scenes.cpp @@ -583,8 +583,8 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) { _aniMan2 = _aniMan; MctlCompound *cmp = getSc2MctlCompoundBySceneId(entrance->_sceneId); cmp->initMovGraph2(); - cmp->addObject(_aniMan); - cmp->setEnabled(); + cmp->attachObject(_aniMan); + cmp->activate(); getGameLoaderInteractionController()->enableFlag24(); setInputDisabled(0); diff --git a/engines/fullpipe/scenes/scene04.cpp b/engines/fullpipe/scenes/scene04.cpp index 4a87ae5b87..c0f0960aba 100644 --- a/engines/fullpipe/scenes/scene04.cpp +++ b/engines/fullpipe/scenes/scene04.cpp @@ -275,7 +275,7 @@ void sceneHandler04_clickButton() { } void sceneHandler04_downLadder(int x, int y) { - g_vars->scene04_ladder->method34(g_fp->_aniMan, x + g_vars->scene04_ladder->_ladder_field_20, y + g_vars->scene04_ladder->_ladder_field_24, 0, 0); + g_vars->scene04_ladder->startMove(g_fp->_aniMan, x + g_vars->scene04_ladder->_ladder_field_20, y + g_vars->scene04_ladder->_ladder_field_24, 0, 0); } void sceneHandler04_walkClimbLadder(ExCommand *ex) { @@ -321,7 +321,7 @@ void sceneHandler04_walkClimbLadder(ExCommand *ex) { g_vars->scene04_ladder->_ladder_field_20 = 0; g_vars->scene04_ladder->_ladder_field_24 = -60; - g_vars->scene04_ladder->addObject(g_fp->_aniMan); + g_vars->scene04_ladder->attachObject(g_fp->_aniMan); if (g_vars->scene04_soundPlaying) { g_vars->scene04_ladder->_ladmovements.front()->movVars->varUpStart = MV_MAN_STARTLADDER2; @@ -337,7 +337,7 @@ void sceneHandler04_walkClimbLadder(ExCommand *ex) { g_fp->_aniMan->_priority = 12; - getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->clearEnabled(); + getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->deactivate(); getGameLoaderInteractionController()->disableFlag24(); } @@ -368,7 +368,7 @@ void sceneHandler04_clickLadder() { } else { if (g_fp->_aniMan->isIdle() && !(g_fp->_aniMan->_flags & 0x100)) { if (abs(1095 - g_vars->scene04_dudePosX) > 1 || abs(434 - g_vars->scene04_dudePosY) > 1) { - MessageQueue *mq = getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->method34(g_fp->_aniMan, 1095, 434, 1, ST_MAN_UP); + MessageQueue *mq = getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->startMove(g_fp->_aniMan, 1095, 434, 1, ST_MAN_UP); if (mq) { ExCommand *ex = new ExCommand(0, 17, MSG_SC4_CLICKLADDER, 0, 0, 0, 1, 0, 0, 0); @@ -533,7 +533,7 @@ void sceneHandler04_manFromBottle() { g_vars->scene04_ladder = 0; - getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->setEnabled(); + getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->activate(); getGameLoaderInteractionController()->enableFlag24(); } @@ -1120,7 +1120,7 @@ void sceneHandler04_leaveLadder(ExCommand *ex) { ex->_messageKind = 0; - mc->setEnabled(); + mc->activate(); getGameLoaderInteractionController()->enableFlag24(); } else { delete mq; @@ -1275,7 +1275,7 @@ void sceneHandler04_winArcade() { g_vars->scene04_objectIsTaken = false; g_vars->scene04_soundPlaying = false; - getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->setEnabled(); + getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->activate(); getGameLoaderInteractionController()->enableFlag24(); diff --git a/engines/fullpipe/scenes/scene06.cpp b/engines/fullpipe/scenes/scene06.cpp index 06ec20dcb5..e9cecc42f0 100644 --- a/engines/fullpipe/scenes/scene06.cpp +++ b/engines/fullpipe/scenes/scene06.cpp @@ -118,7 +118,7 @@ void sceneHandler06_winArcade() { sceneHandler06_setExits(g_fp->_currentScene); - getCurrSceneSc2MotionController()->setEnabled(); + getCurrSceneSc2MotionController()->activate(); getGameLoaderInteractionController()->enableFlag24(); } @@ -300,7 +300,7 @@ void sceneHandler06_startAiming() { if (getCurrSceneSc2MotionController()->_isEnabled) g_fp->_updateScreenCallback = sceneHandler06_updateScreenCallback; - getCurrSceneSc2MotionController()->clearEnabled(); + getCurrSceneSc2MotionController()->deactivate(); getGameLoaderInteractionController()->disableFlag24(); g_vars->scene06_ballDrop->queueMessageQueue(0); @@ -313,7 +313,7 @@ void sceneHandler06_takeBall() { || abs(452 - g_fp->_aniMan->_oy) > 1 || g_fp->_aniMan->_movement || g_fp->_aniMan->_statics->_staticsId != (0x4000 | ST_MAN_RIGHT)) { - MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, 1158, 452, 1, (0x4000 | ST_MAN_RIGHT)); + MessageQueue *mq = getCurrSceneSc2MotionController()->startMove(g_fp->_aniMan, 1158, 452, 1, (0x4000 | ST_MAN_RIGHT)); if (mq) { ExCommand *ex = new ExCommand(0, 17, MSG_SC6_TAKEBALL, 0, 0, 0, 1, 0, 0, 0); @@ -562,7 +562,7 @@ int sceneHandler06(ExCommand *ex) { case MSG_SC6_RESTORESCROLL: g_fp->_aniMan2 = g_fp->_aniMan; - getCurrSceneSc2MotionController()->setEnabled(); + getCurrSceneSc2MotionController()->activate(); getGameLoaderInteractionController()->enableFlag24(); sceneHandler06_setExits(g_fp->_currentScene); break; diff --git a/engines/fullpipe/scenes/scene08.cpp b/engines/fullpipe/scenes/scene08.cpp index a5f5a8b389..d64df8688e 100644 --- a/engines/fullpipe/scenes/scene08.cpp +++ b/engines/fullpipe/scenes/scene08.cpp @@ -224,7 +224,7 @@ void sceneHandler08_startArcade() { g_vars->scene08_onBelly = false; getGameLoaderInteractionController()->disableFlag24(); - getCurrSceneSc2MotionController()->clearEnabled(); + getCurrSceneSc2MotionController()->deactivate(); g_vars->scene08_batuta->stopAnim_maybe(); @@ -276,7 +276,7 @@ void sceneHandler08_finishArcade() { g_vars->scene08_inArcade = false; getGameLoaderInteractionController()->enableFlag24(); - getCurrSceneSc2MotionController()->setEnabled(); + getCurrSceneSc2MotionController()->activate(); } void sceneHandler08_jumpOff(ExCommand *cmd) { diff --git a/engines/fullpipe/scenes/scene09.cpp b/engines/fullpipe/scenes/scene09.cpp index 99cf0b20fd..ffe8a1b2de 100644 --- a/engines/fullpipe/scenes/scene09.cpp +++ b/engines/fullpipe/scenes/scene09.cpp @@ -271,7 +271,7 @@ void sceneHandler09_spitterClick() { g_vars->scene09_spitter->setPicAniInfo(&info); if (ABS(x - g_fp->_aniMan->_ox) > 1 || ABS(y - g_fp->_aniMan->_oy) > 1) { - MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, x, y, 1, ST_MAN_UP); + MessageQueue *mq = getCurrSceneSc2MotionController()->startMove(g_fp->_aniMan, x, y, 1, ST_MAN_UP); if (mq) { ExCommand *ex = new ExCommand(0, 17, MSG_SC9_PLVCLICK, 0, 0, 0, 1, 0, 0, 0); @@ -602,14 +602,14 @@ int sceneHandler09(ExCommand *cmd) { break; case MSG_SC9_FROMLADDER: - getCurrSceneSc2MotionController()->setEnabled(); + getCurrSceneSc2MotionController()->activate(); getGameLoaderInteractionController()->enableFlag24(); g_vars->scene09_dudeIsOnLadder = false; break; case MSG_SC9_TOLADDER: - getCurrSceneSc2MotionController()->clearEnabled(); + getCurrSceneSc2MotionController()->deactivate(); getGameLoaderInteractionController()->disableFlag24(); g_vars->scene09_dudeIsOnLadder = true; diff --git a/engines/fullpipe/scenes/scene10.cpp b/engines/fullpipe/scenes/scene10.cpp index 8c9e0b67d0..3e2a918b64 100644 --- a/engines/fullpipe/scenes/scene10.cpp +++ b/engines/fullpipe/scenes/scene10.cpp @@ -82,7 +82,7 @@ void sceneHandler10_clickGum() { int y = g_vars->scene10_gum->_oy - 48; if (abs(x - g_fp->_aniMan->_ox) > 1 || abs(y - g_fp->_aniMan->_oy) > 1) { - MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, x, y, 1, ST_MAN_RIGHT); + MessageQueue *mq = getCurrSceneSc2MotionController()->startMove(g_fp->_aniMan, x, y, 1, ST_MAN_RIGHT); if (mq) { ExCommand *ex = new ExCommand(0, 17, MSG_SC10_CLICKGUM, 0, 0, 0, 1, 0, 0, 0); ex->_excFlags = 2; diff --git a/engines/fullpipe/scenes/scene11.cpp b/engines/fullpipe/scenes/scene11.cpp index 0ce82f5d5f..1fa5cabc15 100644 --- a/engines/fullpipe/scenes/scene11.cpp +++ b/engines/fullpipe/scenes/scene11.cpp @@ -191,7 +191,7 @@ void sceneHandler11_restartMan() { chainObjQueue(0, QU_SC11_RESTARTMAN, 1); getGameLoaderInteractionController()->enableFlag24(); - getCurrSceneSc2MotionController()->setEnabled(); + getCurrSceneSc2MotionController()->activate(); g_vars->scene11_scrollIsEnabled = false; } @@ -234,7 +234,7 @@ int sceneHandler11_updateScreenCallback() { void sceneHandler11_manToSwing() { g_vars->scene11_arcadeIsOn = true; - getCurrSceneSc2MotionController()->clearEnabled(); + getCurrSceneSc2MotionController()->deactivate(); getGameLoaderInteractionController()->disableFlag24(); g_fp->_aniMan2->hide(); @@ -271,7 +271,7 @@ void sceneHandler11_putABoot() { void sceneHandler11_putBoot() { if (abs(353 - g_fp->_aniMan->_ox) > 1 || abs(498 - g_fp->_aniMan->_oy) > 1 || g_fp->_aniMan->_movement || g_fp->_aniMan->_statics->_staticsId != ST_MAN_RIGHT) { - MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, 353, 498, 1, ST_MAN_RIGHT); + MessageQueue *mq = getCurrSceneSc2MotionController()->startMove(g_fp->_aniMan, 353, 498, 1, ST_MAN_RIGHT); if (mq) { ExCommand *ex = new ExCommand(0, 17, MSG_SC11_PUTBOOT, 0, 0, 0, 1, 0, 0, 0); @@ -299,7 +299,7 @@ void sceneHandler11_jumpFromSwing() { g_vars->scene11_hint->_flags &= 0xFFFB; g_vars->scene11_scrollIsEnabled = false; - getCurrSceneSc2MotionController()->setEnabled(); + getCurrSceneSc2MotionController()->activate(); getGameLoaderInteractionController()->enableFlag24(); g_vars->scene11_swingOldAngle = 0.0; diff --git a/engines/fullpipe/scenes/scene14.cpp b/engines/fullpipe/scenes/scene14.cpp index 446f477133..dc919c6d7f 100644 --- a/engines/fullpipe/scenes/scene14.cpp +++ b/engines/fullpipe/scenes/scene14.cpp @@ -174,7 +174,7 @@ void sceneHandler14_exitScene() { chainQueue(QU_SC14_ENDARCADE, 0); getGameLoaderInteractionController()->disableFlag24(); - getCurrSceneSc2MotionController()->clearEnabled(); + getCurrSceneSc2MotionController()->deactivate(); } void sceneHandler14_showBallMan() { @@ -284,7 +284,7 @@ void sceneHandler14_endArcade() { setInputDisabled(0); getGameLoaderInteractionController()->enableFlag24(); - getCurrSceneSc2MotionController()->setEnabled(); + getCurrSceneSc2MotionController()->activate(); BehaviorEntryInfo *beh = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene14_grandma, ST_GMA_SIT, QU_GMA_BLINK); if (beh) @@ -365,7 +365,7 @@ void sceneHandler14_startArcade() { g_fp->_aniMan->_priority = 25; } - getCurrSceneSc2MotionController()->clearEnabled(); + getCurrSceneSc2MotionController()->deactivate(); getGameLoaderInteractionController()->disableFlag24(); g_fp->_aniMan2 = 0; @@ -458,7 +458,7 @@ bool sceneHandler14_arcadeProcessClick(ExCommand *cmd) { if (cmd->_sceneClickX > 1237) return false; - MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, 1237, 451, 1, 0); + MessageQueue *mq = getCurrSceneSc2MotionController()->startMove(g_fp->_aniMan, 1237, 451, 1, 0); if (!mq) return false; @@ -473,7 +473,7 @@ bool sceneHandler14_arcadeProcessClick(ExCommand *cmd) { cmd->_messageKind = 0; - getCurrSceneSc2MotionController()->clearEnabled(); + getCurrSceneSc2MotionController()->deactivate(); getGameLoaderInteractionController()->disableFlag24(); return true; } diff --git a/engines/fullpipe/scenes/scene16.cpp b/engines/fullpipe/scenes/scene16.cpp index df005950d2..5079863b4e 100644 --- a/engines/fullpipe/scenes/scene16.cpp +++ b/engines/fullpipe/scenes/scene16.cpp @@ -298,7 +298,7 @@ void sceneHandler16_drink() { void sceneHandler16_mugClick() { if (abs(310 - g_fp->_aniMan->_ox) >= 1 || abs(449 - g_fp->_aniMan->_oy) >= 1 || g_fp->_aniMan->_movement || g_fp->_aniMan->_statics->_staticsId != ST_MAN_RIGHT) { - MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, 310, 449, 1, ST_MAN_RIGHT); + MessageQueue *mq = getCurrSceneSc2MotionController()->startMove(g_fp->_aniMan, 310, 449, 1, ST_MAN_RIGHT); if (mq) { ExCommand *ex = new ExCommand(0, 17, MSG_SC16_MUGCLICK, 0, 0, 0, 1, 0, 0, 0); diff --git a/engines/fullpipe/scenes/scene18and19.cpp b/engines/fullpipe/scenes/scene18and19.cpp index 4f6677876b..5af7ef9043 100644 --- a/engines/fullpipe/scenes/scene18and19.cpp +++ b/engines/fullpipe/scenes/scene18and19.cpp @@ -379,7 +379,7 @@ int scene19_updateCursor() { void sceneHandler18_clickBoard() { if (ABS(967 - g_fp->_aniMan->_ox) > 1 || ABS(379 - g_fp->_aniMan->_oy) > 1 || g_fp->_aniMan->_statics->_staticsId != ST_MAN_RIGHT) { - MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, 967, 379, 1, ST_MAN_RIGHT); + MessageQueue *mq = getCurrSceneSc2MotionController()->startMove(g_fp->_aniMan, 967, 379, 1, ST_MAN_RIGHT); ExCommand *ex = new ExCommand(0, 17, MSG_SC18_MANREADY, 0, 0, 0, 1, 0, 0, 0); ex->_excFlags = 2; diff --git a/engines/fullpipe/scenes/scene22.cpp b/engines/fullpipe/scenes/scene22.cpp index 542834b51a..f51469da69 100644 --- a/engines/fullpipe/scenes/scene22.cpp +++ b/engines/fullpipe/scenes/scene22.cpp @@ -191,7 +191,7 @@ void sceneHandler22_stoolLogic(ExCommand *cmd) { xpos = 841; manId = ST_MAN_RIGHT; LABEL_31: - mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, xpos, 449, 1, manId); + mq = getCurrSceneSc2MotionController()->startMove(g_fp->_aniMan, xpos, 449, 1, manId); if (!mq) return; @@ -278,7 +278,7 @@ void sceneHandler22_stoolLogic(ExCommand *cmd) { } } - mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, 1010, 443, 1, ST_MAN_UP); + mq = getCurrSceneSc2MotionController()->startMove(g_fp->_aniMan, 1010, 443, 1, ST_MAN_UP); if (mq) { mq->addExCommandToEnd(cmd->createClone()); @@ -318,13 +318,13 @@ int sceneHandler22(ExCommand *cmd) { g_vars->scene22_dudeIsOnStool = false; g_vars->scene22_interactionIsDisabled = false; - getCurrSceneSc2MotionController()->setEnabled(); + getCurrSceneSc2MotionController()->activate(); g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 1); break; case MSG_SC22_ONSTOOL: g_vars->scene22_dudeIsOnStool = true; - getCurrSceneSc2MotionController()->clearEnabled(); + getCurrSceneSc2MotionController()->deactivate(); g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 0); break; diff --git a/engines/fullpipe/scenes/scene23.cpp b/engines/fullpipe/scenes/scene23.cpp index ded467e438..d6075c271b 100644 --- a/engines/fullpipe/scenes/scene23.cpp +++ b/engines/fullpipe/scenes/scene23.cpp @@ -296,7 +296,7 @@ void sceneHandler23_pushButton(ExCommand *cmd) { if (g_fp->_msgX == 276 && g_fp->_msgY == 438 ) return; - MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, 276, 438, 1, ST_MAN_RIGHT); + MessageQueue *mq = getCurrSceneSc2MotionController()->startMove(g_fp->_aniMan, 276, 438, 1, ST_MAN_RIGHT); if (mq) { mq->addExCommandToEnd(cmd->createClone()); @@ -424,7 +424,7 @@ int sceneHandler23(ExCommand *cmd) { case MSG_SC23_FROMSTOOL: g_vars->scene23_isOnStool = false; - getCurrSceneSc2MotionController()->setEnabled(); + getCurrSceneSc2MotionController()->activate(); getGameLoaderInteractionController()->enableFlag24(); g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 1); @@ -438,7 +438,7 @@ int sceneHandler23(ExCommand *cmd) { case MSG_SC23_ONSTOOL: g_vars->scene23_isOnStool = true; - getCurrSceneSc2MotionController()->clearEnabled(); + getCurrSceneSc2MotionController()->deactivate(); getGameLoaderInteractionController()->disableFlag24(); g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 0); diff --git a/engines/fullpipe/scenes/scene25.cpp b/engines/fullpipe/scenes/scene25.cpp index a07330f057..07eda73cf2 100644 --- a/engines/fullpipe/scenes/scene25.cpp +++ b/engines/fullpipe/scenes/scene25.cpp @@ -153,7 +153,7 @@ void sceneHandler25_enterMan() { if (g_vars->scene25_waterIsPresent) { chainQueue(QU_SC25_ENTERUP_WATER, 1); - getCurrSceneSc2MotionController()->clearEnabled(); + getCurrSceneSc2MotionController()->deactivate(); } else { chainQueue(QU_SC25_ENTERUP_FLOOR, 1); } diff --git a/engines/fullpipe/scenes/scene26.cpp b/engines/fullpipe/scenes/scene26.cpp index b9d9161e7d..baed928d00 100644 --- a/engines/fullpipe/scenes/scene26.cpp +++ b/engines/fullpipe/scenes/scene26.cpp @@ -257,7 +257,7 @@ void sceneHandler26_clickVent(StaticANIObject *ani, ExCommand *cmd) { int y = ani->_oy + 61; if (abs(x - g_fp->_aniMan->_ox) > 1 || abs(y - g_fp->_aniMan->_oy) > 1 || g_fp->_aniMan->_movement || g_fp->_aniMan->_statics->_staticsId != ST_MAN_UP) { - MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, x, y, 1, ST_MAN_UP); + MessageQueue *mq = getCurrSceneSc2MotionController()->startMove(g_fp->_aniMan, x, y, 1, ST_MAN_UP); if (mq) { ExCommand *ex = new ExCommand(0, 17, MSG_SC26_CLICKVENT, 0, 0, 0, 1, 0, 0, 0); diff --git a/engines/fullpipe/scenes/scene27.cpp b/engines/fullpipe/scenes/scene27.cpp index 8ec05caaff..9570d30913 100644 --- a/engines/fullpipe/scenes/scene27.cpp +++ b/engines/fullpipe/scenes/scene27.cpp @@ -159,7 +159,7 @@ void sceneHandler27_driverGiveVent() { g_vars->scene27_driverHasVent = false; - getCurrSceneSc2MotionController()->setEnabled(); + getCurrSceneSc2MotionController()->activate(); getGameLoaderInteractionController()->enableFlag24(); g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 1); @@ -226,7 +226,7 @@ void sceneHandler27_throwBat() { g_fp->_aniMan->startAnim(MV_MAN27_THROWBET, 0, -1); - getCurrSceneSc2MotionController()->clearEnabled(); + getCurrSceneSc2MotionController()->deactivate(); getGameLoaderInteractionController()->disableFlag24(); g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 0); @@ -247,7 +247,7 @@ void sceneHandler27_clickBat(ExCommand *cmd) { if (ABS(bx - g_fp->_aniMan->_ox) > 1 || ABS(by - g_fp->_aniMan->_oy) > 1 || g_fp->_aniMan->_movement || g_fp->_aniMan->_statics->_staticsId != ST_MAN_RIGHT) { - MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, bx, by, 1, ST_MAN_RIGHT); + MessageQueue *mq = getCurrSceneSc2MotionController()->startMove(g_fp->_aniMan, bx, by, 1, ST_MAN_RIGHT); if (mq) { mq->addExCommandToEnd(cmd->createClone()); @@ -501,7 +501,7 @@ void sceneHandler27_batLogic() { default: chainQueue(QU_SC27_RESTARTBETS, 1); - getCurrSceneSc2MotionController()->setEnabled(); + getCurrSceneSc2MotionController()->activate(); getGameLoaderInteractionController()->enableFlag24(); g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 1); diff --git a/engines/fullpipe/scenes/scene28.cpp b/engines/fullpipe/scenes/scene28.cpp index de5a96e70d..75ba2567b2 100644 --- a/engines/fullpipe/scenes/scene28.cpp +++ b/engines/fullpipe/scenes/scene28.cpp @@ -258,7 +258,7 @@ void sceneHandler28_clickLift(int keycode) { if (abs(x - g_fp->_aniMan->_ox) > 1 || abs(472 - g_fp->_aniMan->_oy) > 1 || g_fp->_aniMan->_movement || g_fp->_aniMan->_statics->_staticsId != ST_MAN_UP) { - MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, x, 472, 1, ST_MAN_UP); + MessageQueue *mq = getCurrSceneSc2MotionController()->startMove(g_fp->_aniMan, x, 472, 1, ST_MAN_UP); if (mq) { ExCommand *ex = new ExCommand(0, 17, MSG_SC28_CLICKLIFT, 0, 0, 0, 1, 0, 0, 0); ex->_excFlags |= 3; diff --git a/engines/fullpipe/scenes/scene29.cpp b/engines/fullpipe/scenes/scene29.cpp index 222a541554..a03671a4d0 100644 --- a/engines/fullpipe/scenes/scene29.cpp +++ b/engines/fullpipe/scenes/scene29.cpp @@ -687,7 +687,7 @@ void sceneHandler29_ballHitCheck() { void sceneHandler29_manFromL() { if (g_vars->scene29_manX < 497 && !g_vars->scene29_scrollingDisabled) { - getCurrSceneSc2MotionController()->setEnabled(); + getCurrSceneSc2MotionController()->activate(); getGameLoaderInteractionController()->enableFlag24(); g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT | 0x4000); @@ -700,7 +700,7 @@ void sceneHandler29_manFromL() { } void sceneHandler29_manFromR() { - getCurrSceneSc2MotionController()->setEnabled(); + getCurrSceneSc2MotionController()->activate(); getGameLoaderInteractionController()->enableFlag24(); chainQueue(QU_SC29_MANFROM_R, 1); @@ -721,7 +721,7 @@ int sceneHandler29_updateScreenCallback() { } void sceneHandler29_manToL() { - getCurrSceneSc2MotionController()->clearEnabled(); + getCurrSceneSc2MotionController()->deactivate(); getGameLoaderInteractionController()->disableFlag24(); chainQueue(QU_SC29_MANTO_L, 1); @@ -737,7 +737,7 @@ void sceneHandler29_manToL() { } void sceneHandler29_manToR() { - getCurrSceneSc2MotionController()->clearEnabled(); + getCurrSceneSc2MotionController()->deactivate(); getGameLoaderInteractionController()->disableFlag24(); chainQueue(QU_SC29_MANTO_R, 1); @@ -763,7 +763,7 @@ void sceneHandler29_clickPorter(ExCommand *cmd) { if (ABS(351 - g_vars->scene29_manX) > 1 || ABS(443 - g_vars->scene29_manY) > 1 || g_fp->_aniMan->_movement || g_fp->_aniMan->_statics->_staticsId != ST_MAN_RIGHT) { if (g_fp->_msgX != 351 || g_fp->_msgY != 443) { - MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, 351, 443, 1, ST_MAN_RIGHT); + MessageQueue *mq = getCurrSceneSc2MotionController()->startMove(g_fp->_aniMan, 351, 443, 1, ST_MAN_RIGHT); if (mq) { mq->addExCommandToEnd(cmd->createClone()); @@ -781,7 +781,7 @@ void sceneHandler29_clickPorter(ExCommand *cmd) { if (ABS(1582 - g_vars->scene29_manX) > 1 || ABS(445 - g_fp->_aniMan->_oy) > 1 || g_fp->_aniMan->_movement || g_fp->_aniMan->_statics->_staticsId != (0x4000 | ST_MAN_RIGHT)) { if (g_fp->_msgX != 1582 || g_fp->_msgY != 445) { - MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, 1582, 445, 1, (0x4000 | ST_MAN_RIGHT)); + MessageQueue *mq = getCurrSceneSc2MotionController()->startMove(g_fp->_aniMan, 1582, 445, 1, (0x4000 | ST_MAN_RIGHT)); if (mq) { mq->addExCommandToEnd(cmd->createClone()); @@ -1001,7 +1001,7 @@ int sceneHandler29(ExCommand *cmd) { g_vars->scene29_reachedFarRight = false; g_vars->scene29_rideBackEnabled = false; - getCurrSceneSc2MotionController()->setEnabled(); + getCurrSceneSc2MotionController()->activate(); getGameLoaderInteractionController()->enableFlag24(); break; diff --git a/engines/fullpipe/scenes/scene32.cpp b/engines/fullpipe/scenes/scene32.cpp index 9279db7513..05b78efb3d 100644 --- a/engines/fullpipe/scenes/scene32.cpp +++ b/engines/fullpipe/scenes/scene32.cpp @@ -189,7 +189,7 @@ void sceneHandler32_trySit(ExCommand *cmd) { g_vars->scene32_dudeIsSitting = true; - getCurrSceneSc2MotionController()->clearEnabled(); + getCurrSceneSc2MotionController()->deactivate(); getGameLoaderInteractionController()->disableFlag24(); } } @@ -236,7 +236,7 @@ void sceneHandler32_ladderLogic(ExCommand *cmd) { g_vars->scene32_dudeOnLadder = false; - getCurrSceneSc2MotionController()->setEnabled(); + getCurrSceneSc2MotionController()->activate(); getGameLoaderInteractionController()->enableFlag24(); } @@ -258,7 +258,7 @@ void sceneHandler32_potLogic(ExCommand *cmd) { mq->setFlags(mq->getFlags() | 1); mq->chain(0); - getCurrSceneSc2MotionController()->setEnabled(); + getCurrSceneSc2MotionController()->activate(); getGameLoaderInteractionController()->enableFlag24(); g_vars->scene32_dudeIsSitting = false; @@ -330,7 +330,7 @@ int sceneHandler32(ExCommand *cmd) { case MSG_SC32_ONLADDER: g_vars->scene32_dudeOnLadder = true; - getCurrSceneSc2MotionController()->clearEnabled(); + getCurrSceneSc2MotionController()->deactivate(); getGameLoaderInteractionController()->disableFlag24(); break; diff --git a/engines/fullpipe/scenes/scene34.cpp b/engines/fullpipe/scenes/scene34.cpp index 1c8c8b4855..32fb192756 100644 --- a/engines/fullpipe/scenes/scene34.cpp +++ b/engines/fullpipe/scenes/scene34.cpp @@ -115,7 +115,7 @@ int scene34_updateCursor() { } void sceneHandler34_leaveBoard() { - getCurrSceneSc2MotionController()->setEnabled(); + getCurrSceneSc2MotionController()->activate(); getGameLoaderInteractionController()->enableFlag24(); g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 1); @@ -124,7 +124,7 @@ void sceneHandler34_leaveBoard() { } void sceneHandler34_onBoard() { - getCurrSceneSc2MotionController()->clearEnabled(); + getCurrSceneSc2MotionController()->deactivate(); getGameLoaderInteractionController()->disableFlag24(); g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 0); @@ -149,7 +149,7 @@ void sceneHandler34_hideStool() { } void sceneHandler34_climb() { - getCurrSceneSc2MotionController()->clearEnabled(); + getCurrSceneSc2MotionController()->deactivate(); getGameLoaderInteractionController()->disableFlag24(); g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 0); @@ -287,7 +287,7 @@ void sceneHandler34_showStool() { } void sceneHandler34_unclimb() { - getCurrSceneSc2MotionController()->setEnabled(); + getCurrSceneSc2MotionController()->activate(); getGameLoaderInteractionController()->enableFlag24(); g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 1); @@ -323,7 +323,7 @@ int sceneHandler34(ExCommand *cmd) { case MSG_SC34_FROMCACTUS: g_vars->scene34_dudeOnCactus = false; - getCurrSceneSc2MotionController()->setEnabled(); + getCurrSceneSc2MotionController()->activate(); getGameLoaderInteractionController()->enableFlag24(); g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 1); @@ -381,7 +381,7 @@ int sceneHandler34(ExCommand *cmd) { case MSG_SC34_ONCACTUS: g_vars->scene34_dudeOnCactus = true; - getCurrSceneSc2MotionController()->clearEnabled(); + getCurrSceneSc2MotionController()->deactivate(); getGameLoaderInteractionController()->disableFlag24(); g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 0); diff --git a/engines/fullpipe/scenes/sceneFinal.cpp b/engines/fullpipe/scenes/sceneFinal.cpp index d0040463ef..8b3ecb1025 100644 --- a/engines/fullpipe/scenes/sceneFinal.cpp +++ b/engines/fullpipe/scenes/sceneFinal.cpp @@ -97,7 +97,7 @@ void sceneHandlerFinal_goto2() { void sceneHandlerFinal_startFinal() { g_vars->sceneFinal_var01 = 1; - getCurrSceneSc2MotionController()->clearEnabled(); + getCurrSceneSc2MotionController()->deactivate(); getGameLoaderInteractionController()->disableFlag24(); g_fp->_aniMan2 = 0; diff --git a/engines/hopkins/computer.cpp b/engines/hopkins/computer.cpp index 18b16cb4c8..16977e0cb8 100644 --- a/engines/hopkins/computer.cpp +++ b/engines/hopkins/computer.cpp @@ -325,13 +325,13 @@ static const char _spanishText[] = "% **** ORDENADOR DEL FBI NUMERO 4985 **** ORDENADOR J.HOPKINS *****\n" "% **** ORDENADOR DEL FBI NUMERO 4998 **** ORDENADOR S.COLLINS *****\n" "% *** ORDENADOR DEL FBI NUMERO 4997 *** ORDENADOR DE ACCESO LIBRE ***\n" -"% LA CONTRASE\0245A ES: ALLFREE\n" -"% ESCRIBE CONTRASE\0245A ACTUAL\n" +"% LA CONTRASE\xA5" "A ES: ALLFREE\n" +"% ESCRIBE CONTRASE\xA5" "A ACTUAL\n" "% **** ACCESO DENEGADO ****\n" "% 1) *** JUEGO ***\n" "% 0) SALIR DEL ORDENADOR\n" -"% 2) CADAVER EXTRA\0245O\n" -"% 3) CADAVER EXTRA\0245O\n" +"% 2) CADAVER EXTRA\xA5" "O\n" +"% 3) CADAVER EXTRA\xA5" "O\n" "% 4) SENADOR FERGUSSON\n" "% 5) MATAPERROS\n" "% 2) CIENTIFICO SECUESTRADO.\n" diff --git a/engines/mads/nebular/game_nebular.cpp b/engines/mads/nebular/game_nebular.cpp index e8e0a4f42c..8f40bc15c8 100644 --- a/engines/mads/nebular/game_nebular.cpp +++ b/engines/mads/nebular/game_nebular.cpp @@ -118,6 +118,10 @@ void GameNebular::startGame() { initializeGlobals(); + if (_loadGameSlot >= 0) + // User selected to resume a savegame + return; + // Check copy protection ProtectionResult protectionResult = checkCopyProtection(); diff --git a/engines/mads/nebular/nebular_scenes1.cpp b/engines/mads/nebular/nebular_scenes1.cpp index fd97f71727..0cb1b11ee9 100644 --- a/engines/mads/nebular/nebular_scenes1.cpp +++ b/engines/mads/nebular/nebular_scenes1.cpp @@ -84,7 +84,7 @@ void Scene1xx::setPlayerSpritesPrefix() { } else if (_scene->_nextSceneId == 112) _game._player._spritesPrefix = ""; - if (oldName == _game._player._spritesPrefix) + if (oldName != _game._player._spritesPrefix) _game._player._spritesChanged = true; if (_scene->_nextSceneId == 105 || (_scene->_nextSceneId == 109 && _globals[kHoovicAlive])) { diff --git a/engines/mads/nebular/sound_nebular.cpp b/engines/mads/nebular/sound_nebular.cpp index 711f82a05b..ab6bd8215c 100644 --- a/engines/mads/nebular/sound_nebular.cpp +++ b/engines/mads/nebular/sound_nebular.cpp @@ -216,6 +216,8 @@ ASound::ASound(Audio::Mixer *mixer, OPL::OPL *opl, const Common::String &filenam } ASound::~ASound() { + _opl->stop(); + Common::List<CachedDataEntry>::iterator i; for (i = _dataCache.begin(); i != _dataCache.end(); ++i) delete[] (*i)._data; diff --git a/engines/mortevielle/menu.cpp b/engines/mortevielle/menu.cpp index b788ce9a71..6235e9f2ed 100644 --- a/engines/mortevielle/menu.cpp +++ b/engines/mortevielle/menu.cpp @@ -682,13 +682,10 @@ void Menu::initMenu() { if (!menuLoaded) { // Load menu from game data using the original language if (_vm->getOriginalLanguage() == Common::FR_FRA) { - if (f.exists("menufr.mor")) { - if (!f.open("menufr.mor")) - error("Missing file - menufr.mor"); - } else { - if (!f.open("menu.mor")) - error("Missing file - menu.mor"); - } + // We do not support reading menu.mor (it has a different format). + // If the game version does not have menufr.mor it has to get the menu from the DAT file. + if (!f.open("menufr.mor")) + error("Missing file - menufr.mor"); } else { // Common::DE_DEU if (!f.open("menual.mor")) error("Missing file - menual.mor"); diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index 6911041e58..826f175d47 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -93,6 +93,10 @@ void MenuModule::setLoadgameInfo(uint index) { _savegameSlot = (*_savegameList)[index].slotNum; } +void MenuModule::setLoadgameSlot(int slot) { + _savegameSlot = slot; +} + void MenuModule::setSavegameInfo(const Common::String &description, uint index, bool newSavegame) { _savegameDescription = description; _savegameSlot = newSavegame ? -1 : (*_savegameList)[index].slotNum; @@ -912,7 +916,7 @@ GameStateMenu::GameStateMenu(NeverhoodEngine *vm, Module *parentModule, Savegame if (slot >= 0) { if (!isSave) { - ((MenuModule*)_parentModule)->setLoadgameInfo(slot); + ((MenuModule*)_parentModule)->setLoadgameSlot(slot); } else { ((MenuModule*)_parentModule)->setSavegameInfo(saveDesc, slot, slot >= saveCount); diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h index 6508ccbdf2..1c4ade2369 100644 --- a/engines/neverhood/menumodule.h +++ b/engines/neverhood/menumodule.h @@ -43,6 +43,7 @@ public: MenuModule(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~MenuModule(); void setLoadgameInfo(uint index); + void setLoadgameSlot(int slot); void setSavegameInfo(const Common::String &description, uint index, bool newSavegame); void setDeletegameInfo(uint index); void refreshSaveGameList(); diff --git a/engines/neverhood/modules/module2700.cpp b/engines/neverhood/modules/module2700.cpp index a510c02558..e0c6509793 100644 --- a/engines/neverhood/modules/module2700.cpp +++ b/engines/neverhood/modules/module2700.cpp @@ -761,7 +761,7 @@ void Scene2702::moveCarToPoint(NPoint pt) { _tracks.findTrackPoint(pt, minMatchTrackIndex, minMatchDistance, _dataResource); if (minMatchTrackIndex >= 0 && minMatchTrackIndex != _currTrackIndex) { _newTrackIndex = minMatchTrackIndex; - _newTrackDestX = pt.x; + _newTrackDest = pt; if (_isUpperTrack) { if (_currTrackIndex == 0) sendMessage(_asCar, 0x2003, _trackPoints->size() - 1); @@ -773,7 +773,7 @@ void Scene2702::moveCarToPoint(NPoint pt) { sendMessage(_asCar, 0x2003, _trackPoints->size() - 1); } else { _newTrackIndex = -1; - sendMessage(_asCar, 0x2004, pt.x); + sendMessage(_asCar, 0x2004, pt); } } @@ -790,7 +790,7 @@ void Scene2702::changeTrack() { sendMessage(_asCar, NM_POSITION_CHANGE, 0); else sendMessage(_asCar, NM_POSITION_CHANGE, _trackPoints->size() - 1); - sendMessage(_asCar, 0x2004, _newTrackDestX); + sendMessage(_asCar, 0x2004, _newTrackDest); _newTrackIndex = -1; } @@ -1092,14 +1092,14 @@ void Scene2706::moveCarToPoint(NPoint pt) { _tracks.findTrackPoint(pt, minMatchTrackIndex, minMatchDistance, _dataResource); if (minMatchTrackIndex >= 0 && minMatchTrackIndex != _currTrackIndex) { _newTrackIndex = minMatchTrackIndex; - _newTrackDestX = pt.x; + _newTrackDest = pt; if (_currTrackIndex == 0) sendMessage(_asCar, 0x2003, _trackPoints->size() - 1); else sendMessage(_asCar, 0x2003, 0); } else { _newTrackIndex = -1; - sendMessage(_asCar, 0x2004, pt.x); + sendMessage(_asCar, 0x2004, pt); } } @@ -1111,7 +1111,7 @@ void Scene2706::changeTrack() { sendMessage(_asCar, NM_POSITION_CHANGE, _trackPoints->size() - 1); else sendMessage(_asCar, NM_POSITION_CHANGE, 0); - sendMessage(_asCar, 0x2004, _newTrackDestX); + sendMessage(_asCar, 0x2004, _newTrackDest); _newTrackIndex = -1; } diff --git a/engines/neverhood/modules/module2700.h b/engines/neverhood/modules/module2700.h index 9ac2159765..ece8866cd4 100644 --- a/engines/neverhood/modules/module2700.h +++ b/engines/neverhood/modules/module2700.h @@ -76,7 +76,7 @@ protected: Sprite *_asCarShadow; Sprite *_asCarTrackShadow; Sprite *_asCarConnectorShadow; - int16 _newTrackDestX; + NPoint _newTrackDest; bool _isInLight; int _currTrackIndex, _newTrackIndex; bool _isUpperTrack; @@ -132,7 +132,7 @@ protected: Sprite *_asCarConnector; Sprite *_asCarTrackShadow; Sprite *_asCarConnectorShadow; - int16 _newTrackDestX; + NPoint _newTrackDest; int _currTrackIndex, _newTrackIndex; Tracks _tracks; NPointArray *_trackPoints; diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 55305c4b42..ffbe3aecaf 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -4185,7 +4185,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { FANMADE_L("Grostesteing: Plus Mechant que Jamais", "ec9a97ccb134f69249f6ea8b16c13d8e", 1500, "b869f5f11bfe2ab5f67f4f0c618f2ce1", 464657, Common::FR_FRA), // FIXME: Accent FANMADE("Humanoid Demo", "97d8331293a6d57e8bad58c1efc89a63", 624, "fb354b9abe64011b12159e45d724633f", 452320), FANMADE("Island of Secrets Demo 0.3", "61279176c3e4530fec9b578877aecda7", 504, "7f4ed7a81b86bea22c62bc98e6d9ec39", 197790), - FANMADE("Jimтs Quest 1: The Phantom Thesis", "0af50be1d3f0cb77a09137709a76ef4f", 960, "9c042c136548b20d9183495668e03526", 496446), + FANMADE("Jim's Quest 1: The Phantom Thesis", "0af50be1d3f0cb77a09137709a76ef4f", 960, "9c042c136548b20d9183495668e03526", 496446), FANMADE("King's Quest II SCI Pre-Alpha Version", "cdea1c081022e7697a1afffb1d2f9f6a", 2646, "fb2ce39002c3e05f3d83533638dea105", 2310356), FANMADE("Knight's Quest Demo 1.0", "5e816edf993956752ed06fccfeeae6d9", 1260, "959321f88a22905fa1f8c6d897874744", 703836), FANMADE("LockerGnome Quest", "3eeff9130206cad0c4e1551e2b9dd2c5", 420, "ae05ca90806fd90cc43f147c82d3547c", 158906), diff --git a/engines/scumm/POTFILES b/engines/scumm/POTFILES index 6d10537d3c..246f14d3f0 100644 --- a/engines/scumm/POTFILES +++ b/engines/scumm/POTFILES @@ -1,5 +1,6 @@ engines/scumm/dialogs.cpp engines/scumm/help.cpp +engines/scumm/input.cpp engines/scumm/scumm.cpp engines/scumm/players/player_v3m.cpp engines/scumm/players/player_v5m.cpp diff --git a/engines/scumm/input.cpp b/engines/scumm/input.cpp index 86048af57c..3ce053f6bc 100644 --- a/engines/scumm/input.cpp +++ b/engines/scumm/input.cpp @@ -23,6 +23,7 @@ #include "common/config-manager.h" #include "common/events.h" #include "common/system.h" +#include "common/translation.h" #include "gui/message.h" #include "gui/gui-manager.h" @@ -568,9 +569,9 @@ void ScummEngine::processKeyboard(Common::KeyState lastKeyHit) { lastKeyHit.hasFlags(Common::KBD_CTRL)) { _snapScroll ^= 1; if (_snapScroll) { - messageDialog("Snap scroll on"); + messageDialog(_("Snap scroll on")); } else { - messageDialog("Snap scroll off"); + messageDialog(_("Snap scroll off")); } if (VAR_CAMERA_FAST_X != 0xFF) @@ -583,7 +584,7 @@ void ScummEngine::processKeyboard(Common::KeyState lastKeyHit) { vol--; // Display the music volume - ValueDisplayDialog dlg("Music volume: ", 0, 16, vol, ']', '['); + ValueDisplayDialog dlg(_("Music volume: "), 0, 16, vol, ']', '['); vol = runDialog(dlg); vol *= 16; @@ -600,7 +601,7 @@ void ScummEngine::processKeyboard(Common::KeyState lastKeyHit) { _defaultTalkDelay++; // Display the talk speed - ValueDisplayDialog dlg("Subtitle speed: ", 0, 9, 9 - _defaultTalkDelay, '+', '-'); + ValueDisplayDialog dlg(_("Subtitle speed: "), 0, 9, 9 - _defaultTalkDelay, '+', '-'); _defaultTalkDelay = 9 - runDialog(dlg); // Save the new talkspeed value to ConfMan diff --git a/engines/scumm/scumm-md5.h b/engines/scumm/scumm-md5.h index a836cf12bc..c85073b877 100644 --- a/engines/scumm/scumm-md5.h +++ b/engines/scumm/scumm-md5.h @@ -1,5 +1,5 @@ /* - This file was generated by the md5table tool on Sun Jun 28 03:19:52 2015 + This file was generated by the md5table tool on Thu Aug 27 23:44:49 2015 DO NOT EDIT MANUALLY! */ @@ -288,6 +288,7 @@ static const MD5Table md5table[] = { { "62b8c16b6db226ba95aaa8be73f9885c", "indy3", "EGA", "EGA", -1, Common::ES_ESP, Common::kPlatformAmiga }, { "632d2fddb8ba97723fa15334763ae857", "thinker1", "", "", 33270, Common::EN_ANY, Common::kPlatformWindows }, { "63fdcdc95cdeea00060883aed38e5504", "PuttTime", "HE 85", "", -1, Common::EN_ANY, Common::kPlatformUnknown }, + { "64a22be96d679018696e5c8d3ca8b71d", "freddi", "HE 73", "", 26375, Common::JA_JPN, Common::kPlatformWindows }, { "6508fd55530e6915507e1cc37f7f045d", "indy3", "EGA", "EGA", -1, Common::EN_ANY, Common::kPlatformDOS }, { "65563295c3a06493351870f20a1630cf", "spyozon", "HE CUP", "Preview", 5235008, Common::UNK_LANG, Common::kPlatformUnknown }, { "659942b9a6b519f123a13cca3c333a13", "jungle", "", "", -1, Common::EN_ANY, Common::kPlatformMacintosh }, diff --git a/engines/sherlock/animation.cpp b/engines/sherlock/animation.cpp index bbf7c913b7..681e71d0f6 100644 --- a/engines/sherlock/animation.cpp +++ b/engines/sherlock/animation.cpp @@ -22,6 +22,7 @@ #include "sherlock/animation.h" #include "sherlock/sherlock.h" +#include "sherlock/scalpel/scalpel_screen.h" #include "common/algorithm.h" namespace Sherlock { @@ -200,19 +201,16 @@ bool Animation::play3DO(const Common::String &filename, bool intro, int minDelay // Draw the sprite. Note that we explicitly use the raw frame below, rather than the ImageFrame, // since we don't want the offsets in the image file to be used, just the explicit position we specify - if (!fadeActive) { - screen.transBlitFrom(images[imageFrame]._frame, pt); - } else { - // Fade active, blit to backbuffer1 - screen._backBuffer1.transBlitFrom(images[imageFrame]._frame, pt); - } + screen._backBuffer1.transBlitFrom(images[imageFrame]._frame, pt); + if (!fadeActive) + screen.slamArea(pt.x, pt.y, images[imageFrame]._frame.w, images[imageFrame]._frame.h); } else { // At this point, either the sprites for the frame has been complete, or there weren't any sprites // at all to draw for the frame if (fadeActive) { // process fading - screen.blitFrom3DOcolorLimit(fadeLimitColor); + static_cast<Scalpel::Scalpel3DOScreen *>(_vm->_screen)->blitFrom3DOcolorLimit(fadeLimitColor); if (!fadeLimitColor) { // we are at the end, so stop diff --git a/engines/sherlock/detection_tables.h b/engines/sherlock/detection_tables.h index 031e89b5ec..6567369528 100644 --- a/engines/sherlock/detection_tables.h +++ b/engines/sherlock/detection_tables.h @@ -32,7 +32,7 @@ static const SherlockGameDescription gameDescriptions[] = { AD_ENTRY1s("talk.lib", "ad0c4d6865edf15da4e9204c08815875", 238928), Common::EN_ANY, Common::kPlatformDOS, - ADGF_UNSTABLE, + ADGF_TESTING, GUIO6(GUIO_NOSPEECH, GAMEOPTION_ORIGINAL_SAVES, GAMEOPTION_FADE_STYLE, GAMEOPTION_HELP_STYLE, GAMEOPTION_PORTRAITS_ON, GAMEOPTION_WINDOW_STYLE) }, @@ -50,7 +50,7 @@ static const SherlockGameDescription gameDescriptions[] = { AD_LISTEND}, Common::DE_DEU, Common::kPlatformDOS, - ADGF_UNSTABLE, + ADGF_TESTING, GUIO6(GUIO_NOSPEECH, GAMEOPTION_ORIGINAL_SAVES, GAMEOPTION_FADE_STYLE, GAMEOPTION_HELP_STYLE, GAMEOPTION_PORTRAITS_ON, GAMEOPTION_WINDOW_STYLE) }, @@ -68,7 +68,7 @@ static const SherlockGameDescription gameDescriptions[] = { AD_LISTEND}, Common::DE_DEU, Common::kPlatformDOS, - ADGF_UNSTABLE, + ADGF_TESTING, GUIO6(GUIO_NOSPEECH, GAMEOPTION_ORIGINAL_SAVES, GAMEOPTION_FADE_STYLE, GAMEOPTION_HELP_STYLE, GAMEOPTION_PORTRAITS_ON, GAMEOPTION_WINDOW_STYLE) }, @@ -76,6 +76,24 @@ static const SherlockGameDescription gameDescriptions[] = { }, { + // Case of the Serrated Scalpel - German + // Provided by max565 + { + "scalpel", + 0, { + {"talk.lib", 0, "3d813fd8505b391a1f8b3a16b1aa7f2e", 284195}, + {"music.lib", 0, "68ae2f7684ecf903bd60a00bb6bae195", 366465}, + AD_LISTEND }, + Common::DE_DEU, + Common::kPlatformDOS, + ADGF_TESTING, + GUIO6(GUIO_NOSPEECH, GAMEOPTION_ORIGINAL_SAVES, GAMEOPTION_FADE_STYLE, GAMEOPTION_HELP_STYLE, + GAMEOPTION_PORTRAITS_ON, GAMEOPTION_WINDOW_STYLE) + }, + GType_SerratedScalpel, + }, + + { // Case of the Serrated Scalpel - Spanish CD (from multilingual CD) // Provided by m_kiewitz { @@ -86,7 +104,7 @@ static const SherlockGameDescription gameDescriptions[] = { AD_LISTEND}, Common::ES_ESP, Common::kPlatformDOS, - ADGF_UNSTABLE, + ADGF_TESTING, GUIO6(GUIO_NOSPEECH, GAMEOPTION_ORIGINAL_SAVES, GAMEOPTION_FADE_STYLE, GAMEOPTION_HELP_STYLE, GAMEOPTION_PORTRAITS_ON, GAMEOPTION_WINDOW_STYLE) }, @@ -116,7 +134,7 @@ static const SherlockGameDescription gameDescriptions[] = { AD_ENTRY1s("talk.lib", "dbdc8a20c96900aa7e4d02f3fe8a274c", 121102), Common::EN_ANY, Common::kPlatformDOS, - ADGF_UNSTABLE | ADGF_DEMO, + ADGF_TESTING | ADGF_DEMO, GUIO1(GUIO_NOSPEECH) }, GType_SerratedScalpel, @@ -131,7 +149,7 @@ static const SherlockGameDescription gameDescriptions[] = { AD_ENTRY1s("music.lib", "ec19a09b7fef6fd90b1ab812ce6e9739", 38563), Common::EN_ANY, Common::kPlatformDOS, - ADGF_UNSTABLE | ADGF_DEMO, + ADGF_TESTING | ADGF_DEMO, GUIO1(GUIO_NOSPEECH) }, GType_SerratedScalpel, @@ -144,9 +162,9 @@ static const SherlockGameDescription gameDescriptions[] = { "rosetattoo", "CD", AD_ENTRY1s("talk.lib", "22e8e6406dd2fbbb238c9898928df42e", 770756), - Common::EN_ANY, + Common::FR_FRA, Common::kPlatformDOS, - ADGF_UNSTABLE, + ADGF_TESTING, GUIO3(GAMEOPTION_ORIGINAL_SAVES, GAMEOPTION_HELP_STYLE, GAMEOPTION_TRANSPARENT_WINDOWS) }, GType_RoseTattoo @@ -161,7 +179,7 @@ static const SherlockGameDescription gameDescriptions[] = { AD_ENTRY1s("talk.lib", "9639a756b0993ebd71cb5f4d8b78b2dc", 765134), Common::EN_ANY, Common::kPlatformDOS, - ADGF_UNSTABLE, + ADGF_TESTING, GUIO3(GAMEOPTION_ORIGINAL_SAVES, GAMEOPTION_HELP_STYLE, GAMEOPTION_TRANSPARENT_WINDOWS) }, GType_RoseTattoo, @@ -176,7 +194,22 @@ static const SherlockGameDescription gameDescriptions[] = { AD_ENTRY1s("talk.lib", "5027aa72f0d263ed3b1c764a6c397911", 873864), Common::DE_DEU, Common::kPlatformDOS, - ADGF_UNSTABLE, + ADGF_TESTING, + GUIO3(GAMEOPTION_ORIGINAL_SAVES, GAMEOPTION_HELP_STYLE, GAMEOPTION_TRANSPARENT_WINDOWS) + }, + GType_RoseTattoo, + }, + + { + // Case of the Rose Tattoo - Spanish CD + // Provided by dianiu + { + "rosetattoo", + "CD", + AD_ENTRY1s("talk.lib", "4f3ccf50e1012445624569cd605d7449", 783713), + Common::ES_ESP, + Common::kPlatformDOS, + ADGF_TESTING, GUIO3(GAMEOPTION_ORIGINAL_SAVES, GAMEOPTION_HELP_STYLE, GAMEOPTION_TRANSPARENT_WINDOWS) }, GType_RoseTattoo, diff --git a/engines/sherlock/events.cpp b/engines/sherlock/events.cpp index e4fe3fb6d6..4b0b7dfb3f 100644 --- a/engines/sherlock/events.cpp +++ b/engines/sherlock/events.cpp @@ -28,6 +28,7 @@ #include "sherlock/sherlock.h" #include "sherlock/events.h" #include "sherlock/surface.h" +#include "sherlock/tattoo/tattoo.h" namespace Sherlock { @@ -97,9 +98,27 @@ void Events::setCursor(const Graphics::Surface &src, int hotspotX, int hotspotY) if (!IS_3DO) { // PC 8-bit palettized CursorMan.replaceCursor(src.getPixels(), src.w, src.h, hotspotX, hotspotY, 0xff); + } else if (!_vm->_isScreenDoubled) { + CursorMan.replaceCursor(src.getPixels(), src.w, src.h, hotspotX, hotspotY, 0x0000, false, &src.format); } else { + Graphics::Surface tempSurface; + tempSurface.create(2 * src.w, 2 * src.h, src.format); + + for (int y = 0; y < src.h; y++) { + const uint16 *srcP = (const uint16 *)src.getBasePtr(0, y); + uint16 *destP = (uint16 *)tempSurface.getBasePtr(0, 2 * y); + for (int x = 0; x < src.w; ++x, ++srcP, destP += 2) { + *destP = *srcP; + *(destP + 1) = *srcP; + *(destP + 2 * src.w) = *srcP; + *(destP + 2 * src.w + 1) = *srcP; + } + } + // 3DO RGB565 - CursorMan.replaceCursor(src.getPixels(), src.w, src.h, hotspotX, hotspotY, 0x0000, false, &src.format); + CursorMan.replaceCursor(tempSurface.getPixels(), tempSurface.w, tempSurface.h, 2 * hotspotX, 2 * hotspotY, 0x0000, false, &src.format); + + tempSurface.free(); } showCursor(); } @@ -155,7 +174,8 @@ void Events::animateCursorIfNeeded() { } void Events::showCursor() { - CursorMan.showMouse(true); + if (IS_SERRATED_SCALPEL || !static_cast<Tattoo::TattooEngine *>(_vm)->_runningProlog) + CursorMan.showMouse(true); } void Events::hideCursor() { @@ -176,6 +196,8 @@ void Events::pollEvents() { Common::Event event; while (g_system->getEventManager()->pollEvent(event)) { _mousePos = event.mouse; + if (_vm->_isScreenDoubled) + _mousePos = Common::Point(_mousePos.x / 2, _mousePos.y / 2); // Handle events switch (event.type) { @@ -219,7 +241,11 @@ void Events::pollEventsAndWait() { } void Events::warpMouse(const Common::Point &pt) { - _mousePos = pt - _vm->_screen->_currentScroll; + Common::Point pos = pt; + if (_vm->_isScreenDoubled) + pos = Common::Point(pt.x / 2, pt.y); + + _mousePos = pos - _vm->_screen->_currentScroll; g_system->warpMouse(_mousePos.x, _mousePos.y); } @@ -237,6 +263,10 @@ void Events::setFrameRate(int newRate) { _frameRate = newRate; } +void Events::toggleSpeed() { + _frameRate = (_frameRate == GAME_FRAME_RATE) ? GAME_FRAME_RATE * 2 : GAME_FRAME_RATE; +} + bool Events::checkForNextFrameCounter() { // Check for next game frame uint32 milli = g_system->getMillis(); @@ -320,7 +350,8 @@ bool Events::delay(uint32 time, bool interruptable) { g_system->delayMillis(time); bool result = !(interruptable && (kbHit() || _pressed || _vm->shouldQuit())); - clearEvents(); + if (interruptable) + clearEvents(); return result; } else { // For long periods go into a loop where we delay by 10ms at a time and then diff --git a/engines/sherlock/events.h b/engines/sherlock/events.h index e13ef18822..711804dfdf 100644 --- a/engines/sherlock/events.h +++ b/engines/sherlock/events.h @@ -149,6 +149,11 @@ public: void setFrameRate(int newRate); /** + * Toggle between standard game speed and an "extra fast" mode + */ + void toggleSpeed(); + + /** * Return the current game frame number */ uint32 getFrameCounter() const { return _frameCounter; } diff --git a/engines/sherlock/fonts.cpp b/engines/sherlock/fonts.cpp index 482e795b6d..4d0991a47c 100644 --- a/engines/sherlock/fonts.cpp +++ b/engines/sherlock/fonts.cpp @@ -62,6 +62,43 @@ void Fonts::setFont(int fontNum) { // load font data _font = new ImageFile(fontFilename); + + if (IS_SERRATED_SCALPEL) { + if (_vm->getLanguage() == Common::ES_ESP) { + if (_fontNumber == 1) { + // Create a new character - inverted exclamation mark (0x88) + // Seems this wasn't included originally, but some text has it + // This was obviously not done in the original game interpreter + ImageFrame &frameExclamationMark = (*_font)[0]; // get actual exclamation mark + ImageFrame frameRevExclamationMark; + + frameRevExclamationMark._width = frameExclamationMark._width; + frameRevExclamationMark._height = frameExclamationMark._height; + frameRevExclamationMark._paletteBase = frameExclamationMark._paletteBase; + frameRevExclamationMark._rleEncoded = frameExclamationMark._rleEncoded; + frameRevExclamationMark._size = frameExclamationMark._size; + frameRevExclamationMark._frame.create(frameExclamationMark._width, frameExclamationMark._height, Graphics::PixelFormat::createFormatCLUT8()); + + byte *frameExclMarkPixels = (byte *)frameExclamationMark._frame.getPixels(); + byte *frameRevExclMarkPixels = (byte *)frameRevExclamationMark._frame.getPixels(); + + uint16 revExclMarkY = frameExclamationMark._height - 1; + frameRevExclMarkPixels += frameExclamationMark._width * (frameExclamationMark._height - 1); + for (uint16 exclMarkY = 0; exclMarkY < frameExclamationMark._height; exclMarkY++) { + memcpy(frameRevExclMarkPixels, frameExclMarkPixels, frameExclamationMark._width); + revExclMarkY--; + frameRevExclMarkPixels -= frameExclamationMark._width; + frameExclMarkPixels += frameExclamationMark._width; + } + + frameRevExclamationMark._offset.x = frameExclamationMark._offset.x; + frameRevExclamationMark._offset.y = frameExclamationMark._offset.y + 1; + + _font->push_back(frameRevExclamationMark); + } + } + } + } else { // 3DO switch (fontNum) { @@ -81,7 +118,7 @@ void Fonts::setFont(int fontNum) { } _charCount = _font->size(); - + // Iterate through the frames to find the widest and tallest font characters _fontHeight = _widestChar = 0; for (uint idx = 0; idx < _charCount; ++idx) { @@ -118,6 +155,24 @@ inline byte Fonts::translateChar(byte c) { return 135; // and this for SH1 default: if (IS_SERRATED_SCALPEL) { + if (_vm->getLanguage() == Common::ES_ESP) { + if (_fontNumber == 1) { + // Special workarounds for translated game text, which was skipped because of effectively a bug + // This was not done in the original interpreter + // It seems at least the inverted exclamation mark was skipped by the original interpreter / + // wasn't shown at all. + // This character is used for example in the alley room, when talking with the inspector after + // searching the corpse. "[0xAD]Claro! Mi experiencia profesional revela que esta mujer fue asesinada..." + // The same text gets put inside Watson's journal as well and should be on page 10 right after + // talking with the inspector. For further study see bug #6931 + // Inverted question mark was also skipped, but at least that character is inside the font already. + if (c == 0xAD) { + // inverted exclamation mark + return 0x88; // our own font character, created during setFont() + } + // Inverted question mask is 0x86 (mapped from 0x88) + } + } if (c >= 0x80) { // German SH1 version did this, but not German SH2 c--; } @@ -147,10 +202,13 @@ void Fonts::writeString(Surface *surface, const Common::String &str, } curChar = translateChar(curChar); - assert(curChar < _charCount); - ImageFrame &frame = (*_font)[curChar]; - surface->transBlitFrom(frame, Common::Point(charPos.x, charPos.y + _yOffsets[curChar]), false, overrideColor); - charPos.x += frame._frame.w + 1; + if (curChar < _charCount) { + ImageFrame &frame = (*_font)[curChar]; + surface->transBlitFrom(frame, Common::Point(charPos.x, charPos.y + _yOffsets[curChar]), false, overrideColor); + charPos.x += frame._frame.w + 1; + } else { + warning("Invalid character encountered - %d", (int)curChar); + } } } diff --git a/engines/sherlock/image_file.cpp b/engines/sherlock/image_file.cpp index 3d881eb655..971980a2ac 100644 --- a/engines/sherlock/image_file.cpp +++ b/engines/sherlock/image_file.cpp @@ -961,59 +961,57 @@ void ImageFile3DO::loadFont(Common::SeekableReadStream &stream) { for (curChar = 33; curChar < header_charCount; curChar++) { // create frame - { - ImageFrame imageFrame; - - imageFrame._width = widthTablePtr[curChar]; - imageFrame._height = header_fontHeight; - imageFrame._paletteBase = 0; - imageFrame._offset.x = 0; - imageFrame._offset.y = 0; - imageFrame._rleEncoded = false; - imageFrame._size = 0; - - // Extract pixels - imageFrame._frame.create(imageFrame._width, imageFrame._height, Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0)); - uint16 *dest = (uint16 *)imageFrame._frame.getPixels(); - Common::fill(dest, dest + imageFrame._width * imageFrame._height, 0); - - curCharHeightLeft = header_fontHeight; - while (curCharHeightLeft) { - curCharWidthLeft = widthTablePtr[curChar]; - curBitsPtr = curBitsLinePtr; - curBitsLeft = 8; - curPosX = 0; - - while (curCharWidthLeft) { - if (!(curPosX & 1)) { - curBits = *curBitsPtr >> 4; - } else { - curBits = *curBitsPtr & 0x0F; - curBitsPtr++; - } - // doing this properly is complicated - // the 3DO has built-in anti-aliasing - // this here at least results in somewhat readable text - // TODO: make it better - if (curBits) { - curBitsReversed = (curBits >> 3) | ((curBits & 0x04) >> 1) | ((curBits & 0x02) << 1) | ((curBits & 0x01) << 3); - curBits = 20 - curBits; - } - - byte curIntensity = curBits; - *dest = (curIntensity << 11) | (curIntensity << 6) | curIntensity; - dest++; - - curCharWidthLeft--; - curPosX++; + ImageFrame imageFrame; + + imageFrame._width = widthTablePtr[curChar]; + imageFrame._height = header_fontHeight; + imageFrame._paletteBase = 0; + imageFrame._offset.x = 0; + imageFrame._offset.y = 0; + imageFrame._rleEncoded = false; + imageFrame._size = 0; + + // Extract pixels + imageFrame._frame.create(imageFrame._width, imageFrame._height, Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0)); + uint16 *dest = (uint16 *)imageFrame._frame.getPixels(); + Common::fill(dest, dest + imageFrame._width * imageFrame._height, 0); + + curCharHeightLeft = header_fontHeight; + while (curCharHeightLeft) { + curCharWidthLeft = widthTablePtr[curChar]; + curBitsPtr = curBitsLinePtr; + curBitsLeft = 8; + curPosX = 0; + + while (curCharWidthLeft) { + if (!(curPosX & 1)) { + curBits = *curBitsPtr >> 4; + } else { + curBits = *curBitsPtr & 0x0F; + curBitsPtr++; + } + // doing this properly is complicated + // the 3DO has built-in anti-aliasing + // this here at least results in somewhat readable text + // TODO: make it better + if (curBits) { + curBitsReversed = (curBits >> 3) | ((curBits & 0x04) >> 1) | ((curBits & 0x02) << 1) | ((curBits & 0x01) << 3); + curBits = 20 - curBits; } - curCharHeightLeft--; - curBitsLinePtr += header_bytesPerLine; + byte curIntensity = curBits; + *dest = (curIntensity << 11) | (curIntensity << 6) | curIntensity; + dest++; + + curCharWidthLeft--; + curPosX++; } - push_back(imageFrame); + curCharHeightLeft--; + curBitsLinePtr += header_bytesPerLine; } + + push_back(imageFrame); } // Warning below being used to silence unused variable warnings for now @@ -1051,10 +1049,12 @@ void StreamingImageFile::close() { _stream = nullptr; _frameNumber = -1; _active = false; + _imageFrame._frame.free(); } bool StreamingImageFile::getNextFrame() { // Don't proceed if we're already at the end of the stream + assert(_stream); if (_stream->pos() >= _stream->size()) { _active = false; return false; @@ -1081,6 +1081,9 @@ bool StreamingImageFile::getNextFrame() { _imageFrame._size = frameStream->readUint16LE() - 11; _imageFrame._rleMarker = frameStream->readByte(); + // Free the previous frame + _imageFrame._frame.free(); + // Decode the frame if (_compressed) { delete frameStream; diff --git a/engines/sherlock/journal.cpp b/engines/sherlock/journal.cpp index e442a3c903..e443b6f727 100644 --- a/engines/sherlock/journal.cpp +++ b/engines/sherlock/journal.cpp @@ -24,6 +24,7 @@ #include "sherlock/scalpel/scalpel.h" #include "sherlock/scalpel/scalpel_fixed_text.h" #include "sherlock/scalpel/scalpel_journal.h" +#include "sherlock/scalpel/scalpel_talk.h" #include "sherlock/tattoo/tattoo.h" #include "sherlock/tattoo/tattoo_fixed_text.h" #include "sherlock/tattoo/tattoo_journal.h" @@ -485,9 +486,9 @@ void Journal::loadJournalFile(bool alreadyLoaded) { // Copy text from the place until either the reply ends, a comment // {} block is started, or a control character is encountered journalString += c; - do { + while (*replyP && *replyP < opcodes[0] && *replyP != '{' && *replyP != '}') { journalString += *replyP++; - } while (*replyP && *replyP < opcodes[0] && *replyP != '{' && *replyP != '}'); + } commentJustPrinted = false; } @@ -525,6 +526,9 @@ void Journal::loadJournalFile(bool alreadyLoaded) { else journalString += people._characters[c]._name; + if (IS_SERRATED_SCALPEL && _vm->getLanguage() == Common::DE_DEU) + Scalpel::ScalpelTalk::skipBadText(replyP); + const byte *strP = replyP; byte v; do { diff --git a/engines/sherlock/music.cpp b/engines/sherlock/music.cpp index 7802bf5eeb..8b8f359de3 100644 --- a/engines/sherlock/music.cpp +++ b/engines/sherlock/music.cpp @@ -225,6 +225,7 @@ Music::Music(SherlockEngine *vm, Audio::Mixer *mixer) : _vm(vm), _mixer(mixer) { _musicOn = false; _midiOption = false; _musicVolume = 0; + _midiMusicData = nullptr; if (IS_3DO) { // 3DO - uses digital samples for music @@ -397,6 +398,7 @@ bool Music::playMusic(const Common::String &name) { if (!_musicOn) return false; + _nextSongName = _currentSongName = name; debugC(kDebugLevelMusic, "Music: playMusic('%s')", name.c_str()); if (!IS_3DO) { @@ -469,8 +471,8 @@ bool Music::playMusic(const Common::String &name) { } } + _midiMusicData = midiMusicData; _midiParser->loadMusic(midiMusicData, midiMusicDataSize); - } else { // 3DO: sample based Audio::AudioStream *musicStream; @@ -516,6 +518,8 @@ void Music::freeSong() { _midiParser->unloadMusic(); } + delete[] _midiMusicData; + _midiMusicData = nullptr; _musicPlaying = false; } @@ -613,4 +617,10 @@ void Music::getSongNames(Common::StringArray &songs) { Common::sort(songs.begin(), songs.end()); } +void Music::checkSongProgress() { + if (!isPlaying()) { + playMusic(_nextSongName); + } +} + } // End of namespace Sherlock diff --git a/engines/sherlock/music.h b/engines/sherlock/music.h index afd3a429be..186e2aa2dc 100644 --- a/engines/sherlock/music.h +++ b/engines/sherlock/music.h @@ -68,6 +68,7 @@ private: MidiDriver *_midiDriver; Audio::SoundHandle _digitalMusicHandle; MusicType _musicType; + byte *_midiMusicData; /** * Play the specified music resource @@ -127,6 +128,12 @@ public: * Gets the names of all the songs in the game. Used by the debugger. */ void getSongNames(Common::StringArray &songs); + + /** + * Checks to see if the currently playing song has finished, then the music specified + * in _nextSongName will be started + */ + void checkSongProgress(); }; } // End of namespace Sherlock diff --git a/engines/sherlock/objects.cpp b/engines/sherlock/objects.cpp index 093f666a46..0856c226f1 100644 --- a/engines/sherlock/objects.cpp +++ b/engines/sherlock/objects.cpp @@ -539,7 +539,7 @@ int BaseObject::checkNameForCodes(const Common::String &name, FixedTextActionId // G: Have object go somewhere // A: Add onto existing co-ordinates Common::String sx(name.c_str() + 2, name.c_str() + 5); - Common::String sy(name.c_str() + 6, name.c_str() + 9); + Common::String sy(name.c_str() + 5, name.c_str() + 8); if (ch == 'G') _position = Common::Point(atoi(sx.c_str()), atoi(sy.c_str())); diff --git a/engines/sherlock/people.cpp b/engines/sherlock/people.cpp index b1f4abba47..8057e26204 100644 --- a/engines/sherlock/people.cpp +++ b/engines/sherlock/people.cpp @@ -184,8 +184,9 @@ void People::reset() { Person &p = *_data[idx]; if (IS_SERRATED_SCALPEL) { - p._type = CHARACTER; - p._position = Point32(100 * FIXED_INT_MULTIPLIER, 110 * FIXED_INT_MULTIPLIER); + p._type = _holmesOn ? CHARACTER : HIDDEN; + if (!saves._justLoaded) + p._position = Point32(100 * FIXED_INT_MULTIPLIER, 110 * FIXED_INT_MULTIPLIER); } else if (!talk._scriptMoreFlag && !saves._justLoaded) { p._type = (idx == 0) ? CHARACTER : INVALID; p._position = Point32(36 * FIXED_INT_MULTIPLIER, 29 * FIXED_INT_MULTIPLIER); diff --git a/engines/sherlock/scalpel/scalpel.cpp b/engines/sherlock/scalpel/scalpel.cpp index 8478327d33..b17f38b218 100644 --- a/engines/sherlock/scalpel/scalpel.cpp +++ b/engines/sherlock/scalpel/scalpel.cpp @@ -28,6 +28,7 @@ #include "sherlock/scalpel/scalpel_map.h" #include "sherlock/scalpel/scalpel_people.h" #include "sherlock/scalpel/scalpel_scene.h" +#include "sherlock/scalpel/scalpel_screen.h" #include "sherlock/scalpel/tsage/logo.h" #include "sherlock/sherlock.h" #include "sherlock/music.h" @@ -101,78 +102,78 @@ static const byte MAP_SEQUENCES[3][MAX_FRAME] = { struct PeopleData { const char *portrait; - const char *name; + int fixedTextId; byte stillSequences[MAX_TALK_SEQUENCES]; byte talkSequences[MAX_TALK_SEQUENCES]; }; const PeopleData PEOPLE_DATA[MAX_PEOPLE] = { - { "HOLM", "Sherlock Holmes", { 1, 0, 0 }, { 1, 0, 0 } }, - { "WATS", "Dr. Watson", { 6, 0, 0 }, { 5, 5, 6, 7, 8, 7, 8, 6, 0, 0 } }, - { "LEST", "Inspector Lestrade", { 4, 0, 0 }, { 2, 0, 0 } }, - { "CON1", "Constable O'Brien", { 2, 0, 0 }, { 1, 0, 0 } }, - { "CON2", "Constable Lewis", { 2, 0, 0 }, { 1, 0, 0 } }, - { "SHEI", "Sheila Parker", { 2, 0, 0 }, { 2, 3, 0, 0 } }, - { "HENR", "Henry Carruthers", { 3, 0, 0 }, { 3, 0, 0 } }, - { "LESL", "Lesley", { 9, 0, 0 }, { 1, 2, 3, 2, 1, 2, 3, 0, 0 } }, - { "USH1", "An Usher", { 13, 0, 0 }, { 13, 14, 0, 0 } }, - { "USH2", "An Usher", { 2, 0, 0 }, { 2, 0, 0 } }, - { "FRED", "Fredrick Epstein", { 4, 0, 0 }, { 1, 2, 3, 4, 3, 4, 3, 2, 0, 0 } }, - { "WORT", "Mrs. Worthington", { 9, 0, 0 }, { 8, 0, 0 } }, - { "COAC", "The Coach", { 2, 0, 0 }, { 1, 2, 3, 4, 5, 4, 3, 2, 0, 0 } }, - { "PLAY", "A Player", { 8, 0, 0 }, { 7, 8, 0, 0 } }, - { "WBOY", "Tim", { 13, 0, 0 }, { 12, 13, 0, 0 } }, - { "JAME", "James Sanders", { 6, 0, 0 }, { 3, 4, 0, 0 } }, - { "BELL", "Belle", { 1, 0, 0 }, { 4, 5, 0, 0 } }, - { "GIRL", "Cleaning Girl", { 20, 0, 0 }, { 14, 15, 16, 17, 18, 19, 20, 20, 20, 0, 0 } }, - { "EPST", "Fredrick Epstein", { 17, 0, 0 }, { 16, 17, 18, 18, 18, 17, 17, 0, 0 } }, - { "WIGG", "Wiggins", { 3, 0, 0 }, { 2, 3, 0, 0 } }, - { "PAUL", "Paul", { 2, 0, 0 }, { 1, 2, 0, 0 } }, - { "BART", "The Bartender", { 1, 0, 0 }, { 1, 0, 0 } }, - { "DIRT", "A Dirty Drunk", { 1, 0, 0 }, { 1, 0, 0 } }, - { "SHOU", "A Shouting Drunk", { 1, 0, 0 }, { 1, 0, 0 } }, - { "STAG", "A Staggering Drunk", { 1, 0, 0 }, { 1, 0, 0 } }, - { "BOUN", "The Bouncer", { 1, 0, 0 }, { 1, 0, 0 } }, - { "SAND", "James Sanders", { 6, 0, 0 }, { 5, 6, 0, 0 } }, - { "CORO", "The Coroner", { 6, 0, 0 }, { 4, 5, 0, 0 } }, - { "EQUE", "Reginald Snipes", { 1, 0, 0 }, { 1, 0, 0 } }, - { "GEOR", "George Blackwood", { 1, 0, 0 }, { 1, 0, 0 } }, - { "LARS", "Lars", { 7, 0, 0 }, { 5, 6, 0, 0 } }, - { "PARK", "Sheila Parker", { 1, 0, 0 }, { 1, 0, 0 } }, - { "CHEM", "The Chemist", { 8, 0, 0 }, { 8, 9, 0, 0 } }, - { "GREG", "Inspector Gregson", { 6, 0, 0 }, { 5, 6, 0, 0 } }, - { "LAWY", "Jacob Farthington", { 1, 0, 0 }, { 1, 0, 0 } }, - { "MYCR", "Mycroft", { 1, 0, 0 }, { 1, 0, 0 } }, - { "SHER", "Old Sherman", { 7, 0, 0 }, { 7, 8, 0, 0 } }, - { "CHMB", "Richard", { 1, 0, 0 }, { 1, 0, 0 } }, - { "BARM", "The Barman", { 1, 0, 0 }, { 1, 0, 0 } }, - { "DAND", "A Dandy Player", { 1, 0, 0 }, { 1, 0, 0 } }, - { "ROUG", "A Rough-looking Player", { 1, 0, 0 }, { 1, 0, 0 } }, - { "SPEC", "A Spectator", { 1, 0, 0 }, { 1, 0, 0 } }, - { "HUNT", "Robert Hunt", { 1, 0, 0 }, { 1, 0, 0 } }, - { "VIOL", "Violet", { 3, 0, 0 }, { 3, 4, 0, 0 } }, - { "PETT", "Pettigrew", { 1, 0, 0 }, { 1, 0, 0 } }, - { "APPL", "Augie", { 8, 0, 0 }, { 14, 15, 0, 0 } }, - { "ANNA", "Anna Carroway", { 16, 0, 0 }, { 3, 4, 5, 6, 0, 0 } }, - { "GUAR", "A Guard", { 1, 0, 0 }, { 4, 5, 6, 0, 0 } }, - { "ANTO", "Antonio Caruso", { 8, 0, 0 }, { 7, 8, 0, 0 } }, - { "TOBY", "Toby the Dog", { 1, 0, 0 }, { 1, 0, 0 } }, - { "KING", "Simon Kingsley", { 13, 0, 0 }, { 13, 14, 0, 0 } }, - { "ALFR", "Alfred", { 2, 0, 0 }, { 2, 3, 0, 0 } }, - { "LADY", "Lady Brumwell", { 1, 0, 0 }, { 3, 4, 0, 0 } }, - { "ROSA", "Madame Rosa", { 1, 0, 0 }, { 1, 30, 0, 0 } }, - { "LADB", "Lady Brumwell", { 1, 0, 0 }, { 3, 4, 0, 0 } }, - { "MOOR", "Joseph Moorehead", { 1, 0, 0 }, { 1, 0, 0 } }, - { "BEAL", "Mrs. Beale", { 5, 0, 0 }, { 14, 15, 16, 17, 18, 19, 20, 0, 0 } }, - { "LION", "Felix", { 1, 0, 0 }, { 1, 0, 0 } }, - { "HOLL", "Hollingston", { 1, 0, 0 }, { 1, 0, 0 } }, - { "CALL", "Constable Callaghan", { 1, 0, 0 }, { 1, 0, 0 } }, - { "JERE", "Sergeant Duncan", { 2, 0, 0 }, { 1, 1, 2, 2, 0, 0 } }, - { "LORD", "Lord Brumwell", { 1, 0, 0 }, { 9, 10, 0, 0 } }, - { "NIGE", "Nigel Jaimeson", { 1, 0, 0 }, { 1, 2, 0, 138, 3, 4, 0, 138, 0, 0 } }, - { "JONA", "Jonas", { 1, 0, 0 }, { 1, 8, 0, 0 } }, - { "DUGA", "Constable Dugan", { 1, 0, 0 }, { 1, 0, 0 } }, - { "INSP", "Inspector Lestrade", { 4, 0, 0 }, { 2, 0, 0 } } + { "HOLM", kFixedText_People_SherlockHolmes, { 1, 0, 0 }, { 1, 0, 0 } }, + { "WATS", kFixedText_People_DrWatson, { 6, 0, 0 }, { 5, 5, 6, 7, 8, 7, 8, 6, 0, 0 } }, + { "LEST", kFixedText_People_InspectorLestrade, { 4, 0, 0 }, { 2, 0, 0 } }, + { "CON1", kFixedText_People_ConstableOBrien, { 2, 0, 0 }, { 1, 0, 0 } }, + { "CON2", kFixedText_People_ConstableLewis, { 2, 0, 0 }, { 1, 0, 0 } }, + { "SHEI", kFixedText_People_SheilaParker, { 2, 0, 0 }, { 2, 3, 0, 0 } }, + { "HENR", kFixedText_People_HenryCarruthers, { 3, 0, 0 }, { 3, 0, 0 } }, + { "LESL", kFixedText_People_Lesley, { 9, 0, 0 }, { 1, 2, 3, 2, 1, 2, 3, 0, 0 } }, + { "USH1", kFixedText_People_AnUsher, { 13, 0, 0 }, { 13, 14, 0, 0 } }, + { "USH2", kFixedText_People_AnUsher, { 2, 0, 0 }, { 2, 0, 0 } }, + { "FRED", kFixedText_People_FredrickEpstein, { 4, 0, 0 }, { 1, 2, 3, 4, 3, 4, 3, 2, 0, 0 } }, + { "WORT", kFixedText_People_MrsWorthington, { 9, 0, 0 }, { 8, 0, 0 } }, + { "COAC", kFixedText_People_TheCoach, { 2, 0, 0 }, { 1, 2, 3, 4, 5, 4, 3, 2, 0, 0 } }, + { "PLAY", kFixedText_People_APlayer, { 8, 0, 0 }, { 7, 8, 0, 0 } }, + { "WBOY", kFixedText_People_Tim, { 13, 0, 0 }, { 12, 13, 0, 0 } }, + { "JAME", kFixedText_People_JamesSanders, { 6, 0, 0 }, { 3, 4, 0, 0 } }, + { "BELL", kFixedText_People_Belle, { 1, 0, 0 }, { 4, 5, 0, 0 } }, + { "GIRL", kFixedText_People_CleaningGirl, { 20, 0, 0 }, { 14, 15, 16, 17, 18, 19, 20, 20, 20, 0, 0 } }, + { "EPST", kFixedText_People_FredrickEpstein, { 17, 0, 0 }, { 16, 17, 18, 18, 18, 17, 17, 0, 0 } }, + { "WIGG", kFixedText_People_Wiggins, { 3, 0, 0 }, { 2, 3, 0, 0 } }, + { "PAUL", kFixedText_People_Paul, { 2, 0, 0 }, { 1, 2, 0, 0 } }, + { "BART", kFixedText_People_TheBartender, { 1, 0, 0 }, { 1, 0, 0 } }, + { "DIRT", kFixedText_People_ADirtyDrunk, { 1, 0, 0 }, { 1, 0, 0 } }, + { "SHOU", kFixedText_People_AShoutingDrunk, { 1, 0, 0 }, { 1, 0, 0 } }, + { "STAG", kFixedText_People_AStaggeringDrunk, { 1, 0, 0 }, { 1, 0, 0 } }, + { "BOUN", kFixedText_People_TheBouncer, { 1, 0, 0 }, { 1, 0, 0 } }, + { "SAND", kFixedText_People_JamesSanders, { 6, 0, 0 }, { 5, 6, 0, 0 } }, + { "CORO", kFixedText_People_TheCoroner, { 6, 0, 0 }, { 4, 5, 0, 0 } }, + { "EQUE", kFixedText_People_ReginaldSnipes, { 1, 0, 0 }, { 1, 0, 0 } }, + { "GEOR", kFixedText_People_GeorgeBlackwood, { 1, 0, 0 }, { 1, 0, 0 } }, + { "LARS", kFixedText_People_Lars, { 7, 0, 0 }, { 5, 6, 0, 0 } }, + { "PARK", kFixedText_People_SheilaParker, { 1, 0, 0 }, { 1, 0, 0 } }, + { "CHEM", kFixedText_People_TheChemist, { 8, 0, 0 }, { 8, 9, 0, 0 } }, + { "GREG", kFixedText_People_InspectorGregson, { 6, 0, 0 }, { 5, 6, 0, 0 } }, + { "LAWY", kFixedText_People_JacobFarthington, { 1, 0, 0 }, { 1, 0, 0 } }, + { "MYCR", kFixedText_People_Mycroft, { 1, 0, 0 }, { 1, 0, 0 } }, + { "SHER", kFixedText_People_OldSherman, { 7, 0, 0 }, { 7, 8, 0, 0 } }, + { "CHMB", kFixedText_People_Richard, { 1, 0, 0 }, { 1, 0, 0 } }, + { "BARM", kFixedText_People_TheBarman, { 1, 0, 0 }, { 1, 0, 0 } }, + { "DAND", kFixedText_People_ADandyPlayer, { 1, 0, 0 }, { 1, 0, 0 } }, + { "ROUG", kFixedText_People_ARoughlookingPlayer, { 1, 0, 0 }, { 1, 0, 0 } }, + { "SPEC", kFixedText_People_ASpectator, { 1, 0, 0 }, { 1, 0, 0 } }, + { "HUNT", kFixedText_People_RobertHunt, { 1, 0, 0 }, { 1, 0, 0 } }, + { "VIOL", kFixedText_People_Violet, { 3, 0, 0 }, { 3, 4, 0, 0 } }, + { "PETT", kFixedText_People_Pettigrew, { 1, 0, 0 }, { 1, 0, 0 } }, + { "APPL", kFixedText_People_Augie, { 8, 0, 0 }, { 14, 15, 0, 0 } }, + { "ANNA", kFixedText_People_AnnaCarroway, { 16, 0, 0 }, { 3, 4, 5, 6, 0, 0 } }, + { "GUAR", kFixedText_People_AGuard, { 1, 0, 0 }, { 4, 5, 6, 0, 0 } }, + { "ANTO", kFixedText_People_AntonioCaruso, { 8, 0, 0 }, { 7, 8, 0, 0 } }, + { "TOBY", kFixedText_People_TobyTheDog, { 1, 0, 0 }, { 1, 0, 0 } }, + { "KING", kFixedText_People_SimonKingsley, { 13, 0, 0 }, { 13, 14, 0, 0 } }, + { "ALFR", kFixedText_People_Alfred, { 2, 0, 0 }, { 2, 3, 0, 0 } }, + { "LADY", kFixedText_People_LadyBrumwell, { 1, 0, 0 }, { 3, 4, 0, 0 } }, + { "ROSA", kFixedText_People_MadameRosa, { 1, 0, 0 }, { 1, 30, 0, 0 } }, + { "LADB", kFixedText_People_LadyBrumwell, { 1, 0, 0 }, { 3, 4, 0, 0 } }, + { "MOOR", kFixedText_People_JosephMoorehead, { 1, 0, 0 }, { 1, 0, 0 } }, + { "BEAL", kFixedText_People_MrsBeale, { 5, 0, 0 }, { 14, 15, 16, 17, 18, 19, 20, 0, 0 } }, + { "LION", kFixedText_People_Felix, { 1, 0, 0 }, { 1, 0, 0 } }, + { "HOLL", kFixedText_People_Hollingston, { 1, 0, 0 }, { 1, 0, 0 } }, + { "CALL", kFixedText_People_ConstableCallaghan, { 1, 0, 0 }, { 1, 0, 0 } }, + { "JERE", kFixedText_People_SergeantDuncan, { 2, 0, 0 }, { 1, 1, 2, 2, 0, 0 } }, + { "LORD", kFixedText_People_LordBrumwell, { 1, 0, 0 }, { 9, 10, 0, 0 } }, + { "NIGE", kFixedText_People_NigelJaimeson, { 1, 0, 0 }, { 1, 2, 0, 138, 3, 4, 0, 138, 0, 0 } }, + { "JONA", kFixedText_People_Jonas, { 1, 0, 0 }, { 1, 8, 0, 0 } }, + { "DUGA", kFixedText_People_ConstableDugan, { 1, 0, 0 }, { 1, 0, 0 } }, + { "INSP", kFixedText_People_InspectorLestrade, { 4, 0, 0 }, { 2, 0, 0 } } }; uint INFO_BLACK; @@ -246,17 +247,32 @@ ScalpelEngine::~ScalpelEngine() { delete _darts; } -void ScalpelEngine::initialize() { - // 3DO actually uses RGB555, but some platforms of ours only support RGB565, so we use that - - if (getPlatform() == Common::kPlatform3DO) { - const Graphics::PixelFormat pixelFormatRGB565 = Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0); - // 320x200 16-bit RGB565 for 3DO support - initGraphics(320, 200, false, &pixelFormatRGB565); - } else { +void ScalpelEngine::setupGraphics() { + if (getPlatform() != Common::kPlatform3DO) { // 320x200 palettized initGraphics(320, 200, false); + } else { + // 3DO actually uses RGB555, but some platforms of ours only support RGB565, so we use that + const Graphics::PixelFormat pixelFormatRGB565 = Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0); + + // First try for a 640x400 mode + g_system->beginGFXTransaction(); + initCommonGFX(true); + g_system->initSize(640, 400, &pixelFormatRGB565); + OSystem::TransactionError gfxError = g_system->endGFXTransaction(); + + if (gfxError == OSystem::kTransactionSuccess) { + _isScreenDoubled = true; + } else { + // System doesn't support it, so fall back on 320x200 mode + initGraphics(320, 200, false, &pixelFormatRGB565); + } } +} + +void ScalpelEngine::initialize() { + // Setup graphics mode + setupGraphics(); // Let the base engine intialize SherlockEngine::initialize(); @@ -279,9 +295,14 @@ void ScalpelEngine::initialize() { loadInventory(); // Set up list of people - for (int idx = 0; idx < MAX_PEOPLE; ++idx) - _people->_characters.push_back(PersonData(PEOPLE_DATA[idx].name, PEOPLE_DATA[idx].portrait, + ScalpelFixedText &fixedText = *(ScalpelFixedText *)_fixedText; + const char *peopleNamePtr = nullptr; + + for (int idx = 0; idx < MAX_PEOPLE; ++idx) { + peopleNamePtr = fixedText.getText(PEOPLE_DATA[idx].fixedTextId); + _people->_characters.push_back(PersonData(peopleNamePtr, PEOPLE_DATA[idx].portrait, PEOPLE_DATA[idx].stillSequences, PEOPLE_DATA[idx].talkSequences)); + } _animation->setPrologueNames(&PROLOGUE_NAMES[0], PROLOGUE_NAMES_COUNT); _animation->setPrologueFrames(&PROLOGUE_FRAMES[0][0], 6, 9); @@ -668,23 +689,25 @@ bool ScalpelEngine::show3DOSplash() { } bool ScalpelEngine::showCityCutscene3DO() { + Scalpel3DOScreen &screen = *(Scalpel3DOScreen *)_screen; _animation->_soundLibraryFilename = "TITLE.SND"; - _screen->clear(); + screen.clear(); bool finished = _events->delay(2500, true); - // rain.aiff seems to be playing in an endless loop until - // sherlock logo fades away TODO - if (finished) { finished = _events->delay(2500, true); // Play intro music _music->loadSong("prolog"); + // Loop rain.aiff until the Sherlock logo fades away. + // TODO: The volume is just a guess. + _sound->playAiff("prologue/sounds/rain.aiff", 15, true); + // Fade screen to grey - _screen->_backBuffer1.fill(0xCE59); // RGB565: 25, 50, 25 (grey) - _screen->fadeIntoScreen3DO(2); + screen._backBuffer1.fill(0xCE59); // RGB565: 25, 50, 25 (grey) + screen.fadeIntoScreen3DO(2); } if (finished) { @@ -692,33 +715,33 @@ bool ScalpelEngine::showCityCutscene3DO() { } if (finished) { - _screen->_backBuffer1.fill(0); // fill backbuffer with black to avoid issues during fade from white + screen._backBuffer1.fill(0); // fill backbuffer with black to avoid issues during fade from white finished = _animation->play3DO("26open1", true, 1, true, 2); } if (finished) { - _screen->_backBuffer1.blitFrom(*_screen); // save into backbuffer 1, used for fade - _screen->_backBuffer2.blitFrom(*_screen); // save into backbuffer 2, for restoring later + screen._backBuffer2.blitFrom(screen._backBuffer1); // "London, England" ImageFile3DO titleImage_London("title2a.cel", kImageFile3DOType_Cel); - _screen->_backBuffer1.transBlitFrom(titleImage_London[0]._frame, Common::Point(30, 50)); + screen._backBuffer1.transBlitFrom(titleImage_London[0]._frame, Common::Point(30, 50)); - _screen->fadeIntoScreen3DO(1); + screen.fadeIntoScreen3DO(1); finished = _events->delay(1500, true); if (finished) { // "November, 1888" ImageFile3DO titleImage_November("title2b.cel", kImageFile3DOType_Cel); - _screen->_backBuffer1.transBlitFrom(titleImage_November[0]._frame, Common::Point(100, 100)); + screen._backBuffer1.transBlitFrom(titleImage_November[0]._frame, Common::Point(100, 100)); - _screen->fadeIntoScreen3DO(1); + screen.fadeIntoScreen3DO(1); finished = _music->waitUntilMSec(14700, 0, 0, 5000); } if (finished) { // Restore screen - _screen->blitFrom(_screen->_backBuffer2); + _screen->_backBuffer1.blitFrom(screen._backBuffer2); + _screen->blitFrom(screen._backBuffer1); } } @@ -726,21 +749,19 @@ bool ScalpelEngine::showCityCutscene3DO() { finished = _animation->play3DO("26open2", true, 1, false, 2); if (finished) { - _screen->_backBuffer1.blitFrom(*_screen); // save into backbuffer 1, used for fade - // "Sherlock Holmes" (title) ImageFile3DO titleImage_SherlockHolmesTitle("title1ab.cel", kImageFile3DOType_Cel); - _screen->_backBuffer1.transBlitFrom(titleImage_SherlockHolmesTitle[0]._frame, Common::Point(34, 5)); + screen._backBuffer1.transBlitFrom(titleImage_SherlockHolmesTitle[0]._frame, Common::Point(34, 5)); // Blend in - _screen->fadeIntoScreen3DO(2); + screen.fadeIntoScreen3DO(2); finished = _events->delay(500, true); // Title should fade in, Copyright should be displayed a bit after that if (finished) { ImageFile3DO titleImage_Copyright("title1c.cel", kImageFile3DOType_Cel); - _screen->transBlitFrom(titleImage_Copyright[0]._frame, Common::Point(20, 190)); + screen.transBlitFrom(titleImage_Copyright[0]._frame, Common::Point(20, 190)); finished = _events->delay(3500, true); } } @@ -748,29 +769,32 @@ bool ScalpelEngine::showCityCutscene3DO() { if (finished) finished = _music->waitUntilMSec(33600, 0, 0, 2000); + _sound->stopAiff(); + if (finished) { // Fade to black - _screen->_backBuffer1.clear(); - _screen->fadeIntoScreen3DO(3); + screen._backBuffer1.clear(); + screen.fadeIntoScreen3DO(3); } if (finished) { // "In the alley behind the Regency Theatre..." ImageFile3DO titleImage_InTheAlley("title1d.cel", kImageFile3DOType_Cel); - _screen->_backBuffer1.transBlitFrom(titleImage_InTheAlley[0]._frame, Common::Point(72, 51)); + screen._backBuffer1.transBlitFrom(titleImage_InTheAlley[0]._frame, Common::Point(72, 51)); // Fade in - _screen->fadeIntoScreen3DO(4); + screen.fadeIntoScreen3DO(4); finished = _music->waitUntilMSec(39900, 0, 0, 2500); // Fade out - _screen->_backBuffer1.clear(); - _screen->fadeIntoScreen3DO(4); + screen._backBuffer1.clear(); + screen.fadeIntoScreen3DO(4); } return finished; } bool ScalpelEngine::showAlleyCutscene3DO() { + Scalpel3DOScreen &screen = *(Scalpel3DOScreen *)_screen; bool finished = _music->waitUntilMSec(43500, 0, 0, 1000); if (finished) @@ -778,8 +802,8 @@ bool ScalpelEngine::showAlleyCutscene3DO() { if (finished) { // Fade out... - _screen->_backBuffer1.clear(); - _screen->fadeIntoScreen3DO(3); + screen._backBuffer1.clear(); + screen.fadeIntoScreen3DO(3); finished = _music->waitUntilMSec(67100, 0, 0, 1000); // 66700 } @@ -794,8 +818,8 @@ bool ScalpelEngine::showAlleyCutscene3DO() { // Show screaming victim ImageFile3DO titleImage_ScreamingVictim("scream.cel", kImageFile3DOType_Cel); - _screen->clear(); - _screen->transBlitFrom(titleImage_ScreamingVictim[0]._frame, Common::Point(0, 0)); + screen.clear(); + screen.transBlitFrom(titleImage_ScreamingVictim[0]._frame, Common::Point(0, 0)); // Play "scream.aiff" if (_sound->_voices) @@ -806,8 +830,8 @@ bool ScalpelEngine::showAlleyCutscene3DO() { if (finished) { // Fade out - _screen->_backBuffer1.clear(); - _screen->fadeIntoScreen3DO(5); + screen._backBuffer1.clear(); + screen.fadeIntoScreen3DO(5); finished = _music->waitUntilMSec(84400, 0, 0, 2000); } @@ -817,17 +841,17 @@ bool ScalpelEngine::showAlleyCutscene3DO() { if (finished) { // Fade out - _screen->_backBuffer1.clear(); - _screen->fadeIntoScreen3DO(5); + screen._backBuffer1.clear(); + screen.fadeIntoScreen3DO(5); } if (finished) { // "Early the following morning on Baker Street..." ImageFile3DO titleImage_EarlyTheFollowingMorning("title3.cel", kImageFile3DOType_Cel); - _screen->_backBuffer1.transBlitFrom(titleImage_EarlyTheFollowingMorning[0]._frame, Common::Point(35, 51)); + screen._backBuffer1.transBlitFrom(titleImage_EarlyTheFollowingMorning[0]._frame, Common::Point(35, 51)); // Fade in - _screen->fadeIntoScreen3DO(4); + screen.fadeIntoScreen3DO(4); finished = _music->waitUntilMSec(96700, 0, 0, 3000); } @@ -835,12 +859,13 @@ bool ScalpelEngine::showAlleyCutscene3DO() { } bool ScalpelEngine::showStreetCutscene3DO() { + Scalpel3DOScreen &screen = *(Scalpel3DOScreen *)_screen; bool finished = true; if (finished) { // fade out "Early the following morning..." - _screen->_backBuffer1.clear(); - _screen->fadeIntoScreen3DO(4); + screen._backBuffer1.clear(); + screen.fadeIntoScreen3DO(4); // wait for music a bit finished = _music->waitUntilMSec(100300, 0, 0, 1000); @@ -859,8 +884,8 @@ bool ScalpelEngine::showStreetCutscene3DO() { if (finished) { // Fade out - _screen->_backBuffer1.clear(); - _screen->fadeIntoScreen3DO(4); + screen._backBuffer1.clear(); + screen.fadeIntoScreen3DO(4); } return finished; @@ -912,7 +937,7 @@ bool ScalpelEngine::showOfficeCutscene3DO() { // TODO: Brighten the image, possibly by doing a partial fade // to white. - _screen->_backBuffer1.blitFrom(*_screen); + _screen->_backBuffer2.blitFrom(_screen->_backBuffer1); for (int nr = 1; finished && nr <= 4; nr++) { char filename[15]; @@ -920,7 +945,7 @@ bool ScalpelEngine::showOfficeCutscene3DO() { ImageFile3DO *creditsImage = new ImageFile3DO(filename, kImageFile3DOType_Cel); ImageFrame *creditsFrame = &(*creditsImage)[0]; for (int i = 0; finished && i < 200 + creditsFrame->_height; i++) { - _screen->blitFrom(_screen->_backBuffer1); + _screen->blitFrom(_screen->_backBuffer2); _screen->transBlitFrom(creditsFrame->_frame, Common::Point((320 - creditsFrame->_width) / 2, 200 - i)); if (!_events->delay(70, true)) finished = false; @@ -1244,7 +1269,8 @@ void ScalpelEngine::showScummVMRestoreDialog() { delete dialog; } -bool ScalpelEngine::play3doMovie(const Common::String &filename, const Common::Point &pos, bool halfSize) { +bool ScalpelEngine::play3doMovie(const Common::String &filename, const Common::Point &pos, bool isPortrait) { + Scalpel3DOScreen &screen = *(Scalpel3DOScreen *)_screen; Scalpel3DOMovieDecoder *videoDecoder = new Scalpel3DOMovieDecoder(); Graphics::Surface tempSurface; @@ -1258,9 +1284,8 @@ bool ScalpelEngine::play3doMovie(const Common::String &filename, const Common::P return false; } - _screen->_backBuffer1.blitFrom(*_screen); // save into backbuffer 1 - - if (halfSize) { + bool halfSize = isPortrait && !_isScreenDoubled; + if (isPortrait) { // only for portrait videos, not for EA intro logo and such if ((framePos.x >= 8) && (framePos.y >= 8)) { // safety check framePos.x -= 8; @@ -1290,29 +1315,78 @@ bool ScalpelEngine::play3doMovie(const Common::String &filename, const Common::P if (frame) { if (halfSize) { - // Reduce the movie frame to half-size on a temp surface - for (int yp = 0; yp < height / 2; ++yp) { - const uint16 *srcP = (const uint16 *)frame->getBasePtr(0, yp * 2); - uint16 *destP = (uint16 *)tempSurface.getBasePtr(0, yp); + // movies are 152 x 200 + + // Downscale, but calculate average color out of 4 pixels and put that average into the target pixel + // TODO: 3DO actually did pixel weighting, exact details about this are unknown + // It's also unknown what 3DO exactly did for interpolation + // and it's also unknown atm if the CinePak videos contained pixel weighting information + + if ((height & 1) || (width & 1)) { + error("Scalpel3DOMoviePlay: critical error, half-size requested on video with uneven height/width"); + } - for (int xp = 0; xp < width / 2; ++xp, ++destP, srcP += 2) - *destP = *srcP; + for (int downscaleY = 0; downscaleY < height / 2; downscaleY++) { + const uint16 *downscaleSource1Ptr = (const uint16 *)frame->getBasePtr(0, downscaleY * 2); + const uint16 *downscaleSource2Ptr = (const uint16 *)frame->getBasePtr(0, (downscaleY * 2) + 1); + uint16 *downscaleTargetPtr = (uint16 *)tempSurface.getBasePtr(0, downscaleY); + + for (int downscaleX = 0; downscaleX < width / 2; downscaleX++) { + // get 4 pixel colors + uint16 downscaleColor = *downscaleSource1Ptr; + uint32 downscaleRed = downscaleColor >> 11; // 5 bits + uint32 downscaleGreen = (downscaleColor >> 5) & 0x3f; // 6 bits + uint32 downscaleBlue = downscaleColor & 0x1f; + + downscaleSource1Ptr++; + downscaleColor = *downscaleSource1Ptr; + downscaleRed += downscaleColor >> 11; + downscaleGreen += (downscaleColor >> 5) & 0x3f; + downscaleBlue += downscaleColor & 0x1f; + + downscaleColor = *downscaleSource2Ptr; + downscaleRed += downscaleColor >> 11; + downscaleGreen += (downscaleColor >> 5) & 0x3f; + downscaleBlue += downscaleColor & 0x1f; + + downscaleSource2Ptr++; + downscaleColor = *downscaleSource2Ptr; + downscaleRed += downscaleColor >> 11; + downscaleGreen += (downscaleColor >> 5) & 0x3f; + downscaleBlue += downscaleColor & 0x1f; + + // Divide colors by 4, so that we get the average + downscaleRed = downscaleRed >> 2; + downscaleGreen = downscaleGreen >> 2; + downscaleBlue = downscaleBlue >> 2; + + // write new color to target pixel + downscaleColor = (downscaleRed << 11) | (downscaleGreen << 5) | downscaleBlue; + *downscaleTargetPtr = downscaleColor; + + downscaleSource1Ptr++; + downscaleSource2Ptr++; + downscaleTargetPtr++; + } } // Point the drawing frame to the temporary surface frame = &tempSurface; + } - if (!frameShown) { - // Draw the frame (not the frame of the video, but a frame around the video) itself - _screen->transBlitFrom(frameImage->_frame, framePos); - frameShown = true; - } + if (isPortrait && !frameShown) { + // Draw the frame (not the frame of the video, but a frame around the video) itself + _screen->transBlitFrom(frameImage->_frame, framePos); + frameShown = true; + } + + if (isPortrait && !halfSize) { + screen.rawBlitFrom(*frame, Common::Point(pos.x * 2, pos.y * 2)); + } else { + _screen->blitFrom(*frame, pos); } - _screen->blitFrom(*frame, pos); _screen->update(); - //g_system->copyRectToScreen(frame->getPixels(), frame->pitch, pos.x, pos.y, frame->w, frame->h); - //g_system->updateScreen(); } } @@ -1334,11 +1408,14 @@ bool ScalpelEngine::play3doMovie(const Common::String &filename, const Common::P videoDecoder->close(); delete videoDecoder; - if (halfSize) { - delete frameImage; + if (isPortrait) { + delete frameImageFile; } - _screen->blitFrom(_screen->_backBuffer1); + // Restore scene + screen._backBuffer1.blitFrom(screen._backBuffer2); + _scene->updateBackground(); + screen.slamArea(0, 0, screen.w(), CONTROLS_Y); return !skipVideo; } diff --git a/engines/sherlock/scalpel/scalpel.h b/engines/sherlock/scalpel/scalpel.h index 7bf3615c13..af4d72a7d7 100644 --- a/engines/sherlock/scalpel/scalpel.h +++ b/engines/sherlock/scalpel/scalpel.h @@ -53,6 +53,14 @@ private: Darts *_darts; int _mapResult; + /** + * Initialize graphics mode + */ + void setupGraphics(); + + /** + * Show the 3DO splash screen + */ bool show3DOSplash(); /** @@ -142,7 +150,7 @@ public: /** * Play back a 3do movie */ - bool play3doMovie(const Common::String &filename, const Common::Point &pos, bool halfSize = false); + bool play3doMovie(const Common::String &filename, const Common::Point &pos, bool isPortrait = false); }; } // End of namespace Scalpel diff --git a/engines/sherlock/scalpel/scalpel_fixed_text.cpp b/engines/sherlock/scalpel/scalpel_fixed_text.cpp index 63f84d68c6..372fbc3e7e 100644 --- a/engines/sherlock/scalpel/scalpel_fixed_text.cpp +++ b/engines/sherlock/scalpel/scalpel_fixed_text.cpp @@ -55,6 +55,11 @@ static const char *const fixedTextEN[] = { "Backward", "Forward", "Text Not Found !", + // SH1: Press key text + "Press any Key for More.", + "P", + "Press any Key to Continue.", + "P", // SH1: Initial Inventory "A message requesting help", "A number of business cards", @@ -68,11 +73,67 @@ static const char *const fixedTextEN[] = { "Tarot Cards", "An ornate key", "A pawn ticket", - // SH2: Verbs - "Open", - "Look", - "Talk", - "Journal" + // SH1: People names + "Sherlock Holmes", + "Dr. Watson", + "Inspector Lestrade", + "Constable O'Brien", + "Constable Lewis", + "Sheila Parker", + "Henry Carruthers", + "Lesley", + "An Usher", + "Fredrick Epstein", + "Mrs. Worthington", + "The Coach", + "A Player", + "Tim", + "James Sanders", + "Belle", + "Cleaning Girl", + "Wiggins", + "Paul", + "The Bartender", + "A Dirty Drunk", + "A Shouting Drunk", + "A Staggering Drunk", + "The Bouncer", + "The Coroner", + "Reginald Snipes", + "George Blackwood", + "Lars", + "The Chemist", + "Inspector Gregson", + "Jacob Farthington", + "Mycroft", + "Old Sherman", + "Richard", + "The Barman", + "A Dandy Player", + "A Rough-looking Player", + "A Spectator", + "Robert Hunt", + "Violet", + "Pettigrew", + "Augie", + "Anna Carroway", + "A Guard", + "Antonio Caruso", + "Toby the Dog", + "Simon Kingsley", + "Alfred", + "Lady Brumwell", + "Madame Rosa", + "Joseph Moorehead", + "Mrs. Beale", + "Felix", + "Hollingston", + "Constable Callaghan", + "Sergeant Duncan", + "Lord Brumwell", + "Nigel Jaimeson", + "Jonas", + "Constable Dugan" }; // sharp-s : 0xE1 / octal 341 @@ -107,6 +168,11 @@ static const char *const fixedTextDE[] = { "R\201ckw\204rts", // original: "Backward" "Vorw\204rts", // original: "Forward" "Text nicht gefunden!", + // SH1: Press key text + "Mehr auf Tastendruck...", + "M", + "Beliebige Taste dr\201cken.", + "B", // SH1: Initial Inventory "Ein Hilferuf von Lestrade", "Holmes' Visitenkarten", @@ -117,14 +183,70 @@ static const char *const fixedTextDE[] = { "Eine offene Taschenuhr", "Ein Zettel mit Zahlen drauf", "Ein mehrfach gefalteter Briefbogen", - "Ein Tarock-Kartenspiel", // [sic] + "Ein Tarot-Kartenspiel", // original interpreter: "Ein Tarock-Kartenspiel" [sic] "Ein verzierter Schl\201ssel", "Ein Pfandschein", - // SH2: Verbs - "\231ffne", - "Schau", - "Rede", - "Tagebuch" + // SH1: People names + "Sherlock Holmes", + "Dr. Watson", + "Inspektor Lestrade", + "Konstabler O'Brien", + "Konstabler Lewis", + "Sheila Parker", + "Henry Carruthers", + "Lesley", + "Platzanweiser", + "Fredrick Epstein", + "Mrs. Worthington", + "Der Trainer", + "Ein Spieler", + "Tim", + "James Sanders", + "Belle", + "Putzm\204dchen", + "Wiggins", + "Paul", + "Gastwirt", + "Schmutziger Betrunkener", + "Lallender Betrunkener", + "Torkelnder Betrunkener", + "The Bouncer", + "Der Leichenbeschauer", + "Reginald Snipes", + "George Blackwood", + "Lars", + "Apotheker", + "Inspektor Gregson", + "Jacob Farthington", + "Mycroft", + "Old Sherman", + "Richard", + "Barkeeper", + "Jock Mahoney", + "Nobby Charleton", + "Zuschauer", + "Robert Hunt", + "Violet", + "Pettigrew", + "Augie", + "Anna Carroway", + "Wache", + "Antonio Caruso", + "Toby the Dog", + "Simon Kingsley", + "Alfred", + "Lady Brumwell", + "Madame Rosa", + "Joseph Moorehead", + "Mrs. Beale", + "Felix", + "Hollingston", + "Konstabler Callaghan", + "Sergeant Duncan", + "Lord Brumwell", + "Nigel Jaimeson", + "Jonas", + "Konstabler Dugan" }; // up-side down exclamation mark - 0xAD / octal 255 @@ -132,11 +254,11 @@ static const char *const fixedTextDE[] = { // n with a wave on top - 0xA4 / octal 244 static const char *const fixedTextES[] = { // SH1: Window buttons - "Exit", + "Salir", // original interpreter: "Exit" "Subir", "Bajar", // SH1: Inventory buttons - "Exit", + "Salir", // original interpreter: "Exit" "Mirar", "Usar", "Dar", @@ -144,7 +266,7 @@ static const char *const fixedTextES[] = { "Diario de Watson", "Pagina %d", // SH1: Journal buttons - "Exit", + "Salir", // original interpreter: "Exit" "Retroceder", "Subir", "baJar", @@ -154,10 +276,15 @@ static const char *const fixedTextES[] = { "Ult pagina", "Imprimir", // SH1: Journal search - "Exit", + "Salir", // original interpreter: "Exit" "Retroceder", "Avanzar", "Texto no encontrado!", + // SH1: Press key text + "Tecla para ver mas", + "T", + "Tecla para continuar", + "T", // SH1: Initial Inventory "Un mensaje solicitando ayuda", "Unas cuantas tarjetas de visita", @@ -171,6 +298,67 @@ static const char *const fixedTextES[] = { "Unas cartas de Tarot", "Una llave muy vistosa", "Una papeleta de empe\244o", + // SH1: People names + "Sherlock Holmes", + "Dr. Watson", + "El inspector Lestrade", + "El agente O'Brien", + "El agente Lewis", + "Sheila Parker", + "Henry Carruthers", + "Lesley", + "Un ujier", + "Fredrick Epstein", + "Mrs. Worthington", + "El entrenador", + "El jugador", + "Tim", + "James Sanders", + "Belle", + "La chica de la limpieza", + "Wiggins", + "Paul", + "El barman", + "Un sucio borracho", + "Un borracho griton", + "Un tambaleante borracho", + "El gorila", + "El forense", + "Reginald Snipes", + "George Blackwood", + "Lars", + "El quimico", + "El inspector Gregson", + "Jacob Farthington", + "Mycroft", + "Old Sherman", + "Richard", + "El barman", + "Un jugador dandy", + "Un duro jugador", + "Un espectador", + "Robert Hunt", + "Violeta", + "Pettigrew", + "Augie", + "Anna Carroway", + "Un guarda", + "Antonio Caruso", + "El perro Toby", + "Simon Kingsley", + "Alfred", + "Lady Brumwell", + "Madame Rosa", + "Joseph Moorehead", + "Mrs. Beale", + "Felix", + "Hollingston", + "El agente Callaghan", + "El sargento Duncan", + "Lord Brumwell", + "Nigel Jaimeson", + "Jonas", + "El agente Dugan" }; // ========================================= diff --git a/engines/sherlock/scalpel/scalpel_fixed_text.h b/engines/sherlock/scalpel/scalpel_fixed_text.h index eae86b8f27..f46587ce81 100644 --- a/engines/sherlock/scalpel/scalpel_fixed_text.h +++ b/engines/sherlock/scalpel/scalpel_fixed_text.h @@ -57,6 +57,11 @@ enum FixedTextId { kFixedText_JournalSearch_Backward, kFixedText_JournalSearch_Forward, kFixedText_JournalSearch_NotFound, + // Press key text + kFixedText_PressKey_ForMore, + kFixedText_PressKey_ForMoreHotkey, + kFixedText_PressKey_ToContinue, + kFixedText_PressKey_ToContinueHotkey, // Initial inventory kFixedText_InitInventory_Message, kFixedText_InitInventory_HolmesCard, @@ -69,7 +74,68 @@ enum FixedTextId { kFixedText_InitInventory_Letter, kFixedText_InitInventory_Tarot, kFixedText_InitInventory_OrnateKey, - kFixedText_InitInventory_PawnTicket + kFixedText_InitInventory_PawnTicket, + // People names + kFixedText_People_SherlockHolmes, + kFixedText_People_DrWatson, + kFixedText_People_InspectorLestrade, + kFixedText_People_ConstableOBrien, + kFixedText_People_ConstableLewis, + kFixedText_People_SheilaParker, + kFixedText_People_HenryCarruthers, + kFixedText_People_Lesley, + kFixedText_People_AnUsher, + kFixedText_People_FredrickEpstein, + kFixedText_People_MrsWorthington, + kFixedText_People_TheCoach, + kFixedText_People_APlayer, + kFixedText_People_Tim, + kFixedText_People_JamesSanders, + kFixedText_People_Belle, + kFixedText_People_CleaningGirl, + kFixedText_People_Wiggins, + kFixedText_People_Paul, + kFixedText_People_TheBartender, + kFixedText_People_ADirtyDrunk, + kFixedText_People_AShoutingDrunk, + kFixedText_People_AStaggeringDrunk, + kFixedText_People_TheBouncer, + kFixedText_People_TheCoroner, + kFixedText_People_ReginaldSnipes, + kFixedText_People_GeorgeBlackwood, + kFixedText_People_Lars, + kFixedText_People_TheChemist, + kFixedText_People_InspectorGregson, + kFixedText_People_JacobFarthington, + kFixedText_People_Mycroft, + kFixedText_People_OldSherman, + kFixedText_People_Richard, + kFixedText_People_TheBarman, + kFixedText_People_ADandyPlayer, + kFixedText_People_ARoughlookingPlayer, + kFixedText_People_ASpectator, + kFixedText_People_RobertHunt, + kFixedText_People_Violet, + kFixedText_People_Pettigrew, + kFixedText_People_Augie, + kFixedText_People_AnnaCarroway, + kFixedText_People_AGuard, + kFixedText_People_AntonioCaruso, + kFixedText_People_TobyTheDog, + kFixedText_People_SimonKingsley, + kFixedText_People_Alfred, + kFixedText_People_LadyBrumwell, + kFixedText_People_MadameRosa, + kFixedText_People_JosephMoorehead, + kFixedText_People_MrsBeale, + kFixedText_People_Felix, + kFixedText_People_Hollingston, + kFixedText_People_ConstableCallaghan, + kFixedText_People_SergeantDuncan, + kFixedText_People_LordBrumwell, + kFixedText_People_NigelJaimeson, + kFixedText_People_Jonas, + kFixedText_People_ConstableDugan }; struct FixedTextActionEntry { diff --git a/engines/sherlock/scalpel/scalpel_journal.cpp b/engines/sherlock/scalpel/scalpel_journal.cpp index 787d899aee..5c2b8f77f3 100644 --- a/engines/sherlock/scalpel/scalpel_journal.cpp +++ b/engines/sherlock/scalpel/scalpel_journal.cpp @@ -104,6 +104,25 @@ void ScalpelJournal::loadLocations() { while ((c = loc->readByte()) != 0) line += c; + // WORKAROUND: Special fixes for faulty translations + // Was obviously not done in the original interpreter + if (_vm->getLanguage() == Common::ES_ESP) { + // Spanish version + // We fix all sorts of typos + // see bug #6931 + if (line == "En el cajellon destras del teatro Regency") { + line = "En el callejon detras del teatro Regency"; + } else if (line == "En el apartamente de Simon Kingsley") { + line = "En el apartamento de Simon Kingsley"; + } else if (line == "Bajo la muelle de Savoy Pier") { + line = "Bajo el muelle de Savoy Pier"; + } else if (line == "En le viejo Sherman") { + line = "En el viejo Sherman"; + } else if (line == "En la entrada de la cada de Anna Carroway") { + line = "En la entrada de la casa de Anna Carroway"; + } + } + _locations.push_back(line); } diff --git a/engines/sherlock/scalpel/scalpel_map.cpp b/engines/sherlock/scalpel/scalpel_map.cpp index 369822ba02..0924581e38 100644 --- a/engines/sherlock/scalpel/scalpel_map.cpp +++ b/engines/sherlock/scalpel/scalpel_map.cpp @@ -100,6 +100,21 @@ void ScalpelMap::loadData() { while ((c = txtStream->readByte()) != '\0') line += c; + // WORKAROUND: Special fixes for faulty translations + // Was obviously not done in the original interpreter + if (_vm->getLanguage() == Common::ES_ESP) { + // Spanish version + if (line == " Alley") { + // The "Alley" location was not translated, we do this now + // see bug #6931 + line = " Callejon"; + } else if (line == " Alamacen") { + // "Warehouse" location has a typo, we fix it + // see bug #6931 + line = " Almacen"; + } + } + _locationNames.push_back(line); } diff --git a/engines/sherlock/scalpel/scalpel_scene.cpp b/engines/sherlock/scalpel/scalpel_scene.cpp index b2c7339363..b62703e0fb 100644 --- a/engines/sherlock/scalpel/scalpel_scene.cpp +++ b/engines/sherlock/scalpel/scalpel_scene.cpp @@ -40,6 +40,11 @@ const int FS_TRANS[8] = { /*----------------------------------------------------------------*/ +ScalpelScene::~ScalpelScene() { + for (uint idx = 0; idx < _canimShapes.size(); ++idx) + delete _canimShapes[idx]; +} + bool ScalpelScene::loadScene(const Common::String &filename) { ScalpelMap &map = *(ScalpelMap *)_vm->_map; bool result = Scene::loadScene(filename); @@ -71,9 +76,9 @@ void ScalpelScene::drawAllShapes() { // Draw all canimations which are behind the person for (uint idx = 0; idx < _canimShapes.size(); ++idx) { - if (_canimShapes[idx]._type == ACTIVE_BG_SHAPE && _canimShapes[idx]._misc == BEHIND) - screen._backBuffer->transBlitFrom(*_canimShapes[idx]._imageFrame, - _canimShapes[idx]._position, _canimShapes[idx]._flags & OBJ_FLIPPED); + if (_canimShapes[idx]->_type == ACTIVE_BG_SHAPE && _canimShapes[idx]->_misc == BEHIND) + screen._backBuffer->transBlitFrom(*_canimShapes[idx]->_imageFrame, + _canimShapes[idx]->_position, _canimShapes[idx]->_flags & OBJ_FLIPPED); } // Draw all active shapes which are normal and behind the person @@ -84,9 +89,9 @@ void ScalpelScene::drawAllShapes() { // Draw all canimations which are normal and behind the person for (uint idx = 0; idx < _canimShapes.size(); ++idx) { - if (_canimShapes[idx]._type == ACTIVE_BG_SHAPE && _canimShapes[idx]._misc == NORMAL_BEHIND) - screen._backBuffer->transBlitFrom(*_canimShapes[idx]._imageFrame, _canimShapes[idx]._position, - _canimShapes[idx]._flags & OBJ_FLIPPED); + if (_canimShapes[idx]->_type == ACTIVE_BG_SHAPE && _canimShapes[idx]->_misc == NORMAL_BEHIND) + screen._backBuffer->transBlitFrom(*_canimShapes[idx]->_imageFrame, _canimShapes[idx]->_position, + _canimShapes[idx]->_flags & OBJ_FLIPPED); } // Draw any active characters @@ -113,10 +118,10 @@ void ScalpelScene::drawAllShapes() { // Draw all static and active canimations that are NORMAL and are in front of the player for (uint idx = 0; idx < _canimShapes.size(); ++idx) { - if ((_canimShapes[idx]._type == ACTIVE_BG_SHAPE || _canimShapes[idx]._type == STATIC_BG_SHAPE) && - _canimShapes[idx]._misc == NORMAL_FORWARD) - screen._backBuffer->transBlitFrom(*_canimShapes[idx]._imageFrame, _canimShapes[idx]._position, - _canimShapes[idx]._flags & OBJ_FLIPPED); + if ((_canimShapes[idx]->_type == ACTIVE_BG_SHAPE || _canimShapes[idx]->_type == STATIC_BG_SHAPE) && + _canimShapes[idx]->_misc == NORMAL_FORWARD) + screen._backBuffer->transBlitFrom(*_canimShapes[idx]->_imageFrame, _canimShapes[idx]->_position, + _canimShapes[idx]->_flags & OBJ_FLIPPED); } // Draw all static and active shapes that are FORWARD @@ -133,10 +138,10 @@ void ScalpelScene::drawAllShapes() { // Draw all static and active canimations that are forward for (uint idx = 0; idx < _canimShapes.size(); ++idx) { - if ((_canimShapes[idx]._type == ACTIVE_BG_SHAPE || _canimShapes[idx]._type == STATIC_BG_SHAPE) && - _canimShapes[idx]._misc == FORWARD) - screen._backBuffer->transBlitFrom(*_canimShapes[idx]._imageFrame, _canimShapes[idx]._position, - _canimShapes[idx]._flags & OBJ_FLIPPED); + if ((_canimShapes[idx]->_type == ACTIVE_BG_SHAPE || _canimShapes[idx]->_type == STATIC_BG_SHAPE) && + _canimShapes[idx]->_misc == FORWARD) + screen._backBuffer->transBlitFrom(*_canimShapes[idx]->_imageFrame, _canimShapes[idx]->_position, + _canimShapes[idx]->_flags & OBJ_FLIPPED); } screen.resetDisplayBounds(); @@ -152,7 +157,7 @@ void ScalpelScene::checkBgShapes() { // Iterate through the canim list for (uint idx = 0; idx < _canimShapes.size(); ++idx) { - Object &obj = _canimShapes[idx]; + Object &obj = *_canimShapes[idx]; if (obj._type == STATIC_BG_SHAPE || obj._type == ACTIVE_BG_SHAPE) { if ((obj._flags & 5) == 1) { obj._misc = (pt.y < (obj._position.y + obj._imageFrame->_frame.h - 1)) ? @@ -221,8 +226,8 @@ void ScalpelScene::doBgAnim() { people._portrait.checkObject(); for (uint idx = 0; idx < _canimShapes.size(); ++idx) { - if (_canimShapes[idx]._type != INVALID && _canimShapes[idx]._type != REMOVE) - _canimShapes[idx].checkObject(); + if (_canimShapes[idx]->_type != INVALID && _canimShapes[idx]->_type != REMOVE) + _canimShapes[idx]->checkObject(); } if (_currentScene == DRAWING_ROOM) @@ -266,7 +271,7 @@ void ScalpelScene::doBgAnim() { } for (uint idx = 0; idx < _canimShapes.size(); ++idx) { - Object &o = _canimShapes[idx]; + Object &o = *_canimShapes[idx]; if (o._type == ACTIVE_BG_SHAPE || o._type == HIDE_SHAPE || o._type == REMOVE) screen.restoreBackground(Common::Rect(o._oldPosition.x, o._oldPosition.y, o._oldPosition.x + o._oldSize.x, o._oldPosition.y + o._oldSize.y)); @@ -287,8 +292,8 @@ void ScalpelScene::doBgAnim() { people._portrait.adjustObject(); for (uint idx = 0; idx < _canimShapes.size(); ++idx) { - if (_canimShapes[idx]._type != INVALID) - _canimShapes[idx].adjustObject(); + if (_canimShapes[idx]->_type != INVALID) + _canimShapes[idx]->adjustObject(); } if (people[HOLMES]._type == CHARACTER && people._holmesOn) @@ -309,7 +314,7 @@ void ScalpelScene::doBgAnim() { // Draw all canimations which are behind the person for (uint idx = 0; idx < _canimShapes.size(); ++idx) { - Object &o = _canimShapes[idx]; + Object &o = *_canimShapes[idx]; if (o._type == ACTIVE_BG_SHAPE && o._misc == BEHIND) { screen._backBuffer->transBlitFrom(*o._imageFrame, o._position, o._flags & OBJ_FLIPPED); } @@ -324,14 +329,14 @@ void ScalpelScene::doBgAnim() { // Draw all canimations which are NORMAL and behind the person for (uint idx = 0; idx < _canimShapes.size(); ++idx) { - Object &o = _canimShapes[idx]; + Object &o = *_canimShapes[idx]; if (o._type == ACTIVE_BG_SHAPE && o._misc == NORMAL_BEHIND) { screen._backBuffer->transBlitFrom(*o._imageFrame, o._position, o._flags & OBJ_FLIPPED); } } - // Draw the person if not animating - if (people[HOLMES]._type == CHARACTER && people[HOLMES]._walkLoaded) { + // Draw the player if he's active and his walk has been loaded into memory + if (people[HOLMES]._type == CHARACTER && people[HOLMES]._walkLoaded && people._holmesOn) { // If Holmes is too far to the right, move him back so he's on-screen int xRight = SHERLOCK_SCREEN_WIDTH - 2 - people[HOLMES]._imageFrame->_frame.w; int tempX = MIN(people[HOLMES]._position.x / FIXED_INT_MULTIPLIER, xRight); @@ -352,7 +357,7 @@ void ScalpelScene::doBgAnim() { // Draw all static and active canimations that are NORMAL and are in front of the person for (uint idx = 0; idx < _canimShapes.size(); ++idx) { - Object &o = _canimShapes[idx]; + Object &o = *_canimShapes[idx]; if ((o._type == ACTIVE_BG_SHAPE || o._type == STATIC_BG_SHAPE) && o._misc == NORMAL_FORWARD) { screen._backBuffer->transBlitFrom(*o._imageFrame, o._position, o._flags & OBJ_FLIPPED); } @@ -372,7 +377,7 @@ void ScalpelScene::doBgAnim() { // Draw all static and active canimations that are in front of the person for (uint idx = 0; idx < _canimShapes.size(); ++idx) { - Object &o = _canimShapes[idx]; + Object &o = *_canimShapes[idx]; if ((o._type == ACTIVE_BG_SHAPE || o._type == STATIC_BG_SHAPE) && o._misc == FORWARD) { screen._backBuffer->transBlitFrom(*o._imageFrame, o._position, o._flags & OBJ_FLIPPED); } @@ -450,16 +455,18 @@ void ScalpelScene::doBgAnim() { } for (int idx = _canimShapes.size() - 1; idx >= 0; --idx) { - Object &o = _canimShapes[idx]; + Object &o = *_canimShapes[idx]; if (o._type == INVALID) { // Anim shape was invalidated by checkEndOfSequence, so at this point we can remove it + delete _canimShapes[idx]; _canimShapes.remove_at(idx); } else if (o._type == REMOVE) { if (_goToScene == -1) screen.slamArea(o._position.x, o._position.y, o._delta.x, o._delta.y); // Shape for an animation is no longer needed, so remove it completely + delete _canimShapes[idx]; _canimShapes.remove_at(idx); } else if (o._type == ACTIVE_BG_SHAPE) { screen.flushImage(o._imageFrame, o._position, @@ -496,6 +503,7 @@ int ScalpelScene::startCAnim(int cAnimNum, int playRate) { int tpDir, walkDir; int tFrames = 0; int gotoCode = -1; + Object *cObj; // Validation if (cAnimNum >= (int)_cAnim.size()) @@ -533,33 +541,33 @@ int ScalpelScene::startCAnim(int cAnimNum, int playRate) { return 1; // Add new anim shape entry for displaying the animation - _canimShapes.push_back(Object()); - Object &cObj = _canimShapes[_canimShapes.size() - 1]; + cObj = new Object(); + _canimShapes.push_back(cObj); // Copy the canimation into the bgShapes type canimation structure so it can be played - cObj._allow = cAnimNum + 1; // Keep track of the parent structure - cObj._name = _cAnim[cAnimNum]._name; // Copy name + cObj->_allow = cAnimNum + 1; // Keep track of the parent structure + cObj->_name = _cAnim[cAnimNum]._name; // Copy name // Remove any attempt to draw object frame if (cAnim._type == NO_SHAPE && cAnim._sequences[0] < 100) cAnim._sequences[0] = 0; - cObj._sequences = cAnim._sequences; - cObj._images = nullptr; - cObj._position = cAnim._position; - cObj._delta = Common::Point(0, 0); - cObj._type = cAnim._type; - cObj._flags = cAnim._flags; - - cObj._maxFrames = 0; - cObj._frameNumber = -1; - cObj._sequenceNumber = cAnimNum; - cObj._oldPosition = Common::Point(0, 0); - cObj._oldSize = Common::Point(0, 0); - cObj._goto = Common::Point(0, 0); - cObj._status = 0; - cObj._misc = 0; - cObj._imageFrame = nullptr; + cObj->_sequences = cAnim._sequences; + cObj->_images = nullptr; + cObj->_position = cAnim._position; + cObj->_delta = Common::Point(0, 0); + cObj->_type = cAnim._type; + cObj->_flags = cAnim._flags; + + cObj->_maxFrames = 0; + cObj->_frameNumber = -1; + cObj->_sequenceNumber = cAnimNum; + cObj->_oldPosition = Common::Point(0, 0); + cObj->_oldSize = Common::Point(0, 0); + cObj->_goto = Common::Point(0, 0); + cObj->_status = 0; + cObj->_misc = 0; + cObj->_imageFrame = nullptr; if (cAnim._name.size() > 0 && cAnim._type != NO_SHAPE) { if (tpPos.x != -1) @@ -584,25 +592,25 @@ int ScalpelScene::startCAnim(int cAnimNum, int playRate) { // Now load the resource as an image if (!IS_3DO) { - cObj._images = new ImageFile(fname); + cObj->_images = new ImageFile(fname); } else { - cObj._images = new ImageFile3DO(fname, kImageFile3DOType_RoomFormat); + cObj->_images = new ImageFile3DO(fname, kImageFile3DOType_RoomFormat); } - cObj._imageFrame = &(*cObj._images)[0]; - cObj._maxFrames = cObj._images->size(); + cObj->_imageFrame = &(*cObj->_images)[0]; + cObj->_maxFrames = cObj->_images->size(); int frames = 0; if (playRate < 0) { // Reverse direction // Count number of frames - while (frames < MAX_FRAME && cObj._sequences[frames]) + while (frames < MAX_FRAME && cObj->_sequences[frames]) ++frames; } else { // Forward direction BaseObject::_countCAnimFrames = true; - while (cObj._type == ACTIVE_BG_SHAPE) { - cObj.checkObject(); + while (cObj->_type == ACTIVE_BG_SHAPE) { + cObj->checkObject(); ++frames; if (frames >= 1000) @@ -614,10 +622,10 @@ int ScalpelScene::startCAnim(int cAnimNum, int playRate) { BaseObject::_countCAnimFrames = false; - cObj._type = cAnim._type; - cObj._frameNumber = -1; - cObj._position = cAnim._position; - cObj._delta = Common::Point(0, 0); + cObj->_type = cAnim._type; + cObj->_frameNumber = -1; + cObj->_position = cAnim._position; + cObj->_delta = Common::Point(0, 0); } // Return if animation has no frames in it @@ -631,7 +639,7 @@ int ScalpelScene::startCAnim(int cAnimNum, int playRate) { if (playRate < 0) { // Play in reverse dir = -2; - cObj._frameNumber = frames - 3; + cObj->_frameNumber = frames - 3; } else { dir = 0; } @@ -648,14 +656,14 @@ int ScalpelScene::startCAnim(int cAnimNum, int playRate) { // Repeat same frame int temp = repeat; while (--temp > 0) { - cObj._frameNumber--; + cObj->_frameNumber--; doBgAnim(); if (_vm->shouldQuit()) return 0; } - cObj._frameNumber += dir; + cObj->_frameNumber += dir; } people[HOLMES]._type = CHARACTER; @@ -670,14 +678,18 @@ int ScalpelScene::startCAnim(int cAnimNum, int playRate) { if (playRate < 0) // Reverse direction - set to end sequence - cObj._frameNumber = tFrames - 1; + cObj->_frameNumber = tFrames - 1; - if (cObj._frameNumber <= 26) - gotoCode = cObj._sequences[cObj._frameNumber + 3]; + if (cObj->_frameNumber <= 26) + gotoCode = cObj->_sequences[cObj->_frameNumber + 3]; - // Unless anim shape has already been freed, set it to REMOVE so doBgAnim can free it - if (_canimShapes.indexOf(cObj) != -1) - cObj.checkObject(); + // Unless anim shape has already been removed, do a final check to allow it to become REMOVEd + for (uint idx = 0; idx < _canimShapes.size(); ++idx) { + if (_canimShapes[idx] == cObj) { + cObj->checkObject(); + break; + } + } if (gotoCode > 0 && !talk._talkToAbort) { _goToScene = gotoCode; diff --git a/engines/sherlock/scalpel/scalpel_scene.h b/engines/sherlock/scalpel/scalpel_scene.h index 8fe3b66b38..8711fea2d0 100644 --- a/engines/sherlock/scalpel/scalpel_scene.h +++ b/engines/sherlock/scalpel/scalpel_scene.h @@ -75,6 +75,8 @@ protected: public: ScalpelScene(SherlockEngine *vm) : Scene(vm) {} + virtual ~ScalpelScene(); + /** * Draw all objects and characters. */ diff --git a/engines/sherlock/scalpel/scalpel_screen.cpp b/engines/sherlock/scalpel/scalpel_screen.cpp index 44113b2a5d..71bcca5dc5 100644 --- a/engines/sherlock/scalpel/scalpel_screen.cpp +++ b/engines/sherlock/scalpel/scalpel_screen.cpp @@ -88,6 +88,255 @@ void ScalpelScreen::makeField(const Common::Rect &r) { _backBuffer->vLine(r.right - 1, r.top + 1, r.bottom - 2, BUTTON_TOP); } +/*----------------------------------------------------------------*/ + +void Scalpel3DOScreen::blitFrom(const Graphics::Surface &src, const Common::Point &pt, const Common::Rect &srcBounds) { + if (!_vm->_isScreenDoubled) { + ScalpelScreen::blitFrom(src, pt, srcBounds); + return; + } + + Common::Rect srcRect = srcBounds; + Common::Rect destRect(pt.x, pt.y, pt.x + srcRect.width(), pt.y + srcRect.height()); + + if (!srcRect.isValidRect() || !clip(srcRect, destRect)) + return; + + // Add dirty area remapped to the 640x200 surface + addDirtyRect(Common::Rect(destRect.left * 2, destRect.top * 2, destRect.right * 2, destRect.bottom * 2)); + + // Transfer the area, doubling each pixel + for (int yp = 0; yp < srcRect.height(); ++yp) { + const uint16 *srcP = (const uint16 *)src.getBasePtr(srcRect.left, srcRect.top + yp); + uint16 *destP = (uint16 *)getBasePtr(destRect.left * 2, (destRect.top + yp) * 2); + + for (int xp = srcRect.left; xp < srcRect.right; ++xp, ++srcP, destP += 2) { + *destP = *srcP; + *(destP + 1) = *srcP; + *(destP + 640) = *srcP; + *(destP + 640 + 1) = *srcP; + } + } +} + +void Scalpel3DOScreen::transBlitFromUnscaled(const Graphics::Surface &src, const Common::Point &pt, + bool flipped, int overrideColor) { + if (!_vm->_isScreenDoubled) { + ScalpelScreen::transBlitFromUnscaled(src, pt, flipped, overrideColor); + return; + } + + Common::Rect drawRect(0, 0, src.w, src.h); + Common::Rect destRect(pt.x, pt.y, pt.x + src.w, pt.y + src.h); + + // Clip the display area to on-screen + if (!clip(drawRect, destRect)) + // It's completely off-screen + return; + + if (flipped) + drawRect = Common::Rect(src.w - drawRect.right, src.h - drawRect.bottom, + src.w - drawRect.left, src.h - drawRect.top); + + Common::Point destPt(destRect.left, destRect.top); + addDirtyRect(Common::Rect(destPt.x * 2, destPt.y * 2, (destPt.x + drawRect.width()) * 2, + (destPt.y + drawRect.height()) * 2)); + + assert(src.format.bytesPerPixel == 2 && _surface.format.bytesPerPixel == 2); + + for (int yp = 0; yp < drawRect.height(); ++yp) { + const uint16 *srcP = (const uint16 *)src.getBasePtr( + flipped ? drawRect.right - 1 : drawRect.left, drawRect.top + yp); + uint16 *destP = (uint16 *)getBasePtr(destPt.x * 2, (destPt.y + yp) * 2); + + for (int xp = 0; xp < drawRect.width(); ++xp, destP += 2) { + // RGB 0, 0, 0 -> transparent on 3DO + if (*srcP) { + *destP = *srcP; + *(destP + 1) = *srcP; + *(destP + 640) = *srcP; + *(destP + 640 + 1) = *srcP; + } + + srcP = flipped ? srcP - 1 : srcP + 1; + } + } +} + +void Scalpel3DOScreen::fillRect(const Common::Rect &r, uint color) { + if (_vm->_isScreenDoubled) + ScalpelScreen::fillRect(Common::Rect(r.left * 2, r.top * 2, r.right * 2, r.bottom * 2), color); + else + ScalpelScreen::fillRect(r, color); +} + +void Scalpel3DOScreen::fadeIntoScreen3DO(int speed) { + Events &events = *_vm->_events; + uint16 *currentScreenBasePtr = (uint16 *)getPixels(); + uint16 *targetScreenBasePtr = (uint16 *)_backBuffer->getPixels(); + uint16 currentScreenPixel = 0; + uint16 targetScreenPixel = 0; + + uint16 currentScreenPixelRed = 0; + uint16 currentScreenPixelGreen = 0; + uint16 currentScreenPixelBlue = 0; + + uint16 targetScreenPixelRed = 0; + uint16 targetScreenPixelGreen = 0; + uint16 targetScreenPixelBlue = 0; + + uint16 screenWidth = SHERLOCK_SCREEN_WIDTH; + uint16 screenHeight = SHERLOCK_SCREEN_HEIGHT; + uint16 screenX = 0; + uint16 screenY = 0; + uint16 pixelsChanged = 0; + + clearDirtyRects(); + + do { + pixelsChanged = 0; + uint16 *currentScreenPtr = currentScreenBasePtr; + uint16 *targetScreenPtr = targetScreenBasePtr; + + for (screenY = 0; screenY < screenHeight; screenY++) { + for (screenX = 0; screenX < screenWidth; screenX++) { + currentScreenPixel = *currentScreenPtr; + targetScreenPixel = *targetScreenPtr; + + if (currentScreenPixel != targetScreenPixel) { + // pixel doesn't match, adjust accordingly + currentScreenPixelRed = currentScreenPixel & 0xF800; + currentScreenPixelGreen = currentScreenPixel & 0x07E0; + currentScreenPixelBlue = currentScreenPixel & 0x001F; + targetScreenPixelRed = targetScreenPixel & 0xF800; + targetScreenPixelGreen = targetScreenPixel & 0x07E0; + targetScreenPixelBlue = targetScreenPixel & 0x001F; + + if (currentScreenPixelRed != targetScreenPixelRed) { + if (currentScreenPixelRed < targetScreenPixelRed) { + currentScreenPixelRed += 0x0800; + } else { + currentScreenPixelRed -= 0x0800; + } + } + if (currentScreenPixelGreen != targetScreenPixelGreen) { + // Adjust +2/-2 because we are running RGB555 at RGB565 + if (currentScreenPixelGreen < targetScreenPixelGreen) { + currentScreenPixelGreen += 0x0040; + } else { + currentScreenPixelGreen -= 0x0040; + } + } + if (currentScreenPixelBlue != targetScreenPixelBlue) { + if (currentScreenPixelBlue < targetScreenPixelBlue) { + currentScreenPixelBlue += 0x0001; + } else { + currentScreenPixelBlue -= 0x0001; + } + } + + uint16 v = currentScreenPixelRed | currentScreenPixelGreen | currentScreenPixelBlue; + *currentScreenPtr = v; + if (_vm->_isScreenDoubled) { + *(currentScreenPtr + 1) = v; + *(currentScreenPtr + 640) = v; + *(currentScreenPtr + 640 + 1) = v; + } + + pixelsChanged++; + } + + currentScreenPtr += _vm->_isScreenDoubled ? 2 : 1; + targetScreenPtr++; + } + + if (_vm->_isScreenDoubled) + currentScreenPtr += 640; + } + + // Too much considered dirty at the moment + if (_vm->_isScreenDoubled) + addDirtyRect(Common::Rect(0, 0, screenWidth * 2, screenHeight * 2)); + else + addDirtyRect(Common::Rect(0, 0, screenWidth, screenHeight)); + + events.pollEvents(); + events.delay(10 * speed); + } while ((pixelsChanged) && (!_vm->shouldQuit())); +} + +void Scalpel3DOScreen::blitFrom3DOcolorLimit(uint16 limitColor) { + uint16 *currentScreenPtr = (uint16 *)getPixels(); + uint16 *targetScreenPtr = (uint16 *)_backBuffer->getPixels(); + uint16 currentScreenPixel = 0; + + uint16 screenWidth = SHERLOCK_SCREEN_WIDTH; + uint16 screenHeight = SHERLOCK_SCREEN_HEIGHT; + uint16 screenX = 0; + uint16 screenY = 0; + + uint16 currentScreenPixelRed = 0; + uint16 currentScreenPixelGreen = 0; + uint16 currentScreenPixelBlue = 0; + + uint16 limitPixelRed = limitColor & 0xF800; + uint16 limitPixelGreen = limitColor & 0x07E0; + uint16 limitPixelBlue = limitColor & 0x001F; + + for (screenY = 0; screenY < screenHeight; screenY++) { + for (screenX = 0; screenX < screenWidth; screenX++) { + currentScreenPixel = *targetScreenPtr; + + currentScreenPixelRed = currentScreenPixel & 0xF800; + currentScreenPixelGreen = currentScreenPixel & 0x07E0; + currentScreenPixelBlue = currentScreenPixel & 0x001F; + + if (currentScreenPixelRed < limitPixelRed) + currentScreenPixelRed = limitPixelRed; + if (currentScreenPixelGreen < limitPixelGreen) + currentScreenPixelGreen = limitPixelGreen; + if (currentScreenPixelBlue < limitPixelBlue) + currentScreenPixelBlue = limitPixelBlue; + + uint16 v = currentScreenPixelRed | currentScreenPixelGreen | currentScreenPixelBlue; + *currentScreenPtr = v; + if (_vm->_isScreenDoubled) { + *(currentScreenPtr + 1) = v; + *(currentScreenPtr + 640) = v; + *(currentScreenPtr + 640 + 1) = v; + } + + currentScreenPtr += _vm->_isScreenDoubled ? 2 : 1; + targetScreenPtr++; + } + + if (_vm->_isScreenDoubled) + currentScreenPtr += 640; + } + + // Too much considered dirty at the moment + if (_vm->_isScreenDoubled) + addDirtyRect(Common::Rect(0, 0, screenWidth * 2, screenHeight * 2)); + else + addDirtyRect(Common::Rect(0, 0, screenWidth, screenHeight)); +} + +uint16 Scalpel3DOScreen::w() const { + return _vm->_isScreenDoubled ? _surface.w / 2 : _surface.w; +} + +uint16 Scalpel3DOScreen::h() const { + return _vm->_isScreenDoubled ? _surface.h / 2 : _surface.h; +} + +void Scalpel3DOScreen::rawBlitFrom(const Graphics::Surface &src, const Common::Point &pt) { + Common::Rect srcRect(0, 0, src.w, src.h); + Common::Rect destRect(pt.x, pt.y, pt.x + src.w, pt.y + src.h); + + addDirtyRect(destRect); + _surface.copyRectToSurface(src, destRect.left, destRect.top, srcRect); +} + } // End of namespace Scalpel } // End of namespace Sherlock diff --git a/engines/sherlock/scalpel/scalpel_screen.h b/engines/sherlock/scalpel/scalpel_screen.h index 0277bcd16f..d6018a44a0 100644 --- a/engines/sherlock/scalpel/scalpel_screen.h +++ b/engines/sherlock/scalpel/scalpel_screen.h @@ -59,6 +59,44 @@ public: void makeField(const Common::Rect &r); }; +class Scalpel3DOScreen : public ScalpelScreen { +protected: + /** + * Draws a sub-section of a surface at a given position within this surface + * Overriden for the 3DO to automatically double the size of everything to the underlying 640x400 surface + */ + virtual void blitFrom(const Graphics::Surface &src, const Common::Point &pt, const Common::Rect &srcBounds); + + /** + * Draws a surface at a given position within this surface with transparency + */ + virtual void transBlitFromUnscaled(const Graphics::Surface &src, const Common::Point &pt, bool flipped, + int overrideColor); +public: + Scalpel3DOScreen(SherlockEngine *vm) : ScalpelScreen(vm) {} + virtual ~Scalpel3DOScreen() {} + + /** + * Draws a sub-section of a surface at a given position within this surface + */ + void rawBlitFrom(const Graphics::Surface &src, const Common::Point &pt); + + /** + * Fade backbuffer 1 into screen (3DO RGB!) + */ + void fadeIntoScreen3DO(int speed); + + void blitFrom3DOcolorLimit(uint16 color); + + /** + * Fill a given area of the surface with a given color + */ + virtual void fillRect(const Common::Rect &r, uint color); + + virtual uint16 w() const; + virtual uint16 h() const; +}; + } // End of namespace Scalpel } // End of namespace Sherlock diff --git a/engines/sherlock/scalpel/scalpel_talk.cpp b/engines/sherlock/scalpel/scalpel_talk.cpp index 2d1a8a9775..2c447b09ab 100644 --- a/engines/sherlock/scalpel/scalpel_talk.cpp +++ b/engines/sherlock/scalpel/scalpel_talk.cpp @@ -22,6 +22,7 @@ #include "sherlock/scalpel/scalpel_talk.h" #include "sherlock/scalpel/scalpel_fixed_text.h" +#include "sherlock/scalpel/scalpel_journal.h" #include "sherlock/scalpel/scalpel_map.h" #include "sherlock/scalpel/scalpel_people.h" #include "sherlock/scalpel/scalpel_scene.h" @@ -189,6 +190,9 @@ void ScalpelTalk::talkInterface(const byte *&str) { ScalpelScreen &screen = *(ScalpelScreen *)_vm->_screen; UserInterface &ui = *_vm->_ui; + if (_vm->getLanguage() == Common::DE_DEU) + skipBadText(str); + // If the window isn't yet open, draw the window before printing starts if (!ui._windowOpen && _noTextYet) { _noTextYet = false; @@ -609,7 +613,6 @@ bool ScalpelTalk::talk3DOMovieTrigger(int subIndex) { if (scriptSelector >= 0) { // Script-selected dialog selector = scriptSelector; - subIndex--; // for scripts we adjust subIndex, b/c we won't get called from doTalkControl() } else { warning("talk3DOMovieTrigger: unable to find selector"); return true; @@ -674,8 +677,8 @@ Common::Point ScalpelTalk::get3doPortraitPosition() const { // Adjust the top-left so the center of the portrait will be on the character, // but ensure the portrait will be entirely on-screen pt -= Common::Point(PORTRAIT_W / 2, PORTRAIT_H / 2); - pt.x = CLIP((int)pt.x, 20, SHERLOCK_SCREEN_WIDTH - 20 - PORTRAIT_W); - pt.y = CLIP((int)pt.y, 20, SHERLOCK_SCREEN_HEIGHT - 20 - PORTRAIT_H); + pt.x = CLIP((int)pt.x, 10, SHERLOCK_SCREEN_WIDTH - 10 - PORTRAIT_W); + pt.y = CLIP((int)pt.y, 10, CONTROLS_Y - PORTRAIT_H - 10); return pt; } @@ -706,10 +709,14 @@ void ScalpelTalk::drawInterface() { screen.makeButton(Common::Rect(181, CONTROLS_Y, 221, CONTROLS_Y + 10), 200 - screen.stringWidth(fixedText_Down) / 2, fixedText_Down); } else { - int strWidth = screen.stringWidth(Scalpel::PRESS_KEY_TO_CONTINUE); + Common::String fixedText_PressKeyToContinue = fixedText.getText(kFixedText_PressKey_ToContinue); + Common::String fixedText_PressKeyToContinueHotkey = fixedText.getText(kFixedText_PressKey_ToContinueHotkey); + int fixedText_PressKeyToContinueLen = screen.stringWidth(fixedText_PressKeyToContinue); + screen.makeButton(Common::Rect(46, CONTROLS_Y, 273, CONTROLS_Y + 10), - 160 - strWidth / 2, Scalpel::PRESS_KEY_TO_CONTINUE); - screen.gPrint(Common::Point(160 - strWidth / 2, CONTROLS_Y), COMMAND_FOREGROUND, "P"); + 160 - fixedText_PressKeyToContinueLen / 2, fixedText_PressKeyToContinue); + screen.gPrint(Common::Point(160 - fixedText_PressKeyToContinueLen / 2, CONTROLS_Y), COMMAND_FOREGROUND, + "%s", fixedText_PressKeyToContinueHotkey.c_str()); } } @@ -1007,6 +1014,14 @@ void ScalpelTalk::clearSequences() { _sequenceStack.clear(); } +void ScalpelTalk::skipBadText(const byte *&msgP) { + // WORKAROUND: Skip over bad text in the original game + const char *BAD_PHRASE1 = "Change Speaker to Sherlock Holmes "; + + if (!strncmp((const char *)msgP, BAD_PHRASE1, strlen(BAD_PHRASE1))) + msgP += strlen(BAD_PHRASE1); +} + } // End of namespace Scalpel } // End of namespace Sherlock diff --git a/engines/sherlock/scalpel/scalpel_talk.h b/engines/sherlock/scalpel/scalpel_talk.h index 4d54273f4a..3ba61dadc1 100644 --- a/engines/sherlock/scalpel/scalpel_talk.h +++ b/engines/sherlock/scalpel/scalpel_talk.h @@ -132,6 +132,11 @@ public: bool talk3DOMovieTrigger(int subIndex); /** + * Handles skipping over bad text in conversations + */ + static void skipBadText(const byte *&msgP); + + /** * Push the details of a passed object onto the saved sequences stack */ virtual void pushSequenceEntry(Object *obj); @@ -145,7 +150,7 @@ public: /** * Returns true if the script stack is empty */ - virtual bool isSequencesEmpty() const { return _scriptStack.empty(); } + virtual bool isSequencesEmpty() const { return _sequenceStack.empty(); } /** * Clears the stack of pending object sequences associated with speakers in the scene diff --git a/engines/sherlock/scalpel/scalpel_user_interface.cpp b/engines/sherlock/scalpel/scalpel_user_interface.cpp index be8f1aaa0c..79d74ba999 100644 --- a/engines/sherlock/scalpel/scalpel_user_interface.cpp +++ b/engines/sherlock/scalpel/scalpel_user_interface.cpp @@ -67,8 +67,6 @@ const int INVENTORY_POINTS[8][3] = { const char COMMANDS[13] = "LMTPOCIUGJFS"; const char COMMANDS_3DO[13] = "LMTPOCIUGSFF"; const char INVENTORY_COMMANDS[9] = { "ELUG-+,." }; -const char *const PRESS_KEY_FOR_MORE = "Press any Key for More."; -const char *const PRESS_KEY_TO_CONTINUE = "Press any Key to Continue."; const int UI_OFFSET_3DO = 16; // (320 - 288) / 2 /*----------------------------------------------------------------*/ @@ -777,7 +775,7 @@ void ScalpelUserInterface::doEnvControl() { } else if ((found == 1 && events._released) || _key == 'L') { saves._envMode = SAVEMODE_LOAD; if (_selector != -1) { - saves.loadGame(_selector + 1); + saves.loadGame(_selector); } } else if ((found == 2 && events._released) || _key == 'S') { saves._envMode = SAVEMODE_SAVE; @@ -786,7 +784,7 @@ void ScalpelUserInterface::doEnvControl() { _oldSelector = _selector; if (saves.promptForDescription(_selector)) { - saves.saveGame(_selector + 1, saves._savegames[_selector]); + saves.saveGame(_selector, saves._savegames[_selector]); banishWindow(1); _windowBounds.top = CONTROLS_Y1; @@ -950,14 +948,14 @@ void ScalpelUserInterface::doEnvControl() { if (_selector != -1) { // Are we already in Load mode? if (saves._envMode == SAVEMODE_LOAD) { - saves.loadGame(_selector + 1); + saves.loadGame(_selector); } else if (saves._envMode == SAVEMODE_SAVE || saves.isSlotEmpty(_selector)) { // We're already in save mode, or pointing to an empty save slot if (saves.checkGameOnScreen(_selector)) _oldSelector = _selector; if (saves.promptForDescription(_selector)) { - saves.saveGame(_selector + 1, saves._savegames[_selector]); + saves.saveGame(_selector, saves._savegames[_selector]); banishWindow(); _windowBounds.top = CONTROLS_Y1; _key = _oldKey = -1; @@ -1300,9 +1298,11 @@ void ScalpelUserInterface::doMainControl() { // Keyboard control _keyboardInput = true; - if (_keyPress >= 'A' && _keyPress <= 'Z') { - const char *c = strchr(commands, _keyPress); - _temp = !c ? 12 : c - commands; + char key = toupper(_keyPress); + const char *c = strchr(commands, key); + if (c) { + _temp = c - commands; + _key = key; } else { _temp = 12; } @@ -1808,6 +1808,7 @@ void ScalpelUserInterface::printObjectDesc(const Common::String &str, bool first ScalpelInventory &inv = *(ScalpelInventory *)_vm->_inventory; ScalpelScreen &screen = *(ScalpelScreen *)_vm->_screen; Talk &talk = *_vm->_talk; + FixedText &fixedText = *_vm->_fixedText; if (str.hasPrefix("_")) { _lookScriptFlag = true; @@ -1938,20 +1939,26 @@ void ScalpelUserInterface::printObjectDesc(const Common::String &str, bool first // Handle display depending on whether all the message was shown if (!endOfStr) { + Common::String fixedText_PressKeyForMore = fixedText.getText(kFixedText_PressKey_ForMore); + Common::String fixedText_PressKeyForMoreHotkey = fixedText.getText(kFixedText_PressKey_ForMoreHotkey); + int fixedText_PressKeyForMoreLen = screen.stringWidth(fixedText_PressKeyForMore); + screen.makeButton(Common::Rect(46, CONTROLS_Y, 272, CONTROLS_Y + 10), - (SHERLOCK_SCREEN_WIDTH - screen.stringWidth(PRESS_KEY_FOR_MORE)) / 2, - PRESS_KEY_FOR_MORE); - screen.gPrint(Common::Point((SHERLOCK_SCREEN_WIDTH - - screen.stringWidth(PRESS_KEY_FOR_MORE)) / 2, CONTROLS_Y), - COMMAND_FOREGROUND, "P"); + (SHERLOCK_SCREEN_WIDTH - fixedText_PressKeyForMoreLen) / 2, + fixedText_PressKeyForMore); + screen.gPrint(Common::Point((SHERLOCK_SCREEN_WIDTH - fixedText_PressKeyForMoreLen) / 2, CONTROLS_Y), + COMMAND_FOREGROUND, "%s", fixedText_PressKeyForMoreHotkey.c_str()); _descStr = msgP; } else { + Common::String fixedText_PressKeyToContinue = fixedText.getText(kFixedText_PressKey_ToContinue); + Common::String fixedText_PressKeyToContinueHotkey = fixedText.getText(kFixedText_PressKey_ToContinueHotkey); + int fixedText_PressKeyToContinueLen = screen.stringWidth(fixedText_PressKeyToContinue); + screen.makeButton(Common::Rect(46, CONTROLS_Y, 272, CONTROLS_Y + 10), - (SHERLOCK_SCREEN_WIDTH - screen.stringWidth(PRESS_KEY_TO_CONTINUE)) / 2, - PRESS_KEY_TO_CONTINUE); - screen.gPrint(Common::Point((SHERLOCK_SCREEN_WIDTH - - screen.stringWidth(PRESS_KEY_TO_CONTINUE)) / 2, CONTROLS_Y), - COMMAND_FOREGROUND, "P"); + (SHERLOCK_SCREEN_WIDTH - fixedText_PressKeyToContinueLen) / 2, + fixedText_PressKeyToContinue); + screen.gPrint(Common::Point((SHERLOCK_SCREEN_WIDTH - fixedText_PressKeyToContinueLen) / 2, CONTROLS_Y), + COMMAND_FOREGROUND, "%s", fixedText_PressKeyToContinueHotkey.c_str()); _descStr = ""; } diff --git a/engines/sherlock/scalpel/scalpel_user_interface.h b/engines/sherlock/scalpel/scalpel_user_interface.h index d88e607c2a..8c2f3f9e3b 100644 --- a/engines/sherlock/scalpel/scalpel_user_interface.h +++ b/engines/sherlock/scalpel/scalpel_user_interface.h @@ -39,8 +39,6 @@ extern const int MENU_POINTS[12][4]; extern const int INVENTORY_POINTS[8][3]; extern const char INVENTORY_COMMANDS[9]; -extern const char *const PRESS_KEY_FOR_MORE; -extern const char *const PRESS_KEY_TO_CONTINUE; class Settings; diff --git a/engines/sherlock/scene.cpp b/engines/sherlock/scene.cpp index 4e40032df9..6f9ef179a3 100644 --- a/engines/sherlock/scene.cpp +++ b/engines/sherlock/scene.cpp @@ -26,6 +26,7 @@ #include "sherlock/scalpel/scalpel.h" #include "sherlock/scalpel/scalpel_people.h" #include "sherlock/scalpel/scalpel_scene.h" +#include "sherlock/scalpel/scalpel_screen.h" #include "sherlock/tattoo/tattoo.h" #include "sherlock/tattoo/tattoo_scene.h" #include "sherlock/tattoo/tattoo_user_interface.h" @@ -215,7 +216,6 @@ Scene::Scene(SherlockEngine *vm): _vm(vm) { _currentScene = -1; _goToScene = -1; - _loadingSavedGame = false; _walkedInScene = false; _version = 0; _compressed = false; @@ -273,6 +273,8 @@ void Scene::selectScene() { } void Scene::freeScene() { + SaveManager &saves = *_vm->_saves; + if (_currentScene == -1) return; @@ -283,10 +285,8 @@ void Scene::freeScene() { _vm->_music->freeSong(); _vm->_sound->freeLoadedSounds(); - if (!_loadingSavedGame) + if (!saves._justLoaded) saveSceneStatus(); - else - _loadingSavedGame = false; _sequenceBuffer.clear(); _descText.clear(); @@ -562,34 +562,37 @@ bool Scene::loadScene(const Common::String &filename) { // Read in the walk data size = rrmStream->readUint16LE(); - Common::SeekableReadStream *walkStream = !_compressed ? rrmStream : + Common::SeekableReadStream *walkStream = !_compressed ? rrmStream->readStream(size) : res.decompress(*rrmStream, size); - int startPos = walkStream->pos(); - while ((walkStream->pos() - startPos) < size) { - _walkPoints.push_back(WalkArray()); - _walkPoints[_walkPoints.size() - 1]._fileOffset = walkStream->pos() - startPos; - _walkPoints[_walkPoints.size() - 1].load(*walkStream, IS_ROSE_TATTOO); - } - - if (_compressed) - delete walkStream; - // Translate the file offsets of the walk directory to indexes in the loaded walk data for (uint idx1 = 0; idx1 < _zones.size(); ++idx1) { for (uint idx2 = 0; idx2 < _zones.size(); ++idx2) { - int fileOffset = _walkDirectory[idx1][idx2]; - if (fileOffset == -1) + int dataOffset = _walkDirectory[idx1][idx2]; + if (dataOffset == -1) continue; + // Check to see if we've already loaded the walk set for the given data offset uint dataIndex = 0; - while (dataIndex < _walkPoints.size() && _walkPoints[dataIndex]._fileOffset != fileOffset) + while (dataIndex < _walkPoints.size() && _walkPoints[dataIndex]._fileOffset != dataOffset) ++dataIndex; - assert(dataIndex < _walkPoints.size()); + + if (dataIndex == _walkPoints.size()) { + // Walk data for that offset hasn't been loaded yet, so load it now + _walkPoints.push_back(WalkArray()); + + walkStream->seek(dataOffset); + _walkPoints[_walkPoints.size() - 1]._fileOffset = dataOffset; + _walkPoints[_walkPoints.size() - 1].load(*walkStream, IS_ROSE_TATTOO); + dataIndex = _walkPoints.size() - 1; + } + _walkDirectory[idx1][idx2] = dataIndex; } } + delete walkStream; + if (IS_ROSE_TATTOO) { // Read in the entrance _entrance.load(*rrmStream); @@ -892,28 +895,38 @@ bool Scene::loadScene(const Common::String &filename) { // === WALK DATA === Read in the walk data roomStream->seek(header3DO_walkData_offset); - int startPos = roomStream->pos(); - while ((roomStream->pos() - startPos) < (int)header3DO_walkData_size) { - _walkPoints.push_back(WalkArray()); - _walkPoints[_walkPoints.size() - 1]._fileOffset = roomStream->pos() - startPos; - _walkPoints[_walkPoints.size() - 1].load(*roomStream, false); - } + // Read in the walk data + Common::SeekableReadStream *walkStream = !_compressed ? roomStream->readStream(header3DO_walkData_size) : + res.decompress(*roomStream, header3DO_walkData_size); // Translate the file offsets of the walk directory to indexes in the loaded walk data for (uint idx1 = 0; idx1 < _zones.size(); ++idx1) { for (uint idx2 = 0; idx2 < _zones.size(); ++idx2) { - int fileOffset = _walkDirectory[idx1][idx2]; - if (fileOffset == -1) + int dataOffset = _walkDirectory[idx1][idx2]; + if (dataOffset == -1) continue; + // Check to see if we've already loaded the walk set for the given data offset uint dataIndex = 0; - while (dataIndex < _walkPoints.size() && _walkPoints[dataIndex]._fileOffset != fileOffset) + while (dataIndex < _walkPoints.size() && _walkPoints[dataIndex]._fileOffset != dataOffset) ++dataIndex; - assert(dataIndex < _walkPoints.size()); + + if (dataIndex == _walkPoints.size()) { + // Walk data for that offset hasn't been loaded yet, so load it now + _walkPoints.push_back(WalkArray()); + + walkStream->seek(dataOffset); + _walkPoints[_walkPoints.size() - 1]._fileOffset = dataOffset; + _walkPoints[_walkPoints.size() - 1].load(*walkStream, IS_ROSE_TATTOO); + dataIndex = _walkPoints.size() - 1; + } + _walkDirectory[idx1][idx2] = dataIndex; } } + delete walkStream; + // === EXITS === Read in the exits roomStream->seek(header3DO_exits_offset); @@ -1090,9 +1103,9 @@ void Scene::checkSceneFlags(bool flag) { for (uint idx = 0; idx < _bgShapes.size(); ++idx) { Object &o = _bgShapes[idx]; - bool objectFlag = true; if (o._requiredFlag[0] || o._requiredFlag[1]) { + bool objectFlag = true; if (o._requiredFlag[0] != 0) objectFlag = _vm->readFlags(o._requiredFlag[0]); if (o._requiredFlag[1] != 0) @@ -1282,7 +1295,7 @@ void Scene::transitionToScene() { } else { // fade in for 3DO screen.clear(); - screen.fadeIntoScreen3DO(3); + static_cast<Scalpel::Scalpel3DOScreen *>(_vm->_screen)->fadeIntoScreen3DO(3); } } else { screen.slamArea(screen._currentScroll.x, screen._currentScroll.y, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT); @@ -1376,7 +1389,6 @@ void Scene::synchronize(Serializer &s) { s.syncAsSint16LE(_currentScene); } else { s.syncAsSint16LE(_goToScene); - _loadingSavedGame = true; } for (int sceneNum = 1; sceneNum < SCENES_COUNT; ++sceneNum) { diff --git a/engines/sherlock/scene.h b/engines/sherlock/scene.h index f75dfb40cd..f7aa39fd41 100644 --- a/engines/sherlock/scene.h +++ b/engines/sherlock/scene.h @@ -145,8 +145,6 @@ public: class Scene { private: - bool _loadingSavedGame; - /** * Loads sounds for the scene */ @@ -229,7 +227,7 @@ public: Common::Array<Exit> _exits; SceneEntry _entrance; Common::Array<SceneSound> _sounds; - ObjectArray _canimShapes; + Common::Array<Object *> _canimShapes; Common::Array<ScaleZone> _scaleZones; Common::StringArray _objSoundList; bool _restoreFlag; diff --git a/engines/sherlock/screen.cpp b/engines/sherlock/screen.cpp index a5241524ef..74da2a80ea 100644 --- a/engines/sherlock/screen.cpp +++ b/engines/sherlock/screen.cpp @@ -30,15 +30,17 @@ namespace Sherlock { Screen *Screen::init(SherlockEngine *vm) { - if (vm->getGameID() == GType_SerratedScalpel) - return new Scalpel::ScalpelScreen(vm); - else + if (vm->getGameID() == GType_RoseTattoo) return new Screen(vm); + else if (vm->getPlatform() == Common::kPlatform3DO) + return new Scalpel::Scalpel3DOScreen(vm); + else + return new Scalpel::ScalpelScreen(vm); } Screen::Screen(SherlockEngine *vm) : Surface(g_system->getWidth(), g_system->getHeight()), _vm(vm), - _backBuffer1(g_system->getWidth(), g_system->getHeight()), - _backBuffer2(g_system->getWidth(), g_system->getHeight()), + _backBuffer1(vm->getGameID() == GType_RoseTattoo ? 640 : 320, vm->getGameID() == GType_RoseTattoo ? 480 : 200), + _backBuffer2(vm->getGameID() == GType_RoseTattoo ? 640 : 320, vm->getGameID() == GType_RoseTattoo ? 480 : 200), _backBuffer(&_backBuffer1) { _transitionSeed = 1; _fadeStyle = false; @@ -219,133 +221,9 @@ void Screen::verticalTransition() { } } -void Screen::fadeIntoScreen3DO(int speed) { - Events &events = *_vm->_events; - uint16 *currentScreenBasePtr = (uint16 *)getPixels(); - uint16 *targetScreenBasePtr = (uint16 *)_backBuffer->getPixels(); - uint16 currentScreenPixel = 0; - uint16 targetScreenPixel = 0; - - uint16 currentScreenPixelRed = 0; - uint16 currentScreenPixelGreen = 0; - uint16 currentScreenPixelBlue = 0; - - uint16 targetScreenPixelRed = 0; - uint16 targetScreenPixelGreen = 0; - uint16 targetScreenPixelBlue = 0; - - uint16 screenWidth = this->w(); - uint16 screenHeight = this->h(); - uint16 screenX = 0; - uint16 screenY = 0; - uint16 pixelsChanged = 0; - - _dirtyRects.clear(); - - do { - pixelsChanged = 0; - uint16 *currentScreenPtr = currentScreenBasePtr; - uint16 *targetScreenPtr = targetScreenBasePtr; - - for (screenY = 0; screenY < screenHeight; screenY++) { - for (screenX = 0; screenX < screenWidth; screenX++) { - currentScreenPixel = *currentScreenPtr; - targetScreenPixel = *targetScreenPtr; - - if (currentScreenPixel != targetScreenPixel) { - // pixel doesn't match, adjust accordingly - currentScreenPixelRed = currentScreenPixel & 0xF800; - currentScreenPixelGreen = currentScreenPixel & 0x07E0; - currentScreenPixelBlue = currentScreenPixel & 0x001F; - targetScreenPixelRed = targetScreenPixel & 0xF800; - targetScreenPixelGreen = targetScreenPixel & 0x07E0; - targetScreenPixelBlue = targetScreenPixel & 0x001F; - - if (currentScreenPixelRed != targetScreenPixelRed) { - if (currentScreenPixelRed < targetScreenPixelRed) { - currentScreenPixelRed += 0x0800; - } else { - currentScreenPixelRed -= 0x0800; - } - } - if (currentScreenPixelGreen != targetScreenPixelGreen) { - // Adjust +2/-2 because we are running RGB555 at RGB565 - if (currentScreenPixelGreen < targetScreenPixelGreen) { - currentScreenPixelGreen += 0x0040; - } else { - currentScreenPixelGreen -= 0x0040; - } - } - if (currentScreenPixelBlue != targetScreenPixelBlue) { - if (currentScreenPixelBlue < targetScreenPixelBlue) { - currentScreenPixelBlue += 0x0001; - } else { - currentScreenPixelBlue -= 0x0001; - } - } - *currentScreenPtr = currentScreenPixelRed | currentScreenPixelGreen | currentScreenPixelBlue; - pixelsChanged++; - } - - currentScreenPtr++; - targetScreenPtr++; - } - } - - // Too much considered dirty at the moment - addDirtyRect(Common::Rect(0, 0, screenWidth, screenHeight)); - - events.pollEvents(); - events.delay(10 * speed); - } while ((pixelsChanged) && (!_vm->shouldQuit())); -} - -void Screen::blitFrom3DOcolorLimit(uint16 limitColor) { - uint16 *currentScreenPtr = (uint16 *)getPixels(); - uint16 *targetScreenPtr = (uint16 *)_backBuffer->getPixels(); - uint16 currentScreenPixel = 0; - - uint16 screenWidth = this->w(); - uint16 screenHeight = this->h(); - uint16 screenX = 0; - uint16 screenY = 0; - - uint16 currentScreenPixelRed = 0; - uint16 currentScreenPixelGreen = 0; - uint16 currentScreenPixelBlue = 0; - - uint16 limitPixelRed = limitColor & 0xF800; - uint16 limitPixelGreen = limitColor & 0x07E0; - uint16 limitPixelBlue = limitColor & 0x001F; - - for (screenY = 0; screenY < screenHeight; screenY++) { - for (screenX = 0; screenX < screenWidth; screenX++) { - currentScreenPixel = *targetScreenPtr; - - currentScreenPixelRed = currentScreenPixel & 0xF800; - currentScreenPixelGreen = currentScreenPixel & 0x07E0; - currentScreenPixelBlue = currentScreenPixel & 0x001F; - - if (currentScreenPixelRed < limitPixelRed) - currentScreenPixelRed = limitPixelRed; - if (currentScreenPixelGreen < limitPixelGreen) - currentScreenPixelGreen = limitPixelGreen; - if (currentScreenPixelBlue < limitPixelBlue) - currentScreenPixelBlue = limitPixelBlue; - - *currentScreenPtr = currentScreenPixelRed | currentScreenPixelGreen | currentScreenPixelBlue; - currentScreenPtr++; - targetScreenPtr++; - } - } - - // Too much considered dirty at the moment - addDirtyRect(Common::Rect(0, 0, screenWidth, screenHeight)); -} - void Screen::restoreBackground(const Common::Rect &r) { if (r.width() > 0 && r.height() > 0) - _backBuffer1.blitFrom(_backBuffer2, Common::Point(r.left, r.top), r); + _backBuffer->blitFrom(_backBuffer2, Common::Point(r.left, r.top), r); } void Screen::slamArea(int16 xp, int16 yp, int16 width, int16 height) { diff --git a/engines/sherlock/screen.h b/engines/sherlock/screen.h index 43e6ea883f..04a0c1e505 100644 --- a/engines/sherlock/screen.h +++ b/engines/sherlock/screen.h @@ -62,6 +62,11 @@ protected: SherlockEngine *_vm; /** + * Clear the current dirty rects list + */ + void clearDirtyRects() { _dirtyRects.clear(); } + + /** * Adds a rectangle to the list of modified areas of the screen during the * current frame */ @@ -86,7 +91,7 @@ public: void update(); /** - * Makes the whole screen dirty, Hack for 3DO movie playing + * Makes the whole screen dirty */ void makeAllDirty(); @@ -126,13 +131,6 @@ public: void verticalTransition(); /** - * Fade backbuffer 1 into screen (3DO RGB!) - */ - void fadeIntoScreen3DO(int speed); - - void blitFrom3DOcolorLimit(uint16 color); - - /** * Prints the text passed onto the back buffer at the given position and color. * The string is then blitted to the screen */ diff --git a/engines/sherlock/sherlock.cpp b/engines/sherlock/sherlock.cpp index ae77c91009..d09fd0b270 100644 --- a/engines/sherlock/sherlock.cpp +++ b/engines/sherlock/sherlock.cpp @@ -51,6 +51,7 @@ SherlockEngine::SherlockEngine(OSystem *syst, const SherlockGameDescription *gam _canLoadSave = false; _showOriginalSavesDialog = false; _interactiveFl = true; + _isScreenDoubled = false; } SherlockEngine::~SherlockEngine() { @@ -237,7 +238,7 @@ void SherlockEngine::loadConfig() { void SherlockEngine::saveConfig() { ConfMan.setBool("mute", !_sound->_digitized); ConfMan.setBool("music_mute", !_music->_musicOn); - ConfMan.setBool("speech_mute", !_sound->_voices); + ConfMan.setBool("speech_mute", !_sound->_speechOn); ConfMan.setInt("font", _screen->fontNumber()); ConfMan.setBool("fade_style", _screen->_fadeStyle); diff --git a/engines/sherlock/sherlock.h b/engines/sherlock/sherlock.h index c05680eb08..b85321c385 100644 --- a/engines/sherlock/sherlock.h +++ b/engines/sherlock/sherlock.h @@ -80,6 +80,7 @@ class Resource; class SherlockEngine : public Engine { private: +\ /** * Main loop for displaying a scene and handling all that occurs within it */ @@ -133,6 +134,7 @@ public: bool _canLoadSave; bool _showOriginalSavesDialog; bool _interactiveFl; + bool _isScreenDoubled; public: SherlockEngine(OSystem *syst, const SherlockGameDescription *gameDesc); virtual ~SherlockEngine(); diff --git a/engines/sherlock/sound.cpp b/engines/sherlock/sound.cpp index fd51462bc0..56ac2a5d9a 100644 --- a/engines/sherlock/sound.cpp +++ b/engines/sherlock/sound.cpp @@ -90,7 +90,7 @@ Sound::Sound(SherlockEngine *vm, Audio::Mixer *mixer) : _vm(vm), _mixer(mixer) { void Sound::syncSoundSettings() { _digitized = !ConfMan.getBool("mute"); _speechOn = !ConfMan.getBool("mute") && !ConfMan.getBool("speech_mute"); - _voices = _speechOn ? 1 : 0; + _voices = _digitized ? 1 : 0; } void Sound::loadSound(const Common::String &name, int priority) { @@ -123,25 +123,9 @@ byte Sound::decodeSample(byte sample, byte &reference, int16 &scale) { bool Sound::playSound(const Common::String &name, WaitType waitType, int priority, const char *libraryFilename) { stopSound(); - Common::String filename = name; - if (!filename.contains('.')) { - if (!IS_3DO) { - if (IS_SERRATED_SCALPEL) { - filename += ".SND"; - } else { - filename += ".WAV"; - } - } else { - // 3DO uses .aiff extension - filename += ".AIFF"; - if (!filename.contains('/')) { - // if no directory was given, use the room sounds directory - filename = "rooms/sounds/" + filename; - } - } - } + Common::String filename = formFilename(name); - Audio::SoundHandle soundHandle = (IS_SERRATED_SCALPEL) ? _scalpelEffectsHandle : getFreeSoundHandle(); + Audio::SoundHandle &soundHandle = (IS_SERRATED_SCALPEL) ? _scalpelEffectsHandle : getFreeSoundHandle(); if (!playSoundResource(filename, libraryFilename, Audio::Mixer::kSFXSoundType, soundHandle)) error("Could not find sound resource - %s", filename.c_str()); @@ -168,6 +152,53 @@ bool Sound::playSound(const Common::String &name, WaitType waitType, int priorit return retval; } +Common::String Sound::formFilename(const Common::String &name) { + Common::String filename = name; + + if (!filename.contains('.')) { + if (!IS_3DO) { + if (IS_SERRATED_SCALPEL) { + filename += ".SND"; + } else { + filename += ".WAV"; + } + } else { + // 3DO uses .aiff extension + filename += ".AIFF"; + if (!filename.contains('/')) { + // if no directory was given, use the room sounds directory + filename = "rooms/sounds/" + filename; + } + } + } + + return filename; +} + +void Sound::playAiff(const Common::String &name, int volume, bool loop) { + Common::File *file = new Common::File(); + if (!file->open(name)) { + delete file; + return; + } + Audio::AudioStream *stream; + Audio::RewindableAudioStream *audioStream = Audio::makeAIFFStream(file, DisposeAfterUse::YES); + if (loop) { + Audio::AudioStream *loopingStream = Audio::makeLoopingAudioStream(audioStream, 0); + stream = loopingStream; + } else { + stream = audioStream; + } + stopAiff(); + _mixer->playStream(Audio::Mixer::kSFXSoundType, &_aiffHandle, stream, -1, volume); +} + +void Sound::stopAiff() { + if (_mixer->isSoundHandleActive(_aiffHandle)) { + _mixer->stopHandle(_aiffHandle); + } +} + void Sound::playLoadedSound(int bufNum, WaitType waitType) { if (IS_SERRATED_SCALPEL) { if (_mixer->isSoundHandleActive(_scalpelEffectsHandle) && (_curPriority > _vm->_scene->_sounds[bufNum]._priority)) @@ -198,7 +229,7 @@ void Sound::freeDigiSound() { _soundPlaying = false; } -Audio::SoundHandle Sound::getFreeSoundHandle() { +Audio::SoundHandle &Sound::getFreeSoundHandle() { for (int i = 0; i < MAX_MIXER_CHANNELS; i++) { if (!_mixer->isSoundHandleActive(_tattooEffectsHandle[i])) return _tattooEffectsHandle[i]; @@ -214,29 +245,32 @@ void Sound::setVolume(int volume) { void Sound::playSpeech(const Common::String &name) { Resources &res = *_vm->_res; Scene &scene = *_vm->_scene; - stopSpeech(); - - // TODO: Technically Scalpel has an sfx command which I've set to call this method because it sets the - // _voice variable as if it were speech. Need to do a play-through of Scalpel and see if it's ever called. - // If so, will need to enhance this method to handle the Serrated Scalpel voice resources - assert(IS_ROSE_TATTOO); - // Figure out which speech library to use - Common::String libraryName = Common::String::format("speech%02d.lib", scene._currentScene); - if ((!scumm_strnicmp(name.c_str(), "SLVE12S", 7)) || (!scumm_strnicmp(name.c_str(), "WATS12X", 7)) - || (!scumm_strnicmp(name.c_str(), "HOLM12X", 7))) - libraryName = "SPEECH12.LIB"; + // Stop any previously playing speech + stopSpeech(); - // If the speech library file doesn't even exist, then we can't play anything - Common::File f; - if (!f.exists(libraryName)) - return; + if (IS_SERRATED_SCALPEL) { + Common::String filename = formFilename(name); + if (playSoundResource(filename, Common::String(), Audio::Mixer::kSFXSoundType, _speechHandle)) + _speechPlaying = true; + } else { + // Figure out which speech library to use + Common::String libraryName = Common::String::format("speech%02d.lib", scene._currentScene); + if ((!scumm_strnicmp(name.c_str(), "SLVE12S", 7)) || (!scumm_strnicmp(name.c_str(), "WATS12X", 7)) + || (!scumm_strnicmp(name.c_str(), "HOLM12X", 7))) + libraryName = "SPEECH12.LIB"; + + // If the speech library file doesn't even exist, then we can't play anything + Common::File f; + if (!f.exists(libraryName)) + return; - // Ensure the given library is in the cache - res.addToCache(libraryName); + // Ensure the given library is in the cache + res.addToCache(libraryName); - if (playSoundResource(name, libraryName, Audio::Mixer::kSpeechSoundType, _speechHandle)) - _speechPlaying = true; + if (playSoundResource(name, libraryName, Audio::Mixer::kSpeechSoundType, _speechHandle)) + _speechPlaying = true; + } } void Sound::stopSpeech() { diff --git a/engines/sherlock/sound.h b/engines/sherlock/sound.h index b2d1584e85..0a0ff83d1f 100644 --- a/engines/sherlock/sound.h +++ b/engines/sherlock/sound.h @@ -46,6 +46,7 @@ private: SherlockEngine *_vm; Audio::Mixer *_mixer; Audio::SoundHandle _scalpelEffectsHandle; + Audio::SoundHandle _aiffHandle; Audio::SoundHandle _tattooEffectsHandle[MAX_MIXER_CHANNELS]; Audio::SoundHandle _speechHandle; int _curPriority; @@ -60,6 +61,11 @@ private: */ bool playSoundResource(const Common::String &name, const Common::String &libFilename, Audio::Mixer::SoundType soundType, Audio::SoundHandle &handle); + + /** + * Form a filename from a passed sound resource name + */ + Common::String formFilename(const Common::String &name); public: bool _digitized; int _voices; @@ -87,6 +93,16 @@ public: * Play the sound in the specified resource */ bool playSound(const Common::String &name, WaitType waitType, int priority = 100, const char *libraryFilename = nullptr); + + /** + * Play the specified AIFF file. (Used for the 3DO Scalpel intro.) + */ + void playAiff(const Common::String &name, int volume = Audio::Mixer::kMaxChannelVolume, bool loop = false); + + /** + * Stop the AIFF sound that was started with playAiff(). + */ + void stopAiff(); /** * Play a previously loaded sound @@ -105,8 +121,14 @@ public: void freeDigiSound(); - Audio::SoundHandle getFreeSoundHandle(); + /** + * Return a sound handle to use + */ + Audio::SoundHandle &getFreeSoundHandle(); + /** + * Set the volume + */ void setVolume(int volume); /** diff --git a/engines/sherlock/surface.cpp b/engines/sherlock/surface.cpp index 2090a334a1..b7fc76325c 100644 --- a/engines/sherlock/surface.cpp +++ b/engines/sherlock/surface.cpp @@ -155,8 +155,8 @@ void Surface::transBlitFromUnscaled(const Graphics::Surface &src, const Common:: return; if (flipped) - drawRect = Common::Rect(src.w - drawRect.right, src.h - drawRect.bottom, - src.w - drawRect.left, src.h - drawRect.top); + drawRect = Common::Rect(src.w - drawRect.right, drawRect.top, + src.w - drawRect.left, drawRect.bottom); Common::Point destPt(destRect.left, destRect.top); addDirtyRect(Common::Rect(destPt.x, destPt.y, destPt.x + drawRect.width(), @@ -211,23 +211,23 @@ void Surface::fillRect(const Common::Rect &r, uint color) { } void Surface::fill(uint color) { - _surface.fillRect(Common::Rect(_surface.w, _surface.h), color); + fillRect(Common::Rect(_surface.w, _surface.h), color); } bool Surface::clip(Common::Rect &srcBounds, Common::Rect &destBounds) { - if (destBounds.left >= _surface.w || destBounds.top >= _surface.h || + if (destBounds.left >= w() || destBounds.top >= h() || destBounds.right <= 0 || destBounds.bottom <= 0) return false; // Clip the bounds if necessary to fit on-screen - if (destBounds.right > _surface.w) { - srcBounds.right -= destBounds.right - _surface.w; - destBounds.right = _surface.w; + if (destBounds.right > w()) { + srcBounds.right -= destBounds.right - w(); + destBounds.right = w(); } - if (destBounds.bottom > _surface.h) { - srcBounds.bottom -= destBounds.bottom - _surface.h; - destBounds.bottom = _surface.h; + if (destBounds.bottom > h()) { + srcBounds.bottom -= destBounds.bottom - h(); + destBounds.bottom = h(); } if (destBounds.top < 0) { @@ -244,7 +244,7 @@ bool Surface::clip(Common::Rect &srcBounds, Common::Rect &destBounds) { } void Surface::clear() { - fillRect(Common::Rect(0, 0, _surface.w, _surface.h), 0); + fillRect(Common::Rect(0, 0, w(), h()), 0); } void Surface::free() { diff --git a/engines/sherlock/surface.h b/engines/sherlock/surface.h index 64b57f644a..378c9be9cd 100644 --- a/engines/sherlock/surface.h +++ b/engines/sherlock/surface.h @@ -40,30 +40,32 @@ private: bool _freePixels; /** + * Copy a surface into this one + */ + void blitFrom(const Graphics::Surface &src); +protected: + Graphics::Surface _surface; + + /** * Clips the given source bounds so the passed destBounds will be entirely on-screen */ bool clip(Common::Rect &srcBounds, Common::Rect &destBounds); /** - * Copy a surface into this one + * Base method stub for signalling dirty rect areas */ - void blitFrom(const Graphics::Surface &src); + virtual void addDirtyRect(const Common::Rect &r) {} /** * Draws a sub-section of a surface at a given position within this surface */ - void blitFrom(const Graphics::Surface &src, const Common::Point &pt, const Common::Rect &srcBounds); + virtual void blitFrom(const Graphics::Surface &src, const Common::Point &pt, const Common::Rect &srcBounds); /** * Draws a surface at a given position within this surface with transparency */ - void transBlitFromUnscaled(const Graphics::Surface &src, const Common::Point &pt, bool flipped, + virtual void transBlitFromUnscaled(const Graphics::Surface &src, const Common::Point &pt, bool flipped, int overrideColor); - -protected: - Graphics::Surface _surface; - - virtual void addDirtyRect(const Common::Rect &r) {} public: Surface(uint16 width, uint16 height); Surface(); @@ -138,7 +140,7 @@ public: /** * Fill a given area of the surface with a given color */ - void fillRect(const Common::Rect &r, uint color); + virtual void fillRect(const Common::Rect &r, uint color); void fill(uint color); @@ -168,8 +170,8 @@ public: virtual void writeString(const Common::String &str, const Common::Point &pt, uint overrideColor); void writeFancyString(const Common::String &str, const Common::Point &pt, uint overrideColor1, uint overrideColor2); - inline uint16 w() const { return _surface.w; } - inline uint16 h() const { return _surface.h; } + inline virtual uint16 w() const { return _surface.w; } + inline virtual uint16 h() const { return _surface.h; } inline const byte *getPixels() const { return (const byte *)_surface.getPixels(); } inline byte *getPixels() { return (byte *)_surface.getPixels(); } inline byte *getBasePtr(int x, int y) { return (byte *)_surface.getBasePtr(x, y); } diff --git a/engines/sherlock/talk.cpp b/engines/sherlock/talk.cpp index fa00b9d715..e9c52276f6 100644 --- a/engines/sherlock/talk.cpp +++ b/engines/sherlock/talk.cpp @@ -569,14 +569,13 @@ void Talk::loadTalkFile(const Common::String &filename) { // Create the base of the sound filename used for talking in Rose Tattoo if (IS_ROSE_TATTOO && _scriptMoreFlag != 1) sound._talkSoundFile = Common::String(filename.c_str(), filename.c_str() + 7) + "."; - else if (IS_3DO) - _3doSpeechIndex = 1; // Open the talk file for reading Common::SeekableReadStream *talkStream = res.load(talkFile); _converseNum = res.resourceIndex(); talkStream->skip(2); // Skip talk file version num + _statements.clear(); _statements.resize(talkStream->readByte()); for (uint idx = 0; idx < _statements.size(); ++idx) _statements[idx].load(*talkStream, IS_ROSE_TATTOO); @@ -599,7 +598,7 @@ void Talk::stripVoiceCommands() { // rest of the name following it statement._reply = Common::String(statement._reply.c_str(), statement._reply.c_str() + idx) + " " + - Common::String(statement._reply.c_str() + 9); + Common::String(statement._reply.c_str() + idx + 9); } } @@ -753,6 +752,22 @@ void Talk::doScript(const Common::String &script) { while (*str++ != '}') ; } else if (isOpcode(c)) { + // the original interpreter checked for c being >= 0x80 + // and if that is the case, it tried to process it as opcode, BUT ALSO ALWAYS skipped over it + // This was done inside the Spanish + German interpreters of Serrated Scalpel, not the original + // English interpreter (reverse engineered from the binaries). + // + // This resulted in special characters not getting shown in case they occurred at the start + // of sentences like for example the inverted exclamation mark and the inverted question mark. + // For further study see fonts.cpp + // + // We create an inverted exclamation mark for the Spanish version and we show it. + // + // Us not skipping over those characters may result in an assert() happening inside fonts.cpp + // in case more invalid characters exist. + // More information see bug #6931 + // + // Handle control code switch ((this->*_opcodeTable[c - _opcodes[0]])(str)) { case RET_EXIT: @@ -832,7 +847,7 @@ int Talk::waitForMore(int delay) { playingSpeech = sound.isSpeechPlaying(); do { - if (IS_SERRATED_SCALPEL && sound._speechOn && !sound.isSpeechPlaying()) + if (IS_SERRATED_SCALPEL && playingSpeech && !sound.isSpeechPlaying()) people._portrait._frameNumber = -1; scene.doBgAnim(); @@ -876,7 +891,7 @@ int Talk::waitForMore(int delay) { } while (!_vm->shouldQuit() && key2 == 254 && (delay || (playingSpeech && sound.isSpeechPlaying())) && !events._released && !events._rightReleased); - // If voices was set 2 to indicate a voice file was place, then reset it back to 1 + // If voices was set 2 to indicate a Scalpel voice file was playing, then reset it back to 1 if (sound._voices == 2) sound._voices = 1; @@ -1025,6 +1040,7 @@ OpcodeReturn Talk::cmdEndTextWindow(const byte *&str) { OpcodeReturn Talk::cmdHolmesOff(const byte *&str) { People &people = *_vm->_people; people[HOLMES]._type = REMOVE; + people._holmesOn = false; return RET_SUCCESS; } @@ -1032,6 +1048,7 @@ OpcodeReturn Talk::cmdHolmesOff(const byte *&str) { OpcodeReturn Talk::cmdHolmesOn(const byte *&str) { People &people = *_vm->_people; people[HOLMES]._type = CHARACTER; + people._holmesOn = true; return RET_SUCCESS; } @@ -1179,7 +1196,7 @@ void Talk::talkWait(const byte *&str) { _endStr = true; // If a key was pressed to finish the window, see if further voice files should be skipped - if (_wait >= 0 && _wait < 254) { + if (IS_SERRATED_SCALPEL && _wait >= 0 && _wait < 254) { if (str[0] == _opcodes[OP_SFX_COMMAND]) str += 9; } diff --git a/engines/sherlock/talk.h b/engines/sherlock/talk.h index f354c28c1b..2c0da24d69 100644 --- a/engines/sherlock/talk.h +++ b/engines/sherlock/talk.h @@ -215,10 +215,10 @@ protected: OpcodeReturn cmdWalkToCAnimation(const byte *&str); protected: /** - * Checks, if a character is an opcode + * Checks if a character is an opcode */ bool isOpcode(byte checkCharacter); - + /** * Form a table of the display indexes for statements */ diff --git a/engines/sherlock/tattoo/tattoo.cpp b/engines/sherlock/tattoo/tattoo.cpp index bfb35565bc..3131df7649 100644 --- a/engines/sherlock/tattoo/tattoo.cpp +++ b/engines/sherlock/tattoo/tattoo.cpp @@ -65,10 +65,15 @@ void TattooEngine::initialize() { _res->addToCache("walk.lib"); // Set up list of people + TattooFixedText &fixedText = *(TattooFixedText *)_fixedText; + const char *peopleNamePtr = nullptr; + for (int idx = 0; idx < TATTOO_MAX_PEOPLE; ++idx) { + peopleNamePtr = fixedText.getText(PEOPLE_DATA[idx].fixedTextId); + _people->_characters.push_back(PersonData( - getLanguage() == Common::FR_FRA ? FRENCH_NAMES[idx] : ENGLISH_NAMES[idx], - PORTRAITS[idx], nullptr, nullptr)); + peopleNamePtr, + PEOPLE_DATA[idx].portrait, nullptr, nullptr)); } // Load the inventory diff --git a/engines/sherlock/tattoo/tattoo_darts.cpp b/engines/sherlock/tattoo/tattoo_darts.cpp index cb4b52b01a..274d80e3e1 100644 --- a/engines/sherlock/tattoo/tattoo_darts.cpp +++ b/engines/sherlock/tattoo/tattoo_darts.cpp @@ -30,7 +30,8 @@ namespace Tattoo { enum { DART_COLOR_FORE = 5, - PLAYER_COLOR = 11 + PLAYER_COLOR = 11, + DART_BAR_FORE = 208 }; static const int STATUS_INFO_X = 430; @@ -77,7 +78,6 @@ void Darts::playDarts(GameType gameType) { Screen &screen = *_vm->_screen; int oldFontType = screen.fontNumber(); int playerNum = 0; - int roundStart, score; int lastDart; int numHits = 0; bool gameOver = false; @@ -90,8 +90,10 @@ void Darts::playDarts(GameType gameType) { // Load dart graphics and initialize values loadDarts(); initDarts(); + events.hideCursor(); while (!done && !_vm->shouldQuit()) { + int roundStart, score; roundStart = score = (playerNum == 0) ? _score1 : _score2; showNames(playerNum); @@ -143,7 +145,6 @@ void Darts::playDarts(GameType gameType) { } else { // check for cricket game over bool allClosed = true; - int nOtherScore; for (int y = 0; y < 7; y++) { if (_cricketScore[playerNum][y] < 3) @@ -151,7 +152,7 @@ void Darts::playDarts(GameType gameType) { } if (allClosed) { - nOtherScore = (playerNum == 0) ? _score2 : _score1; + int nOtherScore = (playerNum == 0) ? _score2 : _score1; if (score >= nOtherScore) gameOver = true; } @@ -416,7 +417,7 @@ void Darts::erasePowerBars() { bool Darts::dartHit() { Events &events = *_vm->_events; - events.pollEventsAndWait(); + events.pollEvents(); events.setButtonState(); // Keyboard check @@ -441,10 +442,7 @@ int Darts::doPowerBar(const Common::Point &pt, byte color, int goToPower, int or events.clearEvents(); events.delay(100); - while (!_vm->shouldQuit()) { - if (idx >= DART_BAR_SIZE) - break; - + while (!_vm->shouldQuit() && idx < DART_BAR_SIZE) { if ((goToPower - 1) == idx) break; else if (goToPower == 0) { @@ -492,11 +490,8 @@ int Darts::drawHand(int goToPower, int computer) { Common::Point pt(DARTBOARD_LEFT - HAND_OFFSET[hand], SHERLOCK_SCREEN_HEIGHT - _handSize.y); int x = 0; - while (!_vm->shouldQuit()) { - if (x >= DARTBOARD_WIDTH) - break; - - if ((goToPower - 1) == x) + while (!_vm->shouldQuit() && x < DARTBOARD_WIDTH) { + if (computer && x >= (goToPower - 1)) break; else if (goToPower == 0) { if (dartHit()) @@ -561,22 +556,20 @@ void Darts::drawDartThrow(const Common::Point &dartPos, int computer) { Events &events = *_vm->_events; Screen &screen = *_vm->_screen; int cx, cy; - int handCy; - int drawX = 0, drawY = 0, oldDrawX = 0, oldDrawY = 0; int xSize = 0, ySize = 0, oldxSize = 0, oldySize = 0; - int handOCx, handOCy; - int ocx, ocy; + int handOCx = 0, handOCy = 0; + int ocx = 0, ocy = 0; int handOldxSize, handOldySize; int delta = 9; int dartNum; int hddy; + Common::Point drawPos, oldDrawPos; // Draw the animation of the hand throwing the dart first // See which hand animation to use ImageFile &hands = !computer ? *_hand1 : *_hand2; int numFrames = !computer ? 14 : 13; - ocx = ocy = handOCx = handOCy = 0; oldxSize = oldySize = handOldxSize = handOldySize = 1; cx = dartPos.x; cy = SHERLOCK_SCREEN_HEIGHT - _handSize.y - 20; @@ -590,7 +583,7 @@ void Darts::drawDartThrow(const Common::Point &dartPos, int computer) { for (int idx = 0; idx < numFrames; ++idx) { _handSize.x = hands[idx]._offset.x + hands[idx]._width; _handSize.y = hands[idx]._offset.y + hands[idx]._height; - handCy = SHERLOCK_SCREEN_HEIGHT - _handSize.y; + int handCy = SHERLOCK_SCREEN_HEIGHT - _handSize.y; screen._backBuffer1.transBlitFrom(hands[idx], Common::Point(_handX, handCy)); screen.slamArea(_handX, handCy, _handSize.x + 1, _handSize.y); @@ -610,37 +603,37 @@ void Darts::drawDartThrow(const Common::Point &dartPos, int computer) { xSize = (*_dartGraphics)[dartNum]._width; ySize = (*_dartGraphics)[dartNum]._height; - ocx = drawX = cx - (*_dartGraphics)[dartNum]._width / 2; - ocy = drawY = cy - (*_dartGraphics)[dartNum]._height; + ocx = drawPos.x = cx - (*_dartGraphics)[dartNum]._width / 2; + ocy = drawPos.y = cy - (*_dartGraphics)[dartNum]._height; // Draw dart - screen._backBuffer1.transBlitFrom((*_dartGraphics)[dartNum], dartPos); + screen._backBuffer1.transBlitFrom((*_dartGraphics)[dartNum], drawPos); - if (drawX < 0) { - xSize += drawX; + if (drawPos.x < 0) { + xSize += drawPos.x; if (xSize < 0) xSize = 1; - drawX = 0; + drawPos.x = 0; } - if (drawY < 0) { - ySize += drawY; + if (drawPos.y < 0) { + ySize += drawPos.y; if (ySize < 0) ySize = 1; - drawY = 0; + drawPos.y = 0; } // Flush the drawn dart to the screen - screen.slamArea(drawX, drawY, xSize, ySize); - if (oldDrawX != -1) + screen.slamArea(drawPos.x, drawPos.y, xSize, ySize); + if (oldDrawPos.x != -1) // Flush the erased dart area - screen.slamArea(oldDrawX, oldDrawY, oldxSize, oldySize); + screen.slamArea(oldDrawPos.x, oldDrawPos.y, oldxSize, oldySize); - screen._backBuffer1.blitFrom(screen._backBuffer2, Common::Point(drawX, drawY), - Common::Rect(drawX, drawY, drawX + xSize, drawY + ySize)); + screen._backBuffer1.blitFrom(screen._backBuffer2, Common::Point(drawPos.x, drawPos.y), + Common::Rect(drawPos.x, drawPos.y, drawPos.x + xSize, drawPos.y + ySize)); - oldDrawX = drawX; - oldDrawY = drawY; + oldDrawPos.x = drawPos.x; + oldDrawPos.y = drawPos.y; oldxSize = xSize; oldySize = ySize; @@ -654,15 +647,15 @@ void Darts::drawDartThrow(const Common::Point &dartPos, int computer) { screen.slamArea(handOCx, handOCy, handOldxSize, handOldySize); // Erase the old dart - if (oldDrawX != -1) - screen.slamArea(oldDrawX, oldDrawY, oldxSize, oldySize); + if (oldDrawPos.x != -1) + screen.slamArea(oldDrawPos.x, oldDrawPos.y, oldxSize, oldySize); - screen._backBuffer1.blitFrom(screen._backBuffer2, Common::Point(drawX, drawY), - Common::Rect(drawX, drawY, drawX + xSize, drawY + ySize)); + screen._backBuffer1.blitFrom(screen._backBuffer2, Common::Point(drawPos.x, drawPos.y), + Common::Rect(drawPos.x, drawPos.y, drawPos.x + xSize, drawPos.y + ySize)); cx = dartPos.x; cy = dartPos.y + 2; - oldDrawX = oldDrawY = -1; + oldDrawPos.x = oldDrawPos.y = -1; for (int idx = 5; idx <= 23; ++idx) { dartNum = idx - 4; @@ -680,38 +673,37 @@ void Darts::drawDartThrow(const Common::Point &dartPos, int computer) { xSize = (*_dartGraphics)[dartNum]._width; ySize = (*_dartGraphics)[dartNum]._height; - ocx = drawX = cx - (*_dartGraphics)[dartNum]._width / 2; - ocy = drawY = cy - (*_dartGraphics)[dartNum]._height; + ocx = drawPos.x = cx - (*_dartGraphics)[dartNum]._width / 2; + ocy = drawPos.y = cy - (*_dartGraphics)[dartNum]._height; - screen._backBuffer1.transBlitFrom((*_dartGraphics)[dartNum], Common::Point(drawX, drawY)); + screen._backBuffer1.transBlitFrom((*_dartGraphics)[dartNum], Common::Point(drawPos.x, drawPos.y)); - if (drawX < 0) { - xSize += drawX; + if (drawPos.x < 0) { + xSize += drawPos.x; if (xSize < 0) xSize = 1; - drawX = 0; + drawPos.x = 0; } - if (drawY < 0) { - ySize += drawY; + if (drawPos.y < 0) { + ySize += drawPos.y; if (ySize < 0) ySize = 1; - drawY = 0; + drawPos.y = 0; } // flush the dart - screen.slamArea(drawX, drawY, xSize, ySize); - if (oldDrawX != -1) - screen.slamArea(oldDrawX, oldDrawY, oldxSize, oldySize); + screen.slamArea(drawPos.x, drawPos.y, xSize, ySize); + if (oldDrawPos.x != -1) + screen.slamArea(oldDrawPos.x, oldDrawPos.y, oldxSize, oldySize); if (idx != 23) - screen._backBuffer1.blitFrom(screen._backBuffer2, Common::Point(drawX, drawY), - Common::Rect(drawX, drawY, drawX + xSize, drawY + ySize)); // erase dart + screen._backBuffer1.blitFrom(screen._backBuffer2, drawPos, + Common::Rect(drawPos.x, drawPos.y, drawPos.x + xSize, drawPos.y + ySize)); // erase dart events.wait(1); - oldDrawX = drawX; - oldDrawY = drawY; + oldDrawPos = drawPos; oldxSize = xSize; oldySize = ySize; } @@ -787,8 +779,6 @@ void Darts::getComputerNumber(int playerNum, Common::Point &targetPos) { int score; int aim = 0; Common::Point pt; - bool done = false; - int cricketaimset = false; bool shootBull = false; score = (playerNum == 0) ? _score1 : _score2; @@ -799,6 +789,7 @@ void Darts::getComputerNumber(int playerNum, Common::Point &targetPos) { if(score > 60) shootBull = true; } else { + bool cricketaimset = false; if (_cricketScore[playerNum][6] < 3) { // shoot at bull first aim = CRICKET_VALUE[6]; @@ -842,6 +833,7 @@ void Darts::getComputerNumber(int playerNum, Common::Point &targetPos) { } } else { // Loop in case number does not exist on board + bool done = false; do { done = findNumberOnBoard(aim, pt); --aim; @@ -906,7 +898,7 @@ int Darts::throwDart(int dartNum, int computer) { if (!computer) { // Wait for a hit while (!dartHit() && !_vm->shouldQuit()) - ; + events.wait(1); if (_escapePressed) return 0; } else { @@ -930,7 +922,7 @@ int Darts::throwDart(int dartNum, int computer) { if (_escapePressed) return 0; - height = doPowerBar(Common::Point(DART_BAR_VX, DART_HEIGHT_Y), DART_COLOR_FORE, targetPos.y, 1); + height = doPowerBar(Common::Point(DART_BAR_VX, DART_HEIGHT_Y), DART_BAR_FORE, targetPos.y, 1); if (_escapePressed) return 0; diff --git a/engines/sherlock/tattoo/tattoo_fixed_text.cpp b/engines/sherlock/tattoo/tattoo_fixed_text.cpp index c9345e44d1..38acd78aba 100644 --- a/engines/sherlock/tattoo/tattoo_fixed_text.cpp +++ b/engines/sherlock/tattoo/tattoo_fixed_text.cpp @@ -27,23 +27,22 @@ namespace Sherlock { namespace Tattoo { -static const char *const FIXED_TEXT_ENGLISH[] = { +static const char *const fixedTextEN[] = { "Money", - "Card", - "Tobacco", - "Timetable", - "Summons", - "Foolscap", - "Damp Paper", - "Bull's Eye", - "Money", "Card", + "Card", + "Tobacco", "Tobacco", "Timetable", + "Timetable", + "Summons", "Summons", "Foolscap", "Foolscap", + "Damp Paper", + "Foolscap", + "Bull's Eye", "Bull's Eye Lantern", "Open", @@ -60,7 +59,7 @@ static const char *const FIXED_TEXT_ENGLISH[] = { "Picked up", "Page %d", - "Close Journal", + "Close Journal", "Search Journal", "Save Journal", "Abort Search", @@ -77,13 +76,13 @@ static const char *const FIXED_TEXT_ENGLISH[] = { "to start", "Hit a key", "Press a key", - "bullseye", + "bullseye", // ?? "GAME OVER", "BUSTED", "Wins", "Scored", "points", - "Hit", + "Hit %s %d", "Double", "Triple", @@ -106,65 +105,167 @@ static const char *const FIXED_TEXT_ENGLISH[] = { "Yes", "No", "Enter Password", - "Going East" + "Going East", // correct password, was not and should not to be translated + // SH2: People names + "Sherlock Holmes", + "Dr. Watson", + "Mrs. Hudson", + "Stanley Forbes", + "Mycroft Holmes", + "Wiggins", + "Police Constable Burns", + "Augustus Trimble", + "Police Constable Daley", + "Matron", + "Sister Grace", + "Preston McCabe", + "Bob Colleran", + "Jonas Rigby", + "Police Constable Roach", + "James Dewar", + "Sergeant Jeremy Duncan", + "Inspector Gregson", + "Inspector Lestrade", + "Jesse Needhem", + "Arthur Fleming", + "Mr. Thomas Pratt", + "Mathilda (Tillie) Mason", + "Adrian Russell", + "Eldridge Whitney", + "Hepplethwaite", + "Horace Silverbridge", + "Old Sherman", + "Maxwell Verner", + "Millicent Redding", + "Virgil Silverbridge", + "George O'Keeffe", + "Lord Denys Lawton", + "Jenkins", + "Jock Mahoney", + "Bartender", + "Lady Cordelia Lockridge", + "Pettigrew", + "Sir Avery Fanshawe", + "Hodgkins", + "Wilbur \"Birdy\" Heywood", + "Jacob Farthington", + "Philip Bledsoe", + "Sidney Fowler", + "Professor Theodore Totman", + "Rose Hinchem", + "Tallboy", + "Ethlebert \"Stitch\" Rumsey", + "Charles Freedman", + "Nigel Hemmings", + "Fairfax Carter", + "Wilhelm II", + "Wachthund", + "Jonathan Wilson", + "David Lloyd-Jones", + "Edward Hargrove", + "Misteray", + "The Lascar", + "Parrot", + "Vincent Scarrett", + "Alexandra", + "Queen Victoria", + "John Brown", + "A Patient", + "A Patient", + "Patron", + "Queen Victoria", + "Patient in white", + "Lush", + "Drunk", + "Prostitute", + "Mudlark", + "Grinder", + "Bouncer", + "Agnes Ratchet", + "Aloysius Ratchet", + "Real Estate Agent", + "Candy Clerk", + "Beadle", + "Prussian", + "Mrs. Rowbottom", + "Miss Lloyd-Jones", + "Tavern patron", + "User", + "Toby", + "Stationer", + "Law Clerk", + "Ministry Clerk", + "Bather", + "Maid", + "Lady Fanshawe", + "Sidney Ratchet", + "Boy", + "Patron", + "Constable Brit", + "Wagon Driver" }; -static const char *const FIXED_TEXT_GERMAN[] = { +// sharp-s : 0xE1 / octal 341 +// small a-umlaut: 0x84 / octal 204 +// small o-umlaut: 0x94 / octal 224 +// small u-umlaut: 0x81 / octal 201 +// large O-umlaut: 0x99 / octal 231 +static const char *const fixedTextDE[] = { "Geld", - "S. Holmes", - "Tabak", - "Plan", - "Aufforderg.", - "Blatt pap.", - "Dunstig pap", - "Handlampe", - "Geld", "S. Holmes", + "S. Holmes", "Tabak", + "Tabak", + "Plan", "Plan", "Aufforderg.", + "Aufforderg.", + "Blatt pap.", "Pergament", "Dunstig pap", + "Dunstig pap", + "Handlampe", "Handlampe", - "ffne", + "\231ffne", "Schau", "Rede", "Benutze", - "Journal", - "Inventory", - "Options", - "Losen", + "Tagebuch", + "Tasche", + "Optionen", + "L\224osen", "mit", "Keine Wirkung...", - "Diese Person weic im Augenblick nichts zu berichten.", + "Diese Person wei\341 im Augenblick nichts zu berichten.", + "Picked up", // <-- ?? "Seite %d", - "Schliecen", - "Lessen", + "Schlie\341en", + "Lessen", // <-- "In Datei sichern", "Suche abbrechen", - "Rbckwarts suchen ", + "R\201ckw\204rts suchen ", "Vorwarts suchen ", "Text nicht gefunden", "Holmes", "Jock", "Bull", - "Runde", - "Gesamt", - "Pfeil", + "Runde: %d", + "Gesamt: %d", + "Pfeil # %d", "zum Starten", - "Taste dracken", - "Taste dracken", - "Bullseye", - "SPIEL BEENDET", - "VERLOREN", - "Gewinnt", - "Erzielte", - "Punkte", - "Treffer", + "Taste dr\201cken", + "Taste dr\201cken", + "Bullseye", // ?? + "SPIEL BEENDET!", + "VERLOREN!", + "Gewinnt!", // "Holmes Gewinnt!", "%s Gewinnt!" + "Erzielte %d Punkte", + "Punkte", // ?? + "Treffer %s %d", "Doppel", "Dreifach", @@ -177,7 +278,7 @@ static const char *const FIXED_TEXT_GERMAN[] = { "Soundeffekte", "Voices", "Textfenster", - "Transparente Menbs", + "Transparente Men\201s", "Schriftart andern", "Aus", "An", @@ -186,19 +287,499 @@ static const char *const FIXED_TEXT_GERMAN[] = { "Sind Sie sicher ?", "Ja", "Nein", - "Pacwort eingeben", - "Going East" + "Pa\341wort eingeben", + "Going East", // correct password, was not and should not to be translated + // SH2: People names + "Sherlock Holmes", // note: People names were not translated in the German interpreter + "Dr. Watson", + "Mrs. Hudson", + "Stanley Forbes", + "Mycroft Holmes", + "Wiggins", + "Police Constable Burns", + "Augustus Trimble", + "Police Constable Daley", + "Matron", + "Sister Grace", + "Preston McCabe", + "Bob Colleran", + "Jonas Rigby", + "Police Constable Roach", + "James Dewar", + "Sergeant Jeremy Duncan", + "Inspector Gregson", + "Inspector Lestrade", + "Jesse Needhem", + "Arthur Fleming", + "Mr. Thomas Pratt", + "Mathilda (Tillie) Mason", + "Adrian Russell", + "Eldridge Whitney", + "Hepplethwaite", + "Horace Silverbridge", + "Old Sherman", + "Maxwell Verner", + "Millicent Redding", + "Virgil Silverbridge", + "George O'Keeffe", + "Lord Denys Lawton", + "Jenkins", + "Jock Mahoney", + "Bartender", + "Lady Cordelia Lockridge", + "Pettigrew", + "Sir Avery Fanshawe", + "Hodgkins", + "Wilbur \"Birdy\" Heywood", + "Jacob Farthington", + "Philip Bledsoe", + "Sidney Fowler", + "Professor Theodore Totman", + "Rose Hinchem", + "Tallboy", + "Ethlebert \"Stitch\" Rumsey", + "Charles Freedman", + "Nigel Hemmings", + "Fairfax Carter", + "Wilhelm II", + "Wachthund", + "Jonathan Wilson", + "David Lloyd-Jones", + "Edward Hargrove", + "Misteray", + "The Lascar", + "Parrot", + "Vincent Scarrett", + "Alexandra", + "Queen Victoria", + "John Brown", + "A Patient", + "A Patient", + "Patron", + "Queen Victoria", + "Patient in white", + "Lush", + "Drunk", + "Prostitute", + "Mudlark", + "Grinder", + "Bouncer", + "Agnes Ratchet", + "Aloysius Ratchet", + "Real Estate Agent", + "Candy Clerk", + "Beadle", + "Prussian", + "Mrs. Rowbottom", + "Miss Lloyd-Jones", + "Tavern patron", + "User", + "Toby", + "Stationer", + "Law Clerk", + "Ministry Clerk", + "Bather", + "Maid", + "Lady Fanshawe", + "Sidney Ratchet", + "Boy", + "Patron", + "Constable Brit", + "Wagon Driver" +}; + +// small a w/ accent grave: 0x85 / octal 205 +// small e w/ accent acute: 0x82 / octal 202 +// small e w/ accent grave: 0x8A / octal 212 +// small e w/ circonflexe: 0x88 / octal 210 +// small cedilla: 0x87 / octal 207 +static const char *const fixedTextFR[] = { + "Argent", + "Argent", + "S. Holmes", + "S. Holmes", + "Tabac", + "Tabac", + "Horaire", + "Horaire", + "Convocation", + "Convocation", + "Feuille", + "Feuille", + "F. humide", + "Feuille", + "Lanterne", + "Lanterne", + + "Ouvrir", + "Regarder", + "Parler", + "Utiliser", + "Journal", // <-- + "Inventaire", + "Options", + "R\202soudre", + "avec", + "Sans effet...", + "Cette personne n'a rien \205 ajouter pour le moment.", + "Picked up", // <-- ?? + + "Page %d", + "Fermer", + "Lessen", // <-- + "Sauvegarder", + "Annuler ", + "Chercher avant", + "Chercher apr\212s", + "Texte introuvable !", + + "Holmes", + "Jock", + "Bull", + "Tour: %d", + "Total: %d", + "Fl\202chette # %d", + "pour commencer", + "Appuyez sur C", + "Appuyez sur C", + "Bullseye", // ?? + "FIN DE LA PARTIE!", // original: "Fin de la partie!" + "FIASCO!", + "Gagnant!", // "Holmes Gagnant!", "%s Gagnant!" + "Total des points: %d", + "Punkte", // ?? + "Treffer %s %d", + "double", + "triple", + + "Mouillez", + "Puis", + "Chauffez", + "Charger", + "Sauvegarder", + "Musique", + "Sons", + "Voix", + "Fen\210tres de texte", // 0x88 + "Menu Transparent", + "Changer la fonte", + "Aus", // ??? + "An", // ??? + "Quitter", + "Voulez-vous quitter?", + "Sind Sie sicher ?", // ??? + "Oui", + "Non", + "Entrez le mot de passe", + "Going East", // correct password, was not and should not to be translated + // SH2: People names + "Sherlock Holmes", + "Dr. Watson", + "Mme. Hudson", + "Stanley Forbes", + "Mycroft Holmes", + "Wiggins", + "Sergent Burns", + "Augustus Trimble", + "Sergent Daley", + "Infirmi\212re chef", + "Mme. Grace", + "Preston McCabe", + "Bob Colleran", + "Jonas Rigby", + "Sergent Roach", + "James Dewar", + "Sergent Jeremy Duncan", + "Inspecteur Gregson", + "Inspecteur Lestrade", + "Jesse Needhem", + "Arthur Fleming", + "M. Thomas Pratt", + "Mathilda (Tillie) Mason", + "Adrian Russell", + "Eldridge Whitney", + "Hepplethwaite", + "Horace Silverbridge", + "Sherman", + "Maxwell Verner", + "Millicent Redding", + "Virgil Silverbridge", + "George O'Keeffe", + "Lord Denys Lawton", + "Jenkins", + "Jock Mahoney", + "Serveur", + "Lady Cordelia Lockridge", + "Pettigrew", + "Sir Avery Fanshawe", + "Hodgkins", + "Wilbur \"Birdy\" Heywood", + "Jacob Farthington", + "Philip Bledsoe", + "Sidney Fowler", + "Professeur Theodore Totman", + "Rose Hinchem", + "Tallboy", + "Ethlebert \"Stitch\" Rumsey", + "Charles Freedman", + "Nigel Hemmings", + "Fairfax Carter", + "Wilhelm II", + "Wachthund", + "Jonathan Wilson", + "David Lloyd-Jones", + "Edward Hargrove", + "Misteray", + "Le Lascar", + "Oiseau", + "Vincent Scarrett", + "Alexandra", + "Queen Victoria", + "John Brown", + "Patient", + "Patient", + "Client", + "Queen Victoria", + "Patient en blanc", + "Ivrogne", + "Ivrogne", + "Belle femme", + "Mudlark", + "Broyeur", + "Videur", + "Agnes Ratchet", + "Aloysius Ratchet", + "Immobilier", + "Gar\207on", + "Beadle", + "Prussian", + "Mme. Rowbottom", + "Mme Lloyd-Jones", + "Tavern Client", + "User", + "Toby", + "Papeterie", + "Law Clerc", + "Ministry Employ\202", + "Clint du thermes", + "Bonne", + "Lady Fanshawe", + "Sidney Ratchet", + "Gar\207on", + "Client", + "Sergent Brit", + "Wagon Driver" +}; + +// small a w/ accent bottom to top : 0xA0 / octal 240 +// small i w/ accent bottom to top : 0xA1 / octal 241 +// small o w/ accent bottom to top : 0xA2 / octal 242 +// small u w/ accent bottom to top : 0xA3 / octal 243 +// small n w/ wavy line : 0xA4 / octal 244 +// inverted question mark : 0xA8 / octal 250 +static const char *const fixedTextES[] = { + "Dinero", + "Dinero", + "Tarjeta", + "Tarjeta", + "Tabaco", + "Tabaco", + "Horarios", + "Horarios", + "Mensaje", + "Mensaje", + "Papel", + "Papel", + "Papel", + "Papel", + "Linterna", + "Linterna", + + "Abrir", + "Mirar", + "Hablar", + "Usar", + "Diario", + "Inventario", + "Opciones", + "Resolver", + "con", + "Sin Efecto...", + "Esta persona no tiene nada que decir en este momento", + "Picked up", // <-- ?? + + "P\240gina %d", + "Cerrar Diario", + "Lessen", // <-- not included?!?! + "Salvar en Archivo", + "Detener B\243squeda", + "Buscar Hacia Atr\240s", + "Buscar Hacia Delante", + "Texto No Encontrado !", + + "Holmes", // + "Jock", + "Bull", + "Vuelta: %d", + "Total del Turno: %d", + "Dardo # %d", + "para empezar", + "Pulsa una tecla", + "Pulsa una tecla", + "Golpe %s ojo de buey", // ?? + "FIN DE LA PARTIDA!", + "ROTO!", + "Gana!", // "Holmes Gana!", "%s Gana!" + "Puntuado %d puntos", + "puntos", // ?? + "Golpe %s %d", + "doble", + "triple", + + "aplicar", + "Agua", + "Calentar", + "Cargar Partida", + "Salvar Partida", + "M\243sica", + "Efectos de Sonido", + "Voces", + "Ventanas de Texto", + "Men\243s Transparentes", + "Cambiar Tipo de Letra", + "Off", // ??? + "On", // ??? + "Salir", + "quieres salir?", + "\250Est\240s seguro de que", + "Si", + "Non", + "Introducir Palabra Clave", + "Vas al Este", // correct password, was translated in Spanish version (???) + // SH2: People names + "Sherlock Holmes", + "Dr. Watson", + "Sta. Hudson", + "Stanley Forbes", + "Mycroft Holmes", + "Wiggins", + "Agente de Polic\241a Burns", + "Augustus Trimble", + "Agente de Polic\241a Daley", + "Enfermera", + "Hermana Grace", + "Preston McCabe", + "Bob Colleran", + "Jonas Rigby", + "Agente de Polic\241a Roach", + "James Dewar", + "Sargento Jeremy Duncan", + "Inspector Gregson", + "Inspector Lestrade", + "Jesse Needhem", + "Arthur Fleming", + "Sr. Thomas Pratt", + "Mathilda (Tillie) Mason", + "Adrian Russell", + "Eldridge Whitney", + "Hepplethwaite", + "Horace Silverbridge", + "Old Sherman", + "Maxwell Verner", + "Millicent Redding", + "Virgil Silverbridge", + "George O'Keeffe", + "Lord Denys Lawton", + "Jenkins", + "Jock Mahoney", + "Camarero", + "Lady Cordelia Lockridge", + "Pettigrew", + "Sir Avery Fanshawe", + "Hodgkins", + "Wilbur \"Birdy\" Heywood", + "Jacob Farthington", + "Philip Bledsoe", + "Sidney Fowler", + "Profesor Theodore Totman", + "Rose Hinchem", + "Tallboy", + "Ethlebert \"Stitch\" Rumsey", + "Charles Freedman", + "Nigel Hemmings", + "Fairfax Carter", + "Guillermo II", + "Wachthund", + "Jonathan Wilson", + "David Lloyd-Jones", + "Edward Hargrove", + "Misteray", + "The Lascar", + "Loro", + "Vincent Scarrett", + "Alexandra", + "Reina Victoria", + "John Brown", + "Un Paciente", + "Un Paciente", + "Cliente", + "Reina Victoria", + "Paciente de blanco", + "Exuberante", + "Borracho", + "Prostituta", + "Mudlark", + "Grinder", + "Mat\242n", // sic? means block in Spanish and not bouncer?! + "Agnes Ratchet", + "Aloysius Ratchet", + "Agente de Bienes Ra\241ces", + "Candy Clerk", + "Beadle", + "Prusiano", + "Sta. Rowbottom", + "Sra. Lloyd-Jones", + "Parroquiano", + "Usuario", + "Toby", + "Papelero", + "Secretario de Justicia", + "Secreatrio del Ministerio", + "Ba\244ista", + "Criada", + "Lady Fanshawe", + "Sidney Ratchet", + "Chico", + "Patron", // ??? not found?? + "Agente Brit", + "Cochero" +}; + +// TODO: There also was a Spanish version of Sherlock Holmes 2 +static const FixedTextLanguageEntry fixedTextLanguages[] = { + { Common::DE_DEU, fixedTextDE }, + { Common::ES_ESP, fixedTextES }, + { Common::EN_ANY, fixedTextEN }, + { Common::FR_FRA, fixedTextFR }, + { Common::UNK_LANG, fixedTextEN } }; TattooFixedText::TattooFixedText(SherlockEngine *vm) : FixedText(vm) { - if (vm->getLanguage() == Common::DE_DEU) - _fixedText = FIXED_TEXT_GERMAN; - else - _fixedText = FIXED_TEXT_ENGLISH; + // Figure out which fixed texts to use + Common::Language curLanguage = _vm->getLanguage(); + + const FixedTextLanguageEntry *curLanguageEntry = fixedTextLanguages; + + while (curLanguageEntry->language != Common::UNK_LANG) { + if (curLanguageEntry->language == curLanguage) + break; // found current language + curLanguageEntry++; + } + _curLanguageEntry = curLanguageEntry; } const char *TattooFixedText::getText(int fixedTextId) { - return _fixedText[fixedTextId]; + return _curLanguageEntry->fixedTextArray[fixedTextId]; } const Common::String TattooFixedText::getActionMessage(FixedTextActionId actionId, int messageIndex) { diff --git a/engines/sherlock/tattoo/tattoo_fixed_text.h b/engines/sherlock/tattoo/tattoo_fixed_text.h index 3f43678ca2..48d237db3c 100644 --- a/engines/sherlock/tattoo/tattoo_fixed_text.h +++ b/engines/sherlock/tattoo/tattoo_fixed_text.h @@ -31,20 +31,20 @@ namespace Tattoo { enum FixedTextId { kFixedText_Inv1, - kFixedText_Inv2, - kFixedText_Inv3, - kFixedText_Inv4, - kFixedText_Inv5, - kFixedText_Inv6, - kFixedText_Inv7, - kFixedText_Inv8, kFixedText_InvDesc1, + kFixedText_Inv2, kFixedText_InvDesc2, + kFixedText_Inv3, kFixedText_InvDesc3, + kFixedText_Inv4, kFixedText_InvDesc4, + kFixedText_Inv5, kFixedText_InvDesc5, + kFixedText_Inv6, kFixedText_InvDesc6, + kFixedText_Inv7, kFixedText_InvDesc7, + kFixedText_Inv8, kFixedText_InvDesc8, kFixedText_Open, kFixedText_Look, @@ -106,12 +106,114 @@ enum FixedTextId { kFixedText_Yes, kFixedText_No, kFixedText_EnterPassword, - kFixedText_CorrectPassword + kFixedText_CorrectPassword, + // SH2: People names + kFixedText_People_SherlockHolmes, + kFixedText_People_DrWatson, + kFixedText_People_MrsHudson, + kFixedText_People_StanleyForbes, + kFixedText_People_MycroftHolmes, + kFixedText_People_Wiggins, + kFixedText_People_PoliceConstableBurns, + kFixedText_People_AugustusTrimble, + kFixedText_People_PoliceConstableDaley, + kFixedText_People_Matron, + kFixedText_People_SisterGrace, + kFixedText_People_PrestonMcCabe, + kFixedText_People_BobColleran, + kFixedText_People_JonasRigby, + kFixedText_People_PoliceConstableRoach, + kFixedText_People_JamesDewar, + kFixedText_People_SergeantJeremyDuncan, + kFixedText_People_InspectorGregson, + kFixedText_People_InspectorLestrade, + kFixedText_People_JesseNeedhem, + kFixedText_People_ArthurFleming, + kFixedText_People_MrThomasPratt, + kFixedText_People_MathildaTillieMason, + kFixedText_People_AdrianRussell, + kFixedText_People_EldridgeWhitney, + kFixedText_People_Hepplethwaite, + kFixedText_People_HoraceSilverbridge, + kFixedText_People_OldSherman, + kFixedText_People_MaxwellVerner, + kFixedText_People_MillicentRedding, + kFixedText_People_VirgilSilverbridge, + kFixedText_People_GeorgeOKeeffe, + kFixedText_People_LordDenysLawton, + kFixedText_People_Jenkins, + kFixedText_People_JockMahoney, + kFixedText_People_Bartender, + kFixedText_People_LadyCordeliaLockridge, + kFixedText_People_Pettigrew, + kFixedText_People_SirAveryFanshawe, + kFixedText_People_Hodgkins, + kFixedText_People_WilburBirdyHeywood, + kFixedText_People_JacobFarthington, + kFixedText_People_PhilipBledsoe, + kFixedText_People_SidneyFowler, + kFixedText_People_ProfessorTheodoreTotman, + kFixedText_People_RoseHinchem, + kFixedText_People_Tallboy, + kFixedText_People_EthlebertStitchRumsey, + kFixedText_People_CharlesFreedman, + kFixedText_People_NigelHemmings, + kFixedText_People_FairfaxCarter, + kFixedText_People_WilhelmII, + kFixedText_People_Wachthund, + kFixedText_People_JonathanWilson, + kFixedText_People_DavidLloydJones, + kFixedText_People_EdwardHargrove, + kFixedText_People_Misteray, + kFixedText_People_TheLascar, + kFixedText_People_Parrot, + kFixedText_People_VincentScarrett, + kFixedText_People_Alexandra, + kFixedText_People_QueenVictoria, + kFixedText_People_JohnBrown, + kFixedText_People_APatient1, + kFixedText_People_APatient2, + kFixedText_People_Patron, + kFixedText_People_QueenVictoria2, + kFixedText_People_PatientInWhite, + kFixedText_People_Lush, + kFixedText_People_Drunk, + kFixedText_People_Prostitute, + kFixedText_People_Mudlark, + kFixedText_People_Grinder, + kFixedText_People_Bouncer, + kFixedText_People_AgnesRatchet, + kFixedText_People_AloysiusRatchet, + kFixedText_People_RealEstateAgent, + kFixedText_People_CandyClerk, + kFixedText_People_Beadle, + kFixedText_People_Prussian, + kFixedText_People_MrsRowbottom, + kFixedText_People_MissLloydJones, + kFixedText_People_TavernPatron, + kFixedText_People_User, + kFixedText_People_Toby, + kFixedText_People_Stationer, + kFixedText_People_LawClerk, + kFixedText_People_MinistryClerk, + kFixedText_People_Bather, + kFixedText_People_Maid, + kFixedText_People_LadyFanshawe, + kFixedText_People_SidneyRatchet, + kFixedText_People_Boy, + kFixedText_People_Patron2, + kFixedText_People_ConstableBrit, + kFixedText_People_WagonDriver +}; + +struct FixedTextLanguageEntry { + Common::Language language; + const char *const *fixedTextArray; }; class TattooFixedText: public FixedText { private: - const char *const *_fixedText; + const FixedTextLanguageEntry *_curLanguageEntry; public: TattooFixedText(SherlockEngine *vm); virtual ~TattooFixedText() {} diff --git a/engines/sherlock/tattoo/tattoo_inventory.cpp b/engines/sherlock/tattoo/tattoo_inventory.cpp index 6bd1822c10..14e79e9f33 100644 --- a/engines/sherlock/tattoo/tattoo_inventory.cpp +++ b/engines/sherlock/tattoo/tattoo_inventory.cpp @@ -43,10 +43,10 @@ void TattooInventory::loadInv() { Common::SeekableReadStream *stream = _vm->_res->load("invent.txt"); int count = stream->readByte(); - char c; for (int idx = 0; idx < count; ++idx) { Common::String name; + char c; while ((c = stream->readByte()) != 0) name += c; diff --git a/engines/sherlock/tattoo/tattoo_journal.cpp b/engines/sherlock/tattoo/tattoo_journal.cpp index b45d669c34..e836cca620 100644 --- a/engines/sherlock/tattoo/tattoo_journal.cpp +++ b/engines/sherlock/tattoo/tattoo_journal.cpp @@ -253,9 +253,11 @@ void TattooJournal::handleButtons() { // FIgure out the left of the scrollbar scroll area and paging data const int scrollingWidth = JOURNAL_BAR_WIDTH - BUTTON_SIZE * 2 - 6; const int scrollingLeft = (SHERLOCK_SCREEN_WIDTH - JOURNAL_BAR_WIDTH) / 2 + BUTTON_SIZE + 3; - const int numPages = (_maxPage + LINES_PER_PAGE - 1) / LINES_PER_PAGE - 1; - const int barWidth = CLIP(scrollingWidth / numPages, BUTTON_SIZE, JOURNAL_BAR_WIDTH - BUTTON_SIZE * 2 - 6); + const int numPages = (_maxPage + LINES_PER_PAGE - 1) / LINES_PER_PAGE; + if (numPages == 1) + return; + const int barWidth = CLIP(scrollingWidth / numPages, BUTTON_SIZE, JOURNAL_BAR_WIDTH - BUTTON_SIZE * 2 - 6); const int scrollOffset = mousePos.x - scrollingLeft; const int page = scrollOffset * FIXED_INT_MULTIPLIER / ((scrollingWidth - barWidth) * (FIXED_INT_MULTIPLIER / (numPages - 1))) + 1; @@ -345,9 +347,9 @@ void TattooJournal::handleButtons() { disableControls(); bool notFound = false; - int dir; do { + int dir; if ((dir = getFindName(notFound)) != 0) { _savedIndex = _index; _savedSub = _sub; @@ -556,7 +558,7 @@ void TattooJournal::highlightJournalControls(bool slamIt) { _selector = JH_NONE; } else { // Calculate the Scroll Position Bar - int numPages = (_maxPage + LINES_PER_PAGE - 1) / LINES_PER_PAGE - 1; + int numPages = (_maxPage + LINES_PER_PAGE - 1) / LINES_PER_PAGE; int barWidth = (r.width() - BUTTON_SIZE * 2 - 6) / numPages; barWidth = CLIP(barWidth, BUTTON_SIZE, r.width() - BUTTON_SIZE * 2 - 6); @@ -672,7 +674,7 @@ void TattooJournal::drawScrollBar() { r.moveTo((SHERLOCK_SCREEN_WIDTH - r.width()) / 2, SHERLOCK_SCREEN_HEIGHT - r.height()); // Calculate the Scroll Position Bar - int numPages = (_maxPage + LINES_PER_PAGE - 1) / LINES_PER_PAGE - 1; + int numPages = (_maxPage + LINES_PER_PAGE - 1) / LINES_PER_PAGE; int barWidth = (r.width() - BUTTON_SIZE * 2 - 6) / numPages; barWidth = CLIP(barWidth, BUTTON_SIZE, r.width() - BUTTON_SIZE * 2 - 6); int barX; diff --git a/engines/sherlock/tattoo/tattoo_map.cpp b/engines/sherlock/tattoo/tattoo_map.cpp index 4bd85bd5c0..4c7e8c8fef 100644 --- a/engines/sherlock/tattoo/tattoo_map.cpp +++ b/engines/sherlock/tattoo/tattoo_map.cpp @@ -134,6 +134,7 @@ int TattooMap::show() { screen.slamArea(screen._currentScroll.x, screen._currentScroll.y, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_WIDTH); } + music.checkSongProgress(); checkMapNames(true); if (mousePos.x < (SHERLOCK_SCREEN_WIDTH / 6)) @@ -364,8 +365,8 @@ void TattooMap::showCloseUp(int closeUpNum) { Events &events = *_vm->_events; Screen &screen = *_vm->_screen; - // Reset scroll position - screen._currentScroll = Common::Point(0, 0); + // Hide the cursor + events.hideCursor(); // Get the closeup images Common::String fname = Common::String::format("res%02d.vgs", closeUpNum + 1); @@ -402,7 +403,8 @@ void TattooMap::showCloseUp(int closeUpNum) { for (int step = 0; step < CLOSEUP_STEPS; ++step) { Common::Point picSize(pic[0].sDrawXSize(scaleVal), pic[0].sDrawYSize(scaleVal)); - Common::Point pt(closeUp.x / 100 - picSize.x / 2, closeUp.y / 100 - picSize.y / 2); + Common::Point pt(screen._currentScroll.x + closeUp.x / 100 - picSize.x / 2, + screen._currentScroll.y + closeUp.y / 100 - picSize.y / 2); restoreArea(oldBounds); screen._backBuffer1.transBlitFrom(pic[0], pt, false, 0, scaleVal); @@ -418,15 +420,18 @@ void TattooMap::showCloseUp(int closeUpNum) { } // Handle final drawing of closeup - Common::Rect r(SHERLOCK_SCREEN_WIDTH / 2 - pic[0]._width / 2, SHERLOCK_SCREEN_HEIGHT / 2 - pic[0]._height / 2, - SHERLOCK_SCREEN_WIDTH / 2 - pic[0]._width / 2 + pic[0]._width, - SHERLOCK_SCREEN_HEIGHT / 2 - pic[0]._height / 2 + pic[0]._height); + Common::Rect r(screen._currentScroll.x + SHERLOCK_SCREEN_WIDTH / 2 - pic[0]._width / 2, + screen._currentScroll.y + SHERLOCK_SCREEN_HEIGHT / 2 - pic[0]._height / 2, + screen._currentScroll.x + SHERLOCK_SCREEN_WIDTH / 2 - pic[0]._width / 2 + pic[0]._width, + screen._currentScroll.y + SHERLOCK_SCREEN_HEIGHT / 2 - pic[0]._height / 2 + pic[0]._height); restoreArea(oldBounds); screen._backBuffer1.transBlitFrom(pic[0], Common::Point(r.left, r.top)); screen.slamRect(oldBounds); screen.slamRect(r); + events.wait(60); + events.showCursor(); } } // End of namespace Tattoo diff --git a/engines/sherlock/tattoo/tattoo_people.cpp b/engines/sherlock/tattoo/tattoo_people.cpp index e3e957e35c..0af8deff9f 100644 --- a/engines/sherlock/tattoo/tattoo_people.cpp +++ b/engines/sherlock/tattoo/tattoo_people.cpp @@ -121,12 +121,13 @@ TattooPerson::TattooPerson() : Person() { _lookHolmes = false; } -void TattooPerson::freeAltGraphics() { - if (_altImages != nullptr) { - delete _altImages; - _altImages = nullptr; - } +TattooPerson::~TattooPerson() { + delete _altImages; +} +void TattooPerson::freeAltGraphics() { + delete _altImages; + _altImages = nullptr; _altSeq = 0; } @@ -874,8 +875,8 @@ Common::Point TattooPerson::getSourcePoint() const { TattooScene &scene = *(TattooScene *)_vm->_scene; int scaleVal = scene.getScaleVal(_position); - return Common::Point(_position.x / FIXED_INT_MULTIPLIER + _imageFrame->sDrawXSize(scaleVal) / 2, - _position.y / FIXED_INT_MULTIPLIER); + return Common::Point(_position.x / FIXED_INT_MULTIPLIER + + (_imageFrame ? _imageFrame->sDrawXSize(scaleVal) / 2 : 0), _position.y / FIXED_INT_MULTIPLIER); } void TattooPerson::setObjTalkSequence(int seq) { @@ -1010,7 +1011,6 @@ void TattooPerson::walkHolmesToNPC() { Screen &screen = *_vm->_screen; Talk &talk = *_vm->_talk; TattooPerson &holmes = people[HOLMES]; - int facing; // Save the character's details pushNPCPath(); @@ -1073,9 +1073,8 @@ void TattooPerson::walkHolmesToNPC() { if (!talk._talkToAbort) { // Setup correct direction for Holmes to face - // See where Holmes is with respect to the NPC (x coords) - facing = (holmes._position.x < _position.x) ? STOP_RIGHT : STOP_LEFT; + int facing = (holmes._position.x < _position.x) ? STOP_RIGHT : STOP_LEFT; // See where Holmes is with respect to the NPC (y coords) if (holmes._position.y < (_position.y - (10 * FIXED_INT_MULTIPLIER))) { diff --git a/engines/sherlock/tattoo/tattoo_people.h b/engines/sherlock/tattoo/tattoo_people.h index 722c4a9aaa..e0d53c67dd 100644 --- a/engines/sherlock/tattoo/tattoo_people.h +++ b/engines/sherlock/tattoo/tattoo_people.h @@ -128,7 +128,7 @@ public: bool _lookHolmes; public: TattooPerson(); - virtual ~TattooPerson() {} + virtual ~TattooPerson(); /** * Clear the NPC related data diff --git a/engines/sherlock/tattoo/tattoo_resources.cpp b/engines/sherlock/tattoo/tattoo_resources.cpp index 3be41e2650..4b73356d58 100644 --- a/engines/sherlock/tattoo/tattoo_resources.cpp +++ b/engines/sherlock/tattoo/tattoo_resources.cpp @@ -21,309 +21,111 @@ */ #include "sherlock/tattoo/tattoo_resources.h" +#include "sherlock/tattoo/tattoo_fixed_text.h" namespace Sherlock { namespace Tattoo { -const char PORTRAITS[TATTOO_MAX_PEOPLE][5] = { - { "HOLM" }, // Sherlock Holmes - { "WATS" }, // Dr. Watson - { "HUDS" }, // Mrs. Hudson - { "FORB" }, // Stanley Forbes - { "MYCR" }, // Mycroft Holmes - { "WIGG" }, // Wiggins - { "BURN" }, // Police Constable Burns - { "TRIM" }, // Augustus Trimble - { "DALE" }, // Police Constable Daley - { "MATR" }, // Matron - { "GRAC" }, // Sister Grace - { "MCCA" }, // Preston McCabe - { "COLL" }, // Bob Colleran - { "JONA" }, // Jonas Rigby - { "ROAC" }, // Police Constable Roach - { "DEWA" }, // James Dewar - { "JERE" }, // Sergeant Jeremy Duncan - { "GREG" }, // Inspector Gregson - { "LEST" }, // Inspector Lestrade - { "NEED" }, // Jesse Needhem - { "FLEM" }, // Arthur Fleming - { "PRAT" }, // Mr. Thomas Pratt - { "TILL" }, // Mathilda (Tillie) Mason - { "RUSS" }, // Adrian Russell - { "WHIT" }, // Eldridge Whitney - { "HEPP" }, // Hepplethwaite - { "HORA" }, // Horace Silverbridge - { "SHER" }, // Old Sherman - { "VERN" }, // Maxwell Verner - { "REDD" }, // Millicent Redding - { "VIRG" }, // Virgil Silverbridge - { "GEOR" }, // George O'Keeffe - { "LAWT" }, // Lord Denys Lawton - { "JENK" }, // Jenkins - { "JOCK" }, // Jock Mahoney - { "BART" }, // Bartender - { "LADY" }, // Lady Cordelia Lockridge - { "PETT" }, // Pettigrew - { "FANS" }, // Sir Avery Fanshawe - { "HODG" }, // Hodgkins - { "WILB" }, // Wilbur "Birdy" Heywood - { "JACO" }, // Jacob Farthington - { "BLED" }, // Philip Bledsoe - { "FOWL" }, // Sidney Fowler - { "PROF" }, // Professor Theodore Totman - { "ROSE" }, // Rose Hinchem - { "TALL" }, // Tallboy - { "STIT" }, // Ethlebert "Stitch" Rumsey - { "FREE" }, // Charles Freedman - { "HEMM" }, // Nigel Hemmings - { "CART" }, // Fairfax Carter - { "WILH" }, // Wilhelm II - { "WACH" }, // Wachthund - { "WILS" }, // Jonathan Wilson - { "DAVE" }, // David Lloyd-Jones - { "HARG" }, // Edward Hargrove - { "MORI" }, // Professor James Moriarty - { "LASC" }, // The Lascar - { "PARR" }, // Parrot - { "SCAR" }, // Vincent Scarrett - { "ALEX" }, // Alexandra - { "QUEE" }, // Queen Victoria - { "JOHN" }, // John Brown - { "PAT1" }, // Patient #1 - { "PAT2" }, // Patient #2 - { "PATR" }, // Patron - { "QUEN" }, // Queen Victoria - { "WITE" }, // Patient in White - { "LUSH" }, // Lush - { "DRNK" }, // Drunk - { "PROS" }, // Prostitute - { "MUDL" }, // Mudlark - { "GRIN" }, // Grinder - { "BOUN" }, // Bouncer - { "RATC" }, // Agnes Ratchet - { "ALOY" }, // Aloysius Ratchet - { "REAL" }, // Real Estate Agent - { "CAND" }, // Candy Clerk - { "BEAD" }, // Beadle - { "PRUS" }, // Prussian - { "ROWB" }, // Mrs. Rowbottom - { "MSLJ" }, // Miss Lloyd-Jones - { "TPAT" }, // Tavern patron - { "USER" }, // User - { "TOBY" }, // Toby - { "STAT" }, // Stationer - { "CLRK" }, // Law Clerk - { "CLER" }, // Ministry Clerk - { "BATH" }, // Bather - { "MAID" }, // Maid - { "LADF" }, // Lady Fanshawe - { "SIDN" }, // Sidney Ratchet - { "BOYO" }, // Boy - { "PTR2" }, // Second Patron - { "BRIT" }, // Constable Brit - { "DROV" } // Wagon Driver +const PeopleData PEOPLE_DATA[TATTOO_MAX_PEOPLE] = { + { "HOLM", kFixedText_People_SherlockHolmes }, + { "WATS", kFixedText_People_DrWatson }, + { "HUDS", kFixedText_People_MrsHudson }, + { "FORB", kFixedText_People_StanleyForbes }, + { "MYCR", kFixedText_People_MycroftHolmes }, + { "WIGG", kFixedText_People_Wiggins }, + { "BURN", kFixedText_People_PoliceConstableBurns }, + { "TRIM", kFixedText_People_AugustusTrimble }, + { "DALE", kFixedText_People_PoliceConstableDaley }, + { "MATR", kFixedText_People_Matron }, + { "GRAC", kFixedText_People_SisterGrace }, + { "MCCA", kFixedText_People_PrestonMcCabe }, + { "COLL", kFixedText_People_BobColleran }, + { "JONA", kFixedText_People_JonasRigby }, + { "ROAC", kFixedText_People_PoliceConstableRoach }, + { "DEWA", kFixedText_People_JamesDewar }, + { "JERE", kFixedText_People_SergeantJeremyDuncan }, + { "GREG", kFixedText_People_InspectorGregson }, + { "LEST", kFixedText_People_InspectorLestrade }, + { "NEED", kFixedText_People_JesseNeedhem }, + { "FLEM", kFixedText_People_ArthurFleming }, + { "PRAT", kFixedText_People_MrThomasPratt }, + { "TILL", kFixedText_People_MathildaTillieMason }, + { "RUSS", kFixedText_People_AdrianRussell }, + { "WHIT", kFixedText_People_EldridgeWhitney }, + { "HEPP", kFixedText_People_Hepplethwaite }, + { "HORA", kFixedText_People_HoraceSilverbridge }, + { "SHER", kFixedText_People_OldSherman }, + { "VERN", kFixedText_People_MaxwellVerner }, + { "REDD", kFixedText_People_MillicentRedding }, + { "VIRG", kFixedText_People_VirgilSilverbridge }, + { "GEOR", kFixedText_People_GeorgeOKeeffe }, + { "LAWT", kFixedText_People_LordDenysLawton }, + { "JENK", kFixedText_People_Jenkins }, + { "JOCK", kFixedText_People_JockMahoney }, + { "BART", kFixedText_People_Bartender }, + { "LADY", kFixedText_People_LadyCordeliaLockridge }, + { "PETT", kFixedText_People_Pettigrew }, + { "FANS", kFixedText_People_SirAveryFanshawe }, + { "HODG", kFixedText_People_Hodgkins }, + { "WILB", kFixedText_People_WilburBirdyHeywood }, + { "JACO", kFixedText_People_JacobFarthington }, + { "BLED", kFixedText_People_PhilipBledsoe }, + { "FOWL", kFixedText_People_SidneyFowler }, + { "PROF", kFixedText_People_ProfessorTheodoreTotman }, + { "ROSE", kFixedText_People_RoseHinchem }, + { "TALL", kFixedText_People_Tallboy }, + { "STIT", kFixedText_People_EthlebertStitchRumsey }, + { "FREE", kFixedText_People_CharlesFreedman }, + { "HEMM", kFixedText_People_NigelHemmings }, + { "CART", kFixedText_People_FairfaxCarter }, + { "WILH", kFixedText_People_WilhelmII }, + { "WACH", kFixedText_People_Wachthund }, + { "WILS", kFixedText_People_JonathanWilson }, + { "DAVE", kFixedText_People_DavidLloydJones }, + { "HARG", kFixedText_People_EdwardHargrove }, + { "MORI", kFixedText_People_Misteray }, + { "LASC", kFixedText_People_TheLascar }, + { "PARR", kFixedText_People_Parrot }, + { "SCAR", kFixedText_People_VincentScarrett }, + { "ALEX", kFixedText_People_Alexandra }, + { "QUEE", kFixedText_People_QueenVictoria }, + { "JOHN", kFixedText_People_JohnBrown }, + { "PAT1", kFixedText_People_APatient1 }, + { "PAT2", kFixedText_People_APatient2 }, + { "PATR", kFixedText_People_Patron }, + { "QUEN", kFixedText_People_QueenVictoria }, + { "WITE", kFixedText_People_PatientInWhite }, + { "LUSH", kFixedText_People_Lush }, + { "DRNK", kFixedText_People_Drunk }, + { "PROS", kFixedText_People_Prostitute }, + { "MUDL", kFixedText_People_Mudlark }, + { "GRIN", kFixedText_People_Grinder }, + { "BOUN", kFixedText_People_Bouncer }, + { "RATC", kFixedText_People_AgnesRatchet }, + { "ALOY", kFixedText_People_AloysiusRatchet }, + { "REAL", kFixedText_People_RealEstateAgent }, + { "CAND", kFixedText_People_CandyClerk }, + { "BEAD", kFixedText_People_Beadle }, + { "PRUS", kFixedText_People_Prussian }, + { "ROWB", kFixedText_People_MrsRowbottom }, + { "MSLJ", kFixedText_People_MissLloydJones }, + { "TPAT", kFixedText_People_TavernPatron }, + { "USER", kFixedText_People_User }, + { "TOBY", kFixedText_People_Toby }, + { "STAT", kFixedText_People_Stationer }, + { "CLRK", kFixedText_People_LawClerk }, + { "CLER", kFixedText_People_MinistryClerk }, + { "BATH", kFixedText_People_Bather }, + { "MAID", kFixedText_People_Maid }, + { "LADF", kFixedText_People_LadyFanshawe }, + { "SIDN", kFixedText_People_SidneyRatchet }, + { "BOYO", kFixedText_People_Boy }, + { "PTR2", kFixedText_People_Patron2 }, + { "BRIT", kFixedText_People_ConstableBrit }, + { "DROV", kFixedText_People_WagonDriver } }; -const char *const FRENCH_NAMES[TATTOO_MAX_PEOPLE] = { - "Sherlock Holmes", - "Dr. Watson", - "Mme. Hudson", - "Stanley Forbes", - "Mycroft Holmes", - "Wiggins", - "Sergent Burns", - "Augustus Trimble", - "Sergent Daley", - "Infirmi?re chef", - "Mme. Grace", - "Preston McCabe", - "Bob Colleran", - "Jonas Rigby", - "Sergent Roach", - "James Dewar", - "Sergent Jeremy Duncan", - "Inspecteur Gregson", - "Inspecteur Lestrade", - "Jesse Needhem", - "Arthur Fleming", - "M. Thomas Pratt", - "Mathilda (Tillie) Mason", - "Adrian Russell", - "Eldridge Whitney", - "Hepplethwaite", - "Horace Silverbridge", - "Sherman", - "Maxwell Verner", - "Millicent Redding", - "Virgil Silverbridge", - "George O'Keeffe", - "Lord Denys Lawton", - "Jenkins", - "Jock Mahoney", - "Serveur", - "Lady Cordelia Lockridge", - "Pettigrew", - "Sir Avery Fanshawe", - "Hodgkins", - "Wilbur \"Birdy\" Heywood", - "Jacob Farthington", - "Philip Bledsoe", - "Sidney Fowler", - "Professeur Theodore Totman", - "Rose Hinchem", - "Tallboy", - "Ethlebert \"Stitch\" Rumsey", - "Charles Freedman", - "Nigel Hemmings", - "Fairfax Carter", - "Wilhelm II", - "Wachthund", - "Jonathan Wilson", - "David Lloyd-Jones", - "Edward Hargrove", - "Misteray", - "Le Lascar", - "Oiseau", - "Vincent Scarrett", - "Alexandra", - "Queen Victoria", - "John Brown", - "Patient", - "Patient", - "Client", - "Queen Victoria", - "Patient en blanc", - "Ivrogne", - "Ivrogne", - "Belle femme", - "Mudlark", - "Broyeur", - "Videur", - "Agnes Ratchet", - "Aloysius Ratchet", - "Immobilier", - "Gar?on", - "Beadle", - "Prussian", - "Mme. Rowbottom", - "Mme Lloyd-Jones", - "Tavern Client", - "User", - "Toby", - "Papeterie", - "Law Clerc", - "Ministry Employ?", - "Clint du thermes", - "Bonne", - "Lady Fanshawe", - "Sidney Ratchet", - "Gar?on", - "Client", - "Sergent Brit", - "Wagon Driver" -}; - -const char *const ENGLISH_NAMES[TATTOO_MAX_PEOPLE] = { - "Sherlock Holmes", - "Dr. Watson", - "Mrs. Hudson", - "Stanley Forbes", - "Mycroft Holmes", - "Wiggins", - "Police Constable Burns", - "Augustus Trimble", - "Police Constable Daley", - "Matron", - "Sister Grace", - "Preston McCabe", - "Bob Colleran", - "Jonas Rigby", - "Police Constable Roach", - "James Dewar", - "Sergeant Jeremy Duncan", - "Inspector Gregson", - "Inspector Lestrade", - "Jesse Needhem", - "Arthur Fleming", - "Mr. Thomas Pratt", - "Mathilda (Tillie) Mason", - "Adrian Russell", - "Eldridge Whitney", - "Hepplethwaite", - "Horace Silverbridge", - "Old Sherman", - "Maxwell Verner", - "Millicent Redding", - "Virgil Silverbridge", - "George O'Keeffe", - "Lord Denys Lawton", - "Jenkins", - "Jock Mahoney", - "Bartender", - "Lady Cordelia Lockridge", - "Pettigrew", - "Sir Avery Fanshawe", - "Hodgkins", - "Wilbur \"Birdy\" Heywood", - "Jacob Farthington", - "Philip Bledsoe", - "Sidney Fowler", - "Professor Theodore Totman", - "Rose Hinchem", - "Tallboy", - "Ethlebert \"Stitch\" Rumsey", - "Charles Freedman", - "Nigel Hemmings", - "Fairfax Carter", - "Wilhelm II", - "Wachthund", - "Jonathan Wilson", - "David Lloyd-Jones", - "Edward Hargrove", - "Misteray", - "The Lascar", - "Parrot", - "Vincent Scarrett", - "Alexandra", - "Queen Victoria", - "John Brown", - "A Patient", - "A Patient", - "Patron", - "Queen Victoria", - "Patient in white", - "Lush", - "Drunk", - "Prostitute", - "Mudlark", - "Grinder", - "Bouncer", - "Agnes Ratchet", - "Aloysius Ratchet", - "Real Estate Agent", - "Candy Clerk", - "Beadle", - "Prussian", - "Mrs. Rowbottom", - "Miss Lloyd-Jones", - "Tavern patron", - "User", - "Toby", - "Stationer", - "Law Clerk", - "Ministry Clerk", - "Bather", - "Maid", - "Lady Fanshawe", - "Sidney Ratchet", - "Boy", - "Patron", - "Constable Brit", - "Wagon Driver" -}; - - } // End of namespace Tattoo } // End of namespace Sherlock diff --git a/engines/sherlock/tattoo/tattoo_resources.h b/engines/sherlock/tattoo/tattoo_resources.h index b706d90f2d..85a78734b9 100644 --- a/engines/sherlock/tattoo/tattoo_resources.h +++ b/engines/sherlock/tattoo/tattoo_resources.h @@ -31,9 +31,12 @@ namespace Tattoo { #define TATTOO_MAX_PEOPLE 96 -extern const char PORTRAITS[TATTOO_MAX_PEOPLE][5]; -extern const char *const FRENCH_NAMES[TATTOO_MAX_PEOPLE]; -extern const char *const ENGLISH_NAMES[TATTOO_MAX_PEOPLE]; +struct PeopleData { + const char *portrait; + int fixedTextId; +}; + +extern const PeopleData PEOPLE_DATA[TATTOO_MAX_PEOPLE]; } // End of namespace Tattoo diff --git a/engines/sherlock/tattoo/tattoo_scene.cpp b/engines/sherlock/tattoo/tattoo_scene.cpp index f13d0588df..27f37665dc 100644 --- a/engines/sherlock/tattoo/tattoo_scene.cpp +++ b/engines/sherlock/tattoo/tattoo_scene.cpp @@ -90,20 +90,25 @@ bool TattooScene::loadScene(const Common::String &filename) { } } + // Handle loading music for the scene + if (talk._scriptMoreFlag != 1 && talk._scriptMoreFlag != 3) + music._nextSongName = Common::String::format("res%02d", _currentScene); + // Set the NPC paths for the scene setNPCPath(WATSON); - // Handle loading music for the scene - if (music._musicOn) { - if (talk._scriptMoreFlag != 1 && talk._scriptMoreFlag != 3) - music._nextSongName = Common::String::format("res%02d", _currentScene); - - // If it's a new song, then start it up - if (music._currentSongName.compareToIgnoreCase(music._nextSongName)) { - if (music.loadSong(music._nextSongName)) { - if (music._musicOn) - music.startSong(); - } + // If it's a new song, then start it up + if (music._currentSongName.compareToIgnoreCase(music._nextSongName)) { + // WORKAROUND: Stop playing music after Diogenes fire scene in the intro, + // since it overlaps slightly into the next scene + if (talk._scriptName == "prol80p" && _currentScene == 80) { + music.stopMusic(); + events.wait(5); + } + + if (music.loadSong(music._nextSongName)) { + if (music._musicOn) + music.startSong(); } } @@ -340,12 +345,14 @@ void TattooScene::doBgAnimCheckCursor() { void TattooScene::doBgAnim() { TattooEngine &vm = *(TattooEngine *)_vm; Events &events = *_vm->_events; + Music &music = *_vm->_music; TattooPeople &people = *(TattooPeople *)_vm->_people; Screen &screen = *_vm->_screen; Talk &talk = *_vm->_talk; TattooUserInterface &ui = *((TattooUserInterface *)_vm->_ui); doBgAnimCheckCursor(); + music.checkSongProgress(); talk._talkToAbort = false; @@ -653,8 +660,6 @@ int TattooScene::startCAnim(int cAnimNum, int playRate) { if (ui._windowOpen) ui.banishWindow(); - //_activeCAnim._filesize = cAnim._size; - // Open up the room resource file and get the data for the animation Common::SeekableReadStream *stream = res.load(_roomFilename); stream->seek(44 + cAnimNum * 4); @@ -690,6 +695,7 @@ int TattooScene::startCAnim(int cAnimNum, int playRate) { _goToScene = STARTING_GAME_SCENE; talk._talkToAbort = true; _activeCAnim.close(); + break; } } } @@ -716,6 +722,7 @@ int TattooScene::startCAnim(int cAnimNum, int playRate) { // Flag the Canimation to be cleared _activeCAnim._zPlacement = REMOVE; _activeCAnim._removeBounds = _activeCAnim._oldBounds; + _vm->_ui->_bgFound = -1; // Free up the animation _activeCAnim.close(); @@ -809,13 +816,12 @@ void TattooScene::synchronize(Serializer &s) { int TattooScene::closestZone(const Common::Point &pt) { int zone = -1; int dist = 9999; - int d; for (uint idx = 0; idx < _zones.size(); ++idx) { Common::Rect &r = _zones[idx]; // Check the distance from the point to the center of the zone - d = ABS(r.left + (r.width() / 2) - pt.x) + ABS(r.top + (r.height() / 2) - pt.y); + int d = ABS(r.left + (r.width() / 2) - pt.x) + ABS(r.top + (r.height() / 2) - pt.y); if (d < dist) { dist = d; zone = idx; diff --git a/engines/sherlock/tattoo/tattoo_talk.cpp b/engines/sherlock/tattoo/tattoo_talk.cpp index a4ceca042b..a5ada7b63e 100644 --- a/engines/sherlock/tattoo/tattoo_talk.cpp +++ b/engines/sherlock/tattoo/tattoo_talk.cpp @@ -341,6 +341,10 @@ OpcodeReturn TattooTalk::cmdNextSong(const byte *&str) { music._nextSongName += str[idx]; str += 7; + // WORKAROUND: Original game set wrong music name at the end of the introduction sequence + if (_scriptName == "prol80p" && music._nextSongName == "default") + music._nextSongName = "01cue90"; + return RET_SUCCESS; } diff --git a/engines/sherlock/tattoo/tattoo_user_interface.cpp b/engines/sherlock/tattoo/tattoo_user_interface.cpp index 6ed0bf66db..ee028f89c2 100644 --- a/engines/sherlock/tattoo/tattoo_user_interface.cpp +++ b/engines/sherlock/tattoo/tattoo_user_interface.cpp @@ -85,7 +85,6 @@ void TattooUserInterface::lookAtObject() { Talk &talk = *_vm->_talk; Common::Point mousePos = events.mousePos(); Common::String desc; - int cAnimSpeed = 0; _lookPos = mousePos; _menuMode = LOOK_MODE; @@ -95,7 +94,7 @@ void TattooUserInterface::lookAtObject() { } else { // Check if there is a Look animation if (_bgShape->_lookcAnim != 0) { - cAnimSpeed = _bgShape->_lookcAnim & 0xe0; + int cAnimSpeed = _bgShape->_lookcAnim & 0xe0; cAnimSpeed >>= 5; ++cAnimSpeed; @@ -216,9 +215,10 @@ void TattooUserInterface::doJournal() { TattooJournal &journal = *(TattooJournal *)_vm->_journal; TattooScene &scene = *(TattooScene *)_vm->_scene; Screen &screen = *_vm->_screen; - byte lookupTable[PALETTE_COUNT]; + byte lookupTable[PALETTE_COUNT], lookupTable1[PALETTE_COUNT]; Common::copy(&_lookupTable[0], &_lookupTable[PALETTE_COUNT], &lookupTable[0]); + Common::copy(&_lookupTable1[0], &_lookupTable1[PALETTE_COUNT], &lookupTable1[0]); _menuMode = JOURNAL_MODE; journal.show(); @@ -230,6 +230,7 @@ void TattooUserInterface::doJournal() { screen.clear(); screen.setPalette(screen._cMap); Common::copy(&lookupTable[0], &lookupTable[PALETTE_COUNT], &_lookupTable[0]); + Common::copy(&lookupTable1[0], &lookupTable1[PALETTE_COUNT], &_lookupTable1[0]); // Restore the scene screen._backBuffer1.blitFrom(screen._backBuffer2); @@ -276,7 +277,7 @@ void TattooUserInterface::handleInput() { scene._goToScene = STARTING_GAME_SCENE; } else if (_menuMode == STD_MODE) { if (_keyState.keycode == Common::KEYCODE_s && vm._allowFastMode) { - vm._fastMode = !vm._fastMode; + events.toggleSpeed(); } else if (_keyState.keycode == Common::KEYCODE_l && _bgFound != -1) { // Beging used for testing that Look dialogs work @@ -374,10 +375,10 @@ void TattooUserInterface::doStandardControl() { TattooEngine &vm = *(TattooEngine *)_vm; Events &events = *_vm->_events; People &people = *_vm->_people; + SaveManager &saves = *_vm->_saves; TattooScene &scene = *(TattooScene *)_vm->_scene; Talk &talk = *_vm->_talk; Common::Point mousePos = events.mousePos(); - bool noDesc = false; // Don't do any input processing whilst the prolog is running if (vm._runningProlog) @@ -458,6 +459,7 @@ void TattooUserInterface::doStandardControl() { if (_arrowZone == -1 || events._rightReleased) freeMenu(); + bool noDesc = false; if (_personFound) { if (people[_bgFound - 1000]._description.empty() || people[_bgFound - 1000]._description.hasPrefix(" ")) noDesc = true; @@ -471,6 +473,7 @@ void TattooUserInterface::doStandardControl() { if (events._rightReleased) { // Show the verbs menu for the highlighted object _tooltipWidget.banishWindow(); + saves.createThumbnail(); _verbsWidget.load(!noDesc); _verbsWidget.summonWindow(); @@ -515,11 +518,9 @@ void TattooUserInterface::doStandardControl() { void TattooUserInterface::doLookControl() { Events &events = *_vm->_events; TattooScene &scene = *(TattooScene *)_vm->_scene; - Sound &sound = *_vm->_sound; - // See if a mouse button was released or a key pressed, and we want to initiate an action - // TODO: Not sure about _soundOn.. should be check for speaking voice for text being complete - if (events._released || events._rightReleased || _keyState.keycode || (sound._voices && !sound._soundOn)) { + // See if a mouse button was released or a key pressed to close the active look dialog + if (events._released || events._rightReleased || _keyState.keycode) { // See if we were looking at an inventory object if (!_invLookFlag) { // See if there is any more text to display diff --git a/engines/sherlock/tattoo/tattoo_user_interface.h b/engines/sherlock/tattoo/tattoo_user_interface.h index c92ff21dd1..d89da4a6da 100644 --- a/engines/sherlock/tattoo/tattoo_user_interface.h +++ b/engines/sherlock/tattoo/tattoo_user_interface.h @@ -185,6 +185,9 @@ public: */ void doBgAnimEraseBackground(); + /** + * Draws overlays onto the scene. Basically, the smoke effects some scenes have + */ void drawMaskArea(bool mode); /** diff --git a/engines/sherlock/tattoo/widget_files.cpp b/engines/sherlock/tattoo/widget_files.cpp index c9a20b0f8a..0f5e6793c4 100644 --- a/engines/sherlock/tattoo/widget_files.cpp +++ b/engines/sherlock/tattoo/widget_files.cpp @@ -253,7 +253,6 @@ bool WidgetFiles::getFilename() { int done = 0; bool blinkFlag = false; int blinkCountdown = 0; - int width; int cursorColor = 192; byte color, textColor; bool insert = true; @@ -285,7 +284,7 @@ bool WidgetFiles::getFilename() { char currentChar = (index == (int)filename.size()) ? ' ' : filename[index]; Common::String charString = Common::String::format("%c", currentChar); - width = screen.charWidth(currentChar); + int width = screen.charWidth(currentChar); // Wait for keypress while (!events.kbHit()) { diff --git a/engines/sherlock/tattoo/widget_inventory.cpp b/engines/sherlock/tattoo/widget_inventory.cpp index 3555ecdffd..b49e30b30d 100644 --- a/engines/sherlock/tattoo/widget_inventory.cpp +++ b/engines/sherlock/tattoo/widget_inventory.cpp @@ -641,10 +641,12 @@ void WidgetInventory::handleEvents() { bool found = false; if (ui._bgFound != -1) { if (ui._personFound) { + Person &person = people[ui._bgFound - 1000]; + for (int idx = 0; idx < 2; ++idx) { - if (!people[ui._bgFound - 1000]._use[idx]._verb.compareToIgnoreCase(_verb) && - !people[ui._bgFound - 1000]._use[idx]._target.compareToIgnoreCase(_invTarget)) { - ui.checkAction(people[ui._bgFound - 1000]._use[idx], ui._bgFound); + if (!person._use[idx]._verb.compareToIgnoreCase(_verb) && + !person._use[idx]._target.compareToIgnoreCase(_invTarget)) { + ui.checkAction(person._use[idx], ui._bgFound); found = true; } } diff --git a/engines/sherlock/tattoo/widget_lab.cpp b/engines/sherlock/tattoo/widget_lab.cpp index 2873b12f22..eb32e2e22c 100644 --- a/engines/sherlock/tattoo/widget_lab.cpp +++ b/engines/sherlock/tattoo/widget_lab.cpp @@ -45,7 +45,6 @@ void WidgetLab::handleEvents() { Common::Point mousePos = events.mousePos(); WidgetBase::handleEvents(); - bool noDesc = false; // Handle drawing tooltips. If the user is dragging a lab item, display a tooltip for using the item // on another. Otherwise, fall back on showing standard tooltips @@ -65,6 +64,7 @@ void WidgetLab::handleEvents() { if (ui._arrowZone == -1 || events._rightReleased) ui._tooltipWidget.setText(""); + bool noDesc = false; if (ui._bgFound != -1) { if (ui._bgShape->_description.hasPrefix(" ") || ui._bgShape->_description.empty()) noDesc = true; diff --git a/engines/sherlock/tattoo/widget_talk.cpp b/engines/sherlock/tattoo/widget_talk.cpp index 00e8233a95..6e7bde292f 100644 --- a/engines/sherlock/tattoo/widget_talk.cpp +++ b/engines/sherlock/tattoo/widget_talk.cpp @@ -369,11 +369,11 @@ void WidgetTalk::handleEvents() { void WidgetTalk::render(Highlight highlightMode) { TattooTalk &talk = *(TattooTalk *)_vm->_talk; - int yp = 5; - int statementNum = 1; - byte color; if (highlightMode != HL_SCROLLBAR_ONLY) { + int yp = 5; + int statementNum = 1; + // Draw all the statements // Check whether scrolling has occurred, and if so, figure out what the starting // number for the first visible statement will be @@ -392,7 +392,7 @@ void WidgetTalk::render(Highlight highlightMode) { _surface.fillRect(Common::Rect(3, yp, _surface.w() - BUTTON_SIZE - 3, yp + _surface.fontHeight()), TRANSPARENCY); // Different coloring based on whether the option has been previously chosen or not - color = (!talk._talkHistory[talk._converseNum][_statementLines[idx]._num]) ? + byte color = (!talk._talkHistory[talk._converseNum][_statementLines[idx]._num]) ? INFO_TOP : INFO_BOTTOM; if (_statementLines[idx]._num == _selector && highlightMode == HL_CHANGED_HIGHLIGHTS) diff --git a/engines/sherlock/tattoo/widget_verbs.cpp b/engines/sherlock/tattoo/widget_verbs.cpp index 0b523a93e9..499afb2e79 100644 --- a/engines/sherlock/tattoo/widget_verbs.cpp +++ b/engines/sherlock/tattoo/widget_verbs.cpp @@ -58,9 +58,8 @@ void WidgetVerbs::load(bool objectsOn) { // person or an object if (ui._personFound) { TattooPerson &person = people[ui._activeObj - 1000]; - TattooPerson &npc = people[ui._activeObj - 1001]; - if (!scumm_strnicmp(npc._npcName.c_str(), "WATS", 4)) + if (!scumm_strnicmp(person._npcName.c_str(), "WATS", 4)) isWatson = true; @@ -158,7 +157,6 @@ void WidgetVerbs::handleEvents() { Talk &talk = *_vm->_talk; TattooUserInterface &ui = *(TattooUserInterface *)_vm->_ui; Common::Point mousePos = events.mousePos(); - bool noDesc = false; Common::String strLook = fixedText.getText(kFixedText_Look); Common::String strTalk = fixedText.getText(kFixedText_Talk); @@ -184,6 +182,7 @@ void WidgetVerbs::handleEvents() { ui._personFound = ui._bgFound >= 1000; ui._bgShape = ui._personFound || ui._bgFound == -1 ? nullptr : &scene._bgShapes[ui._bgFound]; + bool noDesc = false; if (ui._personFound) { if (people[ui._bgFound - 1000]._description.empty() || people[ui._bgFound - 1000]._description.hasPrefix(" ")) noDesc = true; diff --git a/engines/tinsel/music.cpp b/engines/tinsel/music.cpp index 9b4e2494e0..2a9804263a 100644 --- a/engines/tinsel/music.cpp +++ b/engines/tinsel/music.cpp @@ -418,9 +418,12 @@ MidiMusicPlayer::MidiMusicPlayer(TinselEngine *vm) { // Version 2: drivers got installed and fat.opl got copied over by the user _driver = Audio::MidiDriver_Miles_AdLib_create("MIDPAK.AD", ""); } else { - // Version 1: sample.ad / sample.opl, have to be copied over by the user for this version - // That's why we check those last, because then the user gets a proper error message for them - _driver = Audio::MidiDriver_Miles_AdLib_create("SAMPLE.AD", "SAMPLE.OPL"); + if ((fileClass.exists("SAMPLE.AD")) || (fileClass.exists("SAMPLE.OPL"))) { + // Version 1: sample.ad / sample.opl, have to be copied over by the user for this version + _driver = Audio::MidiDriver_Miles_AdLib_create("SAMPLE.AD", "SAMPLE.OPL"); + } else { + error("MILES-ADLIB: timbre file not found (may be called FAT.OPL, MIDPAK.AD, SAMPLE.AD or SAMPLE.OPL, may be in a subdirectory)"); + } } } break; diff --git a/engines/tucker/staticres.cpp b/engines/tucker/staticres.cpp index b884851d7e..b9f6a6efee 100644 --- a/engines/tucker/staticres.cpp +++ b/engines/tucker/staticres.cpp @@ -329,8 +329,13 @@ static const SoundSequenceData _soundDataSeq19_20[] = { { 53, 2, 14, 100, 1 }, { 78, 2, 0, 100, 2 }, { 80, 0, 0, 100, 4 }, }; +// I've been told that there are versions of the game that don't play the +// "introdub" music (130) for the first scene of the intro. The English "Euro +// power pack" release does however, and I see no harm in doing it for every +// version here. The volume is just a guess, though. + const SoundSequenceDataList AnimationSequencePlayer::_soundSeqDataList[] = { - { 0, 0, 14, 10, 58, _soundDataSeq3_4 }, + { 130, 80, 14, 10, 58, _soundDataSeq3_4 }, { 0, 0, 14, 5, 60, _soundDataSeq9_10 }, { 0, 0, 14, 9, 48, _soundDataSeq21_20 }, { 1, 80, 14, 4, 25, _soundDataSeq13_14 }, @@ -471,6 +476,7 @@ const char *const AnimationSequencePlayer::_audioFileNamesTable[] = { "rdfx38.wav", "rdfx8.wav", "rdfx9.wav", + "introdub.raw", }; } // namespace Tucker diff --git a/engines/tucker/tucker.h b/engines/tucker/tucker.h index a423915a5f..3bbf6a57f5 100644 --- a/engines/tucker/tucker.h +++ b/engines/tucker/tucker.h @@ -246,6 +246,15 @@ private: }; inline int scaleMixerVolume(int volume, int max = 100) { + if (volume > max) { + // This happens for instance for Bud's line, "Is that the + // great mystery invention you had hidden away?" in the intro, + // which is played at volume 110 out of 100. This made it very + // hard to hear. I'm not sure if this was a bug in the original + // game, or if it had the ability to amplify sounds. + warning("scaleMixerVolume: Adjusting volume %d to %d", volume, max); + volume = max; + } return volume * Audio::Mixer::kMaxChannelVolume / max; } diff --git a/engines/wintermute/base/file/base_file.cpp b/engines/wintermute/base/file/base_file.cpp index 2927c908e2..4589721e7e 100644 --- a/engines/wintermute/base/file/base_file.cpp +++ b/engines/wintermute/base/file/base_file.cpp @@ -57,7 +57,7 @@ bool BaseFile::isEOF() { Common::SeekableReadStream *BaseFile::getMemStream() { uint32 oldPos = getPos(); seek(0); - byte *data = new byte[getSize()]; + byte *data = (byte *)malloc(getSize()); read(data, getSize()); seek(oldPos); Common::MemoryReadStream *memStream = new Common::MemoryReadStream(data, getSize(), DisposeAfterUse::YES); diff --git a/engines/wintermute/base/gfx/base_surface.cpp b/engines/wintermute/base/gfx/base_surface.cpp index f8b96b5baf..3aa500b224 100644 --- a/engines/wintermute/base/gfx/base_surface.cpp +++ b/engines/wintermute/base/gfx/base_surface.cpp @@ -75,11 +75,6 @@ bool BaseSurface::displayHalfTrans(int x, int y, Rect32 rect) { } ////////////////////////////////////////////////////////////////////////// -bool BaseSurface::displayTransform(int x, int y, Rect32 rect, Rect32 newRect, const Graphics::TransformStruct &transform) { - return displayTransform(x, y, rect, newRect, transform); -} - -////////////////////////////////////////////////////////////////////////// bool BaseSurface::create(int width, int height) { return STATUS_FAILED; } diff --git a/engines/wintermute/utils/convert_utf.cpp b/engines/wintermute/utils/convert_utf.cpp index 7ebc011d01..cdb48103d0 100644 --- a/engines/wintermute/utils/convert_utf.cpp +++ b/engines/wintermute/utils/convert_utf.cpp @@ -55,8 +55,6 @@ static const UTF32 halfMask = 0x3FFUL; #define UNI_SUR_HIGH_END (UTF32)0xDBFF #define UNI_SUR_LOW_START (UTF32)0xDC00 #define UNI_SUR_LOW_END (UTF32)0xDFFF -#define false 0 -#define true 1 /* --------------------------------------------------------------------- */ @@ -311,7 +309,7 @@ ConversionResult ConvertUTF16toUTF8( * definition of UTF-8 goes up to 4-byte sequences. */ -static Boolean isLegalUTF8(const UTF8 *source, int length) { +static bool isLegalUTF8(const UTF8 *source, int length) { UTF8 a; const UTF8 *srcptr = source + length; switch (length) { @@ -356,7 +354,7 @@ static Boolean isLegalUTF8(const UTF8 *source, int length) { * Exported function to return whether a UTF-8 sequence is legal or not. * This is not used here; it's just exported. */ -Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) { +bool isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) { int length = trailingBytesForUTF8[*source] + 1; if (source + length > sourceEnd) { return false; diff --git a/engines/wintermute/utils/convert_utf.h b/engines/wintermute/utils/convert_utf.h index a5f34456f5..d2e54f4af4 100644 --- a/engines/wintermute/utils/convert_utf.h +++ b/engines/wintermute/utils/convert_utf.h @@ -96,7 +96,6 @@ namespace Wintermute { typedef uint32 UTF32; /* at least 32 bits */ typedef uint16 UTF16; /* at least 16 bits */ typedef uint8 UTF8; /* typically 8 bits */ -typedef uint8 Boolean; /* 0 or 1 */ /* Some fundamental constants */ #define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD @@ -141,7 +140,7 @@ ConversionResult ConvertUTF32toUTF16( const UTF32 **sourceStart, const UTF32 *sourceEnd, UTF16 **targetStart, UTF16 *targetEnd, ConversionFlags flags); -Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd); +bool isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd); } // End of namespace Wintermute diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp index ed01204180..016cfc136d 100644 --- a/gui/ThemeEngine.cpp +++ b/gui/ThemeEngine.cpp @@ -739,12 +739,24 @@ bool ThemeEngine::loadDefaultXML() { // Use the Python script "makedeftheme.py" to convert a normal XML theme // into the "default.inc" file, which is ready to be included in the code. #ifndef DISABLE_GUI_BUILTIN_THEME - const char *defaultXML = #include "themes/default.inc" - ; + int xmllen = 0; + + for (int i = 0; i < ARRAYSIZE(defaultXML); i++) + xmllen += strlen(defaultXML[i]); + + byte *tmpXML = (byte *)malloc(xmllen + 1); + + for (int i = 0; i < ARRAYSIZE(defaultXML); i++) + strncat((char *)tmpXML, defaultXML[i], xmllen); + + if (!_parser->loadBuffer(tmpXML, xmllen)) { + free(tmpXML); - if (!_parser->loadBuffer((const byte *)defaultXML, strlen(defaultXML))) return false; + } + + free(tmpXML); _themeName = "ScummVM Classic Theme (Builtin Version)"; _themeId = "builtin"; diff --git a/gui/filebrowser-dialog.cpp b/gui/filebrowser-dialog.cpp new file mode 100644 index 0000000000..93395ba909 --- /dev/null +++ b/gui/filebrowser-dialog.cpp @@ -0,0 +1,160 @@ +/* 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/filebrowser-dialog.h" + +#include "common/system.h" +#include "common/algorithm.h" +#include "common/savefile.h" +#include "common/str-array.h" + +#include "common/translation.h" + +#include "gui/widgets/list.h" +#include "gui/message.h" + +namespace GUI { + +enum { + kChooseCmd = 'Chos' +}; + +FileBrowserDialog::FileBrowserDialog(const char *title, const char *fileExtension, int mode) + : Dialog("FileBrowser"), _mode(mode), _fileExt(fileExtension) { + + _fileMask = "*."; + _fileMask += fileExtension; + _fileList = NULL; + + new StaticTextWidget(this, "FileBrowser.Headline", title ? title : + mode == kFBModeLoad ? _("Choose file for loading") : _("Enter filename for saving")); + + _fileName = new EditTextWidget(this, "FileBrowser.Filename", ""); + + if (mode == kFBModeLoad) + _fileName->setEnabled(false); + + // Add file list + _fileList = new ListWidget(this, "FileBrowser.List"); + _fileList->setNumberingMode(kListNumberingOff); + _fileList->setEditable(false); + + _backgroundType = GUI::ThemeEngine::kDialogBackgroundPlain; + + // Buttons + new ButtonWidget(this, "FileBrowser.Cancel", _("Cancel"), 0, kCloseCmd); + new ButtonWidget(this, "FileBrowser.Choose", _("Choose"), 0, kChooseCmd); +} + +void FileBrowserDialog::open() { + // Call super implementation + Dialog::open(); + + updateListing(); +} + +void FileBrowserDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { + switch (cmd) { + case kChooseCmd: + if (_fileName->getEditString().empty()) + break; + + normalieFileName(); + + if (!isProceedSave()) + break; + + setResult(1); + close(); + break; + case kListSelectionChangedCmd: + _fileName->setEditString(_fileList->getList().operator[](_fileList->getSelected()).c_str()); + _fileName->draw(); + break; + case kListItemActivatedCmd: + case kListItemDoubleClickedCmd: + normalieFileName(); + + if (!isProceedSave()) + break; + + setResult(1); + close(); + break; + default: + Dialog::handleCommand(sender, cmd, data); + } +} + +void FileBrowserDialog::normalieFileName() { + Common::String filename = _fileName->getEditString(); + + if (filename.matchString(_fileMask)) + return; + + _fileName->setEditString(filename + "." + _fileExt); +} + + +bool FileBrowserDialog::isProceedSave() { + bool matched = false; + + if (_mode == kFBModeLoad) + return true; + + for (ListWidget::StringArray::const_iterator file = _fileList->getList().begin(); file != _fileList->getList().end(); ++file) { + if (*file == _fileName->getEditString()) { + matched = true; + break; + } + } + + if (matched) { + GUI::MessageDialog alert(_("Do you really want to overwrite the file?"), _("Yes"), _("No")); + + if (alert.runModal() != GUI::kMessageOK) + return false; + } + + return true; +} + +void FileBrowserDialog::updateListing() { + Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); + + ListWidget::StringArray list; + + Common::StringArray filenames = saveFileMan->listSavefiles(_fileMask); + Common::sort(filenames.begin(), filenames.end()); + + for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { + list.push_back(file->c_str()); + } + + _fileList->setList(list); + _fileList->scrollTo(0); + + // Finally, redraw + draw(); +} + +} // End of namespace GUI diff --git a/gui/filebrowser-dialog.h b/gui/filebrowser-dialog.h new file mode 100644 index 0000000000..5916d76c80 --- /dev/null +++ b/gui/filebrowser-dialog.h @@ -0,0 +1,64 @@ +/* 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 FILEBROWSER_DIALOG_H +#define FILEBROWSER_DIALOG_H + +#include "gui/dialog.h" +#include "gui/widgets/edittext.h" + +namespace GUI { + +class ListWidget; +class EditTextWidget; +class CommandSender; + +enum { + kFBModeLoad = 0, + kFBModeSave +}; + +class FileBrowserDialog : public Dialog { +public: + FileBrowserDialog(const char *title, const char *fileExtension, int mode); + + virtual void open(); + + virtual void handleCommand(CommandSender *sender, uint32 cmd, uint32 data); + + const char *getResult() { return Dialog::getResult() ? _fileName->getEditString().c_str() : NULL; } + +protected: + EditTextWidget *_fileName; + ListWidget *_fileList; + Common::String _fileMask; + Common::String _fileExt; + int _mode; + + void updateListing(); + void normalieFileName(); + bool isProceedSave(); +}; + +} // End of namespace GUI + +#endif diff --git a/gui/module.mk b/gui/module.mk index 338e43c6a4..e355212620 100644 --- a/gui/module.mk +++ b/gui/module.mk @@ -8,6 +8,7 @@ MODULE_OBJS := \ dialog.o \ error.o \ EventRecorder.o \ + filebrowser-dialog.o \ gui-manager.o \ launcher.o \ massadd.o \ diff --git a/gui/recorderdialog.cpp b/gui/recorderdialog.cpp index 5617d2ba9a..2d74cebbb6 100644 --- a/gui/recorderdialog.cpp +++ b/gui/recorderdialog.cpp @@ -171,7 +171,7 @@ void RecorderDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat const EnginePlugin *plugin = 0; GameDescriptor desc = EngineMan.findGame(gameId, &plugin); g_system->getTimeAndDate(t); - EditRecordDialog editDlg("Unknown Author", Common::String::format("%.2d.%.2d.%.4d ", t.tm_mday, t.tm_mon, 1900 + t.tm_year) + desc.description(), ""); + EditRecordDialog editDlg(_("Unknown Author"), Common::String::format("%.2d.%.2d.%.4d ", t.tm_mday, t.tm_mon, 1900 + t.tm_year) + desc.description(), ""); if (editDlg.runModal() != kOKCmd) { return; } diff --git a/gui/themes/default.inc b/gui/themes/default.inc index aa2a24bf00..90d7967bc0 100644 --- a/gui/themes/default.inc +++ b/gui/themes/default.inc @@ -1,5 +1,6 @@ - "<?xml version = '1.0'?>" -"<render_info>" +const char *defaultXML1 = "<?xml version = '1.0'?>" +; + const char *defaultXML2 = "<render_info>" "<palette>" "<color name='black' " "rgb='0,0,0' " @@ -610,7 +611,8 @@ "/>" "</drawdata>" "</render_info>" -"<layout_info resolution='y>399'>" +; + const char *defaultXML3 = "<layout_info resolution='y>399'>" "<globals>" "<def var='Line.Height' value='16' />" "<def var='Font.Height' value='16' />" @@ -771,6 +773,28 @@ "</layout>" "</layout>" "</dialog>" +"<dialog name='FileBrowser' overlays='screen' inset='32' shading='dim'>" +"<layout type='vertical' padding='16,16,16,16'>" +"<widget name='Headline' " +"height='Globals.Line.Height' " +"/>" +"<widget name='Filename' " +"height='Globals.Line.Height' " +"/>" +"<space size='10' />" +"<widget name='List'/>" +"<layout type='vertical' padding='0,0,16,0'>" +"<layout type='horizontal' padding='0,0,0,0'>" +"<widget name='Cancel' " +"type='Button' " +"/>" +"<widget name='Choose' " +"type='Button' " +"/>" +"</layout>" +"</layout>" +"</layout>" +"</dialog>" "<dialog name='GlobalOptions' overlays='Dialog.Launcher.GameList' shading='dim'>" "<layout type='vertical' padding='0,0,0,0'>" "<widget name='TabWidget'/>" @@ -1873,7 +1897,8 @@ "</layout>" "</dialog>" "</layout_info>" -"<layout_info resolution='y<400'>" +; + const char *defaultXML4 = "<layout_info resolution='y<400'>" "<globals>" "<def var='Line.Height' value='12' />" "<def var='Font.Height' value='10' />" @@ -2031,6 +2056,28 @@ "</layout>" "</layout>" "</dialog>" +"<dialog name='FileBrowser' overlays='screen' inset='16' shading='dim'>" +"<layout type='vertical' padding='16,16,16,16'>" +"<widget name='Headline' " +"height='Globals.Line.Height' " +"/>" +"<widget name='Filename' " +"height='Globals.Line.Height' " +"/>" +"<space size='5' />" +"<widget name='List'/>" +"<layout type='vertical' padding='0,0,16,0'>" +"<layout type='horizontal' padding='0,0,0,0'>" +"<widget name='Cancel' " +"type='Button' " +"/>" +"<widget name='Choose' " +"type='Button' " +"/>" +"</layout>" +"</layout>" +"</layout>" +"</dialog>" "<dialog name='GlobalOptions' overlays='screen' inset='16' shading='dim'>" "<layout type='vertical' padding='0,0,0,0'>" "<widget name='TabWidget'/>" @@ -3105,3 +3152,5 @@ "</layout>" "</dialog>" "</layout_info>" +; +const char *defaultXML[] = { defaultXML1, defaultXML2, defaultXML3, defaultXML4 }; diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip Binary files differindex 1b555a6c27..d7016cab58 100644 --- a/gui/themes/scummclassic.zip +++ b/gui/themes/scummclassic.zip diff --git a/gui/themes/scummclassic/classic_layout.stx b/gui/themes/scummclassic/classic_layout.stx index cf8268696d..26656deaf9 100644 --- a/gui/themes/scummclassic/classic_layout.stx +++ b/gui/themes/scummclassic/classic_layout.stx @@ -196,6 +196,29 @@ </layout> </dialog> + <dialog name = 'FileBrowser' overlays = 'screen' inset = '32' shading = 'dim'> + <layout type = 'vertical' padding = '16, 16, 16, 16'> + <widget name = 'Headline' + height = 'Globals.Line.Height' + /> + <widget name = 'Filename' + height = 'Globals.Line.Height' + /> + <space size = '10' /> + <widget name = 'List'/> + <layout type = 'vertical' padding = '0, 0, 16, 0'> + <layout type = 'horizontal' padding = '0, 0, 0, 0'> + <widget name = 'Cancel' + type = 'Button' + /> + <widget name = 'Choose' + type = 'Button' + /> + </layout> + </layout> + </layout> + </dialog> + <dialog name = 'GlobalOptions' overlays = 'Dialog.Launcher.GameList' shading = 'dim'> <layout type = 'vertical' padding = '0, 0, 0, 0'> <widget name = 'TabWidget'/> @@ -673,7 +696,7 @@ /> </layout> </dialog> - + <dialog name = 'GlobalMenu' overlays = 'screen_center'> <layout type = 'vertical' padding = '16, 16, 16, 16' center = 'true'> <widget name = 'Title' @@ -1040,7 +1063,7 @@ width = '180' height = '170' /> - <layout type = 'horizontal' padding = '0, 0, 0, 0'> + <layout type = 'horizontal' padding = '0, 0, 0, 0'> <widget name = 'NextScreenShotButton' width = '25' height = '25' @@ -1115,15 +1138,15 @@ <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 10'> <widget name = 'AuthorLabel' type = 'EditRecordLabel' - /> + /> <widget name = 'AuthorEdit' type = 'EditRecord' - /> + /> </layout> <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 10'> <widget name = 'NameLabel' type = 'EditRecordLabel' - /> + /> <widget name = 'NameEdit' type = 'EditRecord' /> @@ -1142,11 +1165,11 @@ /> <widget name = 'OK' type = 'Button' - /> + /> </layout> </layout> </dialog> - + <dialog name = 'ScummHelp' overlays = 'screen_center'> <layout type = 'vertical' padding = '8, 8, 8, 8' center = 'true'> <widget name = 'Title' @@ -1250,7 +1273,7 @@ <layout type = 'horizontal' padding = '5, 5, 5, 5'> <widget name = 'Word' width = '190' - height = 'Globals.Button.Height' + height = 'Globals.Button.Height' /> <widget name = 'Delete' width = '20' @@ -1315,7 +1338,7 @@ /> </layout> <space size = '5' /> - <layout type = 'horizontal' padding = '3, 3, 3, 3'> + <layout type = 'horizontal' padding = '3, 3, 3, 3'> <widget name = 'Add' width = 'Globals.Predictive.Button.Width' height = 'Globals.Button.Height' diff --git a/gui/themes/scummclassic/classic_layout_lowres.stx b/gui/themes/scummclassic/classic_layout_lowres.stx index 506657ef31..60057fa4ba 100644 --- a/gui/themes/scummclassic/classic_layout_lowres.stx +++ b/gui/themes/scummclassic/classic_layout_lowres.stx @@ -193,6 +193,29 @@ </layout> </dialog> + <dialog name = 'FileBrowser' overlays = 'screen' inset = '16' shading = 'dim'> + <layout type = 'vertical' padding = '16, 16, 16, 16'> + <widget name = 'Headline' + height = 'Globals.Line.Height' + /> + <widget name = 'Filename' + height = 'Globals.Line.Height' + /> + <space size = '5' /> + <widget name = 'List'/> + <layout type = 'vertical' padding = '0, 0, 16, 0'> + <layout type = 'horizontal' padding = '0, 0, 0, 0'> + <widget name = 'Cancel' + type = 'Button' + /> + <widget name = 'Choose' + type = 'Button' + /> + </layout> + </layout> + </layout> + </dialog> + <dialog name = 'GlobalOptions' overlays = 'screen' inset = '16' shading = 'dim'> <layout type = 'vertical' padding = '0, 0, 0, 0'> <widget name = 'TabWidget'/> @@ -685,7 +708,7 @@ /> </layout> </dialog> - + <dialog name = 'GlobalMenu' overlays = 'screen_center'> <layout type = 'vertical' padding = '2, 2, 2, 6' center = 'true' spacing='0'> <widget name = 'Title' @@ -1086,15 +1109,15 @@ <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 10'> <widget name = 'AuthorLabel' type = 'EditRecordLabel' - /> + /> <widget name = 'AuthorEdit' type = 'EditRecord' - /> + /> </layout> <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 10'> <widget name = 'NameLabel' type = 'EditRecordLabel' - /> + /> <widget name = 'NameEdit' type = 'EditRecord' /> @@ -1113,7 +1136,7 @@ /> <widget name = 'OK' type = 'Button' - /> + /> </layout> </layout> </dialog> @@ -1220,7 +1243,7 @@ <layout type = 'horizontal' padding = '3, 3, 3, 3'> <widget name = 'Word' width = '120' - height = 'Globals.Button.Height' + height = 'Globals.Button.Height' /> <widget name = 'Delete' width = '20' diff --git a/gui/themes/scummmodern.zip b/gui/themes/scummmodern.zip Binary files differindex c7c585654d..5bf1b8e17d 100644 --- a/gui/themes/scummmodern.zip +++ b/gui/themes/scummmodern.zip diff --git a/gui/themes/scummmodern/scummmodern_layout.stx b/gui/themes/scummmodern/scummmodern_layout.stx index 7e61d6820e..3254049c62 100644 --- a/gui/themes/scummmodern/scummmodern_layout.stx +++ b/gui/themes/scummmodern/scummmodern_layout.stx @@ -67,7 +67,7 @@ <widget name = 'Button' size = '108, 24' - /> + /> <widget name = 'Slider' size = '128, 18' @@ -210,6 +210,29 @@ </layout> </dialog> + <dialog name = 'FileBrowser' overlays = 'screen' inset = '32' shading = 'dim'> + <layout type = 'vertical' padding = '16, 16, 16, 16'> + <widget name = 'Headline' + height = 'Globals.Line.Height' + /> + <widget name = 'Filename' + height = 'Globals.Line.Height' + /> + <space size = '10' /> + <widget name = 'List'/> + <layout type = 'vertical' padding = '0, 0, 16, 0'> + <layout type = 'horizontal' padding = '0, 0, 0, 0'> + <widget name = 'Cancel' + type = 'Button' + /> + <widget name = 'Choose' + type = 'Button' + /> + </layout> + </layout> + </layout> + </dialog> + <dialog name = 'GlobalOptions' overlays = 'Dialog.Launcher.GameList' shading = 'dim'> <layout type = 'vertical' padding = '0, 0, 0, 0'> <widget name = 'TabWidget'/> @@ -687,7 +710,7 @@ /> </layout> </dialog> - + <dialog name = 'GlobalMenu' overlays = 'screen_center'> <layout type = 'vertical' padding = '16, 16, 16, 16' center = 'true'> <widget name = 'Logo' @@ -1054,7 +1077,7 @@ width = '180' height = '170' /> - <layout type = 'horizontal' padding = '0, 0, 0, 0'> + <layout type = 'horizontal' padding = '0, 0, 0, 0'> <widget name = 'NextScreenShotButton' width = '25' height = '25' @@ -1130,15 +1153,15 @@ <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 10'> <widget name = 'AuthorLabel' type = 'EditRecordLabel' - /> + /> <widget name = 'AuthorEdit' type = 'EditRecord' - /> + /> </layout> <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 10'> <widget name = 'NameLabel' type = 'EditRecordLabel' - /> + /> <widget name = 'NameEdit' type = 'EditRecord' /> @@ -1157,11 +1180,11 @@ /> <widget name = 'OK' type = 'Button' - /> + /> </layout> </layout> </dialog> - + <dialog name = 'ScummHelp' overlays = 'screen_center'> <layout type = 'vertical' padding = '8, 8, 8, 8' center = 'true'> <widget name = 'Title' @@ -1252,7 +1275,7 @@ type = 'Button' /> </layout> - </dialog> + </dialog> <dialog name = 'Predictive' overlays = 'screen_center'> <layout type = 'vertical' padding = '5, 5, 5, 5' center = 'true'> <widget name = 'Headline' @@ -1264,7 +1287,7 @@ <layout type = 'horizontal' padding = '5, 5, 5, 5'> <widget name = 'Word' width = '190' - height = 'Globals.Button.Height' + height = 'Globals.Button.Height' /> <widget name = 'Delete' width = '20' diff --git a/gui/themes/scummmodern/scummmodern_layout_lowres.stx b/gui/themes/scummmodern/scummmodern_layout_lowres.stx index cee1e4af2b..2b4dc099a0 100644 --- a/gui/themes/scummmodern/scummmodern_layout_lowres.stx +++ b/gui/themes/scummmodern/scummmodern_layout_lowres.stx @@ -191,6 +191,29 @@ </layout> </dialog> + <dialog name = 'FileBrowser' overlays = 'screen' inset = '16' shading = 'dim'> + <layout type = 'vertical' padding = '16, 16, 16, 16'> + <widget name = 'Headline' + height = 'Globals.Line.Height' + /> + <widget name = 'Filename' + height = 'Globals.Line.Height' + /> + <space size = '5' /> + <widget name = 'List'/> + <layout type = 'vertical' padding = '0, 0, 16, 0'> + <layout type = 'horizontal' padding = '0, 0, 0, 0'> + <widget name = 'Cancel' + type = 'Button' + /> + <widget name = 'Choose' + type = 'Button' + /> + </layout> + </layout> + </layout> + </dialog> + <dialog name = 'GlobalOptions' overlays = 'screen' inset = '16' shading = 'dim'> <layout type = 'vertical' padding = '0, 0, 0, 0'> <widget name = 'TabWidget'/> @@ -683,7 +706,7 @@ /> </layout> </dialog> - + <dialog name = 'GlobalMenu' overlays = 'screen_center'> <layout type = 'vertical' padding = '4, 4, 4, 4' center = 'true' spacing='2'> <widget name = 'Title' @@ -1105,15 +1128,15 @@ <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 10'> <widget name = 'AuthorLabel' type = 'EditRecordLabel' - /> + /> <widget name = 'AuthorEdit' type = 'EditRecord' - /> + /> </layout> <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 10'> <widget name = 'NameLabel' type = 'EditRecordLabel' - /> + /> <widget name = 'NameEdit' type = 'EditRecord' /> @@ -1132,11 +1155,11 @@ /> <widget name = 'OK' type = 'Button' - /> + /> </layout> </layout> </dialog> - + <dialog name = 'ScummHelp' overlays = 'screen' inset = '8'> <layout type = 'vertical' padding = '8, 8, 8, 8'> <widget name = 'Title' @@ -1237,7 +1260,7 @@ <layout type = 'horizontal' padding = '0, 0, 2, 2'> <widget name = 'Word' width = '120' - height = 'Globals.Button.Height' + height = 'Globals.Button.Height' /> <widget name = 'Delete' width = '20' diff --git a/gui/themes/scummtheme.py b/gui/themes/scummtheme.py index 94dc08f1ef..d5fa4dfca7 100755 --- a/gui/themes/scummtheme.py +++ b/gui/themes/scummtheme.py @@ -35,11 +35,15 @@ def buildAllThemes(): if os.path.isdir(os.path.join('.', f)) and not f[0] == '.': buildTheme(f) -def parseSTX(theme_file, def_file): +def parseSTX(theme_file, def_file, subcount): comm = re.compile("<!--(.*?)-->", re.DOTALL) head = re.compile("<\?(.*?)\?>") strlitcount = 0 + subcount += 1 + + def_file.write(";\n const char *defaultXML" + str(subcount) + " = ") + output = "" for line in theme_file: output += line.rstrip("\r\n\t ").lstrip() @@ -55,8 +59,12 @@ def parseSTX(theme_file, def_file): for line in output.splitlines(): if line and not line.isspace(): strlitcount += len(line) + if strlitcount > 65535: + subcount += 1 + def_file.write(";\n const char *defaultXML" + str(subcount) + " = ") + strlitcount = len(line) def_file.write("\"" + line + "\"\n") - return strlitcount + return subcount def buildDefTheme(themeName): def_file = open("default.inc", "w") @@ -64,8 +72,8 @@ def buildDefTheme(themeName): if not os.path.isdir(themeName): print ("Cannot open default theme dir.") - def_file.write(""" "<?xml version = '1.0'?>"\n""") - strlitcount = 24 + def_file.write("""const char *defaultXML1 = "<?xml version = '1.0'?>"\n""") + subcount = 1 filenames = os.listdir(themeName) filenames.sort() @@ -73,16 +81,16 @@ def buildDefTheme(themeName): filename = os.path.join(themeName, filename) if os.path.isfile(filename) and filename.endswith(".stx"): theme_file = open(filename, "r") - strlitcount += parseSTX(theme_file, def_file) + subcount = parseSTX(theme_file, def_file, subcount) theme_file.close() - def_file.close() + def_file.write(";\nconst char *defaultXML[] = { defaultXML1") + for sub in range(2, subcount + 1): + def_file.write(", defaultXML" + str(sub)) - if strlitcount > 65535: - print("WARNING: default.inc string literal is of length %d which exceeds the" % strlitcount) - print(" maximum length of 65536 that C++ compilers are required to support.") - print(" It is likely that bugs will occur dependent on compiler behaviour.") - print(" To avoid this, reduce the size of the theme.") + def_file.write(" };\n") + + def_file.close() def printUsage(): print ("===============================") diff --git a/gui/themes/translations.dat b/gui/themes/translations.dat Binary files differindex 4225994810..ec86f36518 100644 --- a/gui/themes/translations.dat +++ b/gui/themes/translations.dat diff --git a/gui/widgets/editable.cpp b/gui/widgets/editable.cpp index af3e5e9b9a..2d929113b1 100644 --- a/gui/widgets/editable.cpp +++ b/gui/widgets/editable.cpp @@ -79,7 +79,7 @@ bool EditableWidget::tryInsertChar(byte c, int pos) { void EditableWidget::handleTickle() { uint32 time = g_system->getMillis(); - if (_caretTime < time) { + if (_caretTime < time && isEnabled()) { _caretTime = time + kCaretBlinkTime; drawCaret(_caretVisible); } @@ -90,6 +90,9 @@ bool EditableWidget::handleKeyDown(Common::KeyState state) { bool dirty = false; bool forcecaret = false; + if (!isEnabled()) + return false; + // First remove caret if (_caretVisible) drawCaret(true); diff --git a/gui/widgets/edittext.cpp b/gui/widgets/edittext.cpp index 550b1bd153..1481bebae3 100644 --- a/gui/widgets/edittext.cpp +++ b/gui/widgets/edittext.cpp @@ -62,6 +62,9 @@ void EditTextWidget::reflowLayout() { void EditTextWidget::handleMouseDown(int x, int y, int button, int clickCount) { + if (!isEnabled()) + return; + // First remove caret if (_caretVisible) drawCaret(true); diff --git a/po/POTFILES b/po/POTFILES index 0eef66bd51..e6afba7ad6 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -6,6 +6,7 @@ gui/browser_osx.mm gui/chooser.cpp gui/editrecorddialog.cpp gui/error.cpp +gui/filebrowser-dialog.cpp gui/gui-manager.cpp gui/KeysDialog.h gui/KeysDialog.cpp diff --git a/po/be_BY.po b/po/be_BY.po index 66697d9899..5b22098c1c 100644 --- a/po/be_BY.po +++ b/po/be_BY.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.7.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2015-09-06 15:14+0200\n" +"POT-Creation-Date: 2015-10-11 18:59+0100\n" "PO-Revision-Date: 2014-07-02 17:22+0300\n" "Last-Translator: Ivan Lukyanov <greencis@mail.ru>\n" "Language-Team: Ivan Lukyanov <greencis@mail.ru>\n" @@ -1044,6 +1044,11 @@ msgstr "" msgid "Do you really want to delete this record?" msgstr "Вы сапраўды жадаеце выдаліць гэта захаванне?" +#: gui/recorderdialog.cpp:174 +#, fuzzy +msgid "Unknown Author" +msgstr "Невядомая памылка" + #: gui/saveload-dialog.cpp:167 msgid "List view" msgstr "Выгляд спісу" @@ -1827,8 +1832,9 @@ msgstr "Хуткі рэжым" #: 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:218 engines/scumm/dialogs.cpp:192 -#: engines/scumm/help.cpp:83 engines/scumm/help.cpp:85 +#: backends/events/default/default-events.cpp:218 +#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:83 +#: engines/scumm/help.cpp:85 msgid "Quit" msgstr "Выхад" @@ -3333,6 +3339,25 @@ msgstr "Ляцець направа" msgid "Fly to lower right" msgstr "Ляцець направа-ўніз" +#: engines/scumm/input.cpp:572 +#, fuzzy +msgid "Snap scroll on" +msgstr "Плыўная прагортка" + +#: engines/scumm/input.cpp:574 +msgid "Snap scroll off" +msgstr "" + +#: engines/scumm/input.cpp:587 +#, fuzzy +msgid "Music volume: " +msgstr "Гучн. музыкі:" + +#: engines/scumm/input.cpp:604 +#, fuzzy +msgid "Subtitle speed: " +msgstr "Хуткасць тытраў:" + #: engines/scumm/scumm.cpp:1832 #, c-format msgid "" diff --git a/po/ca_ES.po b/po/ca_ES.po index 1a0a756253..096990848c 100644 --- a/po/ca_ES.po +++ b/po/ca_ES.po @@ -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: 2015-09-06 15:14+0200\n" +"POT-Creation-Date: 2015-10-11 18:59+0100\n" "PO-Revision-Date: 2013-05-05 14:16+0100\n" "Last-Translator: Jordi Vilalta Prat <jvprat@jvprat.com>\n" "Language-Team: Catalan <scummvm-devel@lists.sf.net>\n" @@ -1047,6 +1047,11 @@ msgstr "" msgid "Do you really want to delete this record?" msgstr "Realment voleu suprimir aquesta partida?" +#: gui/recorderdialog.cpp:174 +#, fuzzy +msgid "Unknown Author" +msgstr "Error desconegut" + #: gui/saveload-dialog.cpp:167 msgid "List view" msgstr "Vista de llistat" @@ -1832,8 +1837,9 @@ msgstr "Mode rрpid" #: 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:218 engines/scumm/dialogs.cpp:192 -#: engines/scumm/help.cpp:83 engines/scumm/help.cpp:85 +#: backends/events/default/default-events.cpp:218 +#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:83 +#: engines/scumm/help.cpp:85 msgid "Quit" msgstr "Surt" @@ -3338,6 +3344,25 @@ msgstr "Vola a la dreta" msgid "Fly to lower right" msgstr "Vola avall i a la dreta" +#: engines/scumm/input.cpp:572 +#, fuzzy +msgid "Snap scroll on" +msgstr "Desplaчament suau" + +#: engines/scumm/input.cpp:574 +msgid "Snap scroll off" +msgstr "" + +#: engines/scumm/input.cpp:587 +#, fuzzy +msgid "Music volume: " +msgstr "Volum de mњsica:" + +#: engines/scumm/input.cpp:604 +#, fuzzy +msgid "Subtitle speed: " +msgstr "Velocitat de subt.:" + #: engines/scumm/scumm.cpp:1832 #, c-format msgid "" diff --git a/po/cs_CZ.po b/po/cs_CZ.po index 28c50ed514..aa3fc856b8 100644 --- a/po/cs_CZ.po +++ b/po/cs_CZ.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.7.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2015-09-06 15:14+0200\n" +"POT-Creation-Date: 2015-10-11 18:59+0100\n" "PO-Revision-Date: 2015-07-26 18:51+0200\n" "Last-Translator: Zbynьk Schwarz <zbynek.schwarz@gmail.com>\n" "Language-Team: \n" @@ -1039,6 +1039,11 @@ msgstr "Poznсmky:" msgid "Do you really want to delete this record?" msgstr "Opravdu chcete tento zсznam smazat?" +#: gui/recorderdialog.cpp:174 +#, fuzzy +msgid "Unknown Author" +msgstr "Neznсmс chyba" + #: gui/saveload-dialog.cpp:167 msgid "List view" msgstr "Seznam" @@ -1820,8 +1825,9 @@ msgstr "Rychl§ reОim" #: 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:218 engines/scumm/dialogs.cpp:192 -#: engines/scumm/help.cpp:83 engines/scumm/help.cpp:85 +#: backends/events/default/default-events.cpp:218 +#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:83 +#: engines/scumm/help.cpp:85 msgid "Quit" msgstr "Ukonшit" @@ -3332,6 +3338,25 @@ msgstr "Letьt doprava" msgid "Fly to lower right" msgstr "Letьt doprava dolљ" +#: engines/scumm/input.cpp:572 +#, fuzzy +msgid "Snap scroll on" +msgstr "Plynulщ posunovсnэ" + +#: engines/scumm/input.cpp:574 +msgid "Snap scroll off" +msgstr "" + +#: engines/scumm/input.cpp:587 +#, fuzzy +msgid "Music volume: " +msgstr "Hlasitost hudby" + +#: engines/scumm/input.cpp:604 +#, fuzzy +msgid "Subtitle speed: " +msgstr "Rychlost titulkљ:" + #: engines/scumm/scumm.cpp:1832 #, c-format msgid "" diff --git a/po/da_DA.po b/po/da_DA.po index 8556dd7734..0da2db01f3 100644 --- a/po/da_DA.po +++ b/po/da_DA.po @@ -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: 2015-09-06 15:14+0200\n" +"POT-Creation-Date: 2015-10-11 18:59+0100\n" "PO-Revision-Date: 2014-07-09 17:34+0100\n" "Last-Translator: Steffen Nyeland <steffen@nyeland.dk>\n" "Language-Team: Steffen Nyeland <steffen@nyeland.dk>\n" @@ -1038,6 +1038,11 @@ msgstr "" msgid "Do you really want to delete this record?" msgstr "Vil du virkelig slette denne gemmer?" +#: gui/recorderdialog.cpp:174 +#, fuzzy +msgid "Unknown Author" +msgstr "Ukendt fejl" + #: gui/saveload-dialog.cpp:167 msgid "List view" msgstr "Liste visning" @@ -1820,8 +1825,9 @@ msgstr "Hurtig tilstand" #: 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:218 engines/scumm/dialogs.cpp:192 -#: engines/scumm/help.cpp:83 engines/scumm/help.cpp:85 +#: backends/events/default/default-events.cpp:218 +#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:83 +#: engines/scumm/help.cpp:85 msgid "Quit" msgstr "Afslut" @@ -3323,6 +3329,25 @@ msgstr "Flyv til hјjre" msgid "Fly to lower right" msgstr "Flyv nederst til hјjre" +#: engines/scumm/input.cpp:572 +#, fuzzy +msgid "Snap scroll on" +msgstr "Jцvn bevцgelse" + +#: engines/scumm/input.cpp:574 +msgid "Snap scroll off" +msgstr "" + +#: engines/scumm/input.cpp:587 +#, fuzzy +msgid "Music volume: " +msgstr "Musik lydstyrke:" + +#: engines/scumm/input.cpp:604 +#, fuzzy +msgid "Subtitle speed: " +msgstr "Tekst hastighed:" + #: engines/scumm/scumm.cpp:1832 #, c-format msgid "" diff --git a/po/de_DE.po b/po/de_DE.po index 56d363b597..60fd903be9 100644 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.8.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2015-09-06 15:14+0200\n" -"PO-Revision-Date: 2015-07-04 12:06+0200\n" +"POT-Creation-Date: 2015-10-11 18:59+0100\n" +"PO-Revision-Date: 2015-10-16 11:00+0200\n" "Last-Translator: Lothar Serra Mari <scummvm@rootfather.de>\n" "Language-Team: Simon Sawatzki <SimSaw@gmx.de>, Lothar Serra Mari " "<scummvm@rootfather.de>\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Poedit 1.8.2\n" +"X-Generator: Poedit 1.8.5\n" #: gui/about.cpp:94 #, c-format @@ -75,7 +75,6 @@ msgid "Choose" msgstr "Auswфhlen" #: gui/editrecorddialog.cpp:58 -#, fuzzy msgid "Author:" msgstr "Autor:" @@ -84,13 +83,12 @@ msgid "Name:" msgstr "Name:" #: gui/editrecorddialog.cpp:60 -#, fuzzy msgid "Notes:" msgstr "Notizen:" #: gui/editrecorddialog.cpp:68 gui/predictivedialog.cpp:75 msgid "Ok" -msgstr "" +msgstr "OK" #: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53 #: engines/scumm/help.cpp:126 engines/scumm/help.cpp:141 @@ -579,19 +577,17 @@ msgstr "%d neue Spiele gefunden, %d bereits hinzugefќgte Spiele ignoriert..." #: gui/onscreendialog.cpp:101 gui/onscreendialog.cpp:103 msgid "Stop" -msgstr "" +msgstr "Anhalten" #: gui/onscreendialog.cpp:106 msgid "Edit record description" -msgstr "" +msgstr "Aufnahme-Beschreibung фndern" #: gui/onscreendialog.cpp:108 -#, fuzzy msgid "Switch to Game" msgstr "Wechsle" #: gui/onscreendialog.cpp:110 -#, fuzzy msgid "Fast replay" msgstr "Schneller Modus" @@ -879,7 +875,7 @@ msgstr "Musiklautstфrke:" #: gui/options.cpp:968 msgid "Mute All" -msgstr "Alles stumm" +msgstr "Alles aus" #: gui/options.cpp:971 msgid "SFX volume:" @@ -1000,29 +996,28 @@ msgstr "" #. I18N: You must leave "#" as is, only word 'next' is translatable #: gui/predictivedialog.cpp:87 msgid "# next" -msgstr "" +msgstr "# nфchste" #: gui/predictivedialog.cpp:88 msgid "add" -msgstr "" +msgstr "hinzufќgen" #: gui/predictivedialog.cpp:92 -#, fuzzy msgid "Delete char" msgstr "Lіschen" #: gui/predictivedialog.cpp:96 msgid "<" -msgstr "" +msgstr "<" #. I18N: Pre means 'Predictive', leave '*' as is #: gui/predictivedialog.cpp:98 msgid "* Pre" -msgstr "" +msgstr "* Vorschau" #: gui/recorderdialog.cpp:64 msgid "Recorder or Playback Gameplay" -msgstr "Spiel aufzeichnen oder wiedergeben" +msgstr "Spiel aufzeichnen/wiedergeben" #: gui/recorderdialog.cpp:69 gui/recorderdialog.cpp:156 #: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276 @@ -1055,6 +1050,10 @@ msgstr "Notizen:" msgid "Do you really want to delete this record?" msgstr "Mіchten Sie diese Aufnahme wirklich lіschen?" +#: gui/recorderdialog.cpp:174 +msgid "Unknown Author" +msgstr "Unbekannter Autor" + #: gui/saveload-dialog.cpp:167 msgid "List view" msgstr "Listenansicht" @@ -1520,7 +1519,7 @@ msgstr "DOSBox-OPL-Emulator" #: audio/fmopl.cpp:67 msgid "ALSA Direct FM" -msgstr "" +msgstr "ALSA Direct FM" #: audio/mididrv.cpp:209 #, c-format @@ -3371,6 +3370,22 @@ msgstr "Nach rechts fliegen" msgid "Fly to lower right" msgstr "Nach unten rechts fliegen" +#: engines/scumm/input.cpp:572 +msgid "Snap scroll on" +msgstr "Blфttern einschalten" + +#: engines/scumm/input.cpp:574 +msgid "Snap scroll off" +msgstr "Blфttern ausschalten" + +#: engines/scumm/input.cpp:587 +msgid "Music volume: " +msgstr "Musiklautstфrke:" + +#: engines/scumm/input.cpp:604 +msgid "Subtitle speed: " +msgstr "Untertitel-Tempo:" + #: engines/scumm/scumm.cpp:1832 #, c-format msgid "" @@ -3538,7 +3553,6 @@ msgstr "" "Zeige die aktuelle Anzahl von Bildern pro Sekunde in der oberen linken Ecke" #: engines/zvision/detection_tables.h:52 -#, fuzzy msgid "Use the original save/load screens instead of the ScummVM interface" msgstr "" "Verwendet die originalen Menќs zum Speichern und Laden statt der von ScummVM." @@ -3548,7 +3562,6 @@ msgid "Double FPS" msgstr "FPS verdoppeln" #: engines/zvision/detection_tables.h:62 -#, fuzzy msgid "Increase framerate from 30 to 60 FPS" msgstr "Bilder pro Sekunde im Spiel von 30 auf 60 erhіhen" @@ -3565,17 +3578,14 @@ msgid "Disable animation while turning" msgstr "Animation wфhrend Drehen ausschalten" #: engines/zvision/detection_tables.h:82 -#, fuzzy msgid "Disable animation while turning in panorama mode" msgstr "Animation wфhrend Drehen im Panorama-Modus ausschalten" #: engines/zvision/detection_tables.h:91 -#, fuzzy msgid "Use high resolution MPEG video" msgstr "Nutze hochauflіsende MPEG-Filme" #: engines/zvision/detection_tables.h:92 -#, fuzzy msgid "Use MPEG video from the DVD version, instead of lower resolution AVI" msgstr "" "Verwende hochauflіsende MPEG-Filme der DVD-Version anstelle der AVI-Filme" diff --git a/po/es_ES.po b/po/es_ES.po index 3398957b22..9d2e236d46 100644 --- a/po/es_ES.po +++ b/po/es_ES.po @@ -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: 2015-09-06 15:14+0200\n" +"POT-Creation-Date: 2015-10-11 18:59+0100\n" "PO-Revision-Date: 2014-07-06 20:39+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -1045,6 +1045,11 @@ msgstr "" msgid "Do you really want to delete this record?" msgstr "ПSeguro que quieres borrar esta partida?" +#: gui/recorderdialog.cpp:174 +#, fuzzy +msgid "Unknown Author" +msgstr "Error desconocido" + #: gui/saveload-dialog.cpp:167 msgid "List view" msgstr "Modo lista" @@ -1828,8 +1833,9 @@ msgstr "Modo rсpido" #: 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:218 engines/scumm/dialogs.cpp:192 -#: engines/scumm/help.cpp:83 engines/scumm/help.cpp:85 +#: backends/events/default/default-events.cpp:218 +#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:83 +#: engines/scumm/help.cpp:85 msgid "Quit" msgstr "Salir" @@ -3335,6 +3341,25 @@ msgstr "Volar a la derecha" msgid "Fly to lower right" msgstr "Volar abajo y a la derecha" +#: engines/scumm/input.cpp:572 +#, fuzzy +msgid "Snap scroll on" +msgstr "Desplazamiento suave" + +#: engines/scumm/input.cpp:574 +msgid "Snap scroll off" +msgstr "" + +#: engines/scumm/input.cpp:587 +#, fuzzy +msgid "Music volume: " +msgstr "Mњsica:" + +#: engines/scumm/input.cpp:604 +#, fuzzy +msgid "Subtitle speed: " +msgstr "Vel. de subtэtulos:" + #: engines/scumm/scumm.cpp:1832 #, c-format msgid "" @@ -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: 2015-09-06 15:14+0200\n" +"POT-Creation-Date: 2015-10-11 18:59+0100\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" @@ -1045,6 +1045,11 @@ msgstr "" msgid "Do you really want to delete this record?" msgstr "Ezabatu partida gorde hau?" +#: gui/recorderdialog.cpp:174 +#, fuzzy +msgid "Unknown Author" +msgstr "Errore ezezaguna" + #: gui/saveload-dialog.cpp:167 msgid "List view" msgstr "" @@ -1834,8 +1839,9 @@ msgstr "Modu bizkorra" #: 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:218 engines/scumm/dialogs.cpp:192 -#: engines/scumm/help.cpp:83 engines/scumm/help.cpp:85 +#: backends/events/default/default-events.cpp:218 +#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:83 +#: engines/scumm/help.cpp:85 msgid "Quit" msgstr "Irten" @@ -3340,6 +3346,25 @@ msgstr "Eskuinera hegan egin" msgid "Fly to lower right" msgstr "Behera eta eskuinera hegan egin" +#: engines/scumm/input.cpp:572 +#, fuzzy +msgid "Snap scroll on" +msgstr "Behera" + +#: engines/scumm/input.cpp:574 +msgid "Snap scroll off" +msgstr "" + +#: engines/scumm/input.cpp:587 +#, fuzzy +msgid "Music volume: " +msgstr "Musika:" + +#: engines/scumm/input.cpp:604 +#, fuzzy +msgid "Subtitle speed: " +msgstr "Azpitit. abiadura:" + #: engines/scumm/scumm.cpp:1832 #, c-format msgid "" diff --git a/po/fi_FI.po b/po/fi_FI.po index 7851775712..aeed76304e 100644 --- a/po/fi_FI.po +++ b/po/fi_FI.po @@ -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: 2015-09-06 15:14+0200\n" +"POT-Creation-Date: 2015-10-11 18:59+0100\n" "PO-Revision-Date: 2012-12-01 19:37+0200\n" "Last-Translator: Toni Saarela <saarela@gmail.com>\n" "Language-Team: Finnish\n" @@ -1046,6 +1046,11 @@ msgstr "" msgid "Do you really want to delete this record?" msgstr "Haluatko varmasti poistaa tфmфn pelitallennuksen?" +#: gui/recorderdialog.cpp:174 +#, fuzzy +msgid "Unknown Author" +msgstr "Tuntematon virhe" + #: gui/saveload-dialog.cpp:167 msgid "List view" msgstr "Listanфkymф" @@ -1834,8 +1839,9 @@ msgstr "Nopea moodi" #: 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:218 engines/scumm/dialogs.cpp:192 -#: engines/scumm/help.cpp:83 engines/scumm/help.cpp:85 +#: backends/events/default/default-events.cpp:218 +#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:83 +#: engines/scumm/help.cpp:85 msgid "Quit" msgstr "Lopeta" @@ -3334,6 +3340,25 @@ msgstr "Lennф oikealle" msgid "Fly to lower right" msgstr "Lennф alas oikealle" +#: engines/scumm/input.cpp:572 +#, fuzzy +msgid "Snap scroll on" +msgstr "Pehmeф vieritys" + +#: engines/scumm/input.cpp:574 +msgid "Snap scroll off" +msgstr "" + +#: engines/scumm/input.cpp:587 +#, fuzzy +msgid "Music volume: " +msgstr "Musiikki:" + +#: engines/scumm/input.cpp:604 +#, fuzzy +msgid "Subtitle speed: " +msgstr "Tekstin nopeus:" + #: engines/scumm/scumm.cpp:1832 #, c-format msgid "" diff --git a/po/fr_FR.po b/po/fr_FR.po index 64247a45bf..c6b785c794 100644 --- a/po/fr_FR.po +++ b/po/fr_FR.po @@ -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: 2015-09-06 15:14+0200\n" +"POT-Creation-Date: 2015-10-11 18:59+0100\n" "PO-Revision-Date: 2014-07-05 13:49-0000\n" "Last-Translator: Thierry Crozat <criezy@scummvm.org>\n" "Language-Team: French <scummvm-devel@lists.sf.net>\n" @@ -1051,6 +1051,11 @@ msgstr "" msgid "Do you really want to delete this record?" msgstr "Voulez-vous vraiment supprimer cette sauvegarde ?" +#: gui/recorderdialog.cpp:174 +#, fuzzy +msgid "Unknown Author" +msgstr "Erreur inconnue" + #: gui/saveload-dialog.cpp:167 msgid "List view" msgstr "Vue en liste" @@ -1833,8 +1838,9 @@ msgstr "Mode rapide" #: 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:218 engines/scumm/dialogs.cpp:192 -#: engines/scumm/help.cpp:83 engines/scumm/help.cpp:85 +#: backends/events/default/default-events.cpp:218 +#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:83 +#: engines/scumm/help.cpp:85 msgid "Quit" msgstr "Quitter" @@ -3342,6 +3348,25 @@ msgstr "Voler vers la droite" msgid "Fly to lower right" msgstr "Voler vers la bas р droite" +#: engines/scumm/input.cpp:572 +#, fuzzy +msgid "Snap scroll on" +msgstr "Dщfilement rщgulier" + +#: engines/scumm/input.cpp:574 +msgid "Snap scroll off" +msgstr "" + +#: engines/scumm/input.cpp:587 +#, fuzzy +msgid "Music volume: " +msgstr "Volume Musique:" + +#: engines/scumm/input.cpp:604 +#, fuzzy +msgid "Subtitle speed: " +msgstr "Vitesse des ST:" + #: engines/scumm/scumm.cpp:1832 #, c-format msgid "" diff --git a/po/gl_ES.po b/po/gl_ES.po index cec2582c0a..905c87d316 100644 --- a/po/gl_ES.po +++ b/po/gl_ES.po @@ -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: 2015-09-06 15:14+0200\n" +"POT-Creation-Date: 2015-10-11 18:59+0100\n" "PO-Revision-Date: 2014-07-02 09:51+0100\n" "Last-Translator: Santiago G. Sanz <s.sanz@uvigo.es>\n" "Language-Team: Santiago G. Sanz <s.sanz@uvigo.es>\n" @@ -1038,6 +1038,11 @@ msgstr "" msgid "Do you really want to delete this record?" msgstr "Seguro que queres eliminar esta partida?" +#: gui/recorderdialog.cpp:174 +#, fuzzy +msgid "Unknown Author" +msgstr "Erro descoёecido" + #: gui/saveload-dialog.cpp:167 msgid "List view" msgstr "Lista" @@ -1820,8 +1825,9 @@ msgstr "Modo rсpido" #: 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:218 engines/scumm/dialogs.cpp:192 -#: engines/scumm/help.cpp:83 engines/scumm/help.cpp:85 +#: backends/events/default/default-events.cpp:218 +#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:83 +#: engines/scumm/help.cpp:85 msgid "Quit" msgstr "Saэr" @@ -3325,6 +3331,25 @@ msgstr "Voar с dereita" msgid "Fly to lower right" msgstr "Voar с dereita abaixo" +#: engines/scumm/input.cpp:572 +#, fuzzy +msgid "Snap scroll on" +msgstr "Desprazamento suave" + +#: engines/scumm/input.cpp:574 +msgid "Snap scroll off" +msgstr "" + +#: engines/scumm/input.cpp:587 +#, fuzzy +msgid "Music volume: " +msgstr "Volume de mњsica:" + +#: engines/scumm/input.cpp:604 +#, fuzzy +msgid "Subtitle speed: " +msgstr "Velocidade dos subtэtulos:" + #: engines/scumm/scumm.cpp:1832 #, c-format msgid "" diff --git a/po/hu_HU.po b/po/hu_HU.po index ac48bd5e62..89538e9f61 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2015-09-06 15:14+0200\n" -"PO-Revision-Date: 2014-02-18 06:30+0100\n" +"POT-Creation-Date: 2015-10-11 18:59+0100\n" +"PO-Revision-Date: 2015-10-12 11:10+0200\n" "Last-Translator: George Kormendi <grubycza@hotmail.com>\n" "Language-Team: Hungarian\n" "Language: Magyar\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: iso-8859-1\n" -"X-Generator: Poedit 1.6.4\n" +"X-Generator: Poedit 1.8.5\n" #: gui/about.cpp:94 #, c-format @@ -75,7 +75,7 @@ msgstr "Vсlaszt" #: gui/editrecorddialog.cpp:58 msgid "Author:" -msgstr "" +msgstr "Szerzѕ:" #: gui/editrecorddialog.cpp:59 gui/launcher.cpp:204 msgid "Name:" @@ -83,11 +83,11 @@ msgstr "Nщv:" #: gui/editrecorddialog.cpp:60 msgid "Notes:" -msgstr "" +msgstr "Megjegyzщs:" #: gui/editrecorddialog.cpp:68 gui/predictivedialog.cpp:75 msgid "Ok" -msgstr "" +msgstr "Ok" #: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53 #: engines/scumm/help.cpp:126 engines/scumm/help.cpp:141 @@ -414,7 +414,7 @@ msgstr "A vсlasztott jсtщk indэtсsa" #: gui/launcher.cpp:633 msgid "~L~oad..." -msgstr "Betіltщs" +msgstr "~B~etіlt..." #: gui/launcher.cpp:633 msgid "Load saved game for selected game" @@ -545,7 +545,7 @@ msgstr "Masszэv mѓd..." #: gui/launcher.cpp:1161 msgid "Record..." -msgstr "" +msgstr "Felvщtel..." #: gui/massadd.cpp:79 gui/massadd.cpp:82 msgid "... progress ..." @@ -572,21 +572,19 @@ msgstr "%d њj jсtщkot talсltam, %d elѕzѕleg hozzсadott jсtщk kihagyva..." #: gui/onscreendialog.cpp:101 gui/onscreendialog.cpp:103 msgid "Stop" -msgstr "" +msgstr "Сllj" #: gui/onscreendialog.cpp:106 msgid "Edit record description" -msgstr "" +msgstr "Felvщtel leэrсs szerkesztщse" #: gui/onscreendialog.cpp:108 -#, fuzzy msgid "Switch to Game" -msgstr "Kapcsol" +msgstr "Сtvсlt jсtщkra" #: gui/onscreendialog.cpp:110 -#, fuzzy msgid "Fast replay" -msgstr "Gyors mѓd" +msgstr "Gyors visszajсtszсs" #: gui/options.cpp:85 msgid "Never" @@ -980,29 +978,28 @@ msgstr "" #. I18N: You must leave "#" as is, only word 'next' is translatable #: gui/predictivedialog.cpp:87 msgid "# next" -msgstr "" +msgstr "# kіvetkezѕ" #: gui/predictivedialog.cpp:88 msgid "add" -msgstr "" +msgstr "hozzсad" #: gui/predictivedialog.cpp:92 -#, fuzzy msgid "Delete char" -msgstr "Tіrіl" +msgstr "Karakter tіrlщs" #: gui/predictivedialog.cpp:96 msgid "<" -msgstr "" +msgstr "<" #. I18N: Pre means 'Predictive', leave '*' as is #: gui/predictivedialog.cpp:98 msgid "* Pre" -msgstr "" +msgstr "* Elѕzѕ" #: gui/recorderdialog.cpp:64 msgid "Recorder or Playback Gameplay" -msgstr "" +msgstr "Jсtщkmenet felvщtel vagy lejсtszсs" #: gui/recorderdialog.cpp:69 gui/recorderdialog.cpp:156 #: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276 @@ -1011,31 +1008,33 @@ msgstr "Tіrіl" #: gui/recorderdialog.cpp:71 msgid "Record" -msgstr "" +msgstr "Felvщtel" #: gui/recorderdialog.cpp:72 -#, fuzzy msgid "Playback" -msgstr "Jсtщk" +msgstr "Visszajсtszсs" #: gui/recorderdialog.cpp:74 msgid "Edit" -msgstr "" +msgstr "Javэt" #: gui/recorderdialog.cpp:86 gui/recorderdialog.cpp:243 #: gui/recorderdialog.cpp:253 msgid "Author: " -msgstr "" +msgstr "Szerzѕ:" #: gui/recorderdialog.cpp:87 gui/recorderdialog.cpp:244 #: gui/recorderdialog.cpp:254 msgid "Notes: " -msgstr "" +msgstr "Megjegyzщs:" #: gui/recorderdialog.cpp:155 -#, fuzzy msgid "Do you really want to delete this record?" -msgstr "Biztos hogy tіrіlni akarod ezt a jсtщkсllсst?" +msgstr "Biztos hogy tіrіlni akarod ezt a felvщtelt?" + +#: gui/recorderdialog.cpp:174 +msgid "Unknown Author" +msgstr "Ismeretlen Szerzѕ" #: gui/saveload-dialog.cpp:167 msgid "List view" @@ -1336,7 +1335,7 @@ msgstr "Folytatсs" #: engines/dialogs.cpp:87 msgid "~L~oad" -msgstr "Betіltщs" +msgstr "~B~etіltщs" #: engines/dialogs.cpp:91 msgid "~S~ave" @@ -1410,7 +1409,7 @@ msgstr "~O~K" #: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:110 #: engines/mohawk/dialogs.cpp:171 engines/tsage/dialogs.cpp:107 msgid "~C~ancel" -msgstr "Mщgse" +msgstr "~M~щgse" #: engines/dialogs.cpp:311 msgid "~K~eys" @@ -1493,7 +1492,7 @@ msgstr "DOSBox OPL emulсtor" #: audio/fmopl.cpp:67 msgid "ALSA Direct FM" -msgstr "" +msgstr "ALSA Direct FM" #: audio/mididrv.cpp:209 #, c-format @@ -1609,7 +1608,7 @@ msgstr "ScummVM Fѕmenќ" #: backends/platform/ds/arm9/source/dsoptions.cpp:63 msgid "~L~eft handed mode" -msgstr "Balkezes mѓd:" +msgstr "~B~alkezes mѓd" #: backends/platform/ds/arm9/source/dsoptions.cpp:64 msgid "~I~ndy fight controls" @@ -1814,8 +1813,9 @@ msgstr "Gyors mѓd" #: 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:218 engines/scumm/dialogs.cpp:192 -#: engines/scumm/help.cpp:83 engines/scumm/help.cpp:85 +#: backends/events/default/default-events.cpp:218 +#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:83 +#: engines/scumm/help.cpp:85 msgid "Quit" msgstr "Kilщpщs" @@ -2069,7 +2069,7 @@ msgstr "Vсlassz egy billentyћt az 'Eszkіztсr rejtщs' mћvelethez" #: backends/platform/wince/wince-sdl.cpp:542 msgid "Map Zoom Up action (optional)" -msgstr "Nagyэtсs mћvelet (opcionсlis)" +msgstr "Tщrkщp nagyэtсs mћvelet (opcionсlis)" #: backends/platform/wince/wince-sdl.cpp:545 msgid "Map Zoom Down action (optional)" @@ -2182,25 +2182,27 @@ 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/detection.cpp:157 -#, fuzzy msgid "Use an alternative palette" -msgstr "Alternatэv jсtщkintro hasznсlata (csak CD verziѓnсl)" +msgstr "Alternatэv paletta hasznсlat" #: engines/agi/detection.cpp:158 msgid "" "Use an alternative palette, common for all Amiga games. This was the old " "behavior" msgstr "" +"Alternatэv paletta hasznсlat, kіzіs minden Amiga jсtщknсl. Ez egy rщgi " +"megoldсs" #: engines/agi/detection.cpp:167 -#, fuzzy msgid "Mouse support" -msgstr "Сtugrсs tсmogatсs" +msgstr "Egщr tсmogatсs" #: engines/agi/detection.cpp:168 msgid "" "Enables mouse support. Allows to use mouse for movement and in game menus." msgstr "" +"Egщrmѓd engщlyezve. Lehetѕvщ teszi az egщrrel mozgatсst jсtщkban щs " +"jсtщkmenќkben." #: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349 #: engines/dreamweb/saveload.cpp:169 engines/neverhood/menumodule.cpp:886 @@ -2253,13 +2255,12 @@ msgid "Cutscene file '%s' not found!" msgstr "'%s' сtvezetѕ fсjl nem talсlhatѓ" #: engines/cge/detection.cpp:105 engines/cge2/detection.cpp:101 -#, fuzzy msgid "Color Blind Mode" -msgstr "Kattintсs Mѓd" +msgstr "Szэnvak Mѓd" #: engines/cge/detection.cpp:106 engines/cge2/detection.cpp:102 msgid "Enable Color Blind Mode by default" -msgstr "" +msgstr "Szinvak mѓd engedщlyezve alapщrtelmezett" #: engines/drascula/saveload.cpp:47 msgid "" @@ -2314,11 +2315,11 @@ msgstr "Jсtщk mentщs nem sikerќlt" #: engines/hopkins/detection.cpp:76 engines/hopkins/detection.cpp:86 msgid "Gore Mode" -msgstr "" +msgstr "Gore Mѓd" #: engines/hopkins/detection.cpp:77 engines/hopkins/detection.cpp:87 msgid "Enable Gore Mode when available" -msgstr "" +msgstr "Gore mѓd engedщlyezщs ha elщrhetѕ" #. I18N: Studio audience adds an applause and cheering sounds whenever #. Malcolm makes a joke. @@ -2450,6 +2451,12 @@ msgid "" "Do you wish to use this save game file with ScummVM?\n" "\n" msgstr "" +"A kіvetkezѕ eredeti jсtщkmentщs fсjlt talсltam a jсtщkkіnyvtсrban:\n" +"\n" +"%s %s\n" +"\n" +"Akarod hogy ezt a jсtщkmentщs fсjlt hasznсlja a ScummVM?\n" +"\n" #: engines/kyra/saveload_eob.cpp:590 #, c-format @@ -2457,6 +2464,8 @@ msgid "" "A save game file was found in the specified slot %d. Overwrite?\n" "\n" msgstr "" +"Jсtщkmentщs talсlhatѓ a vсlasztott %d slotban. Felќlэrjam?\n" +"\n" #: engines/kyra/saveload_eob.cpp:623 #, c-format @@ -2468,6 +2477,11 @@ msgid "" "'import_savefile'.\n" "\n" msgstr "" +"%d eredeti jсtщkmentщs fсjlt sikeresen importсlta a\n" +"ScummVM. Ha kщsѕbb manuсlisan akarod importсlni az eredeti jсtщkmentщseket\n" +"meg kell nyitnod a ScummVM debug konzolt щs hasznсld az 'import_savefile' " +"utasэtсst.\n" +"\n" #. I18N: Option for fast scene switching #: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167 @@ -2476,7 +2490,7 @@ msgstr "~Z~ip Mѓd aktivсlva" #: engines/mohawk/dialogs.cpp:93 msgid "~T~ransitions Enabled" -msgstr "Сtmenetek engedщlyezve" +msgstr "~С~tmenetek engedщlyezve" #. I18N: Drop book page #: engines/mohawk/dialogs.cpp:95 @@ -2607,11 +2621,12 @@ msgstr "Alternatэv jсtщkintro hasznсlata (csak CD verziѓnсl)" #: engines/sci/detection.cpp:374 msgid "Skip EGA dithering pass (full color backgrounds)" -msgstr "" +msgstr "EGA szэnmodulсciѓ сtugrсsa (Szэnes hсttereknщl)" #: engines/sci/detection.cpp:375 msgid "Skip dithering pass in EGA games, graphics are shown with full colors" msgstr "" +"Szэnmodulсciѓ сtugrсsa EGA jсtщkoknсl, grafikсk teljes szэnben lсthatѓk" #: engines/sci/detection.cpp:384 msgid "Prefer digital sound effects" @@ -2682,15 +2697,13 @@ msgstr "Jсtщk szќnetel. SPACE a folytatсshoz." #. "Moechten Sie wirklich neu starten? (J/N)J" #. Will react to J as 'Yes' #: engines/scumm/dialogs.cpp:183 -#, fuzzy msgid "Are you sure you want to restart? (Y/N)Y" -msgstr "Biztos hogy њjra akarod indэtani? (Y/N)" +msgstr "Biztos hogy њjra akarod indэtani? (I/N)I" #. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment #: engines/scumm/dialogs.cpp:185 -#, fuzzy msgid "Are you sure you want to quit? (Y/N)Y" -msgstr "Biztos hogy ki akarsz lщpni? (Y/N)" +msgstr "Biztos hogy ki akarsz lщpni? (I/N)I" #: engines/scumm/dialogs.cpp:190 msgid "Play" @@ -2737,7 +2750,7 @@ msgstr "Jсtщk cэme)" #. I18N: Previous page button #: engines/scumm/dialogs.cpp:288 msgid "~P~revious" -msgstr "Elѕzѕ" +msgstr "~E~lѕzѕ" #. I18N: Next page button #: engines/scumm/dialogs.cpp:290 @@ -3198,25 +3211,24 @@ msgid "Third kid" msgstr "Harmadik gyerek" #: engines/scumm/help.cpp:292 -#, fuzzy msgid "Toggle Inventory/IQ Points display" -msgstr "Adatkщpernyѕ kapcsolѓ" +msgstr "Leltсr/IQ pont kijelzѕ kapcsolѓ" #: engines/scumm/help.cpp:293 msgid "Toggle Keyboard/Mouse Fighting (*)" -msgstr "" +msgstr "Billentyћzet/Egщr harc kapcsolѓ (*)" #: engines/scumm/help.cpp:295 msgid "* Keyboard Fighting is always on," -msgstr "" +msgstr "* Harc billentyћzetrѕl mindэg aktэv," #: engines/scumm/help.cpp:296 msgid " so despite the in-game message this" -msgstr "" +msgstr " so despite the in-game message this" #: engines/scumm/help.cpp:297 msgid " actually toggles Mouse Fighting Off/On" -msgstr "" +msgstr " egщrrel harcolсs mѓd сtkapcsolсs Be/Ki" #: engines/scumm/help.cpp:304 msgid "Fighting controls (numpad):" @@ -3253,7 +3265,7 @@ msgstr "Alsѓ ќtщs" #: engines/scumm/help.cpp:315 msgid "Sucker punch" -msgstr "" +msgstr "Vсratlan ќtщs" #: engines/scumm/help.cpp:318 msgid "These are for Indy on left." @@ -3311,6 +3323,22 @@ msgstr "Jobbra repќlщs" msgid "Fly to lower right" msgstr "Jobbra le repќlщs" +#: engines/scumm/input.cpp:572 +msgid "Snap scroll on" +msgstr "Finomgіrgetщs be" + +#: engines/scumm/input.cpp:574 +msgid "Snap scroll off" +msgstr "Finomgіrgetщs ki" + +#: engines/scumm/input.cpp:587 +msgid "Music volume: " +msgstr "Zene hangereje:" + +#: engines/scumm/input.cpp:604 +msgid "Subtitle speed: " +msgstr "Felirat sebessщg:" + #: engines/scumm/scumm.cpp:1832 #, c-format msgid "" @@ -3321,27 +3349,30 @@ msgstr "" "a %s hiсnyzik. AdLib-ot hasznсlok helyette." #: engines/scumm/scumm.cpp:2644 -#, fuzzy msgid "" "Usually, Maniac Mansion would start now. But for that to work, the game " "files for Maniac Mansion have to be in the 'Maniac' directory inside the " "Tentacle game directory, and the game has to be added to ScummVM." msgstr "" -"Сltalсban a Maniac Mansion indulna itt. De a ScummVM most nem indэtja el. Ha " -"jсtszani akarsz vele menj a ScummVM fѕmenќben a 'Jсtщk hozzсadсs' ra щs " -"vсlaszd a 'Maniac' mappсt a 'Tentacle' kіnyvtсrсban." +"Сltalсban a Maniac Mansion indulna most. De a mћkіdщshez a Maniac Mansion " +"fсjljainak, a 'Maniac' mappсban kell lenni a Tentacle jсtщkmappсjсn belќl, " +"щs a jсtщkot эgy adja hozzс a ScummVM a listсhoz." #: engines/scumm/players/player_v3m.cpp:129 msgid "" "Could not find the 'Loom' Macintosh executable to read the\n" "instruments from. Music will be disabled." msgstr "" +"Nem talсlhatѓ a 'Loom' Macintosh futtatѓ сllomсny, hogy \n" +"beolvassa a hangszereket. Zene le lessz tiltva." #: engines/scumm/players/player_v5m.cpp:107 msgid "" "Could not find the 'Monkey Island' Macintosh executable to read the\n" "instruments from. Music will be disabled." msgstr "" +"Nem talсlhatѓ a 'Monkey Island' Macintosh futtatѓ сllomсny, hogy \n" +"beolvassa a hangszereket. Zene le lessz tiltva." #: engines/sky/compact.cpp:130 msgid "" @@ -3457,51 +3488,48 @@ msgstr "" #: engines/wintermute/detection.cpp:58 msgid "Show FPS-counter" -msgstr "" +msgstr "FPS szсmlсlѓ lсtszik" #: engines/wintermute/detection.cpp:59 msgid "Show the current number of frames per second in the upper left corner" msgstr "" +"A jelenlegi mсsodpercenkщnti kщpkocka szсm kijelzщse a bal felsѕ sarokban" #: engines/zvision/detection_tables.h:52 -#, fuzzy msgid "Use the original save/load screens instead of the ScummVM interface" -msgstr "Az eredeti mentщs/betіltщs kщpernyѕ hasznсlata a ScummVM kщpek helyett" +msgstr "Hasznсld az eredeti mentщs/tіltщs kщpet a ScummVM felќlet helyett" #: engines/zvision/detection_tables.h:61 msgid "Double FPS" -msgstr "" +msgstr "Dupla FPS" #: engines/zvision/detection_tables.h:62 msgid "Increase framerate from 30 to 60 FPS" -msgstr "" +msgstr "Nіveli a kщpfrissэtщst 30 rѓl 60 FPS-re" #: engines/zvision/detection_tables.h:71 -#, fuzzy msgid "Enable Venus" -msgstr "Helium mѓd engedщlyezve" +msgstr "Venus engedщlyezve" #: engines/zvision/detection_tables.h:72 -#, fuzzy msgid "Enable the Venus help system" -msgstr "Helium mѓd engedщlyezve" +msgstr "Venus sњgѓrendszer engedщlyezve" #: engines/zvision/detection_tables.h:81 msgid "Disable animation while turning" -msgstr "" +msgstr "Animсciѓ tiltсs bekapcsolсs kіzben" #: engines/zvision/detection_tables.h:82 msgid "Disable animation while turning in panorama mode" -msgstr "" +msgstr "Animсciѓ tiltсsa panorсma mѓd bekapcsolсsa kіzben" #: engines/zvision/detection_tables.h:91 msgid "Use high resolution MPEG video" -msgstr "" +msgstr "Nagyfelbontсsњ MPEG videѓ hasznсlat" #: engines/zvision/detection_tables.h:92 -#, fuzzy msgid "Use MPEG video from the DVD version, instead of lower resolution AVI" -msgstr "Alternatэv ezќst kurzorszett hasznсlata, a normсl arany helyett" +msgstr "MPEG videѓt hasznсl DVD verziѓnсl, a kisebb felbontсsњ AVI helyett" #~ msgid "EGA undithering" #~ msgstr "EGA szinjavэtсs" diff --git a/po/it_IT.po b/po/it_IT.po index 28ec2960db..21c4341570 100644 --- a/po/it_IT.po +++ b/po/it_IT.po @@ -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: 2015-09-06 15:14+0200\n" +"POT-Creation-Date: 2015-10-11 18:59+0100\n" "PO-Revision-Date: 2014-07-03 17:59-0600\n" "Last-Translator: Matteo 'Maff' Angelino <matteo.maff at gmail dot com>\n" "Language-Team: Italian\n" @@ -1042,6 +1042,11 @@ msgstr "" msgid "Do you really want to delete this record?" msgstr "Sei sicuro di voler eliminare questo salvataggio?" +#: gui/recorderdialog.cpp:174 +#, fuzzy +msgid "Unknown Author" +msgstr "Errore sconosciuto" + #: gui/saveload-dialog.cpp:167 msgid "List view" msgstr "Elenco" @@ -1827,8 +1832,9 @@ msgstr "Modalitр veloce" #: 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:218 engines/scumm/dialogs.cpp:192 -#: engines/scumm/help.cpp:83 engines/scumm/help.cpp:85 +#: backends/events/default/default-events.cpp:218 +#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:83 +#: engines/scumm/help.cpp:85 msgid "Quit" msgstr "Esci" @@ -3332,6 +3338,25 @@ msgstr "Vola a destra" msgid "Fly to lower right" msgstr "Vola in basso a destra" +#: engines/scumm/input.cpp:572 +#, fuzzy +msgid "Snap scroll on" +msgstr "Scorrimento morbido" + +#: engines/scumm/input.cpp:574 +msgid "Snap scroll off" +msgstr "" + +#: engines/scumm/input.cpp:587 +#, fuzzy +msgid "Music volume: " +msgstr "Volume musica:" + +#: engines/scumm/input.cpp:604 +#, fuzzy +msgid "Subtitle speed: " +msgstr "Velocitр testo:" + #: engines/scumm/scumm.cpp:1832 #, c-format msgid "" diff --git a/po/nb_NO.po b/po/nb_NO.po index 0b2816ad2f..086cb488a7 100644 --- a/po/nb_NO.po +++ b/po/nb_NO.po @@ -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: 2015-09-06 15:14+0200\n" +"POT-Creation-Date: 2015-10-11 18:59+0100\n" "PO-Revision-Date: 2014-07-11 00:02+0100\n" "Last-Translator: Einar Johan Trјan Sјmхen <einarjohants@gmail.com>\n" "Language-Team: somaen <einarjohants@gmail.com>\n" @@ -1039,6 +1039,11 @@ msgstr "" msgid "Do you really want to delete this record?" msgstr "Vil du virkelig slette dette lagrede spillet?" +#: gui/recorderdialog.cpp:174 +#, fuzzy +msgid "Unknown Author" +msgstr "Ukjent feil" + #: gui/saveload-dialog.cpp:167 msgid "List view" msgstr "Listevisning" @@ -1820,8 +1825,9 @@ msgstr "Rask modus" #: 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:218 engines/scumm/dialogs.cpp:192 -#: engines/scumm/help.cpp:83 engines/scumm/help.cpp:85 +#: backends/events/default/default-events.cpp:218 +#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:83 +#: engines/scumm/help.cpp:85 msgid "Quit" msgstr "Avslutt" @@ -3322,6 +3328,25 @@ msgstr "Fly til hјyre" msgid "Fly to lower right" msgstr "Fly til nedre hјyre" +#: engines/scumm/input.cpp:572 +#, fuzzy +msgid "Snap scroll on" +msgstr "Myk scrolling" + +#: engines/scumm/input.cpp:574 +msgid "Snap scroll off" +msgstr "" + +#: engines/scumm/input.cpp:587 +#, fuzzy +msgid "Music volume: " +msgstr "Musikkvolum:" + +#: engines/scumm/input.cpp:604 +#, fuzzy +msgid "Subtitle speed: " +msgstr "Teksthastighet:" + #: engines/scumm/scumm.cpp:1832 #, c-format msgid "" diff --git a/po/nl_NL.po b/po/nl_NL.po index 0cca1a004e..0f4548951d 100644 --- a/po/nl_NL.po +++ b/po/nl_NL.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.8.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2015-09-06 15:14+0200\n" +"POT-Creation-Date: 2015-10-11 18:59+0100\n" "PO-Revision-Date: 2014-11-25 20:46+0100\n" "Last-Translator: Ben Castricum <scummvm@bencastricum.nl>\n" "Language-Team: Ben Castricum <scummvm@bencastricum.nl>\n" @@ -1051,6 +1051,11 @@ msgstr "" msgid "Do you really want to delete this record?" msgstr "Wilt u dit opgeslagen spel echt verwijderen?" +#: gui/recorderdialog.cpp:174 +#, fuzzy +msgid "Unknown Author" +msgstr "Onbekende fout" + #: gui/saveload-dialog.cpp:167 msgid "List view" msgstr "Lijstopmaak" @@ -1837,8 +1842,9 @@ msgstr "Snelle modus" #: 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:218 engines/scumm/dialogs.cpp:192 -#: engines/scumm/help.cpp:83 engines/scumm/help.cpp:85 +#: backends/events/default/default-events.cpp:218 +#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:83 +#: engines/scumm/help.cpp:85 msgid "Quit" msgstr "Stoppen" @@ -3358,6 +3364,25 @@ msgstr "Vlieg naar rechts" msgid "Fly to lower right" msgstr "Vlieg naar rechts omlaag" +#: engines/scumm/input.cpp:572 +#, fuzzy +msgid "Snap scroll on" +msgstr "Vloeiend scrollen" + +#: engines/scumm/input.cpp:574 +msgid "Snap scroll off" +msgstr "" + +#: engines/scumm/input.cpp:587 +#, fuzzy +msgid "Music volume: " +msgstr "Muziek volume:" + +#: engines/scumm/input.cpp:604 +#, fuzzy +msgid "Subtitle speed: " +msgstr "Snelheid tekst:" + #: engines/scumm/scumm.cpp:1832 #, c-format msgid "" diff --git a/po/nn_NO.po b/po/nn_NO.po index 35f461e6d2..a6af5e4b60 100644 --- a/po/nn_NO.po +++ b/po/nn_NO.po @@ -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: 2015-09-06 15:14+0200\n" +"POT-Creation-Date: 2015-10-11 18:59+0100\n" "PO-Revision-Date: 2014-07-11 00:04+0100\n" "Last-Translator: Einar Johan Trјan Sјmхen <einarjohants@gmail.com>\n" "Language-Team: somaen <einarjohants@gmail.com>\n" @@ -1038,6 +1038,11 @@ msgstr "" msgid "Do you really want to delete this record?" msgstr "Vil du verkeleg slette det lagra spelet?" +#: gui/recorderdialog.cpp:174 +#, fuzzy +msgid "Unknown Author" +msgstr "Ukjend feil" + #: gui/saveload-dialog.cpp:167 msgid "List view" msgstr "Listevisning" @@ -1802,8 +1807,9 @@ msgstr "Rask modus" #: 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:218 engines/scumm/dialogs.cpp:192 -#: engines/scumm/help.cpp:83 engines/scumm/help.cpp:85 +#: backends/events/default/default-events.cpp:218 +#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:83 +#: engines/scumm/help.cpp:85 msgid "Quit" msgstr "Avslutt" @@ -3304,6 +3310,25 @@ msgstr "Fly til hјgre" msgid "Fly to lower right" msgstr "Fly til nedre hјgre" +#: engines/scumm/input.cpp:572 +#, fuzzy +msgid "Snap scroll on" +msgstr "Bla liste ned" + +#: engines/scumm/input.cpp:574 +msgid "Snap scroll off" +msgstr "" + +#: engines/scumm/input.cpp:587 +#, fuzzy +msgid "Music volume: " +msgstr "Musikkvolum:" + +#: engines/scumm/input.cpp:604 +#, fuzzy +msgid "Subtitle speed: " +msgstr "Undertekstfart:" + #: engines/scumm/scumm.cpp:1832 #, c-format msgid "" diff --git a/po/pl_PL.po b/po/pl_PL.po index 233fa02599..477ecb6e69 100644 --- a/po/pl_PL.po +++ b/po/pl_PL.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2015-09-06 15:14+0200\n" +"POT-Creation-Date: 2015-10-11 18:59+0100\n" "PO-Revision-Date: 2014-07-02 12:28+0100\n" "Last-Translator: MichaГ ZiБbkowski <mziab@o2.pl>\n" "Language-Team: Grajpopolsku.pl <grajpopolsku@gmail.com>\n" @@ -1039,6 +1039,11 @@ msgstr "" msgid "Do you really want to delete this record?" msgstr "Na pewno chcesz skasowaц ten zapis?" +#: gui/recorderdialog.cpp:174 +#, fuzzy +msgid "Unknown Author" +msgstr "Nieznany bГБd" + #: gui/saveload-dialog.cpp:167 msgid "List view" msgstr "Widok listy" @@ -1815,8 +1820,9 @@ msgstr "Tryb szybki" #: 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:218 engines/scumm/dialogs.cpp:192 -#: engines/scumm/help.cpp:83 engines/scumm/help.cpp:85 +#: backends/events/default/default-events.cpp:218 +#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:83 +#: engines/scumm/help.cpp:85 msgid "Quit" msgstr "Zakoёcz" @@ -3312,6 +3318,25 @@ msgstr "Leц w prawo" msgid "Fly to lower right" msgstr "Leц w dѓГ, w prawo" +#: engines/scumm/input.cpp:572 +#, fuzzy +msgid "Snap scroll on" +msgstr "PГynne przewijanie" + +#: engines/scumm/input.cpp:574 +msgid "Snap scroll off" +msgstr "" + +#: engines/scumm/input.cpp:587 +#, fuzzy +msgid "Music volume: " +msgstr "GГoЖnoЖц muzyki:" + +#: engines/scumm/input.cpp:604 +#, fuzzy +msgid "Subtitle speed: " +msgstr "Prъd. napisѓw:" + #: engines/scumm/scumm.cpp:1832 #, c-format msgid "" diff --git a/po/pt_BR.po b/po/pt_BR.po index dae84f8e09..a406d5e096 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -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: 2015-09-06 15:14+0200\n" +"POT-Creation-Date: 2015-10-11 18:59+0100\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" @@ -1051,6 +1051,11 @@ msgstr "" msgid "Do you really want to delete this record?" msgstr "Vocъ realmente quer excluir este jogo salvo?" +#: gui/recorderdialog.cpp:174 +#, fuzzy +msgid "Unknown Author" +msgstr "Erro desconhecido" + #: gui/saveload-dialog.cpp:167 msgid "List view" msgstr "" @@ -1849,8 +1854,9 @@ msgstr "Modo rсpido" #: 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:218 engines/scumm/dialogs.cpp:192 -#: engines/scumm/help.cpp:83 engines/scumm/help.cpp:85 +#: backends/events/default/default-events.cpp:218 +#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:83 +#: engines/scumm/help.cpp:85 msgid "Quit" msgstr "Sair" @@ -3366,6 +3372,25 @@ msgstr "Voar para direita" msgid "Fly to lower right" msgstr "Voar para direita inferior" +#: engines/scumm/input.cpp:572 +#, fuzzy +msgid "Snap scroll on" +msgstr "Descer na lista" + +#: engines/scumm/input.cpp:574 +msgid "Snap scroll off" +msgstr "" + +#: engines/scumm/input.cpp:587 +#, fuzzy +msgid "Music volume: " +msgstr "Volume da Mњsica:" + +#: engines/scumm/input.cpp:604 +#, fuzzy +msgid "Subtitle speed: " +msgstr "Rapidez legendas:" + #: engines/scumm/scumm.cpp:1832 #, c-format msgid "" diff --git a/po/ru_RU.po b/po/ru_RU.po index 6941d5773a..5fbb8dcb24 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -1,22 +1,21 @@ # Russian translation for ScummVM. # Copyright (C) 2010-2015 The ScummVM Team # This file is distributed under the same license as the ScummVM package. -# Eugene Sandulenko <sev@scummvm.org>, 2010-2014 +# Eugene Sandulenko <sev@scummvm.org>, 2010-2015 # msgid "" msgstr "" -"Project-Id-Version: ScummVM 1.3.0svn\n" +"Project-Id-Version: ScummVM 1.8.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2015-09-06 15:14+0200\n" -"PO-Revision-Date: 2014-07-02 17:20+0300\n" +"POT-Creation-Date: 2015-10-11 18:59+0100\n" +"PO-Revision-Date: 2015-11-06 09:23+0300\n" "Last-Translator: Eugene Sandulenko <sev@scummvm.org>\n" "Language-Team: Russian\n" "Language: Russian\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" +"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.5\n" #: gui/about.cpp:94 @@ -75,7 +74,7 @@ msgstr "Выбрать" #: gui/editrecorddialog.cpp:58 msgid "Author:" -msgstr "" +msgstr "Автор:" #: gui/editrecorddialog.cpp:59 gui/launcher.cpp:204 msgid "Name:" @@ -83,11 +82,11 @@ msgstr "Название:" #: gui/editrecorddialog.cpp:60 msgid "Notes:" -msgstr "" +msgstr "Заметки:" #: gui/editrecorddialog.cpp:68 gui/predictivedialog.cpp:75 msgid "Ok" -msgstr "" +msgstr "Ok" #: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53 #: engines/scumm/help.cpp:126 engines/scumm/help.cpp:141 @@ -545,7 +544,7 @@ msgstr "Много игр..." #: gui/launcher.cpp:1161 msgid "Record..." -msgstr "" +msgstr "Запись..." #: gui/massadd.cpp:79 gui/massadd.cpp:82 msgid "... progress ..." @@ -572,21 +571,19 @@ msgstr "Найдено %d новых игр, пропущено %d ранее добавленных игр ..." #: gui/onscreendialog.cpp:101 gui/onscreendialog.cpp:103 msgid "Stop" -msgstr "" +msgstr "Стоп" #: gui/onscreendialog.cpp:106 msgid "Edit record description" -msgstr "" +msgstr "Редактировать описание записи" #: gui/onscreendialog.cpp:108 -#, fuzzy msgid "Switch to Game" -msgstr "Переключить" +msgstr "Переключиться в игру" #: gui/onscreendialog.cpp:110 -#, fuzzy msgid "Fast replay" -msgstr "Быстрый режим" +msgstr "Быстрое воспроизведение" #: gui/options.cpp:85 msgid "Never" @@ -987,29 +984,28 @@ msgstr "" #. I18N: You must leave "#" as is, only word 'next' is translatable #: gui/predictivedialog.cpp:87 msgid "# next" -msgstr "" +msgstr "# след" #: gui/predictivedialog.cpp:88 msgid "add" -msgstr "" +msgstr "доб" #: gui/predictivedialog.cpp:92 -#, fuzzy msgid "Delete char" -msgstr "Удалить" +msgstr "Удалить символ" #: gui/predictivedialog.cpp:96 msgid "<" -msgstr "" +msgstr "<" #. I18N: Pre means 'Predictive', leave '*' as is #: gui/predictivedialog.cpp:98 msgid "* Pre" -msgstr "" +msgstr "* Pre" #: gui/recorderdialog.cpp:64 msgid "Recorder or Playback Gameplay" -msgstr "" +msgstr "Воспроизвести или записать игровой процесс" #: gui/recorderdialog.cpp:69 gui/recorderdialog.cpp:156 #: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276 @@ -1018,31 +1014,33 @@ msgstr "Удалить" #: gui/recorderdialog.cpp:71 msgid "Record" -msgstr "" +msgstr "Записать" #: gui/recorderdialog.cpp:72 -#, fuzzy msgid "Playback" -msgstr "Играть" +msgstr "Воспроизвести" #: gui/recorderdialog.cpp:74 msgid "Edit" -msgstr "" +msgstr "Редактировать" #: gui/recorderdialog.cpp:86 gui/recorderdialog.cpp:243 #: gui/recorderdialog.cpp:253 msgid "Author: " -msgstr "" +msgstr "Автор: " #: gui/recorderdialog.cpp:87 gui/recorderdialog.cpp:244 #: gui/recorderdialog.cpp:254 msgid "Notes: " -msgstr "" +msgstr "Заметки: " #: gui/recorderdialog.cpp:155 -#, fuzzy msgid "Do you really want to delete this record?" -msgstr "Вы действительно хотите удалить это сохранение?" +msgstr "Вы действительно хотите удалить эту запись?" + +#: gui/recorderdialog.cpp:174 +msgid "Unknown Author" +msgstr "Неизвестный автор" #: gui/saveload-dialog.cpp:167 msgid "List view" @@ -1506,7 +1504,7 @@ msgstr "Эмулятор DOSBox OPL" #: audio/fmopl.cpp:67 msgid "ALSA Direct FM" -msgstr "" +msgstr "Прямой FM ALSA" #: audio/mididrv.cpp:209 #, c-format @@ -1829,8 +1827,9 @@ msgstr "Быстрый режим" #: 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:218 engines/scumm/dialogs.cpp:192 -#: engines/scumm/help.cpp:83 engines/scumm/help.cpp:85 +#: backends/events/default/default-events.cpp:218 +#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:83 +#: engines/scumm/help.cpp:85 msgid "Quit" msgstr "Выход" @@ -2199,25 +2198,25 @@ msgstr "" "ScummVM" #: engines/agi/detection.cpp:157 -#, fuzzy msgid "Use an alternative palette" -msgstr "Использовать альтернативное вступление (только для CD версии игры)" +msgstr "Использовать альтернативную палитру" #: engines/agi/detection.cpp:158 msgid "" "Use an alternative palette, common for all Amiga games. This was the old " "behavior" msgstr "" +"Использовать альтернативную палитру для всех игр Amiga. Это было старое поведение" #: engines/agi/detection.cpp:167 -#, fuzzy msgid "Mouse support" -msgstr "Поддержка пропусков" +msgstr "Поддержка мыши" #: engines/agi/detection.cpp:168 msgid "" "Enables mouse support. Allows to use mouse for movement and in game menus." msgstr "" +"Включает поддержку мыши. Позволяет использовать мышь для перемещения и в меню игры." #: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349 #: engines/dreamweb/saveload.cpp:169 engines/neverhood/menumodule.cpp:886 @@ -2270,13 +2269,12 @@ msgid "Cutscene file '%s' not found!" msgstr "Файл заставки '%s' не найден!" #: engines/cge/detection.cpp:105 engines/cge2/detection.cpp:101 -#, fuzzy msgid "Color Blind Mode" -msgstr "Режим щелчка" +msgstr "Режим без цвета" #: engines/cge/detection.cpp:106 engines/cge2/detection.cpp:102 msgid "Enable Color Blind Mode by default" -msgstr "" +msgstr "Включить режим для людей со слабым восприятием цвета" #: engines/drascula/saveload.cpp:47 msgid "" @@ -2332,11 +2330,11 @@ msgstr "Не удалось сохранить игру" #: engines/hopkins/detection.cpp:76 engines/hopkins/detection.cpp:86 msgid "Gore Mode" -msgstr "" +msgstr "Режим с кровью" #: engines/hopkins/detection.cpp:77 engines/hopkins/detection.cpp:87 msgid "Enable Gore Mode when available" -msgstr "" +msgstr "Включает режим с изображением крови, если доступно" #. I18N: Studio audience adds an applause and cheering sounds whenever #. Malcolm makes a joke. @@ -2469,6 +2467,12 @@ msgid "" "Do you wish to use this save game file with ScummVM?\n" "\n" msgstr "" +"Нижеследующий файл сохранения из оригинальной игры был найден в вашей игровой директории:\n" +"\n" +"%s %s\n" +"\n" +"Не желаете ли использовать это сохранение в ScummVM?\n" +"\n" #: engines/kyra/saveload_eob.cpp:590 #, c-format @@ -2476,6 +2480,8 @@ msgid "" "A save game file was found in the specified slot %d. Overwrite?\n" "\n" msgstr "" +"В указанном слоте %d уже есть сохранение игры. Перезаписать?\n" +"\n" #: engines/kyra/saveload_eob.cpp:623 #, c-format @@ -2487,6 +2493,10 @@ msgid "" "'import_savefile'.\n" "\n" msgstr "" +"%d оригинальных файлов сохранения были успешно импортированы в ScummVM.\n" +"Если вы захотите импортировать оригинпльные сохранения, вам нужно будет\n" +"открыть отладочную консоль ScummVM и ввести команду 'import_savefile'.\n" +"\n" #. I18N: Option for fast scene switching #: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167 @@ -2625,11 +2635,11 @@ msgstr "Использовать альтернативное вступление (только для CD версии игры)" #: engines/sci/detection.cpp:374 msgid "Skip EGA dithering pass (full color backgrounds)" -msgstr "" +msgstr "Не делать аппроксимацию цветов EGA (полноцветные фоны)" #: engines/sci/detection.cpp:375 msgid "Skip dithering pass in EGA games, graphics are shown with full colors" -msgstr "" +msgstr "Пропускает проход аппроксимации цветов EGA, графика будет показана со всеми цветами" #: engines/sci/detection.cpp:384 msgid "Prefer digital sound effects" @@ -2706,15 +2716,13 @@ msgstr "Игра остановлена. Нажмите пробел, чтобы продолжить." #. "Moechten Sie wirklich neu starten? (J/N)J" #. Will react to J as 'Yes' #: engines/scumm/dialogs.cpp:183 -#, fuzzy msgid "Are you sure you want to restart? (Y/N)Y" -msgstr "Вы уверены, что хотите начать снова? (Y/N)" +msgstr "Вы уверены, что хотите начать снова? (Y/N)Y" #. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment #: engines/scumm/dialogs.cpp:185 -#, fuzzy msgid "Are you sure you want to quit? (Y/N)Y" -msgstr "Вы уверены, что хотите выйти? (Y/N)" +msgstr "Вы уверены, что хотите выйти? (Y/N)Y" #: engines/scumm/dialogs.cpp:190 msgid "Play" @@ -3222,25 +3230,24 @@ msgid "Third kid" msgstr "Третий герой" #: engines/scumm/help.cpp:292 -#, fuzzy msgid "Toggle Inventory/IQ Points display" -msgstr "Включить показ данных в центре экрана" +msgstr "Переключить показ инвентаря/очков IQ" #: engines/scumm/help.cpp:293 msgid "Toggle Keyboard/Mouse Fighting (*)" -msgstr "" +msgstr "Переключить управление боями Клввиатурой/Мышью (*)" #: engines/scumm/help.cpp:295 msgid "* Keyboard Fighting is always on," -msgstr "" +msgstr "* Управление клавиатурой всегда включено," #: engines/scumm/help.cpp:296 msgid " so despite the in-game message this" -msgstr "" +msgstr " твк что несмотря на сообщение игры," #: engines/scumm/help.cpp:297 msgid " actually toggles Mouse Fighting Off/On" -msgstr "" +msgstr " на самом деле это вкл/выкл управление мышью" #: engines/scumm/help.cpp:304 msgid "Fighting controls (numpad):" @@ -3277,7 +3284,7 @@ msgstr "Удар снизу" #: engines/scumm/help.cpp:315 msgid "Sucker punch" -msgstr "" +msgstr "Удар сзади" #: engines/scumm/help.cpp:318 msgid "These are for Indy on left." @@ -3335,6 +3342,22 @@ msgstr "Лететь вправо" msgid "Fly to lower right" msgstr "Лететь вправо-вниз" +#: engines/scumm/input.cpp:572 +msgid "Snap scroll on" +msgstr "Прокрутка скачками включена" + +#: engines/scumm/input.cpp:574 +msgid "Snap scroll off" +msgstr "Прокрутка скачками выкл" + +#: engines/scumm/input.cpp:587 +msgid "Music volume: " +msgstr "Громк. музыки: " + +#: engines/scumm/input.cpp:604 +msgid "Subtitle speed: " +msgstr "Скорость титров: " + #: engines/scumm/scumm.cpp:1832 #, c-format msgid "" @@ -3345,27 +3368,30 @@ msgstr "" "LucasArts, но не хватает %s. Переключаюсь на AdLib." #: engines/scumm/scumm.cpp:2644 -#, fuzzy msgid "" "Usually, Maniac Mansion would start now. But for that to work, the game " "files for Maniac Mansion have to be in the 'Maniac' directory inside the " "Tentacle game directory, and the game has to be added to ScummVM." msgstr "" -"Сейчас должна запуститься игра Maniac Mansion. Но ScummVM пока этого не " -"умеет. Чтобы сыграть, нажмите 'Новая игра' в стартовом меню ScummVM, а затем " -"выберите директорию Maniac внутри директории с игрой Tentacle." +"Сейчас должна запуститься игра Maniac Mansion. Но чтобы это работало, файлы " +"игры Maniac Mansion должны быть скопированы в директорию 'Maniac' внутри " +"директории игры Tentacle, и сама игра должна быть добавлена в ScummVM." #: engines/scumm/players/player_v3m.cpp:129 msgid "" "Could not find the 'Loom' Macintosh executable to read the\n" "instruments from. Music will be disabled." msgstr "" +"Не удалось найти исполнимый файл 'Loom' Macintosh, чтобы прочитать\n" +"данные об инструментах. Музыка будет выключена." #: engines/scumm/players/player_v5m.cpp:107 msgid "" "Could not find the 'Monkey Island' Macintosh executable to read the\n" "instruments from. Music will be disabled." msgstr "" +"Не удалось найти исполнимый файл 'Monkey Island' Macintosh, чтобы прочитать\n" +"данные об инструментах. Музыка будет выключена." #: engines/sky/compact.cpp:130 msgid "" @@ -3481,14 +3507,13 @@ msgstr "" #: engines/wintermute/detection.cpp:58 msgid "Show FPS-counter" -msgstr "" +msgstr "Показать счётчик кадров в секунду" #: engines/wintermute/detection.cpp:59 msgid "Show the current number of frames per second in the upper left corner" -msgstr "" +msgstr "Показать в верхнем левом углу текущее количество кадров в секунду" #: engines/zvision/detection_tables.h:52 -#, fuzzy msgid "Use the original save/load screens instead of the ScummVM interface" msgstr "" "Использовать оригинальные экраны записи и сохранения игры вместо сделанных в " @@ -3496,39 +3521,36 @@ msgstr "" #: engines/zvision/detection_tables.h:61 msgid "Double FPS" -msgstr "" +msgstr "Двойноq FPS" #: engines/zvision/detection_tables.h:62 msgid "Increase framerate from 30 to 60 FPS" -msgstr "" +msgstr "Увеличить частоту кадров с 30 до 60 Гц" #: engines/zvision/detection_tables.h:71 -#, fuzzy msgid "Enable Venus" -msgstr "Включить режим гелия" +msgstr "Включить Venus" #: engines/zvision/detection_tables.h:72 -#, fuzzy msgid "Enable the Venus help system" -msgstr "Включить режим гелия" +msgstr "Включить систему помощи Venus" #: engines/zvision/detection_tables.h:81 msgid "Disable animation while turning" -msgstr "" +msgstr "Выключить анимацию во время поворотов" #: engines/zvision/detection_tables.h:82 msgid "Disable animation while turning in panorama mode" -msgstr "" +msgstr "Выключить анимацию во время поворотов в режиме панормаы" #: engines/zvision/detection_tables.h:91 msgid "Use high resolution MPEG video" -msgstr "" +msgstr "Использовать видео MPEG высокого разрешения" #: engines/zvision/detection_tables.h:92 -#, fuzzy msgid "Use MPEG video from the DVD version, instead of lower resolution AVI" msgstr "" -"Использовать альтернативный набор серебряных курсоров вместо обычных золотых" +"Использовать MPEG видео из DVD версии, вместо видео низкого разрешения в формате AVI" #~ msgid "EGA undithering" #~ msgstr "EGA без растра" diff --git a/po/scummvm.pot b/po/scummvm.pot index 7036c41f91..1d6b4028bc 100644 --- a/po/scummvm.pot +++ b/po/scummvm.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.8.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2015-09-06 15:14+0200\n" +"POT-Creation-Date: 2015-10-11 18:59+0100\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" @@ -1017,6 +1017,10 @@ msgstr "" msgid "Do you really want to delete this record?" msgstr "" +#: gui/recorderdialog.cpp:174 +msgid "Unknown Author" +msgstr "" + #: gui/saveload-dialog.cpp:167 msgid "List view" msgstr "" @@ -1768,8 +1772,9 @@ msgstr "" #: 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:218 engines/scumm/dialogs.cpp:192 -#: engines/scumm/help.cpp:83 engines/scumm/help.cpp:85 +#: backends/events/default/default-events.cpp:218 +#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:83 +#: engines/scumm/help.cpp:85 msgid "Quit" msgstr "" @@ -3222,6 +3227,22 @@ msgstr "" msgid "Fly to lower right" msgstr "" +#: engines/scumm/input.cpp:572 +msgid "Snap scroll on" +msgstr "" + +#: engines/scumm/input.cpp:574 +msgid "Snap scroll off" +msgstr "" + +#: engines/scumm/input.cpp:587 +msgid "Music volume: " +msgstr "" + +#: engines/scumm/input.cpp:604 +msgid "Subtitle speed: " +msgstr "" + #: engines/scumm/scumm.cpp:1832 #, c-format msgid "" diff --git a/po/se_SE.po b/po/se_SE.po index b74f82805c..814a5b1e86 100644 --- a/po/se_SE.po +++ b/po/se_SE.po @@ -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: 2015-09-06 15:14+0200\n" +"POT-Creation-Date: 2015-10-11 18:59+0100\n" "PO-Revision-Date: 2014-07-02 16:30+0100\n" "Last-Translator: Hampus Flink <hampus.flink@gmail.com>\n" "Language-Team: \n" @@ -1042,6 +1042,11 @@ msgstr "" msgid "Do you really want to delete this record?" msgstr "Vill du verkligen radera den hфr spardatan?" +#: gui/recorderdialog.cpp:174 +#, fuzzy +msgid "Unknown Author" +msgstr "Okфnt fel" + #: gui/saveload-dialog.cpp:167 msgid "List view" msgstr "Visa som lista" @@ -1825,8 +1830,9 @@ msgstr "Snabblфge" #: 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:218 engines/scumm/dialogs.cpp:192 -#: engines/scumm/help.cpp:83 engines/scumm/help.cpp:85 +#: backends/events/default/default-events.cpp:218 +#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:83 +#: engines/scumm/help.cpp:85 msgid "Quit" msgstr "Avsluta" @@ -3328,6 +3334,25 @@ msgstr "Flyg хt hіger" msgid "Fly to lower right" msgstr "Flyg хt nedre hіger" +#: engines/scumm/input.cpp:572 +#, fuzzy +msgid "Snap scroll on" +msgstr "Mjuk rullning" + +#: engines/scumm/input.cpp:574 +msgid "Snap scroll off" +msgstr "" + +#: engines/scumm/input.cpp:587 +#, fuzzy +msgid "Music volume: " +msgstr "Musikvolym:" + +#: engines/scumm/input.cpp:604 +#, fuzzy +msgid "Subtitle speed: " +msgstr "Texthastighet:" + #: engines/scumm/scumm.cpp:1832 #, c-format msgid "" diff --git a/po/uk_UA.po b/po/uk_UA.po index c9f722c700..c4264f84c2 100644 --- a/po/uk_UA.po +++ b/po/uk_UA.po @@ -2,22 +2,21 @@ # Copyright (C) 2010-2015 The ScummVM Team # This file is distributed under the same license as the ScummVM package. # Lubomyr Lisen, 2010. -# Eugene Sandulenko <sev@scummvm.org>, 2010-2014 +# Eugene Sandulenko <sev@scummvm.org>, 2010-2015 # msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2015-09-06 15:14+0200\n" -"PO-Revision-Date: 2014-07-01 02:34+0300\n" +"POT-Creation-Date: 2015-10-11 18:59+0100\n" +"PO-Revision-Date: 2015-11-06 10:07+0300\n" "Last-Translator: Eugene Sandulenko <sev@scummvm.org>\n" "Language-Team: Ukrainian\n" "Language: Ukrainian\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" +"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:94 #, c-format @@ -75,7 +74,7 @@ msgstr "Вибрати" #: gui/editrecorddialog.cpp:58 msgid "Author:" -msgstr "" +msgstr "Автор:" #: gui/editrecorddialog.cpp:59 gui/launcher.cpp:204 msgid "Name:" @@ -83,11 +82,11 @@ msgstr "Назва:" #: gui/editrecorddialog.cpp:60 msgid "Notes:" -msgstr "" +msgstr "Примітки:" #: gui/editrecorddialog.cpp:68 gui/predictivedialog.cpp:75 msgid "Ok" -msgstr "" +msgstr "Гаразд" #: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53 #: engines/scumm/help.cpp:126 engines/scumm/help.cpp:141 @@ -529,9 +528,8 @@ msgid "Do you really want to remove this game configuration?" msgstr "Ви дійсно хочете видалити установки для цієї гри?" #: gui/launcher.cpp:999 -#, fuzzy msgid "Do you want to load saved game?" -msgstr "Ви хочете завантажити гру?" +msgstr "Ви хочете завантажити збережену гру?" #: gui/launcher.cpp:1048 msgid "This game does not support loading games from the launcher." @@ -547,7 +545,7 @@ msgstr "Дод. багато..." #: gui/launcher.cpp:1161 msgid "Record..." -msgstr "" +msgstr "Запис..." #: gui/massadd.cpp:79 gui/massadd.cpp:82 msgid "... progress ..." @@ -574,21 +572,19 @@ msgstr "Знайдено %d нових ігор, пропущено %d попередньо доданих ігор ..." #: gui/onscreendialog.cpp:101 gui/onscreendialog.cpp:103 msgid "Stop" -msgstr "" +msgstr "Стоп" #: gui/onscreendialog.cpp:106 msgid "Edit record description" -msgstr "" +msgstr "Редагвати опис запису" #: gui/onscreendialog.cpp:108 -#, fuzzy msgid "Switch to Game" -msgstr "Перемкнути" +msgstr "Переключитися на гру" #: gui/onscreendialog.cpp:110 -#, fuzzy msgid "Fast replay" -msgstr "Швидкий режим" +msgstr "Швидке відтворення" #: gui/options.cpp:85 msgid "Never" @@ -987,29 +983,28 @@ msgstr "" #. I18N: You must leave "#" as is, only word 'next' is translatable #: gui/predictivedialog.cpp:87 msgid "# next" -msgstr "" +msgstr "# наст" #: gui/predictivedialog.cpp:88 msgid "add" -msgstr "" +msgstr "дод" #: gui/predictivedialog.cpp:92 -#, fuzzy msgid "Delete char" -msgstr "Видалити" +msgstr "Видалити сммвол" #: gui/predictivedialog.cpp:96 msgid "<" -msgstr "" +msgstr "<" #. I18N: Pre means 'Predictive', leave '*' as is #: gui/predictivedialog.cpp:98 msgid "* Pre" -msgstr "" +msgstr "* Pre" #: gui/recorderdialog.cpp:64 msgid "Recorder or Playback Gameplay" -msgstr "" +msgstr "Записувати або відтворити процес гри" #: gui/recorderdialog.cpp:69 gui/recorderdialog.cpp:156 #: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276 @@ -1018,31 +1013,33 @@ msgstr "Видалити" #: gui/recorderdialog.cpp:71 msgid "Record" -msgstr "" +msgstr "Записати" #: gui/recorderdialog.cpp:72 -#, fuzzy msgid "Playback" -msgstr "Грати" +msgstr "Відтворити" #: gui/recorderdialog.cpp:74 msgid "Edit" -msgstr "" +msgstr "Редагувати" #: gui/recorderdialog.cpp:86 gui/recorderdialog.cpp:243 #: gui/recorderdialog.cpp:253 msgid "Author: " -msgstr "" +msgstr "Автор: " #: gui/recorderdialog.cpp:87 gui/recorderdialog.cpp:244 #: gui/recorderdialog.cpp:254 msgid "Notes: " -msgstr "" +msgstr "Примітки: " #: gui/recorderdialog.cpp:155 -#, fuzzy msgid "Do you really want to delete this record?" -msgstr "Ви дійсно хочете видалити це збереження?" +msgstr "Ви дійсно хочете видалити цей запис?" + +#: gui/recorderdialog.cpp:174 +msgid "Unknown Author" +msgstr "Невідомий автор" #: gui/saveload-dialog.cpp:167 msgid "List view" @@ -1502,7 +1499,7 @@ msgstr "Емулятор DOSBox OPL" #: audio/fmopl.cpp:67 msgid "ALSA Direct FM" -msgstr "" +msgstr "Беспосередній ALSA FM" #: audio/mididrv.cpp:209 #, c-format @@ -1825,8 +1822,9 @@ msgstr "Швидкий режим" #: 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:218 engines/scumm/dialogs.cpp:192 -#: engines/scumm/help.cpp:83 engines/scumm/help.cpp:85 +#: backends/events/default/default-events.cpp:218 +#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:83 +#: engines/scumm/help.cpp:85 msgid "Quit" msgstr "Вихід" @@ -2196,25 +2194,25 @@ msgstr "" "Використовувати оригінальні збереження/завантаження екрани, замість ScummVM" #: engines/agi/detection.cpp:157 -#, fuzzy msgid "Use an alternative palette" -msgstr "Використовувати альтернативний вступ гри (тільки CD версія)" +msgstr "Використовувати альтернативну палітру" #: engines/agi/detection.cpp:158 msgid "" "Use an alternative palette, common for all Amiga games. This was the old " "behavior" msgstr "" +"Використовувати альтернативну палітру, звичайну для ігор з Amiga. Це була стара поведінка." #: engines/agi/detection.cpp:167 -#, fuzzy msgid "Mouse support" -msgstr "Підтримувати Пропустити" +msgstr "Підтримка миші" #: engines/agi/detection.cpp:168 msgid "" "Enables mouse support. Allows to use mouse for movement and in game menus." msgstr "" +"Включає підтримку миші. Дозволяє використовувати мишу для пересування та управління меню." #: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349 #: engines/dreamweb/saveload.cpp:169 engines/neverhood/menumodule.cpp:886 @@ -2267,13 +2265,12 @@ msgid "Cutscene file '%s' not found!" msgstr "Файл ролику '%s' не знайдено!" #: engines/cge/detection.cpp:105 engines/cge2/detection.cpp:101 -#, fuzzy msgid "Color Blind Mode" -msgstr "Режим кліків" +msgstr "Режим без кольору" #: engines/cge/detection.cpp:106 engines/cge2/detection.cpp:102 msgid "Enable Color Blind Mode by default" -msgstr "" +msgstr "Включає режим для людей з погіршенним сприяттям кольору" #: engines/drascula/saveload.cpp:47 msgid "" @@ -2328,11 +2325,11 @@ msgstr "Не вдалося записати гру" #: engines/hopkins/detection.cpp:76 engines/hopkins/detection.cpp:86 msgid "Gore Mode" -msgstr "" +msgstr "Режим з кров'ю" #: engines/hopkins/detection.cpp:77 engines/hopkins/detection.cpp:87 msgid "Enable Gore Mode when available" -msgstr "" +msgstr "Увімкнути режим з кров'ю, якщо є доступний" #. I18N: Studio audience adds an applause and cheering sounds whenever #. Malcolm makes a joke. @@ -2464,6 +2461,12 @@ msgid "" "Do you wish to use this save game file with ScummVM?\n" "\n" msgstr "" +"Наступний оригінальний файл стану гри було знайдено у вашій папці з грою:\n" +"\n" +"%s %s\n" +"\n" +"Чи ви бажаєте використовувати цей стан гри зі ScummVM?\n" +"\n" #: engines/kyra/saveload_eob.cpp:590 #, c-format @@ -2471,6 +2474,8 @@ msgid "" "A save game file was found in the specified slot %d. Overwrite?\n" "\n" msgstr "" +"Файл стану гри було знайдено у вказаній позиції %d. Перетерти?\n" +"\n" #: engines/kyra/saveload_eob.cpp:623 #, c-format @@ -2482,6 +2487,10 @@ msgid "" "'import_savefile'.\n" "\n" msgstr "" +"%d оригінальних файлів зі станом гри було успішно імпортовано у\n" +"ScummVM. Якщо ви захочете пізніше імпортувати оригінальні файли зі станом гри, вам потрібно\n" +"відкрити консоль відладчика і ввести команду 'import_savefile'.\n" +"\n" #. I18N: Option for fast scene switching #: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167 @@ -2697,15 +2706,13 @@ msgstr "Ігру призупинено. Натисніть пробіл для продовження." #. "Moechten Sie wirklich neu starten? (J/N)J" #. Will react to J as 'Yes' #: engines/scumm/dialogs.cpp:183 -#, fuzzy msgid "Are you sure you want to restart? (Y/N)Y" -msgstr "Ви упевнені, що хочете розпочати спочатку? (Y/N)" +msgstr "Ви упевнені, що хочете розпочати спочатку? (Y/N)Y" #. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment #: engines/scumm/dialogs.cpp:185 -#, fuzzy msgid "Are you sure you want to quit? (Y/N)Y" -msgstr "Ви упевнені, що хочете вийти? (Y/N)" +msgstr "Ви упевнені, що хочете вийти? (Y/N)Y" #: engines/scumm/dialogs.cpp:190 msgid "Play" @@ -3213,25 +3220,24 @@ msgid "Third kid" msgstr "Третя дитина" #: engines/scumm/help.cpp:292 -#, fuzzy msgid "Toggle Inventory/IQ Points display" -msgstr "Перемкнути показування в центрі екрану" +msgstr "Перемкнути показування інвентарю або значення IQ" #: engines/scumm/help.cpp:293 msgid "Toggle Keyboard/Mouse Fighting (*)" -msgstr "" +msgstr "Перемкнути керування бійкою Клавіатура/Миша (*)" #: engines/scumm/help.cpp:295 msgid "* Keyboard Fighting is always on," -msgstr "" +msgstr "* Управління клавіатурою завжди влючене, тому, " #: engines/scumm/help.cpp:296 msgid " so despite the in-game message this" -msgstr "" +msgstr " незважаючи на повідомлення гри, це налаштування" #: engines/scumm/help.cpp:297 msgid " actually toggles Mouse Fighting Off/On" -msgstr "" +msgstr " насправді включає та виключає управління мишею." #: engines/scumm/help.cpp:304 msgid "Fighting controls (numpad):" @@ -3268,7 +3274,7 @@ msgstr "Бити знизу" #: engines/scumm/help.cpp:315 msgid "Sucker punch" -msgstr "" +msgstr "Бити ззаду" #: engines/scumm/help.cpp:318 msgid "These are for Indy on left." @@ -3326,6 +3332,22 @@ msgstr "Летіти направо" msgid "Fly to lower right" msgstr "Летіти донизу направо" +#: engines/scumm/input.cpp:572 +msgid "Snap scroll on" +msgstr "Прокрутка стрибками" + +#: engines/scumm/input.cpp:574 +msgid "Snap scroll off" +msgstr "Вмикає прокрутку стрибками" + +#: engines/scumm/input.cpp:587 +msgid "Music volume: " +msgstr "Гучність музики: " + +#: engines/scumm/input.cpp:604 +msgid "Subtitle speed: " +msgstr "Швид. субтитрів: " + #: engines/scumm/scumm.cpp:1832 #, c-format msgid "" @@ -3336,27 +3358,30 @@ msgstr "" "LucasArts, проте %s відсутній. Перемикаюсь на AdLib." #: engines/scumm/scumm.cpp:2644 -#, fuzzy msgid "" "Usually, Maniac Mansion would start now. But for that to work, the game " "files for Maniac Mansion have to be in the 'Maniac' directory inside the " "Tentacle game directory, and the game has to be added to ScummVM." msgstr "" -"Зазвичай, зараз би запустився Maniac Mansion. Проте ScummVM ще цього не " -"вміє. Щоб грати у нього, оберіть 'Додати гру' у початковому меню ScummVM, і " -"виберіть папку Maniac всередені пвпки з грою Tentacle." +"Зазвичай, зараз би запустився Maniac Mansion. Але, щоб це могло працювати, " +"вам потрібно переписати файли гри Maniac Manssion у папку Maniac всередині " +"пвпки з грою Tentacle, а також додати саму гру у ScummVM." #: engines/scumm/players/player_v3m.cpp:129 msgid "" "Could not find the 'Loom' Macintosh executable to read the\n" "instruments from. Music will be disabled." msgstr "" +"Не вадлося знайти файл програми 'Loom' Macintosh аби прочитати\n" +"з нього інструменти. Музику було вимкнено." #: engines/scumm/players/player_v5m.cpp:107 msgid "" "Could not find the 'Monkey Island' Macintosh executable to read the\n" "instruments from. Music will be disabled." msgstr "" +"Не вадлося знайти файл програми 'Monkey Island' Macintosh аби прочитати\n" +"з нього інструменти. Музику було вимкнено." #: engines/sky/compact.cpp:130 msgid "" @@ -3470,136 +3495,46 @@ msgstr "" #: engines/wintermute/detection.cpp:58 msgid "Show FPS-counter" -msgstr "" +msgstr "Показати лічильник кадріи" #: engines/wintermute/detection.cpp:59 msgid "Show the current number of frames per second in the upper left corner" -msgstr "" +msgstr "Показує у верньому лівому куті поточну кількість кадрів на секунду" #: engines/zvision/detection_tables.h:52 -#, fuzzy msgid "Use the original save/load screens instead of the ScummVM interface" msgstr "" -"Використовувати оригінальні збереження/завантаження екрани, замість ScummVM" +"Використовувати оригінальні екрани збереження/завантаження замість ScummVM" #: engines/zvision/detection_tables.h:61 msgid "Double FPS" -msgstr "" +msgstr "Подвійна FPS" #: engines/zvision/detection_tables.h:62 msgid "Increase framerate from 30 to 60 FPS" -msgstr "" +msgstr "Підвищити кількість кадрів на секунду з 30 до 60" #: engines/zvision/detection_tables.h:71 -#, fuzzy msgid "Enable Venus" -msgstr "Увімкнути режим Геліум" +msgstr "Увімкнути Venus" #: engines/zvision/detection_tables.h:72 -#, fuzzy msgid "Enable the Venus help system" -msgstr "Увімкнути режим Геліум" +msgstr "Увімкнути допоміжну систему Venus" #: engines/zvision/detection_tables.h:81 msgid "Disable animation while turning" -msgstr "" +msgstr "Виключити анімацію під час поворотів" #: engines/zvision/detection_tables.h:82 msgid "Disable animation while turning in panorama mode" -msgstr "" +msgstr "Виключає анімацію під ча поворотів у режимі панорами" #: engines/zvision/detection_tables.h:91 msgid "Use high resolution MPEG video" -msgstr "" +msgstr "Використовувати відео MPEG з підвищеною роздільністю" #: engines/zvision/detection_tables.h:92 -#, fuzzy msgid "Use MPEG video from the DVD version, instead of lower resolution AVI" msgstr "" -"Використовувати альтернативний набір срібних курсорів, замість звичайних " -"золотих" - -#~ msgid "EGA undithering" -#~ msgstr "EGA без растрування" - -#~ msgid "Enable undithering in EGA games" -#~ msgstr "Увімкнути анти-згладжування в EGA іграх" - -#~ msgid "MPEG-2 cutscenes found but ScummVM has been built without MPEG-2" -#~ msgstr "" -#~ "Знайдені ролики MPEG-2, але ScummVM був зібраний без підтримки MPEG-2" - -#~ msgctxt "lowres" -#~ msgid "Mass Add..." -#~ msgstr "Дод. багато..." - -#~ msgid "" -#~ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" -#~ msgstr "" -#~ "Вимикає мапінг General MIDI для ігор зі звуковою доріжкою для Roland MT-32" - -#~ msgid "Standard (16bpp)" -#~ msgstr "Стандартний растеризатор (16bpp)" - -#~ msgid "MPEG2 cutscenes are no longer supported" -#~ msgstr "Ролики MPEG2 більше не підтримуються" - -#~ msgid "OpenGL Normal" -#~ msgstr "OpenGL нормальний" - -#~ msgid "OpenGL Conserve" -#~ msgstr "OpenGL Збережений" - -#~ msgid "OpenGL Original" -#~ msgstr "OpenGL Оригінальний" - -#~ msgid "Current display mode" -#~ msgstr "Поточний відеорежим" - -#~ msgid "Current scale" -#~ msgstr "Поточний масштаб" - -#~ msgid "Active filter mode: Linear" -#~ msgstr "Активний режим фільтрації: Лінійний" - -#~ msgid "Active filter mode: Nearest" -#~ 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 "Неправильний шлях" +"Використовувати відео MPEG з DVD-версії, замість файлів AVI з ніжчою роздільною здатністю" |