aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS6
-rw-r--r--audio/decoders/aiff.cpp4
-rw-r--r--audio/decoders/mp3.cpp11
-rw-r--r--audio/midiparser_xmidi.cpp2
-rw-r--r--backends/platform/sdl/win32/win32-main.cpp5
-rw-r--r--backends/platform/symbian/mmp/config.mmh13
-rw-r--r--backends/platform/symbian/mmp/scummvm_avalanche.mmp.in1
-rw-r--r--backends/platform/symbian/mmp/scummvm_cge2.mmp.in1
-rw-r--r--backends/platform/symbian/mmp/scummvm_tsage.mmp.in1
-rw-r--r--backends/platform/symbian/src/SymbianOS.cpp4
-rw-r--r--backends/platform/symbian/src/portdefs.h8
-rw-r--r--backends/saves/default/default-saves.cpp5
-rw-r--r--common/scummsys.h2
-rw-r--r--devtools/README4
-rw-r--r--devtools/create_project/create_project.cpp25
-rw-r--r--devtools/create_project/msbuild.cpp24
-rw-r--r--devtools/create_project/msbuild.h1
-rw-r--r--devtools/create_project/msvc.cpp10
-rw-r--r--devtools/create_project/msvc.h5
-rw-r--r--devtools/create_project/msvc14/create_project.sln28
-rw-r--r--devtools/create_project/msvc14/create_project.vcxproj223
-rw-r--r--devtools/create_project/msvc14/create_project.vcxproj.filters76
-rw-r--r--devtools/create_project/visualstudio.cpp2
-rw-r--r--devtools/scumm-md5.txt1
-rw-r--r--dists/engine-data/testbed-audiocd-files/TESTBED0
-rw-r--r--dists/msvc14/create_msvc14.bat105
-rw-r--r--dists/msvc14/readme.txt6
-rw-r--r--doc/de/Neues7
-rw-r--r--engines/bbvs/minigames/bbairguitar.cpp25
-rw-r--r--engines/cine/cine.cpp52
-rw-r--r--engines/cine/cine.h1
-rw-r--r--engines/cine/main_loop.cpp4
-rw-r--r--engines/cine/saveload.cpp9
-rw-r--r--engines/cine/script_fw.cpp6
-rw-r--r--engines/cine/sound.cpp88
-rw-r--r--engines/cine/sound.h5
-rw-r--r--engines/fullpipe/gameloader.cpp2
-rw-r--r--engines/fullpipe/interaction.cpp2
-rw-r--r--engines/fullpipe/lift.cpp2
-rw-r--r--engines/fullpipe/messagehandlers.cpp2
-rw-r--r--engines/fullpipe/motion.cpp189
-rw-r--r--engines/fullpipe/motion.h93
-rw-r--r--engines/fullpipe/scenes.cpp4
-rw-r--r--engines/fullpipe/scenes/scene04.cpp14
-rw-r--r--engines/fullpipe/scenes/scene06.cpp8
-rw-r--r--engines/fullpipe/scenes/scene08.cpp4
-rw-r--r--engines/fullpipe/scenes/scene09.cpp6
-rw-r--r--engines/fullpipe/scenes/scene10.cpp2
-rw-r--r--engines/fullpipe/scenes/scene11.cpp8
-rw-r--r--engines/fullpipe/scenes/scene14.cpp10
-rw-r--r--engines/fullpipe/scenes/scene16.cpp2
-rw-r--r--engines/fullpipe/scenes/scene18and19.cpp2
-rw-r--r--engines/fullpipe/scenes/scene22.cpp8
-rw-r--r--engines/fullpipe/scenes/scene23.cpp6
-rw-r--r--engines/fullpipe/scenes/scene25.cpp2
-rw-r--r--engines/fullpipe/scenes/scene26.cpp2
-rw-r--r--engines/fullpipe/scenes/scene27.cpp8
-rw-r--r--engines/fullpipe/scenes/scene28.cpp2
-rw-r--r--engines/fullpipe/scenes/scene29.cpp14
-rw-r--r--engines/fullpipe/scenes/scene32.cpp8
-rw-r--r--engines/fullpipe/scenes/scene34.cpp12
-rw-r--r--engines/fullpipe/scenes/sceneFinal.cpp2
-rw-r--r--engines/hopkins/computer.cpp8
-rw-r--r--engines/mads/nebular/game_nebular.cpp4
-rw-r--r--engines/mads/nebular/nebular_scenes1.cpp2
-rw-r--r--engines/mads/nebular/sound_nebular.cpp2
-rw-r--r--engines/mortevielle/menu.cpp11
-rw-r--r--engines/neverhood/menumodule.cpp6
-rw-r--r--engines/neverhood/menumodule.h1
-rw-r--r--engines/neverhood/modules/module2700.cpp12
-rw-r--r--engines/neverhood/modules/module2700.h4
-rw-r--r--engines/sci/detection_tables.h2
-rw-r--r--engines/scumm/POTFILES1
-rw-r--r--engines/scumm/input.cpp9
-rw-r--r--engines/scumm/scumm-md5.h3
-rw-r--r--engines/sherlock/animation.cpp12
-rw-r--r--engines/sherlock/detection_tables.h53
-rw-r--r--engines/sherlock/events.cpp39
-rw-r--r--engines/sherlock/events.h5
-rw-r--r--engines/sherlock/fonts.cpp68
-rw-r--r--engines/sherlock/image_file.cpp99
-rw-r--r--engines/sherlock/journal.cpp8
-rw-r--r--engines/sherlock/music.cpp12
-rw-r--r--engines/sherlock/music.h7
-rw-r--r--engines/sherlock/objects.cpp2
-rw-r--r--engines/sherlock/people.cpp5
-rw-r--r--engines/sherlock/scalpel/scalpel.cpp355
-rw-r--r--engines/sherlock/scalpel/scalpel.h10
-rw-r--r--engines/sherlock/scalpel/scalpel_fixed_text.cpp218
-rw-r--r--engines/sherlock/scalpel/scalpel_fixed_text.h68
-rw-r--r--engines/sherlock/scalpel/scalpel_journal.cpp19
-rw-r--r--engines/sherlock/scalpel/scalpel_map.cpp15
-rw-r--r--engines/sherlock/scalpel/scalpel_scene.cpp146
-rw-r--r--engines/sherlock/scalpel/scalpel_scene.h2
-rw-r--r--engines/sherlock/scalpel/scalpel_screen.cpp249
-rw-r--r--engines/sherlock/scalpel/scalpel_screen.h38
-rw-r--r--engines/sherlock/scalpel/scalpel_talk.cpp27
-rw-r--r--engines/sherlock/scalpel/scalpel_talk.h7
-rw-r--r--engines/sherlock/scalpel/scalpel_user_interface.cpp45
-rw-r--r--engines/sherlock/scalpel/scalpel_user_interface.h2
-rw-r--r--engines/sherlock/scene.cpp76
-rw-r--r--engines/sherlock/scene.h4
-rw-r--r--engines/sherlock/screen.cpp138
-rw-r--r--engines/sherlock/screen.h14
-rw-r--r--engines/sherlock/sherlock.cpp3
-rw-r--r--engines/sherlock/sherlock.h2
-rw-r--r--engines/sherlock/sound.cpp112
-rw-r--r--engines/sherlock/sound.h24
-rw-r--r--engines/sherlock/surface.cpp22
-rw-r--r--engines/sherlock/surface.h26
-rw-r--r--engines/sherlock/talk.cpp29
-rw-r--r--engines/sherlock/talk.h4
-rw-r--r--engines/sherlock/tattoo/tattoo.cpp9
-rw-r--r--engines/sherlock/tattoo/tattoo_darts.cpp114
-rw-r--r--engines/sherlock/tattoo/tattoo_fixed_text.cpp683
-rw-r--r--engines/sherlock/tattoo/tattoo_fixed_text.h120
-rw-r--r--engines/sherlock/tattoo/tattoo_inventory.cpp2
-rw-r--r--engines/sherlock/tattoo/tattoo_journal.cpp12
-rw-r--r--engines/sherlock/tattoo/tattoo_map.cpp17
-rw-r--r--engines/sherlock/tattoo/tattoo_people.cpp19
-rw-r--r--engines/sherlock/tattoo/tattoo_people.h2
-rw-r--r--engines/sherlock/tattoo/tattoo_resources.cpp394
-rw-r--r--engines/sherlock/tattoo/tattoo_resources.h9
-rw-r--r--engines/sherlock/tattoo/tattoo_scene.cpp36
-rw-r--r--engines/sherlock/tattoo/tattoo_talk.cpp4
-rw-r--r--engines/sherlock/tattoo/tattoo_user_interface.cpp19
-rw-r--r--engines/sherlock/tattoo/tattoo_user_interface.h3
-rw-r--r--engines/sherlock/tattoo/widget_files.cpp3
-rw-r--r--engines/sherlock/tattoo/widget_inventory.cpp8
-rw-r--r--engines/sherlock/tattoo/widget_lab.cpp2
-rw-r--r--engines/sherlock/tattoo/widget_talk.cpp8
-rw-r--r--engines/sherlock/tattoo/widget_verbs.cpp5
-rw-r--r--engines/tinsel/music.cpp9
-rw-r--r--engines/tucker/staticres.cpp8
-rw-r--r--engines/tucker/tucker.h9
-rw-r--r--engines/wintermute/base/file/base_file.cpp2
-rw-r--r--engines/wintermute/base/gfx/base_surface.cpp5
-rw-r--r--engines/wintermute/utils/convert_utf.cpp6
-rw-r--r--engines/wintermute/utils/convert_utf.h3
-rw-r--r--gui/ThemeEngine.cpp18
-rw-r--r--gui/filebrowser-dialog.cpp160
-rw-r--r--gui/filebrowser-dialog.h64
-rw-r--r--gui/module.mk1
-rw-r--r--gui/recorderdialog.cpp2
-rw-r--r--gui/themes/default.inc57
-rw-r--r--gui/themes/scummclassic.zipbin110106 -> 111302 bytes
-rw-r--r--gui/themes/scummclassic/classic_layout.stx41
-rw-r--r--gui/themes/scummclassic/classic_layout_lowres.stx35
-rw-r--r--gui/themes/scummmodern.zipbin1485886 -> 1487079 bytes
-rw-r--r--gui/themes/scummmodern/scummmodern_layout.stx43
-rw-r--r--gui/themes/scummmodern/scummmodern_layout_lowres.stx37
-rwxr-xr-xgui/themes/scummtheme.py30
-rw-r--r--gui/themes/translations.datbin468051 -> 471949 bytes
-rw-r--r--gui/widgets/editable.cpp5
-rw-r--r--gui/widgets/edittext.cpp3
-rw-r--r--po/POTFILES1
-rw-r--r--po/be_BY.po31
-rw-r--r--po/ca_ES.po31
-rw-r--r--po/cs_CZ.po31
-rw-r--r--po/da_DA.po31
-rw-r--r--po/de_DE.po56
-rw-r--r--po/es_ES.po31
-rw-r--r--po/eu.po31
-rw-r--r--po/fi_FI.po31
-rw-r--r--po/fr_FR.po31
-rw-r--r--po/gl_ES.po31
-rw-r--r--po/hu_HU.po182
-rw-r--r--po/it_IT.po31
-rw-r--r--po/nb_NO.po31
-rw-r--r--po/nl_NL.po31
-rw-r--r--po/nn_NO.po31
-rw-r--r--po/pl_PL.po31
-rw-r--r--po/pt_BR.po31
-rw-r--r--po/ru_RU.po170
-rw-r--r--po/scummvm.pot27
-rw-r--r--po/se_SE.po31
-rw-r--r--po/uk_UA.po255
177 files changed, 4606 insertions, 1802 deletions
diff --git a/NEWS b/NEWS
index f9aac42b6e..765329a1f5 100644
--- a/NEWS
+++ b/NEWS
@@ -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 &quot;$(SolutionDir)../../devtools/create_project/scripts/prebuild.cmd&quot; &quot;$(SolutionDir)/../..&quot; &quot;$(TargetDir)&quot;\n"
+ "echo.\n"
+ "@call &quot;$(SolutionDir)../../devtools/create_project/scripts/prebuild.cmd&quot; &quot;$(SolutionDir)/../..&quot; &quot;$(TargetDir)&quot;\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
index 1b555a6c27..d7016cab58 100644
--- a/gui/themes/scummclassic.zip
+++ b/gui/themes/scummclassic.zip
Binary files differ
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
index c7c585654d..5bf1b8e17d 100644
--- a/gui/themes/scummmodern.zip
+++ b/gui/themes/scummmodern.zip
Binary files differ
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
index 4225994810..ec86f36518 100644
--- a/gui/themes/translations.dat
+++ b/gui/themes/translations.dat
Binary files differ
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 ""
diff --git a/po/eu.po b/po/eu.po
index 913338606e..97e13810e5 100644
--- a/po/eu.po
+++ b/po/eu.po
@@ -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 з ніжчою роздільною здатністю"