aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS1
-rw-r--r--NEWS42
-rw-r--r--audio/decoders/adpcm.cpp5
-rw-r--r--audio/decoders/adpcm_intern.h2
-rw-r--r--backends/taskbar/macosx/macosx-taskbar.mm2
-rw-r--r--common/gui_options.cpp1
-rw-r--r--common/gui_options.h1
-rw-r--r--common/memstream.h2
-rw-r--r--devtools/create_project/cmake.cpp324
-rw-r--r--devtools/create_project/cmake.h85
-rw-r--r--devtools/create_project/cmake/CMakeLists.txt23
-rw-r--r--devtools/create_project/create_project.cpp123
-rw-r--r--devtools/create_project/module.mk1
-rw-r--r--devtools/create_project/msvc10/create_project.vcxproj2
-rw-r--r--devtools/create_project/msvc11/create_project.vcxproj2
-rw-r--r--devtools/create_project/msvc12/create_project.vcxproj2
-rw-r--r--devtools/create_project/msvc14/create_project.vcxproj2
-rw-r--r--devtools/create_project/msvc9/create_project.vcproj8
-rwxr-xr-xdevtools/credits.pl1
-rw-r--r--devtools/skycpt/COMPACT.TXT2
-rw-r--r--dists/engine-data/sky.cptbin419427 -> 419427 bytes
-rw-r--r--engines/agos/subroutine.cpp2
-rw-r--r--engines/drascula/animation.cpp5
-rw-r--r--engines/fullpipe/behavior.cpp116
-rw-r--r--engines/fullpipe/behavior.h24
-rw-r--r--engines/fullpipe/gameloader.cpp12
-rw-r--r--engines/fullpipe/messagehandlers.cpp8
-rw-r--r--engines/fullpipe/motion.cpp200
-rw-r--r--engines/fullpipe/motion.h16
-rw-r--r--engines/fullpipe/scenes.h8
-rw-r--r--engines/fullpipe/scenes/scene06.cpp4
-rw-r--r--engines/fullpipe/scenes/scene07.cpp4
-rw-r--r--engines/fullpipe/scenes/scene13.cpp16
-rw-r--r--engines/fullpipe/scenes/scene14.cpp8
-rw-r--r--engines/gob/gob.cpp17
-rw-r--r--engines/mads/nebular/nebular_scenes2.cpp2
-rw-r--r--engines/mohawk/detection.cpp74
-rw-r--r--engines/mohawk/detection_tables.h36
-rw-r--r--engines/mohawk/myst_state.cpp1
-rw-r--r--engines/mohawk/resource.h2
-rw-r--r--engines/mohawk/riven.cpp16
-rw-r--r--engines/mohawk/riven_saveload.cpp341
-rw-r--r--engines/mohawk/riven_saveload.h35
-rw-r--r--engines/sci/console.cpp15
-rw-r--r--engines/sci/detection.cpp18
-rw-r--r--engines/sci/detection_tables.h388
-rw-r--r--engines/sci/engine/file.cpp261
-rw-r--r--engines/sci/engine/file.h46
-rw-r--r--engines/sci/engine/kernel.cpp6
-rw-r--r--engines/sci/engine/kernel.h20
-rw-r--r--engines/sci/engine/kernel_tables.h35
-rw-r--r--engines/sci/engine/kfile.cpp109
-rw-r--r--engines/sci/engine/kgraphics32.cpp117
-rw-r--r--engines/sci/engine/kmisc.cpp9
-rw-r--r--engines/sci/engine/kvideo.cpp153
-rw-r--r--engines/sci/engine/savegame.cpp11
-rw-r--r--engines/sci/engine/script_patches.cpp168
-rw-r--r--engines/sci/engine/state.cpp6
-rw-r--r--engines/sci/engine/state.h5
-rw-r--r--engines/sci/engine/workarounds.cpp1
-rw-r--r--engines/sci/graphics/celobj32.cpp31
-rw-r--r--engines/sci/graphics/celobj32.h12
-rw-r--r--engines/sci/graphics/controls32.cpp2
-rw-r--r--engines/sci/graphics/cursor.h2
-rw-r--r--engines/sci/graphics/frameout.cpp65
-rw-r--r--engines/sci/graphics/frameout.h19
-rw-r--r--engines/sci/graphics/paint32.cpp2
-rw-r--r--engines/sci/graphics/palette.h10
-rw-r--r--engines/sci/graphics/palette32.cpp278
-rw-r--r--engines/sci/graphics/palette32.h160
-rw-r--r--engines/sci/graphics/plane32.cpp9
-rw-r--r--engines/sci/graphics/plane32.h7
-rw-r--r--engines/sci/graphics/screen_item32.cpp16
-rw-r--r--engines/sci/graphics/screen_item32.h12
-rw-r--r--engines/sci/graphics/video32.cpp415
-rw-r--r--engines/sci/graphics/video32.h312
-rw-r--r--engines/sci/module.mk1
-rw-r--r--engines/sci/resource.cpp2
-rw-r--r--engines/sci/sci.cpp40
-rw-r--r--engines/sci/sci.h4
-rw-r--r--engines/sci/sound/audio32.cpp49
-rw-r--r--engines/sci/sound/audio32.h2
-rw-r--r--engines/sci/sound/music.cpp3
-rw-r--r--engines/sci/sound/soundcmd.cpp2
-rw-r--r--engines/scumm/actor.cpp187
-rw-r--r--engines/scumm/actor.h14
-rw-r--r--engines/scumm/boxes.cpp59
-rw-r--r--engines/scumm/gfx.cpp5
-rw-r--r--engines/scumm/gfx.h2
-rw-r--r--engines/scumm/object.cpp2
-rw-r--r--engines/scumm/saveload.h2
-rw-r--r--engines/scumm/scumm.cpp50
-rw-r--r--engines/scumm/scumm.h11
-rw-r--r--engines/scumm/scumm_v0.h4
-rw-r--r--engines/sky/compact.cpp17
-rw-r--r--engines/sky/compact.h2
-rw-r--r--engines/sky/logic.cpp2
-rw-r--r--engines/wage/design.cpp43
-rw-r--r--engines/wage/dialog.cpp2
-rw-r--r--engines/wage/gui.cpp2
-rw-r--r--engines/wage/macwindow.cpp6
-rw-r--r--engines/wage/macwindowmanager.cpp85
-rw-r--r--engines/wage/world.cpp6
-rw-r--r--engines/wintermute/ad/ad_entity.cpp3
-rw-r--r--engines/wintermute/ad/ad_entity.h1
-rw-r--r--engines/wintermute/ad/ad_game.cpp3
-rw-r--r--engines/wintermute/ad/ad_game.h1
-rw-r--r--engines/wintermute/ad/ad_scene.cpp5
-rw-r--r--engines/wintermute/ad/ad_scene.h2
-rw-r--r--engines/wintermute/base/base_frame.cpp3
-rw-r--r--engines/wintermute/base/base_frame.h2
-rw-r--r--engines/wintermute/base/base_game.cpp8
-rw-r--r--engines/wintermute/base/base_game.h8
-rw-r--r--engines/wintermute/base/base_region.cpp3
-rw-r--r--engines/wintermute/base/base_region.h2
-rw-r--r--engines/wintermute/base/base_script_holder.cpp15
-rw-r--r--engines/wintermute/base/base_scriptable.cpp5
-rw-r--r--engines/wintermute/base/base_scriptable.h1
-rw-r--r--engines/wintermute/base/base_sprite.cpp3
-rw-r--r--engines/wintermute/base/base_sprite.h1
-rw-r--r--engines/wintermute/base/base_sub_frame.cpp4
-rw-r--r--engines/wintermute/base/base_sub_frame.h1
-rw-r--r--engines/wintermute/base/base_viewport.cpp3
-rw-r--r--engines/wintermute/base/base_viewport.h1
-rw-r--r--engines/wintermute/base/scriptables/debuggable/debuggable_script.cpp148
-rw-r--r--engines/wintermute/base/scriptables/debuggable/debuggable_script.h67
-rw-r--r--engines/wintermute/base/scriptables/debuggable/debuggable_script_engine.cpp35
-rw-r--r--engines/wintermute/base/scriptables/debuggable/debuggable_script_engine.h110
-rw-r--r--engines/wintermute/base/scriptables/script.cpp33
-rw-r--r--engines/wintermute/base/scriptables/script.h14
-rw-r--r--engines/wintermute/base/scriptables/script_engine.cpp8
-rw-r--r--engines/wintermute/base/scriptables/script_engine.h14
-rw-r--r--engines/wintermute/debugger.cpp346
-rw-r--r--engines/wintermute/debugger.h120
-rw-r--r--engines/wintermute/debugger/breakpoint.cpp68
-rw-r--r--engines/wintermute/debugger/breakpoint.h58
-rw-r--r--engines/wintermute/debugger/debugger_controller.cpp325
-rw-r--r--engines/wintermute/debugger/debugger_controller.h119
-rw-r--r--engines/wintermute/debugger/error.cpp137
-rw-r--r--engines/wintermute/debugger/error.h73
-rw-r--r--engines/wintermute/debugger/listing.cpp46
-rw-r--r--engines/wintermute/debugger/listing.h64
-rw-r--r--engines/wintermute/debugger/listing_provider.h42
-rw-r--r--engines/wintermute/debugger/listing_providers/basic_source_listing_provider.cpp92
-rw-r--r--engines/wintermute/debugger/listing_providers/basic_source_listing_provider.h44
-rw-r--r--engines/wintermute/debugger/listing_providers/blank_listing.cpp38
-rw-r--r--engines/wintermute/debugger/listing_providers/blank_listing.h39
-rw-r--r--engines/wintermute/debugger/listing_providers/blank_listing_provider.cpp35
-rw-r--r--engines/wintermute/debugger/listing_providers/blank_listing_provider.h38
-rw-r--r--engines/wintermute/debugger/listing_providers/cached_source_listing_provider.cpp80
-rw-r--r--engines/wintermute/debugger/listing_providers/cached_source_listing_provider.h52
-rw-r--r--engines/wintermute/debugger/listing_providers/source_listing.cpp57
-rw-r--r--engines/wintermute/debugger/listing_providers/source_listing.h37
-rw-r--r--engines/wintermute/debugger/listing_providers/source_listing_provider.h49
-rw-r--r--engines/wintermute/debugger/script_monitor.cpp26
-rw-r--r--engines/wintermute/debugger/script_monitor.h43
-rw-r--r--engines/wintermute/debugger/watch.cpp42
-rw-r--r--engines/wintermute/debugger/watch.h51
-rw-r--r--engines/wintermute/debugger/watch_instance.cpp53
-rw-r--r--engines/wintermute/debugger/watch_instance.h44
-rw-r--r--engines/wintermute/module.mk14
-rw-r--r--engines/wintermute/wintermute.cpp7
-rw-r--r--engines/wintermute/wintermute.h8
-rw-r--r--graphics/VectorRenderer.cpp29
-rw-r--r--graphics/VectorRenderer.h60
-rw-r--r--graphics/VectorRendererSpec.cpp1716
-rw-r--r--graphics/VectorRendererSpec.h73
-rw-r--r--graphics/nine_patch.cpp35
-rw-r--r--graphics/nine_patch.h1
-rw-r--r--graphics/transparent_surface.cpp133
-rw-r--r--graphics/transparent_surface.h8
-rw-r--r--gui/ThemeEngine.cpp455
-rw-r--r--gui/ThemeEngine.h31
-rw-r--r--gui/ThemeEval.cpp16
-rw-r--r--gui/ThemeLayout.h38
-rw-r--r--gui/credits.h1
-rw-r--r--gui/dialog.cpp4
-rw-r--r--gui/gui-manager.cpp6
-rw-r--r--gui/gui-manager.h1
-rw-r--r--gui/module.mk1
-rw-r--r--gui/object.cpp13
-rw-r--r--gui/themes/default.inc14
-rw-r--r--gui/themes/scummclassic.zipbin112109 -> 115643 bytes
-rw-r--r--gui/themes/scummclassic/classic_layout.stx6
-rw-r--r--gui/themes/scummclassic/classic_layout_lowres.stx8
-rw-r--r--gui/themes/scummmodern.zipbin1487883 -> 1491681 bytes
-rw-r--r--gui/themes/scummmodern/scummmodern_layout.stx6
-rw-r--r--gui/themes/scummmodern/scummmodern_layout_lowres.stx8
-rw-r--r--gui/themes/translations.datbin569099 -> 570539 bytes
-rw-r--r--gui/widget.cpp53
-rw-r--r--gui/widget.h4
-rw-r--r--gui/widgets/editable.cpp4
-rw-r--r--gui/widgets/edittext.cpp4
-rw-r--r--gui/widgets/list.cpp8
-rw-r--r--gui/widgets/popup.cpp20
-rw-r--r--gui/widgets/scrollbar.cpp7
-rw-r--r--gui/widgets/scrollcontainer.cpp147
-rw-r--r--gui/widgets/scrollcontainer.h63
-rw-r--r--gui/widgets/tab.cpp24
-rw-r--r--gui/widgets/tab.h1
-rw-r--r--po/be_BY.po170
-rw-r--r--po/ca_ES.po170
-rw-r--r--po/cs_CZ.po170
-rw-r--r--po/da_DK.po170
-rw-r--r--po/de_DE.po175
-rw-r--r--po/es_ES.po170
-rw-r--r--po/eu.po170
-rw-r--r--po/fi_FI.po170
-rw-r--r--po/fr_FR.po170
-rw-r--r--po/gl_ES.po170
-rwxr-xr-xpo/hu_HU.po171
-rw-r--r--po/it_IT.po170
-rw-r--r--po/nb_NO.po170
-rw-r--r--po/nl_NL.po166
-rw-r--r--po/nn_NO.po170
-rw-r--r--po/pl_PL.po170
-rw-r--r--po/pt_BR.po170
-rw-r--r--po/ru_RU.po166
-rw-r--r--po/scummvm.pot166
-rw-r--r--po/sv_SE.po170
-rw-r--r--po/uk_UA.po166
-rw-r--r--po/zh-Latn_CN.po166
-rw-r--r--video/coktel_decoder.cpp4
-rw-r--r--video/coktel_decoder.h2
224 files changed, 11207 insertions, 3176 deletions
diff --git a/AUTHORS b/AUTHORS
index b32182a1bf..59e0d70fcf 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -104,6 +104,7 @@ ScummVM Team
Drascula:
Filippos Karapetis
Pawel Kolodziejski
+ Thierry Crozat
DreamWeb:
Torbjorn Andersson
diff --git a/NEWS b/NEWS
index 050e20f90c..193141d8b7 100644
--- a/NEWS
+++ b/NEWS
@@ -3,9 +3,12 @@ For a more comprehensive changelog of the latest experimental code, see:
1.9.0 (YYYY-MM-DD)
New Games:
- - Added support for Myst.
- - Added support for Myst: Masterpiece Edition.
- - Added support for U.F.O.s.
+ - Added support for Myst.
+ - Added support for Myst: Masterpiece Edition.
+ - Added support for U.F.O.s.
+
+ General:
+ - Fixed audio corruption in the MS ADPCM decoder.
AGI:
- Added support for Hercules rendering. Both green and amber modes are
@@ -15,10 +18,40 @@ For a more comprehensive changelog of the latest experimental code, see:
- Added optional "pause, when entering commands" feature, that was only
available in the original interpreter for Hercules rendering.
+ Beneath a Steel Sky:
+ - Fixed a bug that could possibly make the game unfinishable due to a
+ wrong animation for Officer Blunt that makes further interaction with
+ this character impossible.
+
+ Gob:
+ - Fixed graphical issues in Gobliiins (EGA version).
+
SCI:
- - Fix a missing dialog line in QfG3 which awards the player with 3 additional
+ - Fixed a missing dialog line in QfG3 which awards the player with 3 additional
points. This is a bug in the original game interpreter. Due to this bug,
it was not possible to get all points in the original game.
+ - Fixed a bug in Space Quest 1 that caused issues with the spider droid.
+ - Fixed a bug in Laura Bow: The Colonel's Bequest that could cause a lock-up when
+ interacting with the armor in room 37 (main house, downstairs). This bug is also
+ present in the original game.
+ - Fixed auto-saving in the fan-made Cascade Quest.
+ - Fixed a bug in Conquests of the Longbow: The Adventures of Robin Hood that caused
+ the game to crash while wandering through the Sherwood Forest.
+ - Added a detection entry for the ImagiNation Network (INN) demo.
+
+ SCUMM:
+ - Fixed missing translations in the in-game quit and restart dialogs in Pajama Sam 1.
+ - Fixed visual glitches in DOTT that occured after loading a savegame with the stereo
+ in Green Tentacle's room turned on.
+ - Improved timing and pathfinding in Maniac Mansion (C64 and Apple II versions)
+
+ Mohawk:
+ - Fixed visual glitches in the Spanish version of Myst.
+ - Changed the cancel button in the options dialog of Riven not to save the settings.
+ - Riven savegames created by ScummVM are now loadable in the original game.
+
+ WAGE:
+ - Closed memory leak.
Windows port:
- Fixed taskbar support on Windows 10 onwards.
@@ -1896,3 +1929,4 @@ For a more comprehensive changelog of the latest experimental code, see:
0.0.1 (2001-10-08)
- Initial version.
+
diff --git a/audio/decoders/adpcm.cpp b/audio/decoders/adpcm.cpp
index fd97d5d109..ffb61a49c0 100644
--- a/audio/decoders/adpcm.cpp
+++ b/audio/decoders/adpcm.cpp
@@ -320,10 +320,11 @@ int MS_ADPCMStream::readBuffer(int16 *buffer, const int numSamples) {
_decodedSamples[_decodedSampleCount++] = decodeMS(&_status.ch[0], (data >> 4) & 0x0f);
_decodedSamples[_decodedSampleCount++] = decodeMS(&_status.ch[_channels - 1], data & 0x0f);
}
+ _decodedSampleIndex = 0;
}
- // (1 - (count - 1)) ensures that _decodedSamples acts as a FIFO of depth 2
- buffer[samples] = _decodedSamples[1 - (_decodedSampleCount - 1)];
+ // _decodedSamples acts as a FIFO of depth 2 or 4;
+ buffer[samples] = _decodedSamples[_decodedSampleIndex++];
_decodedSampleCount--;
}
diff --git a/audio/decoders/adpcm_intern.h b/audio/decoders/adpcm_intern.h
index 3a2af91c90..f4a708c3fc 100644
--- a/audio/decoders/adpcm_intern.h
+++ b/audio/decoders/adpcm_intern.h
@@ -209,6 +209,7 @@ public:
error("MS_ADPCMStream(): blockAlign isn't specified for MS ADPCM");
memset(&_status, 0, sizeof(_status));
_decodedSampleCount = 0;
+ _decodedSampleIndex = 0;
}
virtual bool endOfData() const { return (_stream->eos() || _stream->pos() >= _endpos) && (_decodedSampleCount == 0); }
@@ -220,6 +221,7 @@ protected:
private:
uint8 _decodedSampleCount;
+ uint8 _decodedSampleIndex;
int16 _decodedSamples[4];
};
diff --git a/backends/taskbar/macosx/macosx-taskbar.mm b/backends/taskbar/macosx/macosx-taskbar.mm
index 577320b79d..c842eb8090 100644
--- a/backends/taskbar/macosx/macosx-taskbar.mm
+++ b/backends/taskbar/macosx/macosx-taskbar.mm
@@ -269,7 +269,7 @@ void MacOSXTaskbarManager::addRecent(const Common::String &name, const Common::S
// Insert the new game at the start
[newArray insertObject:dict atIndex:0];
// If the game was already present in the array, remove it
- for (int i = 1 ; i < [newArray count] ; ++i) {
+ for (unsigned int i = 1 ; i < [newArray count] ; ++i) {
NSDictionary *oldDict = [newArray objectAtIndex:i];
if (oldDict == nil)
continue;
diff --git a/common/gui_options.cpp b/common/gui_options.cpp
index 473f78c795..df880f4fee 100644
--- a/common/gui_options.cpp
+++ b/common/gui_options.cpp
@@ -74,6 +74,7 @@ const struct GameOpt {
{ GUIO_GAMEOPTIONS6, "gameOption6" },
{ GUIO_GAMEOPTIONS7, "gameOption7" },
{ GUIO_GAMEOPTIONS8, "gameOption8" },
+ { GUIO_GAMEOPTIONS9, "gameOption9" },
{ GUIO_NONE, 0 }
};
diff --git a/common/gui_options.h b/common/gui_options.h
index aa15d906f5..ec3eccd161 100644
--- a/common/gui_options.h
+++ b/common/gui_options.h
@@ -68,6 +68,7 @@
#define GUIO_GAMEOPTIONS6 "\055"
#define GUIO_GAMEOPTIONS7 "\056"
#define GUIO_GAMEOPTIONS8 "\057"
+#define GUIO_GAMEOPTIONS9 "\058"
#define GUIO0() (GUIO_NONE)
#define GUIO1(a) (a)
diff --git a/common/memstream.h b/common/memstream.h
index a01973c6fa..94407f5cc9 100644
--- a/common/memstream.h
+++ b/common/memstream.h
@@ -157,7 +157,7 @@ public:
* that grows as it's written to.
*/
class MemoryWriteStreamDynamic : public WriteStream {
-private:
+protected:
uint32 _capacity;
uint32 _size;
byte *_ptr;
diff --git a/devtools/create_project/cmake.cpp b/devtools/create_project/cmake.cpp
new file mode 100644
index 0000000000..1423e686be
--- /dev/null
+++ b/devtools/create_project/cmake.cpp
@@ -0,0 +1,324 @@
+/* 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 "config.h"
+#include "cmake.h"
+
+#include <algorithm>
+#include <cstring>
+#include <fstream>
+#include <iterator>
+
+namespace CreateProjectTool {
+
+CMakeProvider::CMakeProvider(StringList &global_warnings, std::map<std::string, StringList> &project_warnings, const int version)
+ : ProjectProvider(global_warnings, project_warnings, version) {
+}
+
+const CMakeProvider::Library *CMakeProvider::getLibraryFromFeature(const char *feature) const {
+ static const Library s_libraries[] = {
+ { "sdl", "FindSDL", "SDL", "SDL_INCLUDE_DIR", "SDL_LIBRARY", 0 },
+ { "sdl2", 0, "SDL2", "SDL2_INCLUDE_DIRS", "SDL2_LIBRARIES", 0 },
+ { "freetype", "FindFreetype", "Freetype", "FREETYPE_INCLUDE_DIRS", "FREETYPE_LIBRARIES", 0 },
+ { "libz", "FindZLIB", "ZLIB", "ZLIB_INCLUDE_DIRS", "ZLIB_LIBRARIES", 0 },
+ { "png", "FindPNG", "PNG", "PNG_INCLUDE_DIRS", "PNG_LIBRARIES", 0 },
+ { "jpeg", "FindJPEG", "JPEG", "JPEG_INCLUDE_DIRS", "JPEG_LIBRARIES", 0 },
+ { "mpeg2", "FindMPEG2", "MPEG2", "MPEG2_INCLUDE_DIRS", "MPEG2_mpeg2_LIBRARY", 0 },
+ { "flac", 0, 0, 0, 0, "FLAC" },
+ { "mad", 0, 0, 0, 0, "mad" },
+ { "vorbis", 0, 0, 0, 0, "vorbisfile vorbis ogg" },
+ { "theora", 0, 0, 0, 0, "theoradec" },
+ { "fluidsynth",0, 0, 0, 0, "fluidsynth" },
+ { "faad", 0, 0, 0, 0, "faad" }
+ };
+
+ for (unsigned int i = 0; i < sizeof(s_libraries) / sizeof(s_libraries[0]); i++) {
+ if (std::strcmp(feature, s_libraries[i].feature) == 0) {
+ return &s_libraries[i];
+ }
+ }
+
+ return 0;
+}
+
+void CMakeProvider::createWorkspace(const BuildSetup &setup) {
+ std::string filename = setup.outputDir + "/CMakeLists.txt";
+ std::ofstream workspace(filename.c_str());
+ if (!workspace)
+ error("Could not open \"" + filename + "\" for writing");
+
+ workspace << "cmake_minimum_required(VERSION 3.2)\n"
+ "project(" << setup.projectDescription << ")\n\n";
+
+ workspace << "# Define the engines and subengines\n";
+ writeEngines(setup, workspace);
+ writeSubEngines(setup, workspace);
+ workspace << "# Generate options for the engines\n";
+ writeEngineOptions(workspace);
+
+ workspace << "include_directories(${" << setup.projectDescription << "_SOURCE_DIR} ${" << setup.projectDescription << "_SOURCE_DIR}/engines\n"
+ "$ENV{"<<LIBS_DEFINE<<"}/include)\n\n";
+
+ workspace << "# Libraries and features\n";
+ writeFeatureLibSearch(workspace, setup.useSDL2 ? "sdl2" : "sdl");
+ for (FeatureList::const_iterator i = setup.features.begin(), end = setup.features.end(); i != end; ++i) {
+ if (!i->enable || featureExcluded(i->name)) continue;
+
+ writeFeatureLibSearch(workspace, i->name);
+ workspace << "add_definitions(-D" << i->define << ")\n";
+ }
+ workspace << "\n";
+
+ writeWarnings(workspace);
+ writeDefines(setup, workspace);
+ workspace << "# Generate definitions for the engines\n";
+ writeEngineDefinitions(workspace);
+
+ workspace << "# Generate \"engines/plugins_table.h\"\n";
+ writeGeneratePluginsTable(workspace);
+}
+
+void CMakeProvider::writeFeatureLibSearch(std::ofstream &workspace, const char *feature) const {
+ const Library *library = getLibraryFromFeature(feature);
+ if (library) {
+ if (library->module) {
+ workspace << "Include(" << library->module << ")\n";
+ }
+ if (library->package) {
+ workspace << "Find_Package(" << library->package << " REQUIRED)\n";
+ }
+ if (library->includesVar) {
+ workspace << "include_directories(${" << library->includesVar << "})\n";
+ }
+ }
+}
+
+void CMakeProvider::writeEngines(const BuildSetup &setup, std::ofstream &workspace) const {
+ workspace << "set(ENGINES";
+ for (EngineDescList::const_iterator i = setup.engines.begin(), end = setup.engines.end(); i != end; ++i) {
+ // We ignore all sub engines here because they require special handling.
+ if (!i->enable || isSubEngine(i->name, setup.engines)) {
+ continue;
+ }
+
+ std::string engineName;
+ std::transform(i->name.begin(), i->name.end(), std::back_inserter(engineName), toupper);
+
+ workspace << " " << engineName;
+ }
+ workspace << ")\n";
+}
+
+void CMakeProvider::writeSubEngines(const BuildSetup &setup, std::ofstream &workspace) const {
+ for (EngineDescList::const_iterator i = setup.engines.begin(), end = setup.engines.end(); i != end; ++i) {
+ // We ignore all sub engines here because they are handled in the inner loop
+ if (!i->enable || isSubEngine(i->name, setup.engines) || i->subEngines.empty()) {
+ continue;
+ }
+
+ std::string engineName;
+ std::transform(i->name.begin(), i->name.end(), std::back_inserter(engineName), toupper);
+
+ workspace << "set(SUB_ENGINES_" << engineName;
+ for (StringList::const_iterator j = i->subEngines.begin(), subEnd = i->subEngines.end(); j != subEnd; ++j) {
+ const EngineDesc &subEngine = findEngineDesc(*j, setup.engines);
+ if (!subEngine.enable) continue;
+
+ std::string subEngineName;
+ std::transform(j->begin(), j->end(), std::back_inserter(subEngineName), toupper);
+
+ workspace << " " << subEngineName;
+ }
+ workspace << ")\n";
+ }
+
+ workspace << "\n";
+}
+
+void CMakeProvider::createProjectFile(const std::string &name, const std::string &, const BuildSetup &setup, const std::string &moduleDir,
+ const StringList &includeList, const StringList &excludeList) {
+
+ const std::string projectFile = setup.outputDir + "/CMakeLists.txt";
+ std::ofstream project(projectFile.c_str(), std::ofstream::out | std::ofstream::app);
+ if (!project)
+ error("Could not open \"" + projectFile + "\" for writing");
+
+ if (name == setup.projectName) {
+ project << "add_executable(" << name << "\n";
+ } else {
+ std::string engineName;
+ std::transform(name.begin(), name.end(), std::back_inserter(engineName), toupper);
+
+ project << "if (ENABLE_" << engineName << ")\n";
+ project << "add_library(" << name << "\n";
+ }
+
+ std::string modulePath;
+ if (!moduleDir.compare(0, setup.srcDir.size(), setup.srcDir)) {
+ modulePath = moduleDir.substr(setup.srcDir.size());
+ if (!modulePath.empty() && modulePath.at(0) == '/')
+ modulePath.erase(0, 1);
+ }
+
+ if (modulePath.size())
+ addFilesToProject(moduleDir, project, includeList, excludeList, setup.filePrefix + '/' + modulePath);
+ else
+ addFilesToProject(moduleDir, project, includeList, excludeList, setup.filePrefix);
+
+
+ project << ")\n";
+ if (name != setup.projectName) {
+ project << "endif()\n";
+ }
+
+ project << "# Libraries\n";
+ if (name == setup.projectName) {
+ const Library *sdlLibrary = getLibraryFromFeature(setup.useSDL2 ? "sdl2" : "sdl");
+ project << "target_link_libraries(" << name << " ${" << sdlLibrary->librariesVar << "})\n";
+
+ for (FeatureList::const_iterator i = setup.features.begin(), end = setup.features.end(); i != end; ++i) {
+ if (!i->enable || featureExcluded(i->name)) continue;
+
+ const Library *library = getLibraryFromFeature(i->name);
+ if (!library) continue;
+
+ if (library->librariesVar) {
+ project << "target_link_libraries(" << name << " ${" << library->librariesVar << "})\n";
+ } else {
+ project << "target_link_libraries(" << name << " " << library->libraries << ")\n";
+ }
+ }
+ project << "if (WIN32)\n";
+ project << " target_sources(" << name << " PUBLIC dists/" << name << ".rc)\n";
+ project << " target_link_libraries(" << name << " winmm)\n";
+ project << "endif()\n";
+ project << "\n";
+
+ project << "# Engines libraries handling\n";
+ writeEnginesLibrariesHandling(setup, project);
+
+ project << "set_property(TARGET " << name << " PROPERTY CXX_STANDARD 11)\n";
+ project << "set_property(TARGET " << name << " PROPERTY CXX_STANDARD_REQUIRED ON)\n";
+ }
+}
+
+void CMakeProvider::writeWarnings(std::ofstream &output) const {
+ output << "SET (CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS}";
+ for (StringList::const_iterator i = _globalWarnings.begin(); i != _globalWarnings.end(); ++i) {
+ output << " " << *i;
+ }
+ output << "\")\n";
+}
+
+void CMakeProvider::writeDefines(const BuildSetup &setup, std::ofstream &output) const {
+ output << "if (WIN32)\n";
+ output << " add_definitions(-DWIN32)\n";
+ output << "else()\n";
+ output << " add_definitions(-DPOSIX)\n";
+ output << "endif()\n";
+
+ output << "if (CMAKE_SIZEOF_VOID_P MATCHES 8)\n";
+ output << " add_definitions(-DSCUMM_64BITS)\n";
+ output << "endif()\n";
+
+ output << "add_definitions(-DSDL_BACKEND)\n\n";
+}
+
+void CMakeProvider::writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int indentation,
+ const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix) {
+
+ for (FileNode::NodeList::const_iterator i = dir.children.begin(); i != dir.children.end(); ++i) {
+ const FileNode *node = *i;
+
+ if (!node->children.empty()) {
+ writeFileListToProject(*node, projectFile, indentation + 1, duplicate, objPrefix + node->name + '_', filePrefix + node->name + '/');
+ } else {
+ std::string name, ext;
+ splitFilename(node->name, name, ext);
+ projectFile << "\t" << filePrefix + node->name << "\n";
+ }
+ }
+}
+
+const char *CMakeProvider::getProjectExtension() {
+ return ".txt";
+}
+
+void CMakeProvider::writeEngineOptions(std::ofstream &workspace) const {
+ workspace << "foreach(ENGINE IN LISTS ENGINES)\n";
+ workspace << " OPTION(ENABLE_${ENGINE} \"Enable ${ENGINE}\" ON)\n";
+ workspace << "endforeach(ENGINE)\n\n";
+}
+
+void CMakeProvider::writeGeneratePluginsTable(std::ofstream &workspace) const {
+ workspace << "file(REMOVE \"engines/plugins_table.h\")\n";
+ workspace << "file(APPEND \"engines/plugins_table.h\" \"/* This file is automatically generated by CMake */\\n\")\n";
+ workspace << "foreach(ENGINE IN LISTS ENGINES)\n";
+ workspace << " if (ENABLE_${ENGINE})\n";
+ workspace << " file(APPEND \"engines/plugins_table.h\" \"#if PLUGIN_ENABLED_STATIC(${ENGINE})\\n\")\n";
+ workspace << " file(APPEND \"engines/plugins_table.h\" \"LINK_PLUGIN(${ENGINE})\\n\")\n";
+ workspace << " file(APPEND \"engines/plugins_table.h\" \"#endif\\n\")\n";
+ workspace << " endif()\n";
+ workspace << "endforeach()\n\n";
+}
+
+void CMakeProvider::writeEnginesLibrariesHandling(const BuildSetup &setup, std::ofstream &workspace) const {
+ workspace << "foreach(ENGINE IN LISTS ENGINES)\n";
+ workspace << " if (ENABLE_${ENGINE})\n";
+ workspace << " string(TOLOWER ${ENGINE} ENGINE_LIB)\n\n";
+ workspace << " # Enable C++11\n";
+ workspace << " set_property(TARGET ${ENGINE_LIB} PROPERTY CXX_STANDARD 11)\n";
+ workspace << " set_property(TARGET ${ENGINE_LIB} PROPERTY CXX_STANDARD_REQUIRED ON)\n\n";
+ workspace << " # Link against the engine\n";
+ workspace << " target_link_libraries("<< setup.projectName <<" ${ENGINE_LIB})\n";
+ workspace << " endif()\n";
+ workspace << "endforeach()\n\n";
+}
+
+void CMakeProvider::writeEngineDefinitions(std::ofstream &workspace) const {
+ workspace << "foreach(ENGINE IN LISTS ENGINES)\n";
+ workspace << " if (ENABLE_${ENGINE})\n";
+ workspace << " add_definitions(-DENABLE_${ENGINE})\n";
+ workspace << " foreach(SUB_ENGINE IN LISTS SUB_ENGINES_${ENGINE})\n";
+ workspace << " add_definitions(-DENABLE_${SUB_ENGINE})\n";;
+ workspace << " endforeach(SUB_ENGINE)\n";
+ workspace << " endif()\n";
+ workspace << "endforeach()\n\n";
+}
+
+bool CMakeProvider::featureExcluded(const char *name) const {
+ return std::strcmp(name, "nasm") == 0 ||
+ std::strcmp(name, "updates") == 0 ; // NASM is not supported for now
+}
+
+const EngineDesc &CMakeProvider::findEngineDesc(const std::string &name, const EngineDescList &engines) const {
+ for (EngineDescList::const_iterator i = engines.begin(), end = engines.end(); i != end; ++i) {
+ if (i->name == name) {
+ return *i;
+ }
+
+ }
+
+ error("Unable to find requested engine");
+}
+
+} // End of CreateProjectTool namespace
diff --git a/devtools/create_project/cmake.h b/devtools/create_project/cmake.h
new file mode 100644
index 0000000000..ec7ff565c9
--- /dev/null
+++ b/devtools/create_project/cmake.h
@@ -0,0 +1,85 @@
+/* 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 TOOLS_CREATE_PROJECT_CMAKE_H
+#define TOOLS_CREATE_PROJECT_CMAKE_H
+
+#include "create_project.h"
+
+namespace CreateProjectTool {
+
+/**
+ * A ProjectProvider used to generate CMake project descriptions
+ *
+ * Generated CMake projects are minimal, and will only work with GCC.
+ */
+class CMakeProvider : public ProjectProvider {
+public:
+ CMakeProvider(StringList &global_warnings, std::map<std::string, StringList> &project_warnings, const int version = 0);
+
+protected:
+
+ void createWorkspace(const BuildSetup &setup);
+
+ void createOtherBuildFiles(const BuildSetup &) {}
+
+ void addResourceFiles(const BuildSetup &setup, StringList &includeList, StringList &excludeList) {}
+
+ void createProjectFile(const std::string &name, const std::string &uuid, const BuildSetup &setup, const std::string &moduleDir,
+ const StringList &includeList, const StringList &excludeList);
+
+ void writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int indentation,
+ const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix);
+
+ const char *getProjectExtension();
+
+private:
+ /**
+ * CMake properties for a library required by a feature
+ */
+ struct Library {
+ const char *feature;
+ const char *module;
+ const char *package;
+ const char *includesVar;
+ const char *librariesVar;
+ const char *libraries;
+ };
+
+ const Library *getLibraryFromFeature(const char *feature) const;
+
+ void writeWarnings(std::ofstream &output) const;
+ void writeDefines(const BuildSetup &setup, std::ofstream &output) const;
+ void writeEngines(const BuildSetup &setup, std::ofstream &workspace) const;
+ void writeSubEngines(const BuildSetup &setup, std::ofstream &workspace) const;
+ void writeEngineOptions(std::ofstream &workspace) const;
+ void writeGeneratePluginsTable(std::ofstream &workspace) const;
+ void writeEnginesLibrariesHandling(const BuildSetup &setup, std::ofstream &workspace) const;
+ void writeEngineDefinitions(std::ofstream &workspace) const;
+ void writeFeatureLibSearch(std::ofstream &workspace, const char *feature) const;
+ bool featureExcluded(const char *name) const;
+ const EngineDesc &findEngineDesc(const std::string &name, const EngineDescList &engines) const;
+};
+
+} // End of CreateProjectTool namespace
+
+#endif // TOOLS_CREATE_PROJECT_CMAKE_H
diff --git a/devtools/create_project/cmake/CMakeLists.txt b/devtools/create_project/cmake/CMakeLists.txt
new file mode 100644
index 0000000000..2646b89d2d
--- /dev/null
+++ b/devtools/create_project/cmake/CMakeLists.txt
@@ -0,0 +1,23 @@
+cmake_minimum_required(VERSION 3.2)
+project(create_project)
+
+
+set(SOURCE_FILES
+ ../cmake.cpp
+ ../cmake.h
+ ../codeblocks.cpp
+ ../codeblocks.h
+ ../create_project.cpp
+ ../create_project.h
+ ../msbuild.cpp
+ ../msbuild.h
+ ../msvc.cpp
+ ../msvc.h
+ ../visualstudio.cpp
+ ../visualstudio.h
+ ../xcode.cpp
+ ../xcode.h
+ )
+
+add_executable(create_project ${SOURCE_FILES})
+
diff --git a/devtools/create_project/create_project.cpp b/devtools/create_project/create_project.cpp
index 7e39fa829a..7e2cad0901 100644
--- a/devtools/create_project/create_project.cpp
+++ b/devtools/create_project/create_project.cpp
@@ -31,6 +31,7 @@
#include "config.h"
#include "create_project.h"
+#include "cmake.h"
#include "codeblocks.h"
#include "msvc.h"
#include "visualstudio.h"
@@ -53,7 +54,7 @@
#define USE_WIN32_API
#endif
-#ifdef USE_WIN32_API
+#if (defined(_WIN32) || defined(WIN32))
#include <windows.h>
#else
#include <sstream>
@@ -83,10 +84,18 @@ std::string unifyPath(const std::string &path);
* @param exe Name of the executable.
*/
void displayHelp(const char *exe);
+
+/**
+ * Build a list of options to enable or disable GCC warnings
+ *
+ * @param globalWarnings Resulting list of warnings
+ */
+void addGCCWarnings(StringList &globalWarnings);
} // End of anonymous namespace
enum ProjectType {
kProjectNone,
+ kProjectCMake,
kProjectCodeBlocks,
kProjectMSVC,
kProjectXcode
@@ -141,6 +150,14 @@ int main(int argc, char *argv[]) {
return 0;
+ } else if (!std::strcmp(argv[i], "--cmake")) {
+ if (projectType != kProjectNone) {
+ std::cerr << "ERROR: You cannot pass more than one project type!\n";
+ return -1;
+ }
+
+ projectType = kProjectCMake;
+
} else if (!std::strcmp(argv[i], "--codeblocks")) {
if (projectType != kProjectNone) {
std::cerr << "ERROR: You cannot pass more than one project type!\n";
@@ -334,10 +351,7 @@ int main(int argc, char *argv[]) {
StringList featureDefines = getFeatureDefines(setup.features);
setup.defines.splice(setup.defines.begin(), featureDefines);
- // Windows only has support for the SDL backend, so we hardcode it here (along with winmm)
- if (projectType != kProjectXcode) {
- setup.defines.push_back("WIN32");
- } else {
+ if (projectType == kProjectXcode) {
setup.defines.push_back("POSIX");
// Define both MACOSX, and IPHONE, but only one of them will be associated to the
// correct target by the Xcode project provider.
@@ -346,6 +360,17 @@ int main(int argc, char *argv[]) {
// the files, according to the target.
setup.defines.push_back("MACOSX");
setup.defines.push_back("IPHONE");
+ } else if (projectType == kProjectMSVC || projectType == kProjectCodeBlocks) {
+ // Windows only has support for the SDL backend, so we hardcode it here (along with winmm)
+ setup.defines.push_back("WIN32");
+ } else {
+ // As a last resort, select the backend files to build based on the platform used to build create_project.
+ // This is broken when cross compiling.
+#if defined(_WIN32) || defined(WIN32)
+ setup.defines.push_back("WIN32");
+#else
+ setup.defines.push_back("POSIX");
+#endif
}
bool updatesEnabled = false;
@@ -397,49 +422,25 @@ int main(int argc, char *argv[]) {
std::cerr << "ERROR: No project type has been specified!\n";
return -1;
+ case kProjectCMake:
+ if (setup.devTools || setup.tests) {
+ std::cerr << "ERROR: Building tools or tests is not supported for the CMake project type!\n";
+ return -1;
+ }
+
+ addGCCWarnings(globalWarnings);
+
+ provider = new CreateProjectTool::CMakeProvider(globalWarnings, projectWarnings);
+
+ break;
+
case kProjectCodeBlocks:
if (setup.devTools || setup.tests) {
std::cerr << "ERROR: Building tools or tests is not supported for the CodeBlocks project type!\n";
return -1;
}
- ////////////////////////////////////////////////////////////////////////////
- // Code::Blocks is using GCC behind the scenes, so we need to pass a list
- // of options to enable or disable warnings
- ////////////////////////////////////////////////////////////////////////////
- //
- // -Wall
- // enable all warnings
- //
- // -Wno-long-long -Wno-multichar -Wno-unknown-pragmas -Wno-reorder
- // disable annoying and not-so-useful warnings
- //
- // -Wpointer-arith -Wcast-qual -Wcast-align
- // -Wshadow -Wimplicit -Wnon-virtual-dtor -Wwrite-strings
- // enable even more warnings...
- //
- // -fno-rtti -fno-exceptions -fcheck-new
- // disable RTTI and exceptions, and enable checking of pointers returned
- // by "new"
- //
- ////////////////////////////////////////////////////////////////////////////
-
- globalWarnings.push_back("-Wall");
- globalWarnings.push_back("-Wno-long-long");
- globalWarnings.push_back("-Wno-multichar");
- globalWarnings.push_back("-Wno-unknown-pragmas");
- globalWarnings.push_back("-Wno-reorder");
- globalWarnings.push_back("-Wpointer-arith");
- globalWarnings.push_back("-Wcast-qual");
- globalWarnings.push_back("-Wcast-align");
- globalWarnings.push_back("-Wshadow");
- globalWarnings.push_back("-Wimplicit");
- globalWarnings.push_back("-Wnon-virtual-dtor");
- globalWarnings.push_back("-Wwrite-strings");
- // The following are not warnings at all... We should consider adding them to
- // a different list of parameters.
- globalWarnings.push_back("-fno-exceptions");
- globalWarnings.push_back("-fcheck-new");
+ addGCCWarnings(globalWarnings);
provider = new CreateProjectTool::CodeBlocksProvider(globalWarnings, projectWarnings);
@@ -653,6 +654,7 @@ void displayHelp(const char *exe) {
" Additionally there are the following switches for changing various settings:\n"
"\n"
"Project specific settings:\n"
+ " --cmake build CMake project files\n"
" --codeblocks build Code::Blocks project files\n"
" --msvc build Visual Studio project files\n"
" --xcode build XCode project files\n"
@@ -707,6 +709,41 @@ void displayHelp(const char *exe) {
cout.setf(std::ios_base::right, std::ios_base::adjustfield);
}
+void addGCCWarnings(StringList &globalWarnings) {
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // -Wall
+ // enable all warnings
+ //
+ // -Wno-long-long -Wno-multichar -Wno-unknown-pragmas -Wno-reorder
+ // disable annoying and not-so-useful warnings
+ //
+ // -Wpointer-arith -Wcast-qual -Wcast-align
+ // -Wshadow -Wimplicit -Wnon-virtual-dtor -Wwrite-strings
+ // enable even more warnings...
+ //
+ // -fno-exceptions -fcheck-new
+ // disable exceptions, and enable checking of pointers returned by "new"
+ //
+ ////////////////////////////////////////////////////////////////////////////
+
+ globalWarnings.push_back("-Wall");
+ globalWarnings.push_back("-Wno-long-long");
+ globalWarnings.push_back("-Wno-multichar");
+ globalWarnings.push_back("-Wno-unknown-pragmas");
+ globalWarnings.push_back("-Wno-reorder");
+ globalWarnings.push_back("-Wpointer-arith");
+ globalWarnings.push_back("-Wcast-qual");
+ globalWarnings.push_back("-Wcast-align");
+ globalWarnings.push_back("-Wshadow");
+ globalWarnings.push_back("-Wnon-virtual-dtor");
+ globalWarnings.push_back("-Wwrite-strings");
+ // The following are not warnings at all... We should consider adding them to
+ // a different list of parameters.
+ globalWarnings.push_back("-fno-exceptions");
+ globalWarnings.push_back("-fcheck-new");
+}
+
/**
* Parse the configure.engine file of a given engine directory and return a
* list of all defined engines.
@@ -1175,7 +1212,7 @@ bool compareNodes(const FileNode *l, const FileNode *r) {
FileList listDirectory(const std::string &dir) {
FileList result;
-#ifdef USE_WIN32_API
+#if defined(_WIN32) || defined(WIN32)
WIN32_FIND_DATA fileInformation;
HANDLE fileHandle = FindFirstFile((dir + "/*").c_str(), &fileInformation);
diff --git a/devtools/create_project/module.mk b/devtools/create_project/module.mk
index 0db070fa7c..bb7bdcc9b0 100644
--- a/devtools/create_project/module.mk
+++ b/devtools/create_project/module.mk
@@ -2,6 +2,7 @@
MODULE := devtools/create_project
MODULE_OBJS := \
+ cmake.o \
create_project.o \
codeblocks.o \
msvc.o \
diff --git a/devtools/create_project/msvc10/create_project.vcxproj b/devtools/create_project/msvc10/create_project.vcxproj
index 80dfd5e8d3..700c4bb283 100644
--- a/devtools/create_project/msvc10/create_project.vcxproj
+++ b/devtools/create_project/msvc10/create_project.vcxproj
@@ -95,6 +95,7 @@ xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\iphone\"</Command>
</PreBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
+ <ClCompile Include="..\cmake.cpp" />
<ClCompile Include="..\codeblocks.cpp" />
<ClCompile Include="..\create_project.cpp" />
<ClCompile Include="..\msbuild.cpp" />
@@ -103,6 +104,7 @@ xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\iphone\"</Command>
<ClCompile Include="..\xcode.cpp" />
</ItemGroup>
<ItemGroup>
+ <ClInclude Include="..\cmake.h" />
<ClInclude Include="..\codeblocks.h" />
<ClInclude Include="..\config.h" />
<ClInclude Include="..\create_project.h" />
diff --git a/devtools/create_project/msvc11/create_project.vcxproj b/devtools/create_project/msvc11/create_project.vcxproj
index 8bbd25e9ba..09392a43e3 100644
--- a/devtools/create_project/msvc11/create_project.vcxproj
+++ b/devtools/create_project/msvc11/create_project.vcxproj
@@ -101,6 +101,7 @@ xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\iphone\"</Command>
</PreBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
+ <ClCompile Include="..\cmake.cpp" />
<ClCompile Include="..\codeblocks.cpp" />
<ClCompile Include="..\create_project.cpp" />
<ClCompile Include="..\msbuild.cpp" />
@@ -109,6 +110,7 @@ xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\iphone\"</Command>
<ClCompile Include="..\xcode.cpp" />
</ItemGroup>
<ItemGroup>
+ <ClInclude Include="..\cmake.h" />
<ClInclude Include="..\codeblocks.h" />
<ClInclude Include="..\config.h" />
<ClInclude Include="..\create_project.h" />
diff --git a/devtools/create_project/msvc12/create_project.vcxproj b/devtools/create_project/msvc12/create_project.vcxproj
index 6da1556547..3b38972e51 100644
--- a/devtools/create_project/msvc12/create_project.vcxproj
+++ b/devtools/create_project/msvc12/create_project.vcxproj
@@ -102,6 +102,7 @@ xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\iphone\"</Command>
</PreBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
+ <ClCompile Include="..\cmake.cpp" />
<ClCompile Include="..\codeblocks.cpp" />
<ClCompile Include="..\create_project.cpp" />
<ClCompile Include="..\msbuild.cpp" />
@@ -110,6 +111,7 @@ xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\iphone\"</Command>
<ClCompile Include="..\xcode.cpp" />
</ItemGroup>
<ItemGroup>
+ <ClInclude Include="..\cmake.h" />
<ClInclude Include="..\codeblocks.h" />
<ClInclude Include="..\config.h" />
<ClInclude Include="..\create_project.h" />
diff --git a/devtools/create_project/msvc14/create_project.vcxproj b/devtools/create_project/msvc14/create_project.vcxproj
index 3c0345f49c..839c834bb8 100644
--- a/devtools/create_project/msvc14/create_project.vcxproj
+++ b/devtools/create_project/msvc14/create_project.vcxproj
@@ -192,6 +192,7 @@ xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\iphone\"</Command>
</PreBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
+ <ClCompile Include="..\cmake.cpp" />
<ClCompile Include="..\codeblocks.cpp" />
<ClCompile Include="..\create_project.cpp" />
<ClCompile Include="..\msbuild.cpp" />
@@ -200,6 +201,7 @@ xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\iphone\"</Command>
<ClCompile Include="..\xcode.cpp" />
</ItemGroup>
<ItemGroup>
+ <ClInclude Include="..\cmake.h" />
<ClInclude Include="..\codeblocks.h" />
<ClInclude Include="..\config.h" />
<ClInclude Include="..\create_project.h" />
diff --git a/devtools/create_project/msvc9/create_project.vcproj b/devtools/create_project/msvc9/create_project.vcproj
index dc914248fb..eaa72099cc 100644
--- a/devtools/create_project/msvc9/create_project.vcproj
+++ b/devtools/create_project/msvc9/create_project.vcproj
@@ -170,6 +170,10 @@
>
</File>
<File
+ RelativePath="..\cmake.cpp"
+ >
+ </File>
+ <File
RelativePath="..\codeblocks.cpp"
>
</File>
@@ -200,6 +204,10 @@
>
</File>
<File
+ RelativePath="..\cmake.h"
+ >
+ </File>
+ <File
RelativePath="..\codeblocks.h"
>
</File>
diff --git a/devtools/credits.pl b/devtools/credits.pl
index 33e9c82830..9cc5ad4227 100755
--- a/devtools/credits.pl
+++ b/devtools/credits.pl
@@ -604,6 +604,7 @@ begin_credits("Credits");
begin_section("Drascula");
add_person("Filippos Karapetis", "[md5]", "");
add_person("Pawe&#322; Ko&#322;odziejski", "aquadran", "");
+ add_person("Thierry Crozat", "criezy", "");
end_section();
begin_section("DreamWeb");
diff --git a/devtools/skycpt/COMPACT.TXT b/devtools/skycpt/COMPACT.TXT
index af22e129cf..4f8f5b97d9 100644
--- a/devtools/skycpt/COMPACT.TXT
+++ b/devtools/skycpt/COMPACT.TXT
@@ -2741,7 +2741,7 @@ SECTION::MAINLISTS
0000::NULL
40E6::sc38_phone_talk
40F4::sc32_garden_talk
- 40DF::sc31_guard_talk
+ 40DF::sc31_guard_talk2
4145::barman_talk
4168::sc36_col_talk2
4169::sc36_gal_talk
diff --git a/dists/engine-data/sky.cpt b/dists/engine-data/sky.cpt
index 24c2f03832..cc552105e6 100644
--- a/dists/engine-data/sky.cpt
+++ b/dists/engine-data/sky.cpt
Binary files differ
diff --git a/engines/agos/subroutine.cpp b/engines/agos/subroutine.cpp
index 0f6c767300..2aedfa26fa 100644
--- a/engines/agos/subroutine.cpp
+++ b/engines/agos/subroutine.cpp
@@ -564,7 +564,7 @@ restart:
else
_codePtr += 8;
- debugC(kDebugOpcode, "; %d", sub->id);
+ debugC(kDebugOpcode, "; %d", sub->id);
result = runScript();
if (result != 0) {
break;
diff --git a/engines/drascula/animation.cpp b/engines/drascula/animation.cpp
index f672ad3b55..8b3299aaa9 100644
--- a/engines/drascula/animation.cpp
+++ b/engines/drascula/animation.cpp
@@ -116,7 +116,7 @@ void DrasculaEngine::animation_1_1() {
if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
break;
- for (int l2 = 0; l2 < 3; l2++)
+ for (int l2 = 0; l2 < 3; l2++) {
for (int l = 0; l < 7; l++) {
copyBackground();
copyBackground(interf_x[l], interf_y[l], 156, 45, 63, 31, drawSurface2, screenSurface);
@@ -129,6 +129,9 @@ void DrasculaEngine::animation_1_1() {
}
if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
break;
+ }
+ if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
+ break;
for (int l = 0, l2 = 0, p = 0; l < 180; l++) {
copyBackground(0, 0, 320 - l, 0, l, 200, drawSurface3, screenSurface);
diff --git a/engines/fullpipe/behavior.cpp b/engines/fullpipe/behavior.cpp
index 14e9c33bdf..c90b2b07da 100644
--- a/engines/fullpipe/behavior.cpp
+++ b/engines/fullpipe/behavior.cpp
@@ -40,8 +40,8 @@ BehaviorManager::~BehaviorManager() {
void BehaviorManager::clear() {
for (uint i = 0; i < _behaviors.size(); i++) {
- for (int j = 0; j < _behaviors[i]->_itemsCount; j++)
- delete _behaviors[i]->_bheItems[j];
+ for (int j = 0; j < _behaviors[i]->_animsCount; j++)
+ delete _behaviors[i]->_behaviorAnims[j];
delete _behaviors[i];
}
@@ -90,7 +90,7 @@ void BehaviorManager::updateBehaviors() {
if (!beh->_ani) {
beh->_counter++;
if (beh->_counter >= beh->_counterMax)
- updateBehavior(beh, beh->_bheItems[0]);
+ updateBehavior(beh, beh->_behaviorAnims[0]);
continue;
}
@@ -104,15 +104,15 @@ void BehaviorManager::updateBehaviors() {
beh->_counter++;
if (beh->_counter >= beh->_counterMax) {
if (beh->_subIndex >= 0 && !(beh->_flags & 1) && beh->_ani->_messageQueueId <= 0)
- updateStaticAniBehavior(beh->_ani, beh->_counter, beh->_bheItems[beh->_subIndex]);
+ updateStaticAniBehavior(beh->_ani, beh->_counter, beh->_behaviorAnims[beh->_subIndex]);
}
} else {
beh->_staticsId = beh->_ani->_statics->_staticsId;
beh->_counter = 0;
beh->_subIndex = -1;
- for (int j = 0; j < beh->_itemsCount; j++)
- if (beh->_bheItems[j]->_staticsId == beh->_staticsId) {
+ for (int j = 0; j < beh->_animsCount; j++)
+ if (beh->_behaviorAnims[j]->_staticsId == beh->_staticsId) {
beh->_subIndex = j;
break;
}
@@ -121,10 +121,10 @@ void BehaviorManager::updateBehaviors() {
}
}
-void BehaviorManager::updateBehavior(BehaviorInfo *behaviorInfo, BehaviorEntry *entry) {
- debug(4, "BehaviorManager::updateBehavior() %d", entry->_itemsCount);
- for (int i = 0; i < entry->_itemsCount; i++) {
- BehaviorEntryInfo *bhi = entry->_items[i];
+void BehaviorManager::updateBehavior(BehaviorInfo *behaviorInfo, BehaviorAnim *entry) {
+ debug(4, "BehaviorManager::updateBehavior() %d", entry->_movesCount);
+ for (int i = 0; i < entry->_movesCount; i++) {
+ BehaviorMove *bhi = entry->_behaviorMoves[i];
if (!(bhi->_flags & 1)) {
if (bhi->_flags & 2) {
MessageQueue *mq = new MessageQueue(bhi->_messageQueue, 0, 1);
@@ -132,7 +132,7 @@ void BehaviorManager::updateBehavior(BehaviorInfo *behaviorInfo, BehaviorEntry *
mq->sendNextCommand();
bhi->_flags &= 0xFFFFFFFD;
- } else if (behaviorInfo->_counter >= bhi->_delay && bhi->_percent && g_fp->_rnd->getRandomNumber(32767) <= entry->_items[i]->_percent) {
+ } else if (behaviorInfo->_counter >= bhi->_delay && bhi->_percent && g_fp->_rnd->getRandomNumber(32767) <= entry->_behaviorMoves[i]->_percent) {
MessageQueue *mq = new MessageQueue(bhi->_messageQueue, 0, 1);
mq->sendNextCommand();
@@ -143,7 +143,7 @@ void BehaviorManager::updateBehavior(BehaviorInfo *behaviorInfo, BehaviorEntry *
}
}
-void BehaviorManager::updateStaticAniBehavior(StaticANIObject *ani, int delay, BehaviorEntry *bhe) {
+void BehaviorManager::updateStaticAniBehavior(StaticANIObject *ani, int delay, BehaviorAnim *bhe) {
debug(4, "BehaviorManager::updateStaticAniBehavior(%s)", transCyrillic((byte *)ani->_objectName));
MessageQueue *mq = 0;
@@ -151,21 +151,21 @@ void BehaviorManager::updateStaticAniBehavior(StaticANIObject *ani, int delay, B
if (bhe->_flags & 1) {
uint rnd = g_fp->_rnd->getRandomNumber(32767);
uint runPercent = 0;
- for (int i = 0; i < bhe->_itemsCount; i++) {
- if (!(bhe->_items[i]->_flags & 1) && bhe->_items[i]->_percent) {
- if ((rnd >= runPercent && rnd <= runPercent + bhe->_items[i]->_percent) || i == bhe->_itemsCount - 1) {
- mq = new MessageQueue(bhe->_items[i]->_messageQueue, 0, 1);
+ for (int i = 0; i < bhe->_movesCount; i++) {
+ if (!(bhe->_behaviorMoves[i]->_flags & 1) && bhe->_behaviorMoves[i]->_percent) {
+ if ((rnd >= runPercent && rnd <= runPercent + bhe->_behaviorMoves[i]->_percent) || i == bhe->_movesCount - 1) {
+ mq = new MessageQueue(bhe->_behaviorMoves[i]->_messageQueue, 0, 1);
break;
}
- runPercent += bhe->_items[i]->_percent;
+ runPercent += bhe->_behaviorMoves[i]->_percent;
}
}
} else {
- for (int i = 0; i < bhe->_itemsCount; i++) {
- if (!(bhe->_items[i]->_flags & 1) && delay >= bhe->_items[i]->_delay) {
- if (bhe->_items[i]->_percent) {
- if (g_fp->_rnd->getRandomNumber(32767) <= bhe->_items[i]->_percent) {
- mq = new MessageQueue(bhe->_items[i]->_messageQueue, 0, 1);
+ for (int i = 0; i < bhe->_movesCount; i++) {
+ if (!(bhe->_behaviorMoves[i]->_flags & 1) && delay >= bhe->_behaviorMoves[i]->_delay) {
+ if (bhe->_behaviorMoves[i]->_percent) {
+ if (g_fp->_rnd->getRandomNumber(32767) <= bhe->_behaviorMoves[i]->_percent) {
+ mq = new MessageQueue(bhe->_behaviorMoves[i]->_messageQueue, 0, 1);
break;
}
}
@@ -180,7 +180,7 @@ void BehaviorManager::updateStaticAniBehavior(StaticANIObject *ani, int delay, B
}
bool BehaviorManager::setBehaviorEnabled(StaticANIObject *obj, int aniId, int quId, int flag) {
- BehaviorEntryInfo *entry = getBehaviorEntryInfoByMessageQueueDataId(obj, aniId, quId);
+ BehaviorMove *entry = getBehaviorMoveByMessageQueueDataId(obj, aniId, quId);
if (entry) {
if (flag)
@@ -206,14 +206,14 @@ void BehaviorManager::setFlagByStaticAniObject(StaticANIObject *ani, int flag) {
}
}
-BehaviorEntryInfo *BehaviorManager::getBehaviorEntryInfoByMessageQueueDataId(StaticANIObject *ani, int id1, int id2) {
+BehaviorMove *BehaviorManager::getBehaviorMoveByMessageQueueDataId(StaticANIObject *ani, int id1, int id2) {
for (uint i = 0; i < _behaviors.size(); i++) {
if (_behaviors[i]->_ani == ani) {
- for (uint j = 0; j < _behaviors[i]->_bheItems.size(); j++) {
- if (_behaviors[i]->_bheItems[j]->_staticsId == id1) {
- for (int k = 0; k < _behaviors[i]->_bheItems[j]->_itemsCount; k++) {
- if (_behaviors[i]->_bheItems[j]->_items[k]->_messageQueue->_dataId == id2)
- return _behaviors[i]->_bheItems[j]->_items[k];
+ for (uint j = 0; j < _behaviors[i]->_behaviorAnims.size(); j++) {
+ if (_behaviors[i]->_behaviorAnims[j]->_staticsId == id1) {
+ for (int k = 0; k < _behaviors[i]->_behaviorAnims[j]->_movesCount; k++) {
+ if (_behaviors[i]->_behaviorAnims[j]->_behaviorMoves[k]->_messageQueue->_dataId == id2)
+ return _behaviors[i]->_behaviorAnims[j]->_behaviorMoves[k];
}
}
}
@@ -230,32 +230,32 @@ void BehaviorInfo::clear() {
_counterMax = 0;
_flags = 0;
_subIndex = 0;
- _itemsCount = 0;
+ _animsCount = 0;
- _bheItems.clear();
+ _behaviorAnims.clear();
}
void BehaviorInfo::initAmbientBehavior(GameVar *var, Scene *sc) {
debug(4, "BehaviorInfo::initAmbientBehavior(%s)", transCyrillic((byte *)var->_varName));
clear();
- _itemsCount = 1;
+ _animsCount = 1;
_counterMax = -1;
- BehaviorEntry *bi = new BehaviorEntry();
+ BehaviorAnim *bi = new BehaviorAnim();
- _bheItems.push_back(bi);
+ _behaviorAnims.push_back(bi);
- bi->_itemsCount = var->getSubVarsCount();
+ bi->_movesCount = var->getSubVarsCount();
- bi->_items = (BehaviorEntryInfo**)calloc(bi->_itemsCount, sizeof(BehaviorEntryInfo *));
+ bi->_behaviorMoves = (BehaviorMove **)calloc(bi->_movesCount, sizeof(BehaviorMove *));
- for (int i = 0; i < bi->_itemsCount; i++) {
+ for (int i = 0; i < bi->_movesCount; i++) {
int delay;
- bi->_items[i] = new BehaviorEntryInfo(var->getSubVarByIndex(i), sc, &delay);
+ bi->_behaviorMoves[i] = new BehaviorMove(var->getSubVarByIndex(i), sc, &delay);
- if (bi->_items[i]->_delay <_counterMax)
- _counterMax = bi->_items[i]->_delay;
+ if (bi->_behaviorMoves[i]->_delay <_counterMax)
+ _counterMax = bi->_behaviorMoves[i]->_delay;
}
}
@@ -264,7 +264,7 @@ void BehaviorInfo::initObjectBehavior(GameVar *var, Scene *sc, StaticANIObject *
clear();
- _itemsCount = var->getSubVarsCount();
+ _animsCount = var->getSubVarsCount();
_counterMax = -1;
while (var->_varType == 2) {
@@ -278,54 +278,54 @@ void BehaviorInfo::initObjectBehavior(GameVar *var, Scene *sc, StaticANIObject *
sc = g_fp->accessScene(ani->_sceneId);
clear();
var = v1;
- _itemsCount = var->getSubVarsCount();
+ _animsCount = var->getSubVarsCount();
_counterMax = -1;
}
- for (int i = 0; i < _itemsCount; i++) {
+ for (int i = 0; i < _animsCount; i++) {
int maxDelay = 0;
- _bheItems.push_back(new BehaviorEntry(var->getSubVarByIndex(i), sc, ani, &maxDelay));
+ _behaviorAnims.push_back(new BehaviorAnim(var->getSubVarByIndex(i), sc, ani, &maxDelay));
if (maxDelay < _counterMax)
_counterMax = maxDelay;
}
}
-BehaviorEntry::BehaviorEntry() {
+BehaviorAnim::BehaviorAnim() {
_staticsId = 0;
- _itemsCount = 0;
+ _movesCount = 0;
_flags = 0;
- _items = 0;
+ _behaviorMoves = NULL;
}
-BehaviorEntry::BehaviorEntry(GameVar *var, Scene *sc, StaticANIObject *ani, int *minDelay) {
+BehaviorAnim::BehaviorAnim(GameVar *var, Scene *sc, StaticANIObject *ani, int *minDelay) {
_staticsId = 0;
- _itemsCount = 0;
+ _movesCount = 0;
*minDelay = 100000000;
int totalPercent = 0;
_flags = 0;
- _items = 0;
+ _behaviorMoves = 0;
Statics *st = ani->getStaticsByName(var->_varName);
if (st)
_staticsId = st->_staticsId;
- _itemsCount = var->getSubVarsCount();
- if (_itemsCount) {
- _items = (BehaviorEntryInfo**)calloc(_itemsCount, sizeof(BehaviorEntryInfo *));
+ _movesCount = var->getSubVarsCount();
+ if (_movesCount) {
+ _behaviorMoves = (BehaviorMove **)calloc(_movesCount, sizeof(BehaviorMove *));
- for (int i = 0; i < _itemsCount; i++) {
+ for (int i = 0; i < _movesCount; i++) {
GameVar *subvar = var->getSubVarByIndex(i);
int delay = 0;
- _items[i] = new BehaviorEntryInfo(subvar, sc, &delay);
+ _behaviorMoves[i] = new BehaviorMove(subvar, sc, &delay);
totalPercent += delay;
- if (_items[i]->_delay < *minDelay)
- *minDelay = _items[i]->_delay;
+ if (_behaviorMoves[i]->_delay < *minDelay)
+ *minDelay = _behaviorMoves[i]->_delay;
}
if (!*minDelay && totalPercent == 1000)
@@ -333,7 +333,7 @@ BehaviorEntry::BehaviorEntry(GameVar *var, Scene *sc, StaticANIObject *ani, int
}
}
-BehaviorEntryInfo::BehaviorEntryInfo(GameVar *subvar, Scene *sc, int *delay) {
+BehaviorMove::BehaviorMove(GameVar *subvar, Scene *sc, int *delay) {
_messageQueue = 0;
_delay = 0;
_percent = 0;
diff --git a/engines/fullpipe/behavior.h b/engines/fullpipe/behavior.h
index 1ec98d5bf2..e534371442 100644
--- a/engines/fullpipe/behavior.h
+++ b/engines/fullpipe/behavior.h
@@ -25,23 +25,23 @@
namespace Fullpipe {
-struct BehaviorEntryInfo {
+struct BehaviorMove {
MessageQueue *_messageQueue;
int _delay;
uint32 _percent;
int _flags;
- BehaviorEntryInfo(GameVar *subvar, Scene *sc, int *delay);
+ BehaviorMove(GameVar *subvar, Scene *sc, int *delay);
};
-struct BehaviorEntry {
+struct BehaviorAnim {
int _staticsId;
- int _itemsCount;
+ int _movesCount;
int _flags;
- BehaviorEntryInfo **_items;
+ BehaviorMove **_behaviorMoves;
- BehaviorEntry();
- BehaviorEntry(GameVar *var, Scene *sc, StaticANIObject *ani, int *minDelay);
+ BehaviorAnim();
+ BehaviorAnim(GameVar *var, Scene *sc, StaticANIObject *ani, int *minDelay);
};
struct BehaviorInfo {
@@ -51,8 +51,8 @@ struct BehaviorInfo {
int _counterMax;
int _flags;
int _subIndex;
- int _itemsCount;
- Common::Array<BehaviorEntry *> _bheItems;
+ int _animsCount;
+ Common::Array<BehaviorAnim *> _behaviorAnims;
BehaviorInfo() { clear(); }
@@ -75,14 +75,14 @@ class BehaviorManager : public CObject {
void initBehavior(Scene *scene, GameVar *var);
void updateBehaviors();
- void updateBehavior(BehaviorInfo *behaviorInfo, BehaviorEntry *entry);
- void updateStaticAniBehavior(StaticANIObject *ani, int delay, BehaviorEntry *beh);
+ void updateBehavior(BehaviorInfo *behaviorInfo, BehaviorAnim *entry);
+ void updateStaticAniBehavior(StaticANIObject *ani, int delay, BehaviorAnim *beh);
bool setBehaviorEnabled(StaticANIObject *obj, int aniId, int quId, int flag);
void setFlagByStaticAniObject(StaticANIObject *ani, int flag);
- BehaviorEntryInfo *getBehaviorEntryInfoByMessageQueueDataId(StaticANIObject *ani, int id1, int id2);
+ BehaviorMove *getBehaviorMoveByMessageQueueDataId(StaticANIObject *ani, int id1, int id2);
};
} // End of namespace Fullpipe
diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
index 68b63d398a..3a0e262f82 100644
--- a/engines/fullpipe/gameloader.cpp
+++ b/engines/fullpipe/gameloader.cpp
@@ -110,10 +110,10 @@ GameLoader::~GameLoader() {
}
bool GameLoader::load(MfcArchive &file) {
- debug(5, "GameLoader::load()");
+ debug(1, "GameLoader::load()");
_gameName = file.readPascalString();
- debug(6, "_gameName: %s", _gameName);
+ debug(1, "_gameName: %s", _gameName);
_gameProject = new GameProject();
@@ -126,13 +126,13 @@ bool GameLoader::load(MfcArchive &file) {
}
_gameName = file.readPascalString();
- debug(6, "_gameName: %s", _gameName);
+ debug(1, "_gameName: %s", _gameName);
_inventory.load(file);
_interactionController->load(file);
- debug(6, "sceneTag count: %d", _gameProject->_sceneTagList->size());
+ debug(1, "sceneTag count: %d", _gameProject->_sceneTagList->size());
_sc2array.resize(_gameProject->_sceneTagList->size());
@@ -142,7 +142,7 @@ bool GameLoader::load(MfcArchive &file) {
snprintf(tmp, 11, "%04d.sc2", it->_sceneId);
- debug(2, "sc: %s", tmp);
+ debug(1, "sc: %s", tmp);
_sc2array[i].loadFile((const char *)tmp);
}
@@ -152,6 +152,8 @@ bool GameLoader::load(MfcArchive &file) {
_field_FA = file.readUint16LE();
_field_F8 = file.readUint16LE();
+ debug(1, "_field_FA: %d\n_field_F8: %d", _field_FA, _field_F8);
+
_gameVar = (GameVar *)file.readClass();
return true;
diff --git a/engines/fullpipe/messagehandlers.cpp b/engines/fullpipe/messagehandlers.cpp
index 94754ad22a..caaa8f3e6b 100644
--- a/engines/fullpipe/messagehandlers.cpp
+++ b/engines/fullpipe/messagehandlers.cpp
@@ -765,7 +765,7 @@ int MovGraph_messageHandler(ExCommand *cmd) {
point.x = ani->_ox;
point.y = ani->_oy;
- double dst = gr->calcDistance(&point, (MovGraphLink *)(*i), 0);
+ double dst = gr->putToLink(&point, (MovGraphLink *)(*i), 0);
if (dst >= 0.0 && dst < mindistance) {
mindistance = dst;
link = (MovGraphLink *)(*i);
@@ -775,13 +775,13 @@ int MovGraph_messageHandler(ExCommand *cmd) {
int top;
if (link) {
- MovGraphNode *node = link->_movGraphNode1;
+ MovGraphNode *node = link->_graphSrc;
double sq = (ani->_oy - node->_y) * (ani->_oy - node->_y) + (ani->_ox - node->_x) * (ani->_ox - node->_x);
int off = (node->_field_14 >> 16) & 0xFF;
- double off2 = ((link->_movGraphNode2->_field_14 >> 8) & 0xff) - off;
+ double off2 = ((link->_graphDst->_field_14 >> 8) & 0xff) - off;
- top = off + (int)(sqrt(sq) * off2 / link->_z);
+ top = off + (int)(sqrt(sq) * off2 / link->_length);
} 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 9cf18f3cc2..ceb3208eb3 100644
--- a/engines/fullpipe/motion.cpp
+++ b/engines/fullpipe/motion.cpp
@@ -836,7 +836,7 @@ Common::Array<MovItem *> *MovGraph::getPaths(StaticANIObject *ani, int x, int y,
point.x = ani->_ox;
point.y = ani->_oy;
- if (!calcChunk(idx, ani->_ox, ani->_oy, &_items[idx]->movarr, 0))
+ if (!getHitPoint(idx, ani->_ox, ani->_oy, &_items[idx]->movarr, 0))
getNearestPoint(idx, &point, &_items[idx]->movarr);
_items[idx]->count = 0;
@@ -845,12 +845,12 @@ Common::Array<MovItem *> *MovGraph::getPaths(StaticANIObject *ani, int x, int y,
_items[idx]->movitems = 0;
int arrSize;
- Common::Array<MovArr *> *movarr = genMovArr(x, y, &arrSize, flag1, 0);
+ Common::Array<MovArr *> *movarr = getHitPoints(x, y, &arrSize, flag1, 0);
if (movarr) {
for (int i = 0; i < arrSize; i++) {
int sz;
- Common::Array<MovItem *> *movitems = calcMovItems(&_items[idx]->movarr, (*movarr)[i], &sz);
+ Common::Array<MovItem *> *movitems = getPaths(&_items[idx]->movarr, (*movarr)[i], &sz);
if (sz > 0) {
for (int j = 0; j < sz; j++)
@@ -1008,7 +1008,7 @@ bool MovGraph::canDropInventory(StaticANIObject *ani, int x, int y) {
return true;
}
}
- } else if (calcChunk(idx, ani->_ox, ani->_oy, &m, 0) && m._link && (m._link->_flags & 0x4000000)) {
+ } else if (getHitPoint(idx, ani->_ox, ani->_oy, &m, 0) && m._link && (m._link->_flags & 0x4000000)) {
return true;
}
}
@@ -1074,7 +1074,7 @@ MessageQueue *MovGraph::doWalkTo(StaticANIObject *subj, int xpos, int ypos, int
_items[idx]->movarr._afield_8 = -1;
_items[idx]->movarr._link = 0;
- MessageQueue *mq = fillMGMinfo(_items[idx]->ani, &_items[idx]->movarr, staticsId);
+ MessageQueue *mq = makeWholeQueue(_items[idx]->ani, &_items[idx]->movarr, staticsId);
if (mq) {
ExCommand *ex = new ExCommand();
ex->_messageKind = 17;
@@ -1129,7 +1129,7 @@ MessageQueue *MovGraph::sub1(StaticANIObject *ani, int x, int y, int stid, int x
_items[idx]->movarr._afield_8 = -1;
_items[idx]->movarr._link = 0;
- res = fillMGMinfo(_items[idx]->ani, &_items[idx]->movarr, stid2);
+ res = makeWholeQueue(_items[idx]->ani, &_items[idx]->movarr, stid2);
break;
}
@@ -1140,7 +1140,7 @@ MessageQueue *MovGraph::sub1(StaticANIObject *ani, int x, int y, int stid, int x
return res;
}
-MessageQueue *MovGraph::fillMGMinfo(StaticANIObject *ani, MovArr *movarr, int staticsId) {
+MessageQueue *MovGraph::makeWholeQueue(StaticANIObject *ani, MovArr *movarr, int staticsId) {
if (!movarr->_movStepCount)
return 0;
@@ -1176,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->_z;
+ nd = st->link->_graphSrc->_z;
} else {
if (st->sfield_0) {
- nx = st->link->_movGraphNode1->_x;
- ny = st->link->_movGraphNode1->_y;
- nd = st->link->_movGraphNode1->_z;
+ nx = st->link->_graphSrc->_x;
+ ny = st->link->_graphSrc->_y;
+ nd = st->link->_graphSrc->_z;
} else {
- nx = st->link->_movGraphNode2->_x;
- ny = st->link->_movGraphNode2->_y;
- nd = st->link->_movGraphNode2->_z;
+ nx = st->link->_graphDst->_x;
+ ny = st->link->_graphDst->_y;
+ nd = st->link->_graphDst->_z;
}
}
@@ -1261,7 +1261,7 @@ MessageQueue *MovGraph::method50(StaticANIObject *ani, MovArr *movarr, int stati
_items[idx]->movarr._afield_8 = -1;
_items[idx]->movarr._link = 0;
- MessageQueue *mq = fillMGMinfo(_items[idx]->ani, &_items[idx]->movarr, 0);
+ MessageQueue *mq = makeWholeQueue(_items[idx]->ani, &_items[idx]->movarr, 0);
if (!mq)
return 0;
@@ -1283,24 +1283,24 @@ MessageQueue *MovGraph::method50(StaticANIObject *ani, MovArr *movarr, int stati
return mq;
}
-double MovGraph::calcDistance(Common::Point *point, MovGraphLink *link, int fuzzyMatch) {
- int n1x = link->_movGraphNode1->_x;
- int n1y = link->_movGraphNode1->_y;
- int n2x = link->_movGraphNode2->_x;
- int n2y = link->_movGraphNode2->_y;
+double MovGraph::putToLink(Common::Point *point, MovGraphLink *link, int fuzzyMatch) {
+ int n1x = link->_graphSrc->_x;
+ int n1y = link->_graphSrc->_y;
+ int n2x = link->_graphDst->_x;
+ int n2y = link->_graphDst->_y;
double dist1x = (double)(point->x - n1x);
- double dist1y = (double)(n1y - point->y);
+ double dist1y = (double)(point->y - n1y);
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->_z / dist1;
+ double dist1 = sqrt(dist1x * dist1x + dist1y * dist1y);
+ double dist2 = (dist2y * dist1y + dist2x * dist1x) / link->_length / dist1;
double distm = dist2 * dist1;
double res = sqrt(1.0 - dist2 * dist2) * dist1;
- if (dist2 <= 0.0 || distm >= link->_z) {
+ if (dist2 <= 0.0 || distm >= link->_length) {
if (fuzzyMatch) {
if (dist2 > 0.0) {
- if (distm >= link->_z) {
+ if (distm >= link->_length) {
point->x = n2x;
point->y = n2y;
}
@@ -1312,8 +1312,8 @@ double MovGraph::calcDistance(Common::Point *point, MovGraphLink *link, int fuzz
return -1.0;
}
} else {
- point->x = (int)(n1x + (dist2x * distm / link->_z));
- point->y = (int)(n1y + (dist2y * distm / link->_z));
+ point->x = (int)(n1x + (dist2x * distm / link->_length));
+ point->y = (int)(n1y + (dist2y * distm / link->_length));
}
return res;
@@ -1340,14 +1340,14 @@ bool MovGraph::getNearestPoint(int unusedArg, Common::Point *p, MovArr *movarr)
MovGraphLink *lnk = (MovGraphLink *)*i;
if ((lnk->_flags & 0x10000000) && !(lnk->_flags & 0x20000000) ) {
- double dx1 = lnk->_movGraphNode1->_x - p->x;
- double dy1 = lnk->_movGraphNode1->_y - p->y;
- double dx2 = lnk->_movGraphNode2->_x - p->x;
- double dy2 = lnk->_movGraphNode2->_y - p->y;
- double dx3 = lnk->_movGraphNode2->_x - lnk->_movGraphNode1->_x;
- double dy3 = lnk->_movGraphNode2->_y - lnk->_movGraphNode1->_y;
+ double dx1 = lnk->_graphSrc->_x - p->x;
+ double dy1 = lnk->_graphSrc->_y - p->y;
+ double dx2 = lnk->_graphDst->_x - p->x;
+ double dy2 = lnk->_graphDst->_y - p->y;
+ double dx3 = lnk->_graphDst->_x - lnk->_graphSrc->_x;
+ double dy3 = lnk->_graphDst->_y - lnk->_graphSrc->_y;
double sq1 = sqrt(dy1 * dy1 + dx1 * dx1);
- double sdist = (dy3 * dy1 + dx3 * dx1) / lnk->_z / sq1;
+ double sdist = (dy3 * dy1 + dx3 * dx1) / lnk->_length / sq1;
double ldist = sdist * sq1;
double dist = sqrt(1.0 - sdist * sdist) * sq1;
@@ -1356,14 +1356,14 @@ bool MovGraph::getNearestPoint(int unusedArg, Common::Point *p, MovArr *movarr)
dist = sqrt(dx1 * dx1 + dy1 * dy1);
}
- if (ldist > lnk->_z) {
- ldist = lnk->_z;
+ if (ldist > lnk->_length) {
+ ldist = lnk->_length;
dist = sqrt(dx2 * dx2 + dy2 * dy2);
}
- 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);
+ if (ldist >= 0.0 && ldist <= lnk->_length && dist < mindist) {
+ resx = lnk->_graphSrc->_x + (int)(dx3 * ldist / lnk->_length);
+ resy = lnk->_graphSrc->_y + (int)(dy3 * ldist / lnk->_length);
mindist = dist;
link = lnk;
@@ -1394,7 +1394,7 @@ int MovGraph::getObjectIndex(StaticANIObject *ani) {
return -1;
}
-Common::Array<MovArr *> *MovGraph::genMovArr(int x, int y, int *arrSize, int flag1, int flag2) {
+Common::Array<MovArr *> *MovGraph::getHitPoints(int x, int y, int *arrSize, int flag1, int flag2) {
if (!_links.size()) {
*arrSize = 0;
@@ -1409,15 +1409,15 @@ Common::Array<MovArr *> *MovGraph::genMovArr(int x, int y, int *arrSize, int fla
if (flag1) {
Common::Point point(x, y);
- double dist = calcDistance(&point, lnk, 0);
+ double dist = putToLink(&point, lnk, 0);
if (dist >= 0.0 && dist < 2.0) {
movarr = new MovArr;
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->_z / lnk->_z;
+ movarr->_dist = ((double)(lnk->_graphSrc->_y - lnk->_graphDst->_y) * (double)(lnk->_graphSrc->_y - point.y) +
+ (double)(lnk->_graphDst->_x - lnk->_graphSrc->_x) * (double)(point.x - lnk->_graphSrc->_x)) /
+ lnk->_length / lnk->_length;
movarr->_point = point;
arr->push_back(movarr);
@@ -1430,27 +1430,27 @@ Common::Array<MovArr *> *MovGraph::genMovArr(int x, int y, int *arrSize, int fla
movarr = new MovArr;
movarr->_link = lnk;
movarr->_dist = 0.0;
- movarr->_point.x = lnk->_movGraphNode1->_x;
- movarr->_point.y = lnk->_movGraphNode1->_y;
+ movarr->_point.x = lnk->_graphSrc->_x;
+ movarr->_point.y = lnk->_graphSrc->_y;
arr->push_back(movarr);
movarr = new MovArr;
movarr->_link = lnk;
movarr->_dist = 1.0;
- movarr->_point.x = lnk->_movGraphNode1->_x;
- movarr->_point.y = lnk->_movGraphNode1->_y;
+ movarr->_point.x = lnk->_graphSrc->_x;
+ movarr->_point.y = lnk->_graphSrc->_y;
arr->push_back(movarr);
}
} else {
movarr = new MovArr;
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->_z / lnk->_z;
+ movarr->_dist = ((double)(lnk->_graphSrc->_y - lnk->_graphDst->_y) * (double)(lnk->_graphSrc->_y - y) +
+ (double)(lnk->_graphDst->_x - lnk->_graphSrc->_x) * (double)(x - lnk->_graphSrc->_x)) /
+ lnk->_length / lnk->_length;
movarr->_point.x = x;
movarr->_point.y = y;
- calcDistance(&movarr->_point, lnk, 0);
+ putToLink(&movarr->_point, lnk, 0);
arr->push_back(movarr);
}
@@ -1478,9 +1478,9 @@ void MovGraph::findAllPaths(MovGraphLink *lnk, MovGraphLink *lnk2, Common::Array
for (ObList::iterator i = _links.begin(); i != _links.end(); ++i) {
MovGraphLink *l = (MovGraphLink *)*i;
- if (l->_movGraphNode1 != lnk->_movGraphNode1) {
- if (l->_movGraphNode2 != lnk->_movGraphNode1) {
- if (l->_movGraphNode1 != lnk->_movGraphNode2 && l->_movGraphNode2 != lnk->_movGraphNode2)
+ if (l->_graphSrc != lnk->_graphSrc) {
+ if (l->_graphDst != lnk->_graphSrc) {
+ if (l->_graphSrc != lnk->_graphDst && l->_graphDst != lnk->_graphDst)
continue;
}
}
@@ -1494,7 +1494,7 @@ void MovGraph::findAllPaths(MovGraphLink *lnk, MovGraphLink *lnk2, Common::Array
}
// Returns a list of possible paths two points in graph space
-Common::Array<MovItem *> *MovGraph::calcMovItems(MovArr *currPos, MovArr *destPos, int *pathCount) {
+Common::Array<MovItem *> *MovGraph::getPaths(MovArr *currPos, MovArr *destPos, int *pathCount) {
Common::Array<MovGraphLink *> tempObList1;
Common::Array<MovGraphLink *> allPaths;
@@ -1530,7 +1530,7 @@ void MovGraph::genMovItem(MovItem *movitem, MovGraphLink *grlink, MovArr *movarr
warning("STUB: MovGraph::genMovItem()");
}
-bool MovGraph::calcChunk(int idx, int x, int y, MovArr *arr, int a6) {
+bool MovGraph::getHitPoint(int idx, int x, int y, MovArr *arr, int a6) {
int staticsId;
if (_items[idx]->ani->_statics) {
@@ -1544,7 +1544,7 @@ bool MovGraph::calcChunk(int idx, int x, int y, MovArr *arr, int a6) {
int arrSize;
- Common::Array<MovArr *> *movarr = genMovArr(x, y, &arrSize, 0, 1);
+ Common::Array<MovArr *> *movarr = getHitPoints(x, y, &arrSize, 0, 1);
if (!movarr)
return getNearestPoint(idx, 0, arr);
@@ -1581,20 +1581,20 @@ bool MovGraph::calcChunk(int idx, int x, int y, MovArr *arr, int a6) {
}
void MovGraph::setEnds(MovStep *step1, MovStep *step2) {
- if (step1->link->_movGraphNode1 == step2->link->_movGraphNode2) {
+ if (step1->link->_graphSrc == step2->link->_graphDst) {
step1->sfield_0 = 1;
step2->sfield_0 = 1;
return;
}
- if (step1->link->_movGraphNode1 == step2->link->_movGraphNode1) {
+ if (step1->link->_graphSrc == step2->link->_graphSrc) {
step1->sfield_0 = 1;
step2->sfield_0 = 0;
} else {
step1->sfield_0 = 0;
- if (step1->link->_movGraphNode2 != step2->link->_movGraphNode1) {
+ if (step1->link->_graphDst != step2->link->_graphSrc) {
step2->sfield_0 = 1;
} else {
step2->sfield_0 = 0;
@@ -2241,7 +2241,7 @@ MessageQueue *MovGraph2::doWalkTo(StaticANIObject *obj, int xpos, int ypos, int
if (linkInfoSource.node)
movInfo1.distance1 = linkInfoSource.node->_z;
else
- movInfo1.distance1 = linkInfoSource.link->_movGraphNode1->_z;
+ movInfo1.distance1 = linkInfoSource.link->_graphSrc->_z;
if (linkInfoDest.node) {
dx2 = linkInfoDest.node->_x;
@@ -2255,13 +2255,13 @@ MessageQueue *MovGraph2::doWalkTo(StaticANIObject *obj, int xpos, int ypos, int
movInfo1.pt2.x = xpos;
movInfo1.pt2.y = ypos;
- MovGraphNode *nod = linkInfoDest.link->_movGraphNode1;
+ MovGraphNode *nod = linkInfoDest.link->_graphSrc;
double dst1 = sqrt((double)((ypos - nod->_y) * (ypos - nod->_y) + (xpos - nod->_x) * (xpos - nod->_x)));
- int dst = linkInfoDest.link->_movGraphNode2->_z - nod->_z;
+ int dst = linkInfoDest.link->_graphDst->_z - nod->_z;
- movInfo1.distance2 = (int)(nod->_z + (dst1 * (double)dst / linkInfoDest.link->_z));
+ movInfo1.distance2 = (int)(nod->_z + (dst1 * (double)dst / linkInfoDest.link->_length));
- calcDistance(&movInfo1.pt2, linkInfoDest.link, 1);
+ putToLink(&movInfo1.pt2, linkInfoDest.link, 1);
dx1 = movInfo1.pt1.x;
dy1 = movInfo1.pt1.y;
@@ -2349,7 +2349,7 @@ int MovGraph2::getShortSide(MovGraphLink *lnk, int x, int y) {
bool cond;
if (lnk)
- cond = abs(lnk->_movGraphNode2->_x - lnk->_movGraphNode1->_x) > abs(lnk->_movGraphNode2->_y - lnk->_movGraphNode1->_y);
+ cond = abs(lnk->_graphDst->_x - lnk->_graphSrc->_x) > abs(lnk->_graphDst->_y - lnk->_graphSrc->_y);
else
cond = abs(x) > abs(y);
@@ -2360,16 +2360,16 @@ int MovGraph2::getShortSide(MovGraphLink *lnk, int x, int y) {
}
int MovGraph2::findLink(Common::Array<MovGraphLink *> *linkList, int idx, Common::Rect *rect, Common::Point *point) {
- MovGraphNode *node1 = (*linkList)[idx]->_movGraphNode1;
- MovGraphNode *node2 = (*linkList)[idx]->_movGraphNode2;
+ MovGraphNode *node1 = (*linkList)[idx]->_graphSrc;
+ MovGraphNode *node2 = (*linkList)[idx]->_graphDst;
MovGraphNode *node3 = node1;
if (idx != 0) {
MovGraphLink *lnk = (*linkList)[idx - 1];
- if (lnk->_movGraphNode2 != node1) {
- if (lnk->_movGraphNode1 != node1) {
- if (lnk->_movGraphNode2 == node2 || lnk->_movGraphNode1 == node2) {
+ if (lnk->_graphDst != node1) {
+ if (lnk->_graphSrc != node1) {
+ if (lnk->_graphDst == node2 || lnk->_graphSrc == node2) {
node3 = node2;
node2 = node1;
}
@@ -2380,10 +2380,10 @@ int MovGraph2::findLink(Common::Array<MovGraphLink *> *linkList, int idx, Common
} else if (idx != (int)(linkList->size() - 1)) {
MovGraphLink *lnk = (*linkList)[idx + 1];
- if (lnk->_movGraphNode2 == node1 || lnk->_movGraphNode1 == node1) {
+ if (lnk->_graphDst == node1 || lnk->_graphSrc == node1) {
node3 = node2;
node2 = node1;
- } else if (lnk->_movGraphNode2 == node2 || lnk->_movGraphNode1 == node2) {
+ } else if (lnk->_graphDst == node2 || lnk->_graphSrc == node2) {
node3 = node1;
}
}
@@ -2619,13 +2619,13 @@ MovGraphLink *MovGraph2::findLink1(int x, int y, int idx, int fuzzyMatch) {
if (fuzzyMatch) {
point.x = x;
point.y = y;
- double dst = calcDistance(&point, lnk, 0);
+ double dst = putToLink(&point, lnk, 0);
if (dst >= 0.0 && dst < 2.0)
return lnk;
} else if (!(lnk->_flags & 0x20000000)) {
if (lnk->_movGraphReact->pointInRegion(x, y)) {
- if (abs(lnk->_movGraphNode1->_x - lnk->_movGraphNode2->_x) <= abs(lnk->_movGraphNode1->_y - lnk->_movGraphNode2->_y)) {
+ if (abs(lnk->_graphSrc->_x - lnk->_graphDst->_x) <= abs(lnk->_graphSrc->_y - lnk->_graphDst->_y)) {
if (idx == 2 || idx == 3)
return lnk;
res = lnk;
@@ -2651,14 +2651,14 @@ MovGraphLink *MovGraph2::findLink2(int x, int y) {
MovGraphLink *lnk = (MovGraphLink *)*i;
if (!(lnk->_flags & 0x20000000)) {
- double n1x = lnk->_movGraphNode1->_x;
- double n1y = lnk->_movGraphNode1->_y;
- double n2x = lnk->_movGraphNode2->_x;
- double n2y = lnk->_movGraphNode2->_y;
+ double n1x = lnk->_graphSrc->_x;
+ double n1y = lnk->_graphSrc->_y;
+ double n2x = lnk->_graphDst->_x;
+ double n2y = lnk->_graphDst->_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->_z / dst1;
+ double coeff1 = ((n1y - n2y) * n1dy + (n2x - n1x) * n1dx) / lnk->_length / dst1;
double dst3 = coeff1 * dst1;
double dst2 = sqrt(1.0 - coeff1 * coeff1) * dst1;
@@ -2666,11 +2666,11 @@ MovGraphLink *MovGraph2::findLink2(int x, int y) {
dst3 = 0.0;
dst2 = sqrt(n1dy * n1dy + n1dx * n1dx);
}
- if (dst3 > lnk->_z) {
- dst3 = lnk->_z;
+ if (dst3 > lnk->_length) {
+ dst3 = lnk->_length;
dst2 = sqrt((n2x - x) * (n2x - x) + (n2y - y) * (n2y - y));
}
- if (dst3 >= 0.0 && dst3 <= lnk->_z && dst2 < mindist) {
+ if (dst3 >= 0.0 && dst3 <= lnk->_length && dst2 < mindist) {
mindist = dst2;
res = lnk;
}
@@ -2693,7 +2693,7 @@ double MovGraph2::findMinPath(LinkInfo *linkInfoSource, LinkInfo *linkInfoDest,
for (ObList::iterator i = _links.begin(); i != _links.end(); ++i) {
MovGraphLink *lnk = (MovGraphLink *)*i;
- if ((lnk->_movGraphNode1 == linkInfoSource->node || lnk->_movGraphNode2 == linkInfoSource->node) && !(lnk->_flags & 0xA0000000)) {
+ if ((lnk->_graphSrc == linkInfoSource->node || lnk->_graphDst == linkInfoSource->node) && !(lnk->_flags & 0xA0000000)) {
linkInfoWorkSource.node = 0;
linkInfoWorkSource.link = lnk;
@@ -2703,18 +2703,18 @@ double MovGraph2::findMinPath(LinkInfo *linkInfoSource, LinkInfo *linkInfoDest,
double newDistance = findMinPath(&linkInfoWorkSource, linkInfoDest, &tmpList);
- if (newDistance >= 0.0 && (minDistance < 0.0 || newDistance + lnk->_z < minDistance)) {
+ if (newDistance >= 0.0 && (minDistance < 0.0 || newDistance + lnk->_length < minDistance)) {
listObj->clear();
listObj->push_back(tmpList);
- minDistance = newDistance + lnk->_z;
+ minDistance = newDistance + lnk->_length;
}
lnk->_flags &= 0x7FFFFFFF;
}
}
} else if (linkInfoSource->link) {
- linkInfoWorkSource.node = linkInfoSource->link->_movGraphNode1;
+ linkInfoWorkSource.node = linkInfoSource->link->_graphSrc;
linkInfoWorkSource.link = 0;
Common::Array<MovGraphLink *> tmpList;
@@ -2731,7 +2731,7 @@ double MovGraph2::findMinPath(LinkInfo *linkInfoSource, LinkInfo *linkInfoDest,
}
linkInfoWorkSource.link = 0;
- linkInfoWorkSource.node = linkInfoSource->link->_movGraphNode2;
+ linkInfoWorkSource.node = linkInfoSource->link->_graphDst;
tmpList.clear();
@@ -2774,11 +2774,11 @@ MovGraphNode *MovGraph::calcOffset(int ox, int oy) {
}
MovGraphLink::MovGraphLink() {
- _z = 0;
+ _length = 0;
_angle = 0;
_flags = 0x10000000;
- _movGraphNode2 = 0;
- _movGraphNode1 = 0;
+ _graphDst = 0;
+ _graphSrc = 0;
_field_3C = 0;
_field_38 = 0;
_movGraphReact = 0;
@@ -2804,14 +2804,14 @@ bool MovGraphLink::load(MfcArchive &file) {
_flags = file.readUint32LE();
debug(8, "GraphNode1");
- _movGraphNode1 = (MovGraphNode *)file.readClass();
+ _graphSrc = (MovGraphNode *)file.readClass();
debug(8, "GraphNode2");
- _movGraphNode2 = (MovGraphNode *)file.readClass();
+ _graphDst = (MovGraphNode *)file.readClass();
- _z = file.readDouble();
+ _length = file.readDouble();
_angle = file.readDouble();
- debug(8, "distance: %g, angle: %g", _z, _angle);
+ debug(8, "length: %g, angle: %g", _length, _angle);
_movGraphReact = (MovGraphReact *)file.readClass();
_name = file.readPascalString();
@@ -2820,11 +2820,11 @@ bool MovGraphLink::load(MfcArchive &file) {
}
void MovGraphLink::recalcLength() {
- if (_movGraphNode1) {
- double dx = _movGraphNode2->_x - _movGraphNode1->_x;
- double dy = _movGraphNode2->_y - _movGraphNode1->_y;
+ if (_graphSrc) {
+ double dx = _graphDst->_x - _graphSrc->_x;
+ double dy = _graphDst->_y - _graphSrc->_y;
- _z = sqrt(dy * dy + dx * dx);
+ _length = sqrt(dy * dy + dx * dx);
_angle = atan2(dx, dy);
}
}
diff --git a/engines/fullpipe/motion.h b/engines/fullpipe/motion.h
index a40d810ffa..41860e32d0 100644
--- a/engines/fullpipe/motion.h
+++ b/engines/fullpipe/motion.h
@@ -218,14 +218,14 @@ public:
class MovGraphLink : public CObject {
public:
- MovGraphNode *_movGraphNode1;
- MovGraphNode *_movGraphNode2;
+ MovGraphNode *_graphSrc;
+ MovGraphNode *_graphDst;
DWordArray _dwordArray1;
DWordArray _dwordArray2;
int _flags;
int _field_38;
int _field_3C;
- double _z;
+ double _length;
double _angle;
MovGraphReact *_movGraphReact;
char *_name;
@@ -302,18 +302,18 @@ public:
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);
+ double putToLink(Common::Point *point, MovGraphLink *link, int fuzzyMatch);
void recalcLinkParams();
bool getNearestPoint(int unusedArg, Common::Point *p, MovArr *movarr);
MovGraphNode *calcOffset(int ox, int oy);
int getObjectIndex(StaticANIObject *ani);
- Common::Array<MovArr *> *genMovArr(int x, int y, int *arrSize, int flag1, int flag2);
+ Common::Array<MovArr *> *getHitPoints(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);
+ Common::Array<MovItem *> *getPaths(MovArr *movarr1, MovArr *movarr2, int *listCount);
void genMovItem(MovItem *movitem, MovGraphLink *grlink, MovArr *movarr1, MovArr *movarr2);
- bool calcChunk(int idx, int x, int y, MovArr *arr, int a6);
+ bool getHitPoint(int idx, int x, int y, MovArr *arr, int a6);
MessageQueue *sub1(StaticANIObject *ani, int x, int y, int a5, int x1, int y1, int a8, int a9);
- MessageQueue *fillMGMinfo(StaticANIObject *ani, MovArr *movarr, int staticsId);
+ MessageQueue *makeWholeQueue(StaticANIObject *ani, MovArr *movarr, int staticsId);
void setEnds(MovStep *step1, MovStep *step2);
};
diff --git a/engines/fullpipe/scenes.h b/engines/fullpipe/scenes.h
index 0b7c4e7c8f..17ef5c3140 100644
--- a/engines/fullpipe/scenes.h
+++ b/engines/fullpipe/scenes.h
@@ -26,7 +26,7 @@
namespace Fullpipe {
struct Bat;
-struct BehaviorEntryInfo;
+struct BehaviorMove;
struct Hanger;
class MGM;
class MctlLadder;
@@ -346,12 +346,12 @@ public:
int scene06_sceneClickX;
int scene06_sceneClickY;
int scene06_mumsyPos;
- BehaviorEntryInfo *scene06_mumsyJumpBk;
- BehaviorEntryInfo *scene06_mumsyJumpFw;
+ BehaviorMove *scene06_mumsyJumpBk;
+ BehaviorMove *scene06_mumsyJumpFw;
int scene06_mumsyJumpBkPercent;
int scene06_mumsyJumpFwPercent;
- BehaviorEntryInfo *scene07_lukeAnim;
+ BehaviorMove *scene07_lukeAnim;
int scene07_lukePercent;
StaticANIObject *scene07_plusMinus;
diff --git a/engines/fullpipe/scenes/scene06.cpp b/engines/fullpipe/scenes/scene06.cpp
index e9cecc42f0..14042031bf 100644
--- a/engines/fullpipe/scenes/scene06.cpp
+++ b/engines/fullpipe/scenes/scene06.cpp
@@ -38,8 +38,8 @@
namespace Fullpipe {
void scene06_initMumsy() {
- g_vars->scene06_mumsyJumpFw = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene06_mumsy, ST_MOM_STANDS, QU_MOM_JUMPFW);
- g_vars->scene06_mumsyJumpBk = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene06_mumsy, ST_MOM_STANDS, QU_MOM_JUMPBK);
+ g_vars->scene06_mumsyJumpFw = g_fp->_behaviorManager->getBehaviorMoveByMessageQueueDataId(g_vars->scene06_mumsy, ST_MOM_STANDS, QU_MOM_JUMPFW);
+ g_vars->scene06_mumsyJumpBk = g_fp->_behaviorManager->getBehaviorMoveByMessageQueueDataId(g_vars->scene06_mumsy, ST_MOM_STANDS, QU_MOM_JUMPBK);
g_vars->scene06_mumsyJumpFwPercent = g_vars->scene06_mumsyJumpFw->_percent;
g_vars->scene06_mumsyJumpBkPercent = g_vars->scene06_mumsyJumpBk->_percent;
}
diff --git a/engines/fullpipe/scenes/scene07.cpp b/engines/fullpipe/scenes/scene07.cpp
index 6db8c30932..6f98d014bc 100644
--- a/engines/fullpipe/scenes/scene07.cpp
+++ b/engines/fullpipe/scenes/scene07.cpp
@@ -66,7 +66,7 @@ void sceneHandler07_openLuke() {
} else {
StaticANIObject *ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_CORNERSITTER, -1);
- g_vars->scene07_lukeAnim = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(ani, ST_CST_HANDLELESS, QU_CST_CLOSELUKE);
+ g_vars->scene07_lukeAnim = g_fp->_behaviorManager->getBehaviorMoveByMessageQueueDataId(ani, ST_CST_HANDLELESS, QU_CST_CLOSELUKE);
g_vars->scene07_lukeAnim->_percent = g_vars->scene07_lukePercent;
}
@@ -78,7 +78,7 @@ void sceneHandler07_closeLuke() {
if (!g_vars->scene07_lukeAnim) {
StaticANIObject *ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_CORNERSITTER, -1);
- g_vars->scene07_lukeAnim = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(ani, ST_CST_HANDLELESS, QU_CST_CLOSELUKE);
+ g_vars->scene07_lukeAnim = g_fp->_behaviorManager->getBehaviorMoveByMessageQueueDataId(ani, ST_CST_HANDLELESS, QU_CST_CLOSELUKE);
}
g_vars->scene07_lukePercent = g_vars->scene07_lukeAnim->_percent;
diff --git a/engines/fullpipe/scenes/scene13.cpp b/engines/fullpipe/scenes/scene13.cpp
index c7b3c96b93..1397248bd5 100644
--- a/engines/fullpipe/scenes/scene13.cpp
+++ b/engines/fullpipe/scenes/scene13.cpp
@@ -178,14 +178,14 @@ void sceneHandler13_openFast() {
}
void sceneHandler13_uneatGum() {
- BehaviorEntryInfo *beh = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene13_guard, ST_STR_RIGHT, QU_STR_CHEW);
+ BehaviorMove *beh = g_fp->_behaviorManager->getBehaviorMoveByMessageQueueDataId(g_vars->scene13_guard, ST_STR_RIGHT, QU_STR_CHEW);
if (beh) {
beh->_percent = 0;
beh->_delay = 36;
}
- beh = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene13_guard, ST_STR_RIGHT, QU_STR_PLUU);
+ beh = g_fp->_behaviorManager->getBehaviorMoveByMessageQueueDataId(g_vars->scene13_guard, ST_STR_RIGHT, QU_STR_PLUU);
if (beh) {
beh->_percent = 0;
beh->_delay = 36;
@@ -193,7 +193,7 @@ void sceneHandler13_uneatGum() {
}
void sceneHandler13_eatGum() {
- BehaviorEntryInfo *beh = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene13_guard, ST_STR_RIGHT, QU_STR_CHEW);
+ BehaviorMove *beh = g_fp->_behaviorManager->getBehaviorMoveByMessageQueueDataId(g_vars->scene13_guard, ST_STR_RIGHT, QU_STR_CHEW);
if (beh) {
beh->_percent = 10922;
@@ -216,7 +216,7 @@ void sceneHandler13_showGum() {
chainQueue(QU_SC13_SHOWGUM, 0);
}
-void sceneHandler13_setBehFlag(BehaviorEntryInfo *beh, bool flag) {
+void sceneHandler13_setBehFlag(BehaviorMove *beh, bool flag) {
if (!flag) {
beh->_percent = 327;
beh->_flags |= 1;
@@ -229,11 +229,11 @@ void sceneHandler13_setBehFlag(BehaviorEntryInfo *beh, bool flag) {
}
void sceneHandler13_walkForward(bool flag) {
- BehaviorEntryInfo *beh = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene13_guard, ST_STR_RIGHT, QU_STR_RTOL);
+ BehaviorMove *beh = g_fp->_behaviorManager->getBehaviorMoveByMessageQueueDataId(g_vars->scene13_guard, ST_STR_RIGHT, QU_STR_RTOL);
sceneHandler13_setBehFlag(beh, flag);
- beh = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene13_guard, ST_STR_LEFT, QU_STR_TURNR);
+ beh = g_fp->_behaviorManager->getBehaviorMoveByMessageQueueDataId(g_vars->scene13_guard, ST_STR_LEFT, QU_STR_TURNR);
sceneHandler13_setBehFlag(beh, flag);
@@ -241,11 +241,11 @@ void sceneHandler13_walkForward(bool flag) {
}
void sceneHandler13_walkBackward(bool flag) {
- BehaviorEntryInfo *beh = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene13_guard, ST_STR_RIGHT|0x4000, QU_STR_LTOR);
+ BehaviorMove *beh = g_fp->_behaviorManager->getBehaviorMoveByMessageQueueDataId(g_vars->scene13_guard, ST_STR_RIGHT|0x4000, QU_STR_LTOR);
sceneHandler13_setBehFlag(beh, flag);
- beh = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene13_guard, ST_STR_LEFT|0x4000, QU_STR_TURNR_L);
+ beh = g_fp->_behaviorManager->getBehaviorMoveByMessageQueueDataId(g_vars->scene13_guard, ST_STR_LEFT|0x4000, QU_STR_TURNR_L);
sceneHandler13_setBehFlag(beh, flag);
diff --git a/engines/fullpipe/scenes/scene14.cpp b/engines/fullpipe/scenes/scene14.cpp
index dc919c6d7f..d3ba3c345e 100644
--- a/engines/fullpipe/scenes/scene14.cpp
+++ b/engines/fullpipe/scenes/scene14.cpp
@@ -266,8 +266,8 @@ void sceneHandler14_showBallFly() {
}
void sceneHandler14_grandmaJump() {
- BehaviorEntryInfo *beh1 = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene14_grandma, ST_GMA_SIT, QU_GMA_JUMPFW);
- BehaviorEntryInfo *beh2 = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene14_grandma, ST_GMA_SIT, QU_GMA_JUMPBK);
+ BehaviorMove *beh1 = g_fp->_behaviorManager->getBehaviorMoveByMessageQueueDataId(g_vars->scene14_grandma, ST_GMA_SIT, QU_GMA_JUMPFW);
+ BehaviorMove *beh2 = g_fp->_behaviorManager->getBehaviorMoveByMessageQueueDataId(g_vars->scene14_grandma, ST_GMA_SIT, QU_GMA_JUMPBK);
if (beh1) {
if (beh2) {
@@ -286,11 +286,11 @@ void sceneHandler14_endArcade() {
getGameLoaderInteractionController()->enableFlag24();
getCurrSceneSc2MotionController()->activate();
- BehaviorEntryInfo *beh = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene14_grandma, ST_GMA_SIT, QU_GMA_BLINK);
+ BehaviorMove *beh = g_fp->_behaviorManager->getBehaviorMoveByMessageQueueDataId(g_vars->scene14_grandma, ST_GMA_SIT, QU_GMA_BLINK);
if (beh)
beh->_percent = 327;
- beh = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene14_grandma, ST_GMA_SIT, QU_GMA_THROW);
+ beh = g_fp->_behaviorManager->getBehaviorMoveByMessageQueueDataId(g_vars->scene14_grandma, ST_GMA_SIT, QU_GMA_THROW);
if (beh)
beh->_percent = 0;
diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp
index b51a6382e6..dfbff33c63 100644
--- a/engines/gob/gob.cpp
+++ b/engines/gob/gob.cpp
@@ -429,6 +429,23 @@ Common::Error GobEngine::initGameParts() {
_map = new Map_v1(this);
_goblin = new Goblin_v1(this);
_scenery = new Scenery_v1(this);
+
+ // WORKAROUND: The EGA version of Gobliiins claims a few resources are
+ // larger than they actually are. The original happily reads
+ // past the resource structure boundary, but we don't.
+ // To make sure we don't throw an error like we normally do
+ // (which leads to these resources not loading), we enable
+ // this workaround that automatically fixes the resources
+ // sizes.
+ //
+ // This glitch is visible in levels
+ // - 03 (ICIGCAA)
+ // - 09 (ICVGCGT)
+ // - 16 (TCVQRPM)
+ // - 20 (NNGWTTO)
+ // See also ScummVM bug report #7162.
+ if (isEGA())
+ _resourceSizeWorkaround = true;
break;
case kGameTypeGeisha:
diff --git a/engines/mads/nebular/nebular_scenes2.cpp b/engines/mads/nebular/nebular_scenes2.cpp
index 5210f59f47..c19b7b8381 100644
--- a/engines/mads/nebular/nebular_scenes2.cpp
+++ b/engines/mads/nebular/nebular_scenes2.cpp
@@ -103,7 +103,7 @@ void Scene2xx::sceneEntrySound() {
_vm->_sound->command(1);
else
_vm->_sound->command(9);
- break;
+ break;
case 216:
_vm->_sound->command(16);
break;
diff --git a/engines/mohawk/detection.cpp b/engines/mohawk/detection.cpp
index 7c202998eb..246d3ec3c1 100644
--- a/engines/mohawk/detection.cpp
+++ b/engines/mohawk/detection.cpp
@@ -41,6 +41,7 @@
#ifdef ENABLE_RIVEN
#include "mohawk/riven.h"
+#include "mohawk/riven_saveload.h"
#endif
namespace Mohawk {
@@ -198,6 +199,7 @@ public:
virtual bool hasFeature(MetaEngineFeature f) const;
virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const;
virtual SaveStateList listSaves(const char *target) const;
+ SaveStateList listSavesForPrefix(const char *prefix, const char *extension) const;
virtual int getMaximumSaveSlot() const { return 999; }
virtual void removeSaveState(const char *target, int slot) const;
virtual SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const;
@@ -214,40 +216,58 @@ bool MohawkMetaEngine::hasFeature(MetaEngineFeature f) const {
|| (f == kSavesSupportPlayTime);
}
+SaveStateList MohawkMetaEngine::listSavesForPrefix(const char *prefix, const char *extension) const {
+ Common::String pattern = Common::String::format("%s-###.%s", prefix, extension);
+ Common::StringArray filenames = g_system->getSavefileManager()->listSavefiles(pattern);
+ size_t prefixLen = strlen(prefix);
+
+ SaveStateList saveList;
+ for (Common::StringArray::const_iterator filename = filenames.begin(); filename != filenames.end(); ++filename) {
+ // Extract the slot number from the filename
+ char slot[4];
+ slot[0] = (*filename)[prefixLen + 1];
+ slot[1] = (*filename)[prefixLen + 2];
+ slot[2] = (*filename)[prefixLen + 3];
+ slot[3] = '\0';
+
+ int slotNum = atoi(slot);
+
+ saveList.push_back(SaveStateDescriptor(slotNum, ""));
+ }
+
+ Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator());
+
+ return saveList;
+}
+
SaveStateList MohawkMetaEngine::listSaves(const char *target) const {
- Common::StringArray filenames;
SaveStateList saveList;
// Loading games is only supported in Myst/Riven currently.
#ifdef ENABLE_MYST
if (strstr(target, "myst")) {
- filenames = g_system->getSavefileManager()->listSavefiles("myst-###.mys");
- size_t prefixLen = sizeof("myst") - 1;
-
- for (Common::StringArray::const_iterator filename = filenames.begin(); filename != filenames.end(); ++filename) {
- // Extract the slot number from the filename
- char slot[4];
- slot[0] = (*filename)[prefixLen + 1];
- slot[1] = (*filename)[prefixLen + 2];
- slot[2] = (*filename)[prefixLen + 3];
- slot[3] = '\0';
-
- int slotNum = atoi(slot);
+ saveList = listSavesForPrefix("myst", "mys");
+ for (SaveStateList::iterator save = saveList.begin(); save != saveList.end(); ++save) {
// Read the description from the save
- Common::String description = Mohawk::MystGameState::querySaveDescription(slotNum);
- saveList.push_back(SaveStateDescriptor(slotNum, description));
+ int slot = save->getSaveSlot();
+ Common::String description = Mohawk::MystGameState::querySaveDescription(slot);
+ save->setDescription(description);
}
-
- Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator());
- } else
+ }
#endif
+#ifdef ENABLE_RIVEN
if (strstr(target, "riven")) {
- filenames = g_system->getSavefileManager()->listSavefiles("*.rvn");
+ saveList = listSavesForPrefix("riven", "rvn");
- for (uint32 i = 0; i < filenames.size(); i++)
- saveList.push_back(SaveStateDescriptor(i, filenames[i]));
+ for (SaveStateList::iterator save = saveList.begin(); save != saveList.end(); ++save) {
+ // Read the description from the save
+ int slot = save->getSaveSlot();
+ Common::String description = Mohawk::RivenSaveLoad::querySaveDescription(slot);
+ save->setDescription(description);
+ }
}
+#endif
return saveList;
}
@@ -258,18 +278,24 @@ void MohawkMetaEngine::removeSaveState(const char *target, int slot) const {
#ifdef ENABLE_MYST
if (strstr(target, "myst")) {
Mohawk::MystGameState::deleteSave(slot);
- } else
+ }
#endif
+#ifdef ENABLE_RIVEN
if (strstr(target, "riven")) {
- Common::StringArray filenames = g_system->getSavefileManager()->listSavefiles("*.rvn");
- g_system->getSavefileManager()->removeSavefile(filenames[slot].c_str());
+ Mohawk::RivenSaveLoad::deleteSave(slot);
}
+#endif
}
SaveStateDescriptor MohawkMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
#ifdef ENABLE_MYST
if (strstr(target, "myst")) {
return Mohawk::MystGameState::querySaveMetaInfos(slot);
+ }
+#endif
+#ifdef ENABLE_RIVEN
+ if (strstr(target, "riven")) {
+ return Mohawk::RivenSaveLoad::querySaveMetaInfos(slot);
} else
#endif
{
diff --git a/engines/mohawk/detection_tables.h b/engines/mohawk/detection_tables.h
index e3eab89a34..d9aba26ca3 100644
--- a/engines/mohawk/detection_tables.h
+++ b/engines/mohawk/detection_tables.h
@@ -337,6 +337,24 @@ static const MohawkGameDescription gameDescriptions[] = {
},
// Riven: The Sequel to Myst
+ // Version 1.0 (5CD), 1.02 (DVD, From "Myst: La Trilogie")
+ // From gamin
+ {
+ {
+ "riven",
+ "",
+ AD_ENTRY1("a_Data.MHK", "aff2a384aaa9a0e0ec51010f708c5c04"),
+ Common::FR_FRA,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO1(GUIO_NOASPECT)
+ },
+ GType_RIVEN,
+ 0,
+ 0,
+ },
+
+ // Riven: The Sequel to Myst
// Version 1.0 (5CD) - Italian
// From dodomorandi on bug #6629
{
@@ -425,24 +443,6 @@ static const MohawkGameDescription gameDescriptions[] = {
},
// Riven: The Sequel to Myst
- // Version ? (DVD, From "Myst: La Trilogie")
- // From gamin
- {
- {
- "riven",
- "",
- AD_ENTRY1("a_Data.MHK", "aff2a384aaa9a0e0ec51010f708c5c04"),
- Common::FR_FRA,
- Common::kPlatformWindows,
- ADGF_UNSTABLE,
- GUIO1(GUIO_NOASPECT)
- },
- GType_RIVEN,
- GF_DVD,
- 0,
- },
-
- // Riven: The Sequel to Myst
// Version 1.02 (DVD, From "Myst: Antologia")
// From pykman
{
diff --git a/engines/mohawk/myst_state.cpp b/engines/mohawk/myst_state.cpp
index 4324d6bde5..213a976413 100644
--- a/engines/mohawk/myst_state.cpp
+++ b/engines/mohawk/myst_state.cpp
@@ -120,6 +120,7 @@ bool MystGameState::load(int slot) {
_vm->changeToStack(kIntroStack, 5, 0, 0);
// Set our default cursor
+ _vm->_cursor->showCursor();
if (_globals.heldPage == 0 || _globals.heldPage > 13)
_vm->setMainCursor(kDefaultMystCursor);
else if (_globals.heldPage < 7)
diff --git a/engines/mohawk/resource.h b/engines/mohawk/resource.h
index d9074a5b73..12c5a139e4 100644
--- a/engines/mohawk/resource.h
+++ b/engines/mohawk/resource.h
@@ -68,6 +68,8 @@ namespace Mohawk {
#define ID_VARS MKTAG('V','A','R','S') // Variable Values
#define ID_VERS MKTAG('V','E','R','S') // Version Info
#define ID_ZIPS MKTAG('Z','I','P','S') // Zip Mode Status
+#define ID_META MKTAG('M','E','T','A') // ScummVM save metadata
+#define ID_THMB MKTAG('T','H','M','B') // ScummVM save thumbnail
// Zoombini Resource FourCC's
#define ID_SND MKTAG( 0 ,'S','N','D') // Standard Mohawk Sound
diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp
index 0f764aeded..aa168a38d8 100644
--- a/engines/mohawk/riven.cpp
+++ b/engines/mohawk/riven.cpp
@@ -176,13 +176,10 @@ Common::Error MohawkEngine_Riven::run() {
changeToCard(6);
} else if (ConfMan.hasKey("save_slot")) {
// Load game from launcher/command line if requested
- uint32 gameToLoad = ConfMan.getInt("save_slot");
- Common::StringArray savedGamesList = _saveLoad->generateSaveGameList();
- if (gameToLoad > savedGamesList.size())
- error ("Could not find saved game");
+ int gameToLoad = ConfMan.getInt("save_slot");
// Attempt to load the game. On failure, just send us to the main menu.
- if (_saveLoad->loadGame(savedGamesList[gameToLoad]).getCode() != Common::kNoError) {
+ if (_saveLoad->loadGame(gameToLoad).getCode() != Common::kNoError) {
changeToStack(kStackAspit);
changeToCard(1);
}
@@ -734,16 +731,11 @@ void MohawkEngine_Riven::runLoadDialog() {
}
Common::Error MohawkEngine_Riven::loadGameState(int slot) {
- return _saveLoad->loadGame(_saveLoad->generateSaveGameList()[slot]);
+ return _saveLoad->loadGame(slot);
}
Common::Error MohawkEngine_Riven::saveGameState(int slot, const Common::String &desc) {
- Common::StringArray saveList = _saveLoad->generateSaveGameList();
-
- if ((uint)slot < saveList.size())
- _saveLoad->deleteSave(saveList[slot]);
-
- return _saveLoad->saveGame(desc);
+ return _saveLoad->saveGame(slot, desc);
}
Common::String MohawkEngine_Riven::getStackName(uint16 stack) const {
diff --git a/engines/mohawk/riven_saveload.cpp b/engines/mohawk/riven_saveload.cpp
index 6af66f7a2d..755f87767d 100644
--- a/engines/mohawk/riven_saveload.cpp
+++ b/engines/mohawk/riven_saveload.cpp
@@ -24,25 +24,141 @@
#include "mohawk/riven.h"
#include "mohawk/riven_saveload.h"
-#include "common/util.h"
+#include "common/system.h"
+#include "graphics/thumbnail.h"
namespace Mohawk {
+RivenSaveMetadata::RivenSaveMetadata() {
+ saveDay = 0;
+ saveMonth = 0;
+ saveYear = 0;
+ saveHour = 0;
+ saveMinute = 0;
+ totalPlayTime = 0;
+}
+
+bool RivenSaveMetadata::sync(Common::Serializer &s) {
+ static const Common::Serializer::Version kCurrentVersion = 1;
+
+ if (!s.syncVersion(kCurrentVersion)) {
+ return false;
+ }
+
+ s.syncAsByte(saveDay);
+ s.syncAsByte(saveMonth);
+ s.syncAsUint16BE(saveYear);
+ s.syncAsByte(saveHour);
+ s.syncAsByte(saveMinute);
+ s.syncString(saveDescription);
+ s.syncAsUint32BE(totalPlayTime);
+
+ return true;
+}
+
RivenSaveLoad::RivenSaveLoad(MohawkEngine_Riven *vm, Common::SaveFileManager *saveFileMan) : _vm(vm), _saveFileMan(saveFileMan) {
}
RivenSaveLoad::~RivenSaveLoad() {
}
-Common::StringArray RivenSaveLoad::generateSaveGameList() {
- return _saveFileMan->listSavefiles("*.rvn");
+Common::String RivenSaveLoad::buildSaveFilename(const int slot) {
+ return Common::String::format("riven-%03d.rvn", slot);
+}
+
+Common::String RivenSaveLoad::querySaveDescription(const int slot) {
+ Common::String filename = buildSaveFilename(slot);
+ Common::InSaveFile *loadFile = g_system->getSavefileManager()->openForLoading(filename);
+ if (!loadFile) {
+ return "";
+ }
+
+ MohawkArchive mhk;
+ if (!mhk.openStream(loadFile)) {
+ return "";
+ }
+
+ if (!mhk.hasResource(ID_META, 1)) {
+ return "";
+ }
+
+ Common::SeekableReadStream *metaStream = mhk.getResource(ID_META, 1);
+ if (!metaStream) {
+ return "";
+ }
+
+ Common::Serializer serializer = Common::Serializer(metaStream, nullptr);
+
+ RivenSaveMetadata metadata;
+ if (!metadata.sync(serializer)) {
+ delete metaStream;
+ return "";
+ }
+
+ delete metaStream;
+
+ return metadata.saveDescription;
}
-Common::Error RivenSaveLoad::loadGame(Common::String filename) {
+SaveStateDescriptor RivenSaveLoad::querySaveMetaInfos(const int slot) {
+ Common::String filename = buildSaveFilename(slot);
+ Common::InSaveFile *loadFile = g_system->getSavefileManager()->openForLoading(filename);
+ if (!loadFile) {
+ return SaveStateDescriptor();
+ }
+
+ MohawkArchive mhk;
+ if (!mhk.openStream(loadFile)) {
+ return SaveStateDescriptor();
+ }
+
+ if (!mhk.hasResource(ID_META, 1)) {
+ return SaveStateDescriptor();
+ }
+
+ Common::SeekableReadStream *metaStream = mhk.getResource(ID_META, 1);
+ if (!metaStream) {
+ return SaveStateDescriptor();
+ }
+
+ Common::Serializer serializer = Common::Serializer(metaStream, nullptr);
+
+ RivenSaveMetadata metadata;
+ if (!metadata.sync(serializer)) {
+ delete metaStream;
+ return SaveStateDescriptor();
+ }
+
+ SaveStateDescriptor descriptor;
+ descriptor.setDescription(metadata.saveDescription);
+ descriptor.setPlayTime(metadata.totalPlayTime);
+ descriptor.setSaveDate(metadata.saveYear, metadata.saveMonth, metadata.saveDay);
+ descriptor.setSaveTime(metadata.saveHour, metadata.saveMinute);
+
+ delete metaStream;
+
+ if (!mhk.hasResource(ID_THMB, 1)) {
+ return descriptor;
+ }
+
+ Common::SeekableReadStream *thmbStream = mhk.getResource(ID_THMB, 1);
+ if (!thmbStream) {
+ return descriptor;
+ }
+
+ descriptor.setThumbnail(Graphics::loadThumbnail(*thmbStream));
+
+ delete thmbStream;
+
+ return descriptor;
+}
+
+Common::Error RivenSaveLoad::loadGame(const int slot) {
if (_vm->getFeatures() & GF_DEMO) // Don't load games in the demo
return Common::kNoError;
- Common::InSaveFile *loadFile = _saveFileMan->openForLoading(filename);
+ Common::String filename = buildSaveFilename(slot);
+ Common::InSaveFile *loadFile = _saveFileMan->openForLoading(filename);
if (!loadFile)
return Common::kReadingFailed;
@@ -72,8 +188,11 @@ Common::Error RivenSaveLoad::loadGame(Common::String filename) {
Common::Array<uint32> rawVariables;
while (!vars->eos()) {
- vars->readUint32BE(); // Unknown (Stack?)
- vars->readUint32BE(); // Unknown (0 or 1)
+ // The original engine stores the variables values in an array. All the slots in
+ // the array may not be in use, which is why it needs a reference counter and
+ // a flag to tell if the value has been set.
+ vars->readUint32BE(); // Reference counter
+ vars->readUint32BE(); // Variable initialized flag
rawVariables.push_back(vars->readUint32BE());
}
@@ -144,6 +263,20 @@ Common::Error RivenSaveLoad::loadGame(Common::String filename) {
}
delete zips;
+
+ // Load the ScummVM specific save metadata
+ if (mhk->hasResource(ID_META, 1)) {
+ Common::SeekableReadStream *metadataStream = mhk->getResource(ID_META, 1);
+ Common::Serializer serializer = Common::Serializer(metadataStream, nullptr);
+
+ RivenSaveMetadata metadata;
+ metadata.sync(serializer);
+
+ // Set the saved total play time
+ _vm->setTotalPlayTime(metadata.totalPlayTime);
+
+ delete metadataStream;
+ }
delete mhk;
return Common::kNoError;
@@ -162,14 +295,18 @@ Common::MemoryWriteStreamDynamic *RivenSaveLoad::genVARSSection() {
Common::MemoryWriteStreamDynamic *stream = new Common::MemoryWriteStreamDynamic();
for (RivenVariableMap::const_iterator it = _vm->_vars.begin(); it != _vm->_vars.end(); it++) {
- stream->writeUint32BE(0); // Unknown
- stream->writeUint32BE(0); // Unknown
+ stream->writeUint32BE(1); // Reference counter
+ stream->writeUint32BE(1); // Variable initialized flag
stream->writeUint32BE(it->_value);
}
return stream;
}
+static int stringCompareToIgnoreCase(const Common::String &s1, const Common::String &s2) {
+ return s1.compareToIgnoreCase(s2) < 0;
+}
+
Common::MemoryWriteStreamDynamic *RivenSaveLoad::genNAMESection() {
Common::MemoryWriteStreamDynamic *stream = new Common::MemoryWriteStreamDynamic();
@@ -181,8 +318,28 @@ Common::MemoryWriteStreamDynamic *RivenSaveLoad::genNAMESection() {
curPos += it->_key.size() + 1;
}
- for (uint16 i = 0; i < _vm->_vars.size(); i++)
- stream->writeUint16BE(i);
+ // The original engine does not store the variables in a HashMap, but in a "NameList"
+ // for the keys and an array for the values. The NameList data structure maintains an array
+ // of indices in the string table sorted by case insensitive key alphabetical order.
+ // It is used to perform fast key -> index lookups.
+ // ScummVM does not need the sorted array, but has to write it anyway for the saved games
+ // to be compatible with original engine.
+ Common::Array<Common::String> sortedKeys;
+ for (RivenVariableMap::const_iterator it = _vm->_vars.begin(); it != _vm->_vars.end(); it++) {
+ sortedKeys.push_back(it->_key);
+ }
+ Common::sort(sortedKeys.begin(), sortedKeys.end(), stringCompareToIgnoreCase);
+
+ for (uint i = 0; i < sortedKeys.size(); i++) {
+ uint16 varIndex = 0;
+ for (RivenVariableMap::const_iterator it = _vm->_vars.begin(); it != _vm->_vars.end(); it++) {
+ if (it->_key == sortedKeys[i]) {
+ stream->writeUint16BE(varIndex);
+ break;
+ }
+ varIndex++;
+ }
+ }
for (RivenVariableMap::const_iterator it = _vm->_vars.begin(); it != _vm->_vars.end(); it++) {
stream->write(it->_key.c_str(), it->_key.size());
@@ -206,7 +363,35 @@ Common::MemoryWriteStreamDynamic *RivenSaveLoad::genZIPSSection() {
return stream;
}
-Common::Error RivenSaveLoad::saveGame(Common::String filename) {
+Common::MemoryWriteStreamDynamic *RivenSaveLoad::genTHMBSection() const {
+ Common::MemoryWriteStreamDynamic *stream = new Common::MemoryWriteStreamDynamic();
+
+ Graphics::saveThumbnail(*stream);
+
+ return stream;
+}
+
+Common::MemoryWriteStreamDynamic *RivenSaveLoad::genMETASection(const Common::String &desc) const {
+ Common::MemoryWriteStreamDynamic *stream = new Common::MemoryWriteStreamDynamic();
+ Common::Serializer serializer = Common::Serializer(nullptr, stream);
+
+ TimeDate t;
+ _vm->_system->getTimeAndDate(t);
+
+ RivenSaveMetadata metadata;
+ metadata.saveDay = t.tm_mday;
+ metadata.saveMonth = t.tm_mon + 1;
+ metadata.saveYear = t.tm_year + 1900;
+ metadata.saveHour = t.tm_hour;
+ metadata.saveMinute = t.tm_min;
+ metadata.saveDescription = desc;
+ metadata.totalPlayTime = _vm->getTotalPlayTime();
+ metadata.sync(serializer);
+
+ return stream;
+}
+
+Common::Error RivenSaveLoad::saveGame(const int slot, const Common::String &description) {
// NOTE: This code is designed to only output a Mohawk archive
// for a Riven saved game. It's hardcoded to do this because
// (as of right now) this is the only place in the engine
@@ -214,13 +399,7 @@ Common::Error RivenSaveLoad::saveGame(Common::String filename) {
// games need this, we should think about coming up with some
// more common way of outputting resources to an archive.
- // TODO: Make these saves work with the original interpreter.
- // Not sure why they don't work yet (they still can be loaded
- // by ScummVM).
-
- // Make sure we have the right extension
- if (!filename.matchString("*.rvn", true))
- filename += ".rvn";
+ Common::String filename = buildSaveFilename(slot);
// Convert class variables to variable numbers
_vm->_vars["currentstackid"] = _vm->getCurStack();
@@ -232,16 +411,20 @@ Common::Error RivenSaveLoad::saveGame(Common::String filename) {
debug (0, "Saving game to \'%s\'", filename.c_str());
- Common::MemoryWriteStreamDynamic *versSection = genVERSSection();
+ Common::MemoryWriteStreamDynamic *metaSection = genMETASection(description);
Common::MemoryWriteStreamDynamic *nameSection = genNAMESection();
+ Common::MemoryWriteStreamDynamic *thmbSection = genTHMBSection();
Common::MemoryWriteStreamDynamic *varsSection = genVARSSection();
+ Common::MemoryWriteStreamDynamic *versSection = genVERSSection();
Common::MemoryWriteStreamDynamic *zipsSection = genZIPSSection();
// Let's calculate the file size!
- uint32 fileSize = 142;
- fileSize += versSection->size();
+ uint32 fileSize = 194;
+ fileSize += metaSection->size();
fileSize += nameSection->size();
+ fileSize += thmbSection->size();
fileSize += varsSection->size();
+ fileSize += versSection->size();
fileSize += zipsSection->size();
// MHWK Header (8 bytes - total: 8)
@@ -254,109 +437,151 @@ Common::Error RivenSaveLoad::saveGame(Common::String filename) {
saveFile->writeUint16BE(1); // Compaction -- original saves have this too
saveFile->writeUint32BE(fileSize); // Subtract off the MHWK header size
saveFile->writeUint32BE(28); // Absolute offset: right after both headers
- saveFile->writeUint16BE(70); // File Table Offset
- saveFile->writeUint16BE(44); // File Table Size (4 bytes count + 4 entries * 10 bytes per entry)
+ saveFile->writeUint16BE(102); // File Table Offset
+ saveFile->writeUint16BE(64); // File Table Size (4 bytes count + 6 entries * 10 bytes per entry)
// Type Table (4 bytes - total: 32)
- saveFile->writeUint16BE(36); // String table offset After the Type Table Entries
- saveFile->writeUint16BE(4); // 4 Type Table Entries
+ saveFile->writeUint16BE(52); // String table offset After the Type Table Entries
+ saveFile->writeUint16BE(6); // 6 Type Table Entries
- // Hardcode Entries (32 bytes - total: 64)
- saveFile->writeUint32BE(ID_VERS);
- saveFile->writeUint16BE(46); // Resource table offset
- saveFile->writeUint16BE(38); // String table offset
+ // Hardcode Entries (48 bytes - total: 80)
+ // The original engine relies on the entries being sorted by tag alphabetical order
+ // to optimize its lookup algorithm.
+ saveFile->writeUint32BE(ID_META);
+ saveFile->writeUint16BE(66); // Resource table offset
+ saveFile->writeUint16BE(54); // String table offset
saveFile->writeUint32BE(ID_NAME);
- saveFile->writeUint16BE(52);
- saveFile->writeUint16BE(40);
+ saveFile->writeUint16BE(72);
+ saveFile->writeUint16BE(56);
- saveFile->writeUint32BE(ID_VARS);
+ saveFile->writeUint32BE(ID_THMB);
+ saveFile->writeUint16BE(78);
saveFile->writeUint16BE(58);
- saveFile->writeUint16BE(42);
+
+ saveFile->writeUint32BE(ID_VARS);
+ saveFile->writeUint16BE(84);
+ saveFile->writeUint16BE(60);
+
+ saveFile->writeUint32BE(ID_VERS);
+ saveFile->writeUint16BE(90);
+ saveFile->writeUint16BE(62);
saveFile->writeUint32BE(ID_ZIPS);
+ saveFile->writeUint16BE(96);
saveFile->writeUint16BE(64);
- saveFile->writeUint16BE(44);
- // Pseudo-String Table (2 bytes - total: 66)
+ // Pseudo-String Table (2 bytes - total: 82)
saveFile->writeUint16BE(0); // We don't need a name list
- // Psuedo-Name Tables (8 bytes - total: 74)
+ // Pseudo-Name Tables (12 bytes - total: 94)
+ saveFile->writeUint16BE(0);
+ saveFile->writeUint16BE(0);
saveFile->writeUint16BE(0);
saveFile->writeUint16BE(0);
saveFile->writeUint16BE(0);
saveFile->writeUint16BE(0);
- // VERS Section (Resource Table) (6 bytes - total: 80)
+ // META Section (Resource Table) (6 bytes - total: 100)
saveFile->writeUint16BE(1);
saveFile->writeUint16BE(1);
saveFile->writeUint16BE(1);
- // NAME Section (Resource Table) (6 bytes - total: 86)
+ // NAME Section (Resource Table) (6 bytes - total: 106)
saveFile->writeUint16BE(1);
saveFile->writeUint16BE(1);
saveFile->writeUint16BE(2);
- // VARS Section (Resource Table) (6 bytes - total: 92)
+ // THMB Section (Resource Table) (6 bytes - total: 112)
saveFile->writeUint16BE(1);
saveFile->writeUint16BE(1);
saveFile->writeUint16BE(3);
- // ZIPS Section (Resource Table) (6 bytes - total: 98)
+ // VARS Section (Resource Table) (6 bytes - total: 118)
saveFile->writeUint16BE(1);
saveFile->writeUint16BE(1);
saveFile->writeUint16BE(4);
- // File Table (4 bytes - total: 102)
- saveFile->writeUint32BE(4);
+ // VERS Section (Resource Table) (6 bytes - total: 124)
+ saveFile->writeUint16BE(1);
+ saveFile->writeUint16BE(1);
+ saveFile->writeUint16BE(5);
- // VERS Section (File Table) (10 bytes - total: 112)
- saveFile->writeUint32BE(142);
- saveFile->writeUint16BE(versSection->size() & 0xFFFF);
- saveFile->writeByte((versSection->size() & 0xFF0000) >> 16);
+ // ZIPS Section (Resource Table) (6 bytes - total: 130)
+ saveFile->writeUint16BE(1);
+ saveFile->writeUint16BE(1);
+ saveFile->writeUint16BE(6);
+
+ // File Table (4 bytes - total: 134)
+ saveFile->writeUint32BE(6);
+
+ // META Section (File Table) (10 bytes - total: 144)
+ saveFile->writeUint32BE(194);
+ saveFile->writeUint16BE(metaSection->size() & 0xFFFF);
+ saveFile->writeByte((metaSection->size() & 0xFF0000) >> 16);
saveFile->writeByte(0);
saveFile->writeUint16BE(0);
- // NAME Section (File Table) (10 bytes - total: 122)
- saveFile->writeUint32BE(142 + versSection->size());
+ // NAME Section (File Table) (10 bytes - total: 154)
+ saveFile->writeUint32BE(194 + metaSection->size());
saveFile->writeUint16BE(nameSection->size() & 0xFFFF);
saveFile->writeByte((nameSection->size() & 0xFF0000) >> 16);
saveFile->writeByte(0);
saveFile->writeUint16BE(0);
- // VARS Section (File Table) (10 bytes - total: 132)
- saveFile->writeUint32BE(142 + versSection->size() + nameSection->size());
+ // THMB Section (File Table) (10 bytes - total: 164)
+ saveFile->writeUint32BE(194 + metaSection->size() + nameSection->size());
+ saveFile->writeUint16BE(thmbSection->size() & 0xFFFF);
+ saveFile->writeByte((thmbSection->size() & 0xFF0000) >> 16);
+ saveFile->writeByte(0);
+ saveFile->writeUint16BE(0);
+
+ // VARS Section (File Table) (10 bytes - total: 174)
+ saveFile->writeUint32BE(194 + metaSection->size() + nameSection->size() + thmbSection->size());
saveFile->writeUint16BE(varsSection->size() & 0xFFFF);
saveFile->writeByte((varsSection->size() & 0xFF0000) >> 16);
saveFile->writeByte(0);
saveFile->writeUint16BE(0);
- // ZIPS Section (File Table) (10 bytes - total: 142)
- saveFile->writeUint32BE(142 + versSection->size() + nameSection->size() + varsSection->size());
+ // VERS Section (File Table) (10 bytes - total: 184)
+ saveFile->writeUint32BE(194 + metaSection->size() + nameSection->size() + thmbSection->size() + varsSection->size());
+ saveFile->writeUint16BE(versSection->size() & 0xFFFF);
+ saveFile->writeByte((versSection->size() & 0xFF0000) >> 16);
+ saveFile->writeByte(0);
+ saveFile->writeUint16BE(0);
+
+ // ZIPS Section (File Table) (10 bytes - total: 194)
+ saveFile->writeUint32BE(194 + metaSection->size() + nameSection->size() + thmbSection->size() + varsSection->size() + versSection->size());
saveFile->writeUint16BE(zipsSection->size() & 0xFFFF);
saveFile->writeByte((zipsSection->size() & 0xFF0000) >> 16);
saveFile->writeByte(0);
saveFile->writeUint16BE(0);
- saveFile->write(versSection->getData(), versSection->size());
+ saveFile->write(metaSection->getData(), metaSection->size());
saveFile->write(nameSection->getData(), nameSection->size());
+ saveFile->write(thmbSection->getData(), thmbSection->size());
saveFile->write(varsSection->getData(), varsSection->size());
+ saveFile->write(versSection->getData(), versSection->size());
saveFile->write(zipsSection->getData(), zipsSection->size());
saveFile->finalize();
delete saveFile;
- delete versSection;
+ delete metaSection;
delete nameSection;
+ delete thmbSection;
delete varsSection;
+ delete versSection;
delete zipsSection;
return Common::kNoError;
}
-void RivenSaveLoad::deleteSave(Common::String saveName) {
- debug (0, "Deleting save file \'%s\'", saveName.c_str());
- _saveFileMan->removeSavefile(saveName);
+void RivenSaveLoad::deleteSave(const int slot) {
+ Common::String filename = buildSaveFilename(slot);
+
+ debug (0, "Deleting save file \'%s\'", filename.c_str());
+ g_system->getSavefileManager()->removeSavefile(filename);
}
} // End of namespace Mohawk
diff --git a/engines/mohawk/riven_saveload.h b/engines/mohawk/riven_saveload.h
index a6ddce5713..34bfbdc434 100644
--- a/engines/mohawk/riven_saveload.h
+++ b/engines/mohawk/riven_saveload.h
@@ -23,10 +23,13 @@
#ifndef MOHAWK_SAVELOAD_H
#define MOHAWK_SAVELOAD_H
+#include "common/serializer.h"
#include "common/savefile.h"
#include "common/str.h"
#include "common/memstream.h"
+#include "engines/savestate.h"
+
namespace Mohawk {
class MohawkEngine_Riven;
@@ -36,23 +39,45 @@ enum {
kDVDSaveGameVersion = 0x00010100
};
+struct RivenSaveMetadata {
+ uint8 saveDay;
+ uint8 saveMonth;
+ uint16 saveYear;
+
+ uint8 saveHour;
+ uint8 saveMinute;
+
+ uint32 totalPlayTime;
+
+ Common::String saveDescription;
+
+ RivenSaveMetadata();
+ bool sync(Common::Serializer &s);
+};
+
class RivenSaveLoad {
public:
RivenSaveLoad(MohawkEngine_Riven*, Common::SaveFileManager*);
~RivenSaveLoad();
- Common::StringArray generateSaveGameList();
- Common::Error loadGame(Common::String);
- Common::Error saveGame(Common::String);
- void deleteSave(Common::String);
+ Common::Error loadGame(const int slot);
+ Common::Error saveGame(const int slot, const Common::String &description);
+ static void deleteSave(const int slot);
+
+ static SaveStateDescriptor querySaveMetaInfos(const int slot);
+ static Common::String querySaveDescription(const int slot);
private:
MohawkEngine_Riven *_vm;
Common::SaveFileManager *_saveFileMan;
- Common::MemoryWriteStreamDynamic *genVERSSection();
+ static Common::String buildSaveFilename(const int slot);
+
Common::MemoryWriteStreamDynamic *genNAMESection();
+ Common::MemoryWriteStreamDynamic *genMETASection(const Common::String &desc) const;
+ Common::MemoryWriteStreamDynamic *genTHMBSection() const;
Common::MemoryWriteStreamDynamic *genVARSSection();
+ Common::MemoryWriteStreamDynamic *genVERSSection();
Common::MemoryWriteStreamDynamic *genZIPSSection();
};
diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp
index 2c74fe4b0c..6898745858 100644
--- a/engines/sci/console.cpp
+++ b/engines/sci/console.cpp
@@ -497,8 +497,10 @@ bool Console::cmdGetVersion(int argc, const char **argv) {
if (getSciVersion() <= SCI_VERSION_1_1) {
debugPrintf("kAnimate fastCast enabled: %s\n", g_sci->_gfxAnimate->isFastCastEnabled() ? "yes" : "no");
}
- debugPrintf("Uses palette merging: %s\n", g_sci->_gfxPalette16->isMerging() ? "yes" : "no");
- debugPrintf("Uses 16 bit color matching: %s\n", g_sci->_gfxPalette16->isUsing16bitColorMatch() ? "yes" : "no");
+ if (getSciVersion() < SCI_VERSION_2) {
+ debugPrintf("Uses palette merging: %s\n", g_sci->_gfxPalette16->isMerging() ? "yes" : "no");
+ debugPrintf("Uses 16 bit color matching: %s\n", g_sci->_gfxPalette16->isUsing16bitColorMatch() ? "yes" : "no");
+ }
debugPrintf("Resource volume version: %s\n", g_sci->getResMan()->getVolVersionDesc());
debugPrintf("Resource map version: %s\n", g_sci->getResMan()->getMapVersionDesc());
debugPrintf("Contains selector vocabulary (vocab.997): %s\n", hasVocab997 ? "yes" : "no");
@@ -1620,7 +1622,7 @@ bool Console::cmdParserNodes(int argc, const char **argv) {
bool Console::cmdSetPalette(int argc, const char **argv) {
if (argc < 2) {
- debugPrintf("Sets a palette resource\n");
+ debugPrintf("Sets a palette resource (SCI16)\n");
debugPrintf("Usage: %s <resourceId>\n", argv[0]);
debugPrintf("where <resourceId> is the number of the palette resource to set\n");
return true;
@@ -1628,6 +1630,13 @@ bool Console::cmdSetPalette(int argc, const char **argv) {
uint16 resourceId = atoi(argv[1]);
+#ifdef ENABLE_SCI32
+ if (getSciVersion() >= SCI_VERSION_2) {
+ debugPrintf("This SCI version does not support this command\n");
+ return true;
+ }
+#endif
+
_engine->_gfxPalette16->kernelSetFromResource(resourceId, true);
return true;
}
diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp
index 6b945d6f62..f5797dc106 100644
--- a/engines/sci/detection.cpp
+++ b/engines/sci/detection.cpp
@@ -107,6 +107,10 @@ static const PlainGameDescriptor s_sciGameTitles[] = {
{"pq4", "Police Quest IV: Open Season"}, // floppy is SCI2, CD SCI2.1
{"qfg4", "Quest for Glory IV: Shadows of Darkness"}, // floppy is SCI2, CD SCI2.1
// === SCI2.1 games ========================================================
+ {"hoyle5", "Hoyle Classic Games"},
+ {"hoyle5bridge", "Hoyle Bridge"},
+ {"hoyle5children", "Hoyle Children's Collection"},
+ {"hoyle5solitaire", "Hoyle Solitaire"},
{"chest", "Inside the Chest"}, // aka Behind the Developer's Shield
{"gk2", "The Beast Within: A Gabriel Knight Mystery"},
{"kq7", "King's Quest VII: The Princeless Bride"},
@@ -157,6 +161,10 @@ static const GameIdStrToEnum s_gameIdStrToEnum[] = {
{ "hoyle2", GID_HOYLE2 },
{ "hoyle3", GID_HOYLE3 },
{ "hoyle4", GID_HOYLE4 },
+ { "hoyle5", GID_HOYLE5 },
+ { "hoyle5bridge", GID_HOYLE5 },
+ { "hoyle5children", GID_HOYLE5 },
+ { "hoyle5solitaire", GID_HOYLE5 },
{ "iceman", GID_ICEMAN },
{ "inndemo", GID_INNDEMO },
{ "islandbrain", GID_ISLANDBRAIN },
@@ -397,6 +405,16 @@ static const ADExtraGuiOptionsMap optionsList[] = {
},
{
+ GAMEOPTION_ENABLE_BLACK_LINED_VIDEO,
+ {
+ _s("Enable black-lined video"),
+ _s("Draw black lines over videos to increase their apparent sharpness"),
+ "enable_black_lined_video",
+ false
+ }
+ },
+
+ {
GAMEOPTION_PREFER_DIGITAL_SFX,
{
_s("Prefer digital sound effects"),
diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h
index 2595616f71..b945b5559c 100644
--- a/engines/sci/detection_tables.h
+++ b/engines/sci/detection_tables.h
@@ -30,6 +30,7 @@ namespace Sci {
#define GAMEOPTION_SQ4_SILVER_CURSORS GUIO_GAMEOPTIONS6
#define GAMEOPTION_EGA_UNDITHER GUIO_GAMEOPTIONS7
#define GAMEOPTION_HIGH_RESOLUTION_GRAPHICS GUIO_GAMEOPTIONS8
+#define GAMEOPTION_ENABLE_BLACK_LINED_VIDEO GUIO_GAMEOPTIONS9
// SCI3 games have a different script format (in CSC files) and are currently unsupported
#define ENABLE_SCI3_GAMES
@@ -729,13 +730,22 @@ static const struct ADGameDescription SciGameDescriptions[] = {
Common::EN_ANY, Common::kPlatformDOS, 0, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#ifdef ENABLE_SCI32
+#define GUIO_GK1_FLOPPY GUIO4(GUIO_NOSPEECH, \
+ GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
+#define GUIO_GK1_CD GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
+#define GUIO_GK1_MAC GUIO_GK1_FLOPPY
+
// Gabriel Knight - English DOS Floppy
// SCI interpreter version 2.000.000
{"gk1", "", {
{"resource.map", 0, "372d059f75856afa6d73dd84cbb8913d", 10783},
{"resource.000", 0, "69b7516962510f780d38519cc15fcc7c", 13022630},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_GK1_FLOPPY },
// Gabriel Knight - English DOS Floppy (supplied my markcoolio in bug report #2723777)
// SCI interpreter version 2.000.000
@@ -743,7 +753,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "65e8c14092e4c9b3b3538b7602c8c5ec", 10783},
{"resource.000", 0, "69b7516962510f780d38519cc15fcc7c", 13022630},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_GK1_FLOPPY },
// Gabriel Knight - English DOS Floppy
// SCI interpreter version 2.000.000, VERSION file reports "1.0\nGabriel Knight\n11/22/10:33 pm\n\x1A"
@@ -751,7 +761,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "ef41df08cf2c1f680216cdbeed0f8311", 10783},
{"resource.000", 0, "69b7516962510f780d38519cc15fcc7c", 13022630},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_GK1_FLOPPY },
// Gabriel Knight - German DOS Floppy (supplied my markcoolio in bug report #2723775)
// SCI interpreter version 2.000.000
@@ -759,7 +769,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "ad6508b0296b25c07b1f58828dc33696", 10789},
{"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13077029},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_GK1_FLOPPY },
// Gabriel Knight - French DOS Floppy (supplied my kervala in bug report #3611487)
// SCI interpreter version 2.000.000
@@ -767,7 +777,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "236e36cc847cdeafdd5e5fa8cba916ed", 10801},
{"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13033072},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_GK1_FLOPPY },
// Gabriel Knight - English DOS CD (from jvprat)
// Executable scanning reports "2.000.000", VERSION file reports "01.100.000"
@@ -775,7 +785,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "372d059f75856afa6d73dd84cbb8913d", 10996},
{"resource.000", 0, "69b7516962510f780d38519cc15fcc7c", 12581736},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO4(GAMEOPTION_HIGH_RESOLUTION_GRAPHICS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO_GK1_CD },
// Gabriel Knight - English Windows CD (from jvprat)
// Executable scanning reports "2.000.000", VERSION file reports "01.100.000"
@@ -783,7 +793,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "372d059f75856afa6d73dd84cbb8913d", 10996},
{"resource.000", 0, "69b7516962510f780d38519cc15fcc7c", 12581736},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_CD | ADGF_UNSTABLE, GUIO5(GUIO_NOASPECT, GAMEOPTION_HIGH_RESOLUTION_GRAPHICS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_CD | ADGF_UNSTABLE, GUIO_GK1_CD },
// Gabriel Knight - German DOS CD (from Tobis87)
// SCI interpreter version 2.000.000
@@ -791,7 +801,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a7d3e55114c65647310373cb390815ba", 11392},
{"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13400497},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO4(GAMEOPTION_HIGH_RESOLUTION_GRAPHICS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO_GK1_CD },
// Gabriel Knight - Spanish DOS CD (from jvprat)
// Executable scanning reports "2.000.000", VERSION file reports "1.000.000, April 13, 1995"
@@ -799,7 +809,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "7cb6e9bba15b544ec7a635c45bde9953", 11404},
{"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13381599},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO4(GAMEOPTION_HIGH_RESOLUTION_GRAPHICS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO_GK1_CD },
// Gabriel Knight - French DOS CD (from Hkz)
// VERSION file reports "1.000.000, May 3, 1994"
@@ -807,7 +817,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "55f909ba93a2515042a08d8a2da8414e", 11392},
{"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13325145},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO4(GAMEOPTION_HIGH_RESOLUTION_GRAPHICS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO_GK1_CD },
// Gabriel Knight - German Windows CD (from Tobis87)
// SCI interpreter version 2.000.000
@@ -815,7 +825,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a7d3e55114c65647310373cb390815ba", 11392},
{"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13400497},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformWindows, ADGF_CD | ADGF_UNSTABLE, GUIO5(GUIO_NOASPECT, GAMEOPTION_HIGH_RESOLUTION_GRAPHICS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformWindows, ADGF_CD | ADGF_UNSTABLE, GUIO_GK1_CD },
// Gabriel Knight - Spanish Windows CD (from jvprat)
// Executable scanning reports "2.000.000", VERSION file reports "1.000.000, April 13, 1995"
@@ -823,7 +833,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "7cb6e9bba15b544ec7a635c45bde9953", 11404},
{"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13381599},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformWindows, ADGF_CD | ADGF_UNSTABLE, GUIO5(GUIO_NOASPECT, GAMEOPTION_HIGH_RESOLUTION_GRAPHICS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformWindows, ADGF_CD | ADGF_UNSTABLE, GUIO_GK1_CD },
// Gabriel Knight - English Macintosh
{"gk1", "", {
@@ -832,7 +842,19 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"Data3", 0, "f25068b408b09275d8b698866462f578", 3677599},
{"Data4", 0, "1cceebbe411b26c860a74f91c337fdf3", 3230086},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK | ADGF_UNSTABLE, GUIO_GK1_MAC },
+
+#define GUIO_GK2_DEMO GUIO5(GUIO_NOSPEECH, \
+ GUIO_NOASPECT, \
+ GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
+#define GUIO_GK2 GUIO5(GAMEOPTION_ENABLE_BLACK_LINED_VIDEO, \
+ GUIO_NOASPECT, \
+ GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
+#define GUIO_GK2_MAC GUIO_GK2
// Gabriel Knight 2 - English Windows Non-Interactive Demo
// Executable scanning reports "2.100.002"
@@ -840,7 +862,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "e0effce11c4908f4b91838741716c83d", 1351},
{"resource.000", 0, "d04cfc7f04b6f74d13025378be49ec2b", 4640330},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO_GK2_DEMO },
// Gabriel Knight 2 - English DOS (GOG version) - ressci.* merged in ressci.000
// using Enrico Rolfi's HD/DVD installer: http://gkpatches.vogons.zetafleet.com/
@@ -848,7 +870,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "b996fa1e57389a1e179a00a0049de1f4", 8110},
{"ressci.000", 0, "a19fc3604c6e5407abcf03d59ee87217", 168522221},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_GK2 },
// Gabriel Knight 2 - English DOS (from jvprat)
// Executable scanning reports "2.100.002", VERSION file reports "1.1"
@@ -866,7 +888,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.006", 0, "ce9359037277b7d7976da185c2fa0aad", 2977},
{"ressci.006", 0, "8e44e03890205a7be12f45aaba9644b4", 60659424},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_GK2 },
// Gabriel Knight 2 - French DOS (6-CDs Sierra Originals reedition)
// Executable scanning reports "2.100.002", VERSION file reports "1.0"
@@ -884,7 +906,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.006", 0, "11b2e722170b8c93fdaa5428e2c7676f", 3001},
{"ressci.006", 0, "4037d941aec39d2e654e20960429aefc", 60568486},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_GK2 },
// Gabriel Knight 2 - English Macintosh
// NOTE: This only contains disc 1 files (as well as the persistent file:
@@ -896,7 +918,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"Data4", 0, "8b843c62eb53136a855d6e0087e3cb0d", 5889553},
{"Data5", 0, "f9fcf9ab2eb13b2125c33a1cda03a093", 14349984},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK | ADGF_UNSTABLE, GUIO_GK2_MAC },
#endif // ENABLE_SCI32
@@ -1110,13 +1132,67 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+#ifdef ENABLE_SCI32
+#define GUIO_HOYLE5 GUIO3(GUIO_NOSPEECH, \
+ GUIO_NOASPECT, \
+ GUIO_NOLAUNCHLOAD)
+
+ // Hoyle 5 (Hoyle Classic Games) - Windows demo
+ {"hoyle5", "Demo", {
+ {"ressci.000", 0, "98a39ae535dd01714ac313f8ba925045", 7260363},
+ {"resmap.000", 0, "10267a1542a73d527e50f0340549088b", 4900},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO_HOYLE5 },
+
+ // Hoyle 5 (Hoyle Classic Games) - Windows
+ {"hoyle5", "", {
+ {"resource.aud", 0, "cc4a7e21dc864ae21cf823e893c279ad", 257483406},
+ {"ressci.000", 0, "55ae04012a73abc15b93debf60a7df71", 16909704},
+ {"resmap.000", 0, "daf64a91344a7934fe4374765267c2af", 5767},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_HOYLE5 },
+
+ // Hoyle Bridge - Windows
+ {"hoyle5bridge", "", {
+ {"resource.aud", 0, "cc4a7e21dc864ae21cf823e893c279ad", 257585548},
+ {"ressci.000", 0, "b83cba09229d3003df9e0c864843f962", 16842499},
+ {"resmap.000", 0, "7b3e3030b0ad5f341053c18afce7d176", 5647},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_HOYLE5 },
+
+ // Hoyle Children's Collection - Windows
+ {"hoyle5children", "", {
+ {"resource.aud", 0, "cc4a7e21dc864ae21cf823e893c279ad", 257585548},
+ {"ressci.000", 0, "fd1f7dbeebd4510cd37e171a72f2b6ad", 16824349},
+ {"resmap.000", 0, "b0fe1bcc69596e10fe5caa11d0b55b23", 5671},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_HOYLE5 },
+
+ // Hoyle Solitaire (CD version) - Windows
+ {"hoyle5solitaire", "CD", {
+ {"resource.aud", 0, "d41d8cd98f00b204e9800998ecf8427e", 0},
+ {"ressci.000", 0, "fa4eeb24b1fbf6f33739995360554485", 11628203},
+ {"resmap.000", 0, "3f63df73a49800f080775d2a9ad0e949", 3079},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_HOYLE5 },
+
+ // Hoyle Solitaire (Hard Drive version) - Windows
+ {"hoyle5solitaire", "Hard Drive", {
+ {"resource.aud", 0, "d41d8cd98f00b204e9800998ecf8427e", 0},
+ {"ressci.000", 0, "da180c67d54d4208c84a48fcd8709671", 8582335},
+ {"resmap.000", 0, "e2feb47ab16f9e22a9b6a8580d1da3f0", 3055},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_HOYLE5 },
+
+#endif // ENABLE_SCI32
+
// ImagiNation Network (INN) Demo
// SCI interpreter version 1.001.097
{"inndemo", "", {
{"resource.000", 0, "535b1b920441ec73f42eaa4ccfd47b89", 514578},
{"resource.map", 0, "333daf27c3e8a6d274a3e0061ed7cd5c", 1545},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Jones in the Fast Lane EGA - English DOS
// SCI interpreter version 1.000.172 (not 100% sure FIXME)
@@ -1709,6 +1785,15 @@ static const struct ADGameDescription SciGameDescriptions[] = {
#ifdef ENABLE_SCI32
+#define GUIO_KQ7_DEMO GUIO5(GUIO_NOSPEECH, \
+ GUIO_NOASPECT, \
+ GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
+#define GUIO_KQ7 GUIO4(GUIO_NOASPECT, \
+ GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
// King's Quest 7 - English Windows (from the King's Quest Collection)
// Executable scanning reports "2.100.002", VERSION file reports "1.4"
@@ -1716,7 +1801,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "2be9ab94429c721af8e05c507e048a15", 18697},
{"resource.000", 0, "eb63ea3a2c2469dc2d777d351c626404", 203882535},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO_KQ7 },
// King's Quest 7 - English Windows-interpreter-only (supplied by m_kiewitz)
// SCI interpreter version 2.100.002, VERSION file reports "1.51"
@@ -1725,7 +1810,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "eb63ea3a2c2469dc2d777d351c626404", 206626576},
{"resource.aud", 0, "c2a988a16053eb98c7b73a75139902a0", 217716879},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO_KQ7 },
// King's Quest 7 - German Windows-interpreter-only (supplied by markcoolio in bug report #2727402)
// SCI interpreter version 2.100.002, VERSION file reports "1.51"
@@ -1735,7 +1820,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "eb63ea3a2c2469dc2d777d351c626404", 206626576},
{"resource.aud", 0, "3f17bcaf8a9ff6a6c2d4de1a2078fdcc", 258119621},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO_KQ7 },
// King's Quest 7 - English Windows (from abevi)
// VERSION 1.65c
@@ -1743,7 +1828,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "4948e4e1506f1e1c4e1d47abfa06b7f8", 204385195},
{"resource.map", 0, "40ccafb2195301504eba2e4f4f2c7f3d", 18925},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO_KQ7 },
// King's Quest 7 - English DOS (from FRG)
// SCI interpreter version 2.100.002, VERSION file reports "2.00b"
@@ -1751,7 +1836,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "8676b0fbbd7362989a029fe72fea14c6", 18709},
{"resource.000", 0, "51c1ead1163e19a2de8f121c39df7a76", 200764100},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE | ADGF_CD, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE | ADGF_CD, GUIO_KQ7 },
// King's Quest 7 - English Windows (from FRG)
// SCI interpreter version 2.100.002, VERSION file reports "2.00b"
@@ -1759,7 +1844,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "8676b0fbbd7362989a029fe72fea14c6", 18709},
{"resource.000", 0, "51c1ead1163e19a2de8f121c39df7a76", 200764100},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO_KQ7 },
// King's Quest 7 - Spanish DOS (from jvprat)
// Executable scanning reports "2.100.002", VERSION file reports "2.00"
@@ -1767,7 +1852,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "0b62693cbe87e3aaca3e8655a437f27f", 18709},
{"resource.000", 0, "51c1ead1163e19a2de8f121c39df7a76", 200764100},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, ADGF_UNSTABLE | ADGF_CD, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, ADGF_UNSTABLE | ADGF_CD, GUIO_KQ7 },
// King's Quest 7 - English DOS Non-Interactive Demo
// SCI interpreter version 2.100.002
@@ -1775,7 +1860,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "b44f774108d63faa1d021101221c5a54", 1690},
{"resource.000", 0, "d9659d2cf0c269c6a9dc776707f5bea0", 2433827},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO_KQ7_DEMO },
// King's Quest 7 - English Windows Demo (from DrMcCoy)
// SCI interpreter version 2.100.002
@@ -1783,7 +1868,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "38e627a37a975aea40cc72b0518b0709", 18412},
{"resource.000", 0, "bad61d50aaa64298fa57a7c6ccd3bccf", 84020382},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE | ADGF_CD, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE | ADGF_CD, GUIO_KQ7_DEMO },
// King's Questions mini-game from the King's Quest Collection
// SCI interpreter version 2.000.000
@@ -2473,13 +2558,19 @@ static const struct ADGameDescription SciGameDescriptions[] = {
Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#ifdef ENABLE_SCI32
+
+#define GUIO_LSL6HIRES GUIO4(GUIO_NOASPECT, \
+ GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
+
// Larry 6 - English/German DOS CD - HIRES
// SCI interpreter version 2.100.002
{"lsl6hires", "Hi-res", {
{"resource.map", 0, "0c0804434ea62278dd15032b1947426c", 8872},
{"resource.000", 0, "9a9f4870504444cda863dd14d077a680", 18520872},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_LSL6HIRES },
// Larry 6 - German DOS CD - HIRES (provided by richiefs in bug report #2670691)
// SCI interpreter version 2.100.002
@@ -2487,7 +2578,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "badfdf446ffed569a310d2c63a249421", 8896},
{"resource.000", 0, "bd944d2b06614a5b39f1586906f0ee88", 18534274},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_LSL6HIRES },
// Larry 6 - French DOS CD - HIRES (provided by richiefs in bug report #2670691)
// SCI interpreter version 2.100.002
@@ -2495,7 +2586,18 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "d184e9aa4f2d4b5670ddb3669db82cda", 8896},
{"resource.000", 0, "bd944d2b06614a5b39f1586906f0ee88", 18538987},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_LSL6HIRES },
+
+#define GUIO_LSL7_DEMO GUIO5(GUIO_NOSPEECH, \
+ GUIO_NOASPECT, \
+ GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
+#define GUIO_LSL7 GUIO5(GAMEOPTION_ENABLE_BLACK_LINED_VIDEO, \
+ GUIO_NOASPECT, \
+ GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
// Larry 7 - English DOS Demo (provided by richiefs in bug report #2670691)
// SCI interpreter version 2.100.002
@@ -2503,7 +2605,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"ressci.000", 0, "5cc6159688b2dc03790a67c90ccc67f9", 10195878},
{"resmap.000", 0, "6a2b2811eef82e87cde91cf1de845af8", 2695},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO_LSL7_DEMO },
#ifdef ENABLE_SCI3_GAMES
// Larry 7 - English DOS CD (from spookypeanut)
@@ -2512,7 +2614,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "eae93e1b1d1ccc58b4691c371281c95d", 8188},
{"ressci.000", 0, "89353723488219e25589165d73ed663e", 66965678},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_LSL7 },
// Larry 7 - German DOS (from Tobis87)
// SCI interpreter version 3.000.000
@@ -2520,7 +2622,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "c11e6bfcfc2f2d05da47e5a7df3e9b1a", 8188},
{"ressci.000", 0, "a8c6817bb94f332ff498a71c8b47f893", 66971724},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_LSL7 },
// Larry 7 - French DOS (provided by richiefs in bug report #2670691)
// SCI interpreter version 3.000.000
@@ -2528,7 +2630,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "4407849fd52fe3efb0c30fba60cd5cd4", 8206},
{"ressci.000", 0, "dc37c3055fffbefb494ff22b145d377b", 66964472},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_LSL7 },
// Larry 7 - Italian DOS CD (from glorifindel)
// SCI interpreter version 3.000.000
@@ -2536,7 +2638,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "9852a97141f789413f29bf956052acdb", 8212},
{"ressci.000", 0, "440b9fed89590abb4e4386ed6f948ee2", 67140181},
AD_LISTEND},
- Common::IT_ITA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::IT_ITA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_LSL7 },
// Larry 7 - Spanish DOS (from the Leisure Suit Larry Collection)
// Executable scanning reports "3.000.000", VERSION file reports "1.0s"
@@ -2544,16 +2646,28 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "8f3d603e1acc834a5d598b30cdfc93f3", 8188},
{"ressci.000", 0, "32792f9bc1bf3633a88b382bb3f6e40d", 67071418},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_LSL7 },
#endif
+#define GUIO_LIGHTHOUSE_DEMO GUIO5(GUIO_NOSPEECH, \
+ GUIO_NOASPECT, \
+ GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
+#define GUIO_LIGHTHOUSE GUIO6(GAMEOPTION_ENABLE_BLACK_LINED_VIDEO, \
+ GUIO_NOSPEECH, \
+ GUIO_NOASPECT, \
+ GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
+
// Lighthouse - English Windows Demo (from jvprat)
// Executable scanning reports "2.100.002", VERSION file reports "1.00"
{"lighthouse", "Demo", {
{"resource.map", 0, "543124606352bfa5e07696ddf2a669be", 64},
{"resource.000", 0, "5d7714416b612463d750fb9c5690c859", 28952},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO_LIGHTHOUSE_DEMO },
#ifdef ENABLE_SCI3_GAMES
// Lighthouse - English Windows Demo
@@ -2562,7 +2676,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "3bdee7a16926975a4729f75cf6b80a92", 1525},
{"ressci.000", 0, "3c585827fa4a82f4c04a56a0bc52ccee", 11494351},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO_LIGHTHOUSE },
// Lighthouse - English DOS (from jvprat)
// Executable scanning reports "3.000.000", VERSION file reports "1.1"
@@ -2572,7 +2686,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.002", 0, "c68db5333f152fea6ca2dfc75cad8b34", 7573},
{"ressci.002", 0, "175468431a979b9f317c294ce3bc1430", 94628315},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_LIGHTHOUSE },
// Lighthouse - Japanese DOS (from m_kiewitz)
// Executable scanning reports "3.000.000", VERSION file reports "1.0C"
@@ -2582,7 +2696,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.002", 0, "723fc742c623d8933e5753a264324cb0", 7657},
{"ressci.002", 0, "175468431a979b9f317c294ce3bc1430", 94627469},
AD_LISTEND},
- Common::JA_JPN, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::JA_JPN, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_LIGHTHOUSE },
// Lighthouse - Spanish DOS (from jvprat)
// Executable scanning reports "3.000.000", VERSION file reports "1.1"
@@ -2592,7 +2706,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.002", 0, "e7dc85884a2417e2eff9de0c63dd65fa", 7630},
{"ressci.002", 0, "3c8d627c555b0e3e4f1d9955bc0f0df4", 94631127},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_LIGHTHOUSE },
#endif // ENABLE_SCI3_GAMES
#endif // ENABLE_SCI32
@@ -2714,13 +2828,19 @@ static const struct ADGameDescription SciGameDescriptions[] = {
Common::JA_JPN, Common::kPlatformFMTowns, ADGF_ADDENGLISH, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#ifdef ENABLE_SCI32
+
+#define GUIO_MOTHERGOOSEHIRES GUIO4(GUIO_NOASPECT, \
+ GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
+
// Mixed-Up Mother Goose Deluxe - English Windows/DOS CD (supplied by markcoolio in bug report #2723810)
// Executable scanning reports "2.100.002"
{"mothergoosehires", "", {
{"resource.map", 0, "5159a1578c4306bfe070a3e4d8c2e1d3", 4741},
{"resource.000", 0, "1926925c95d82f0999590e93b02887c5", 15150768},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_MOTHERGOOSEHIRES },
// Mixed-Up Mother Goose Deluxe - Multilingual Windows CD (English/French/German/Spanish)
// Executable scanning reports "2.100.002"
@@ -2728,7 +2848,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "ef611af561898dcfea87846919ebf3eb", 4969},
{"ressci.000", 0, "227685bc59d90821978d330713e44a7a", 17205800},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_MOTHERGOOSEHIRES },
#endif // ENABLE_SCI32
// Ms. Astro Chicken - English DOS
@@ -2740,6 +2860,20 @@ static const struct ADGameDescription SciGameDescriptions[] = {
Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#ifdef ENABLE_SCI32
+
+#define GUIO_PHANTASMAGORIA_DEMO GUIO6(GAMEOPTION_ENABLE_BLACK_LINED_VIDEO, \
+ GUIO_NOSPEECH, \
+ GUIO_NOASPECT, \
+ GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
+#define GUIO_PHANTASMAGORIA GUIO_PHANTASMAGORIA_DEMO
+#define GUIO_PHANTASMAGORIA_MAC GUIO5(GAMEOPTION_ENABLE_BLACK_LINED_VIDEO, \
+ GUIO_NOASPECT, \
+ GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
+
// Phantasmagoria - English DOS/Windows (from csnover)
// Windows executable scanning reports "2.100.002" - "Aug 06 1995"
// DOS executable scanning reports "2.100.002" - "May 24 1995"
@@ -2760,7 +2894,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.007", 0, "aa8175cfc93242af6f5e65bdceaafc0d", 7972},
//{"ressci.007", 0, "3aae6559aa1df273bc542d5ac6330d75", 25859038},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_PHANTASMAGORIA },
// Phantasmagoria - English DOS (from jvprat)
// Executable scanning reports "2.100.002", VERSION file reports "1.100.000UK"
@@ -2780,7 +2914,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.007", 0, "afbd16ea77869a720afa1c5371de107d", 7972},
//{"ressci.007", 0, "3aae6559aa1df273bc542d5ac6330d75", 25859038},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_PHANTASMAGORIA },
// Phantasmagoria - German DOS/Windows
// Windows executable scanning reports "unknown" - "Sep 19 1995 09:39:48"
@@ -2803,7 +2937,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.007", 0, "06309b8043aecb85bd507b15d16cb544", 7984},
//{"ressci.007", 0, "3aae6559aa1df273bc542d5ac6330d75", 26898681},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_PHANTASMAGORIA },
// Phantasmagoria - French DOS
// Supplied by Kervala in bug #6574
@@ -2822,7 +2956,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"ressci.006", 0, "3aae6559aa1df273bc542d5ac6330d75", 85415107},
{"resmap.007", 0, "5633960bc106c39ca91d2d8fce18fd2d", 7984},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_PHANTASMAGORIA },
// Phantasmagoria - English DOS Demo
// Executable scanning reports "2.100.002"
@@ -2830,7 +2964,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.001", 0, "416138651ea828219ca454cae18341a3", 11518},
{"ressci.001", 0, "3aae6559aa1df273bc542d5ac6330d75", 65844612},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO_PHANTASMAGORIA_DEMO },
// Phantasmagoria - English DOS/Windows (GOG version) - ressci.* merged in ressci.000
// Windows executable scanning reports "2.100.002" - "Sep 19 1995 15:09:43"
@@ -2841,7 +2975,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"ressci.000", 0, "cd5967f9b9586e3380645961c0765be3", 116822037},
{"resmap.000", 0, "3cafc1c6a53945c1f3babbfd6380c64c", 16468},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_PHANTASMAGORIA },
// Phantasmagoria - English Macintosh
// NOTE: This only contains disc 1 files (as well as the two persistent files:
@@ -2857,9 +2991,16 @@ static const struct ADGameDescription SciGameDescriptions[] = {
// Data8-12 are empty
{"Data13", 0, "6d2c450fca19a69b5af74ed5b03c0a17", 14923328},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK | ADGF_UNSTABLE, GUIO_PHANTASMAGORIA_MAC },
#ifdef ENABLE_SCI3_GAMES
+
+#define GUIO_PHANTASMAGORIA2 GUIO5(GAMEOPTION_ENABLE_BLACK_LINED_VIDEO, \
+ GUIO_NOSPEECH, \
+ GUIO_NOASPECT, \
+ GUIO_NOMIDI, \
+ GAMEOPTION_ORIGINAL_SAVELOAD)
+
// Some versions of Phantasmagoria 2 were heavily censored.
// Censored versions (data files are currently unknown to us): UK, Australia, first English release in Germany
@@ -2879,7 +3020,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.005", 0, "8bd5ceeedcbe16dfe55d1b90dcd4be84", 1942},
{"ressci.005", 0, "05f9fe2bee749659acb3cd2c90252fc5", 67905112},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_PHANTASMAGORIA2 },
// Phantasmagoria 2 - English DOS (GOG version) (supplied by littleboy in patch #1360)
// Note: Fully uncensored, basically the US release, but ressci.* merged into ressci.000
@@ -2890,7 +3031,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"ressci.000", 0, "c54f26d9f43f908151263254b6d97053", 108134481},
{"resmap.000", 0, "de154a223a9ef4ea7358b76adc38ef5b", 2956},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_PHANTASMAGORIA2 },
// Phantasmagoria 2 - German DOS/Windows (supplied by AReim1982)
// Note: Fully uncensored, but one scene is missing probably because of a mastering error (Curtis + Therese meeting near water cooler)
@@ -2910,7 +3051,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.005", 0, "2fc48a4a5a73b726994f189da51a8b2a", 1954},
{"ressci.005", 0, "e94005890d22dd3b7f605a2a7c025803", 68232146},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_PHANTASMAGORIA2 },
#endif // ENABLE_SCI3_GAMES
#endif // ENABLE_SCI32
@@ -3142,13 +3283,23 @@ static const struct ADGameDescription SciGameDescriptions[] = {
Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#ifdef ENABLE_SCI32
+
+#define GUIO_PQ4_FLOPPY GUIO4(GUIO_NOSPEECH, \
+ GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
+#define GUIO_PQ4_CD GUIO4(GAMEOPTION_HIGH_RESOLUTION_GRAPHICS, \
+ GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
+
// Police Quest 4 - English DOS CD (from the Police Quest Collection)
// Executable scanning reports "2.100.002", VERSION file reports "1.100.000"
{"pq4", "CD", {
{"resource.map", 0, "379dfe80ed6bd16c47e4b950c4722eac", 11374},
{"resource.000", 0, "fd316a09b628b7032248139003369022", 18841068},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO4(GAMEOPTION_HIGH_RESOLUTION_GRAPHICS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO_PQ4_CD },
// Police Quest 4 - German DOS CD (German text, English speech)
// Supplied by markcoolio in bug report #3392955
@@ -3156,7 +3307,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a398076371ed0e1e706c8f9fb9fc7ac5", 11386},
{"resource.000", 0, "6ff21954e0a2c5992279e7eb787c8d56", 18918747},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO4(GAMEOPTION_HIGH_RESOLUTION_GRAPHICS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO_PQ4_CD },
// Police Quest 4 - English DOS
// SCI interpreter version 2.000.000 (a guess?)
@@ -3164,7 +3315,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "aed9643158ccf01b71f359db33137f82", 9895},
{"resource.000", 0, "da383857b3be1e4514daeba2524359e0", 15141432},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_PQ4_FLOPPY },
// Police Quest 4 - French DOS (supplied by abevi in bug report #2612718)
// SCI interpreter version 2.000.000
@@ -3172,7 +3323,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "008030846edcc7c5c7a812c7f4ae4ceb", 9256},
{"resource.000", 0, "6ba98bd2e436739d87ecd2a9b99cabb4", 14730153},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_PQ4_FLOPPY },
// Police Quest 4 - German DOS (supplied by markcoolio in bug report #2723840)
// SCI interpreter version 2.000.000 (a guess?)
@@ -3180,7 +3331,18 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "2393ee728ab930b2762cb5889f9b5aff", 9256},
{"resource.000", 0, "6ba98bd2e436739d87ecd2a9b99cabb4", 14730155},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_PQ4_FLOPPY },
+
+#define GUIO_PQSWAT_DEMO GUIO5(GUIO_NOSPEECH, \
+ GUIO_NOASPECT, \
+ GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
+#define GUIO_PQSWAT GUIO5(GAMEOPTION_ENABLE_BLACK_LINED_VIDEO, \
+ GUIO_NOASPECT, \
+ GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
// Police Quest: SWAT - English DOS/Windows Demo (from jvprat)
// Executable scanning reports "2.100.002", VERSION file reports "0.001.200"
@@ -3188,7 +3350,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "8c96733ef94c21526792f7ca4e3f2120", 1648},
{"resource.000", 0, "d8892f1b8c56c8f7704325460f49b300", 3676175},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO_PQSWAT_DEMO },
// Police Quest: SWAT - English DOS (from GOG.com)
// Executable scanning reports "2.100.002", VERSION file reports "1.0c"
@@ -3196,7 +3358,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "1c2563fee189885e29d9348f37306d94", 12175},
{"ressci.000", 0, "b2e1826ca81ce2e7e764587f5a14eee9", 127149181},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_PQSWAT },
// Police Quest: SWAT - English Windows (from the Police Quest Collection)
// Executable scanning reports "2.100.002", VERSION file reports "1.0c"
@@ -3211,7 +3373,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.004", 0, "4228038906f041623e65789500b22285", 6835},
{"ressci.004", 0, "b7e619e6ecf62fe65d5116a3a422e5f0", 46223872},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_PQSWAT },
#endif // ENABLE_SCI32
// Quest for Glory 1 / Hero's Quest - English DOS 3.5" Floppy (supplied by merkur in bug report #2718784)
@@ -3569,13 +3731,22 @@ static const struct ADGameDescription SciGameDescriptions[] = {
Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#ifdef ENABLE_SCI32
+
+#define GUIO_QFG4_FLOPPY GUIO4(GUIO_NOSPEECH, \
+ GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
+#define GUIO_QFG4_CD GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
+
// Quest for Glory 4 1.1 Floppy - English DOS (supplied by markcool in bug report #2723852)
// SCI interpreter version 2.000.000 (a guess?)
{"qfg4", "", {
{"resource.map", 0, "685bdb1ed47bbbb0e5e25db392da83ce", 9301},
{"resource.000", 0, "f64fd6aa3977939a86ff30783dd677e1", 11004993},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_QFG4_FLOPPY },
// Quest for Glory 4 1.1 Floppy - English DOS (supplied by abevi in bug report #2612718)
// SCI interpreter version 2.000.000
@@ -3583,7 +3754,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "d10a4cc177d2091d744e2ad8c049b0ae", 9295},
{"resource.000", 0, "f64fd6aa3977939a86ff30783dd677e1", 11003589},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_QFG4_FLOPPY },
// Quest for Glory 4 1.1 Floppy - German DOS (supplied by markcool in bug report #2723850)
// Executable scanning reports "2.000.000", VERSION file reports "1.1"
@@ -3591,7 +3762,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "9e0abba8746f40565bc7eb5720522ecd", 9301},
{"resource.000", 0, "57f22cdc54eeb35fce1f26b31b5c3ee1", 11076197},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO_QFG4_FLOPPY },
// Quest for Glory 4 CD - English DOS/Windows (from jvprat)
// Executable scanning reports "2.100.002", VERSION file reports "1.0"
@@ -3599,7 +3770,14 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "aba367f2102e81782d961b14fbe3d630", 10246},
{"resource.000", 0, "263dce4aa34c49d3ad29bec889007b1c", 11571394},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO_QFG4_CD },
+
+#define GUIO_RAMA_DEMO GUIO5(GAMEOPTION_ENABLE_BLACK_LINED_VIDEO, \
+ GUIO_NOASPECT, \
+ GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
+#define GUIO_RAMA GUIO_RAMA_DEMO
// RAMA - English DOS/Windows Demo
// Executable scanning reports "2.100.002", VERSION file reports "000.000.008"
@@ -3607,7 +3785,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.001", 0, "775304e9b2a545156be4d94209550094", 1393},
{"ressci.001", 0, "259437fd75fdf51e8207fda8c01fa4fd", 2334384},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO_RAMA_DEMO },
#ifdef ENABLE_SCI3_GAMES
// RAMA - English Windows (from jvprat)
@@ -3620,7 +3798,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.003", 0, "31ef4c0621711585d031f0ae81707251", 1636},
{"ressci.003", 0, "2a68edd064e5e4937b5e9c74b38f2082", 6860492},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_RAMA },
// RAMA - English Windows (from Quietust, in bug report #2850645)
{"rama", "", {
@@ -3631,7 +3809,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.003", 0, "48841e4b84ef1b98b48d43566fda9e13", 1636},
{"ressci.003", 0, "2a68edd064e5e4937b5e9c74b38f2082", 6870356},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_RAMA },
// RAMA - German Windows CD (from farmboy0, in pull request 397)
{"rama", "", {
@@ -3642,7 +3820,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.003", 0, "222096000bd83a1d56577114a452cccf", 1636},
{"ressci.003", 0, "2a68edd064e5e4937b5e9c74b38f2082", 6954219},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_RAMA },
// RAMA - Italian Windows CD (from glorifindel)
// SCI interpreter version 3.000.000 (a guess?)
@@ -3650,23 +3828,29 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"ressci.001", 0, "2a68edd064e5e4937b5e9c74b38f2082", 70611091},
{"resmap.001", 0, "70ba2ff04a2b7fb2c52420ba7fbd47c2", 8338},
AD_LISTEND},
- Common::IT_ITA, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::IT_ITA, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_RAMA },
#endif // ENABLE_SCI3_GAMES
+#define GUIO_SHIVERS_DEMO GUIO4(GUIO_NOASPECT, \
+ GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
+#define GUIO_SHIVERS GUIO_SHIVERS_DEMO
+
// Shivers - English Windows (from jvprat)
// Executable scanning reports "2.100.002", VERSION file reports "1.02"
{"shivers", "", {
{"resmap.000", 0, "f2ead37749ed8f6535a2445a7d05a0cc", 46525},
{"ressci.000", 0, "4294c6d7510935f2e0a52e302073c951", 262654836},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_SHIVERS },
// Shivers - German Windows (from Tobis87)
{"shivers", "", {
{"resmap.000", 0, "f483d0a1f78334c18052e92785c3086e", 46537},
{"ressci.000", 0, "6751b144671e2deed919eb9d284b07eb", 262390692},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_SHIVERS },
// Shivers - English Windows Demo
// Executable scanning reports "2.100.002"
@@ -3674,7 +3858,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "d9e0bc5eddefcbe47f528760085d8927", 1186},
{"ressci.000", 0, "3a93c6340b54e07e65d0e5583354d186", 10505469},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO_SHIVERS },
// Shivers 2 doesn't contain SCI scripts. The whole game logic has
// been reimplemented from SCI in native code placed in DLL files.
@@ -3692,7 +3876,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "d8659188b84beaef076bd869837cd530", 634},
{"ressci.000", 0, "7fbac0807a044c9543e8ac376d200e59", 4925003},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GAMEOPTION_ENABLE_BLACK_LINED_VIDEO, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Shivers 2 - English Windows (from abevi)
// VERSION.TXT Version 1.0 (3/25/97)
@@ -3700,7 +3884,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"ressci.001", 0, "a79d03d6eb75be0a79324f14e3d2ace4", 95346793},
{"resmap.001", 0, "a4804d436d90c4ec2e46b537f5e954db", 6268},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO6(GAMEOPTION_ENABLE_BLACK_LINED_VIDEO, GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#endif
@@ -4232,13 +4416,25 @@ static const struct ADGameDescription SciGameDescriptions[] = {
Common::RU_RUS, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#ifdef ENABLE_SCI32
+
+#define GUIO_SQ6_DEMO GUIO5(GUIO_NOSPEECH, \
+ GUIO_NOASPECT, \
+ GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
+#define GUIO_SQ6 GUIO5(GAMEOPTION_ENABLE_BLACK_LINED_VIDEO, \
+ GUIO_NOASPECT, \
+ GAMEOPTION_PREFER_DIGITAL_SFX, \
+ GAMEOPTION_ORIGINAL_SAVELOAD, \
+ GAMEOPTION_FB01_MIDI)
+
// Space Quest 6 - English DOS/Win3.11 CD (from the Space Quest Collection)
// Executable scanning reports "2.100.002", VERSION file reports "1.0"
{"sq6", "", {
{"resource.map", 0, "6dddfa3a8f3a3a513ec9dfdfae955005", 10528},
{"resource.000", 0, "c4259ab7355aead07773397b1052827d", 41150806},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO_SQ6 },
// Space Quest 6 - English DOS/Win3.11 CD ver 1.11 (from FRG)
// SCI interpreter version 2.100.002 (just a guess)
@@ -4246,7 +4442,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "e0615d6e4e10e37ae42e6a2a95aaf145", 10528},
{"resource.000", 0, "c4259ab7355aead07773397b1052827d", 41150806},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO_SQ6 },
// Space Quest 6 - French DOS/Win3.11 CD (from French magazine Joystick - September 1997)
// Executable scanning reports "2.100.002", VERSION file reports "1.0"
@@ -4254,7 +4450,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "3c831625931d5079b73ae8c275f52c95", 10534},
{"resource.000", 0, "4195ca940f759424f62b90e262cc1737", 40932397},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO_SQ6 },
// Space Quest 6 - German DOS (from Tobis87, updated info from markcoolio in bug report #2723884)
// SCI interpreter version 2.100.002 (just a guess)
@@ -4262,7 +4458,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "664d797415484f85c90b1b45aedc7686", 10534},
{"resource.000", 0, "ba87ba91e5bdabb4169dd0df75777722", 40933685},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO_SQ6 },
// Space Quest 6 - English DOS/Win3.11 Interactive Demo (from FRG)
// SCI interpreter version 2.100.002 (just a guess)
@@ -4270,7 +4466,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "368f07b07433db3f819fa3fa0e5efee5", 2572},
{"resource.000", 0, "ab12724e078dea34b624e0d2a38dcd7c", 2272050},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO_SQ6_DEMO },
#endif // ENABLE_SCI32
// The Island of Dr. Brain - English DOS CD (from jvprat)
@@ -4298,13 +4494,23 @@ static const struct ADGameDescription SciGameDescriptions[] = {
Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#ifdef ENABLE_SCI32
+
+#define GUIO_TORIN_DEMO GUIO3(GUIO_NOASPECT, \
+ GUIO_NOMIDI, \
+ GAMEOPTION_ORIGINAL_SAVELOAD)
+#define GUIO_TORIN GUIO4(GAMEOPTION_ENABLE_BLACK_LINED_VIDEO, \
+ GUIO_NOASPECT, \
+ GUIO_NOMIDI, \
+ GAMEOPTION_ORIGINAL_SAVELOAD)
+#define GUIO_TORIN_MAC GUIO_TORIN
+
// Torin's Passage - English Windows Interactive Demo
// SCI interpreter version 2.100.002
{"torin", "Demo", {
{"resmap.000", 0, "9a3e172cde9963d0a969f26469318cec", 3403},
{"ressci.000", 0, "db3e290481c35c3224e9602e71e4a1f1", 5073868},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE | ADGF_CD, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE | ADGF_CD, GUIO_TORIN_DEMO },
// Torin's Passage (Multilingual) - English Windows CD
// SCI interpreter version 2.100.002
@@ -4312,7 +4518,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "bb3b0b22ff08df54fbe2d06263409be6", 9799},
{"ressci.000", 0, "693a259d346c9360f4a0c11fdaae430a", 55973887},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO_TORIN },
// Torin's Passage (Multilingual) - Spanish Windows CD (from jvprat)
// Executable scanning reports "2.100.002", VERSION file reports "1.0"
@@ -4321,7 +4527,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"ressci.000", 0, "693a259d346c9360f4a0c11fdaae430a", 55973887},
// TODO: depend on one of the patches?
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO_TORIN },
// Torin's Passage (Multilingual) - French Windows CD
// SCI interpreter version 2.100.002
@@ -4329,7 +4535,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "bb3b0b22ff08df54fbe2d06263409be6", 9799},
{"ressci.000", 0, "693a259d346c9360f4a0c11fdaae430a", 55973887},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO_TORIN },
// Torin's Passage - German Windows CD (from m_kiewitz)
// SCI interpreter version 2.100.002
@@ -4338,7 +4544,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "e55c3097329b3c53752301e01c6af2fb", 9787},
{"ressci.000", 0, "118f9bec04bfe17c4f87bbb5ddb43c18", 56127540},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO_TORIN },
// Torin's Passage (Multilingual) - German Windows CD
// SCI interpreter version 2.100.002
@@ -4346,7 +4552,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "bb3b0b22ff08df54fbe2d06263409be6", 9799},
{"ressci.000", 0, "693a259d346c9360f4a0c11fdaae430a", 55973887},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO_TORIN },
// Torin's Passage (Multilingual) - Italian Windows CD (from glorifindel)
// SCI interpreter version 2.100.002
@@ -4354,7 +4560,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "bb3b0b22ff08df54fbe2d06263409be6", 9799},
{"ressci.000", 0, "693a259d346c9360f4a0c11fdaae430a", 55973887},
AD_LISTEND},
- Common::IT_ITA, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::IT_ITA, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO_TORIN },
// Torin's Passage - French Windows (from LePhilousophe)
// SCI interpreter version 2.100.002
@@ -4362,7 +4568,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "66ed46e3e56f487e688d52f05b33d0ba", 9787},
{"ressci.000", 0, "118f9bec04bfe17c4f87bbb5ddb43c18", 56126981},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO_TORIN },
// Torin's Passage - Russian Windows CD (SoftClub official translate)
// SCI interpreter version 2.100.002
@@ -4372,7 +4578,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{ "ressci.000", 0, "e672da099fb1663b87c78abc6c8ba2a4", 130622695 },
{ "resmap.000", 0, "643859f8f2be8e7701611e29b3b65208", 9799 },
AD_LISTEND },
- Common::RU_RUS, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::RU_RUS, Common::kPlatformWindows, ADGF_UNSTABLE | ADGF_CD, GUIO_TORIN },
// Torin's Passage - English Macintosh
{"torin", "", {
@@ -4384,7 +4590,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"Data6", 0, "b639487c83d1dae0e001e700f3631566", 7594881},
{"Data7", 0, "2afd9b5434102b89610916b904c3f73a", 7627374},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK | ADGF_UNSTABLE | ADGF_CD, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK | ADGF_UNSTABLE | ADGF_CD, GUIO_TORIN_MAC },
#endif // ENABLE_SCI32
// SCI Fanmade Games
diff --git a/engines/sci/engine/file.cpp b/engines/sci/engine/file.cpp
index 0b1001bfda..156f6f51f7 100644
--- a/engines/sci/engine/file.cpp
+++ b/engines/sci/engine/file.cpp
@@ -22,6 +22,7 @@
#include "common/savefile.h"
#include "common/stream.h"
+#include "common/memstream.h"
#include "sci/sci.h"
#include "sci/engine/file.h"
@@ -32,6 +33,112 @@
namespace Sci {
+#ifdef ENABLE_SCI32
+/**
+ * A MemoryWriteStreamDynamic with additional read functionality.
+ * The read and write functions share a single stream position.
+ */
+class MemoryDynamicRWStream : public Common::MemoryWriteStreamDynamic, public Common::SeekableReadStream {
+protected:
+ bool _eos;
+public:
+ MemoryDynamicRWStream(DisposeAfterUse::Flag disposeMemory = DisposeAfterUse::NO) : MemoryWriteStreamDynamic(disposeMemory), _eos(false) { }
+
+ uint32 read(void *dataPtr, uint32 dataSize);
+
+ bool eos() const { return _eos; }
+ int32 pos() const { return _pos; }
+ int32 size() const { return _size; }
+ void clearErr() { _eos = false; Common::MemoryWriteStreamDynamic::clearErr(); }
+ bool seek(int32 offs, int whence = SEEK_SET) { return Common::MemoryWriteStreamDynamic::seek(offs, whence); }
+
+};
+
+uint32 MemoryDynamicRWStream::read(void *dataPtr, uint32 dataSize)
+{
+ // Read at most as many bytes as are still available...
+ if (dataSize > _size - _pos) {
+ dataSize = _size - _pos;
+ _eos = true;
+ }
+ memcpy(dataPtr, _ptr, dataSize);
+
+ _ptr += dataSize;
+ _pos += dataSize;
+
+ return dataSize;
+}
+
+/**
+ * A MemoryDynamicRWStream intended to re-write a file.
+ * It reads the contents of `inFile` in the constructor, and writes back
+ * the changes to `fileName` in the destructor (and when calling commit() ).
+ */
+class SaveFileRewriteStream : public MemoryDynamicRWStream {
+public:
+ SaveFileRewriteStream(Common::String fileName,
+ Common::SeekableReadStream *inFile,
+ bool truncate, bool compress);
+ virtual ~SaveFileRewriteStream();
+
+ virtual uint32 write(const void *dataPtr, uint32 dataSize) { _changed = true; return MemoryDynamicRWStream::write(dataPtr, dataSize); }
+
+ void commit(); //< Save back to disk
+
+protected:
+ Common::String _fileName;
+ bool _compress;
+ bool _changed;
+};
+
+SaveFileRewriteStream::SaveFileRewriteStream(Common::String fileName,
+ Common::SeekableReadStream *inFile,
+ bool truncate,
+ bool compress)
+: MemoryDynamicRWStream(DisposeAfterUse::YES),
+ _fileName(fileName), _compress(compress)
+{
+ if (!truncate && inFile) {
+ unsigned int s = inFile->size();
+ ensureCapacity(s);
+ inFile->read(_data, s);
+ _changed = false;
+ } else {
+ _changed = true;
+ }
+}
+
+SaveFileRewriteStream::~SaveFileRewriteStream() {
+ commit();
+}
+
+void SaveFileRewriteStream::commit() {
+ // Write contents of buffer back to file
+
+ if (_changed) {
+ Common::WriteStream *outFile = g_sci->getSaveFileManager()->openForSaving(_fileName, _compress);
+ outFile->write(_data, _size);
+ delete outFile;
+ _changed = false;
+ }
+}
+
+#endif
+
+uint findFreeFileHandle(EngineState *s) {
+ // Find a free file handle
+ uint handle = 1; // Ignore _fileHandles[0]
+ while ((handle < s->_fileHandles.size()) && s->_fileHandles[handle].isOpen())
+ handle++;
+
+ if (handle == s->_fileHandles.size()) {
+ // Hit size limit => Allocate more space
+ s->_fileHandles.resize(s->_fileHandles.size() + 1);
+ }
+
+ return handle;
+}
+
/*
* Note on how file I/O is implemented: In ScummVM, one can not create/write
* arbitrary data files, simply because many of our target platforms do not
@@ -91,6 +198,27 @@ reg_t file_open(EngineState *s, const Common::String &filename, int mode, bool u
break;
}
+#ifdef ENABLE_SCI32
+ if (mode != _K_FILE_MODE_OPEN_OR_FAIL && (
+ (g_sci->getGameId() == GID_PHANTASMAGORIA && filename == "phantsg.dir") ||
+ (g_sci->getGameId() == GID_PQSWAT && filename == "swat.dat"))) {
+ debugC(kDebugLevelFile, " -> file_open opening %s for rewriting", wrappedName.c_str());
+
+ inFile = saveFileMan->openForLoading(wrappedName);
+ // If no matching savestate exists: fall back to reading from a regular
+ // file
+ if (!inFile)
+ inFile = SearchMan.createReadStreamForMember(englishName);
+
+ SaveFileRewriteStream *stream;
+ stream = new SaveFileRewriteStream(wrappedName, inFile, mode == _K_FILE_MODE_CREATE, isCompressed);
+
+ delete inFile;
+
+ inFile = stream;
+ outFile = stream;
+ } else
+#endif
if (mode == _K_FILE_MODE_OPEN_OR_FAIL) {
// Try to open file, abort if not possible
inFile = saveFileMan->openForLoading(wrappedName);
@@ -126,15 +254,7 @@ reg_t file_open(EngineState *s, const Common::String &filename, int mode, bool u
return SIGNAL_REG;
}
- // Find a free file handle
- uint handle = 1; // Ignore _fileHandles[0]
- while ((handle < s->_fileHandles.size()) && s->_fileHandles[handle].isOpen())
- handle++;
-
- if (handle == s->_fileHandles.size()) {
- // Hit size limit => Allocate more space
- s->_fileHandles.resize(s->_fileHandles.size() + 1);
- }
+ uint handle = findFreeFileHandle(s);
s->_fileHandles[handle]._in = inFile;
s->_fileHandles[handle]._out = outFile;
@@ -252,8 +372,12 @@ FileHandle::~FileHandle() {
}
void FileHandle::close() {
- delete _in;
- delete _out;
+ // NB: It is possible _in and _out are both non-null, but
+ // then they point to the same object.
+ if (_in)
+ delete _in;
+ else
+ delete _out;
_in = 0;
_out = 0;
_name.clear();
@@ -365,119 +489,4 @@ reg_t DirSeeker::nextFile(SegManager *segMan) {
return _outbuffer;
}
-
-#ifdef ENABLE_SCI32
-
-VirtualIndexFile::VirtualIndexFile(Common::String fileName) : _fileName(fileName), _changed(false) {
- Common::SeekableReadStream *inFile = g_sci->getSaveFileManager()->openForLoading(fileName);
-
- _bufferSize = inFile->size();
- _buffer = new char[_bufferSize];
- inFile->read(_buffer, _bufferSize);
- _ptr = _buffer;
- delete inFile;
-}
-
-VirtualIndexFile::VirtualIndexFile(uint32 initialSize) : _changed(false) {
- _bufferSize = initialSize;
- _buffer = new char[_bufferSize];
- _ptr = _buffer;
-}
-
-VirtualIndexFile::~VirtualIndexFile() {
- close();
-
- _bufferSize = 0;
- delete[] _buffer;
- _buffer = 0;
-}
-
-uint32 VirtualIndexFile::read(char *buffer, uint32 size) {
- uint32 curPos = _ptr - _buffer;
- uint32 finalSize = MIN<uint32>(size, _bufferSize - curPos);
- char *localPtr = buffer;
-
- for (uint32 i = 0; i < finalSize; i++)
- *localPtr++ = *_ptr++;
-
- return finalSize;
-}
-
-uint32 VirtualIndexFile::write(const char *buffer, uint32 size) {
- _changed = true;
- uint32 curPos = _ptr - _buffer;
-
- // Check if the buffer needs to be resized
- if (curPos + size >= _bufferSize) {
- _bufferSize = curPos + size + 1;
- char *tmp = _buffer;
- _buffer = new char[_bufferSize];
- _ptr = _buffer + curPos;
- memcpy(_buffer, tmp, _bufferSize);
- delete[] tmp;
- }
-
- for (uint32 i = 0; i < size; i++)
- *_ptr++ = *buffer++;
-
- return size;
-}
-
-uint32 VirtualIndexFile::readLine(char *buffer, uint32 size) {
- uint32 startPos = _ptr - _buffer;
- uint32 bytesRead = 0;
- char *localPtr = buffer;
-
- // This is not a full-blown implementation of readLine, but it
- // suffices for Phantasmagoria
- while (startPos + bytesRead < size) {
- bytesRead++;
-
- if (*_ptr == 0 || *_ptr == 0x0A) {
- _ptr++;
- *localPtr = 0;
- return bytesRead;
- } else {
- *localPtr++ = *_ptr++;
- }
- }
-
- return bytesRead;
-}
-
-bool VirtualIndexFile::seek(int32 offset, int whence) {
- uint32 startPos = _ptr - _buffer;
- assert(offset >= 0);
-
- switch (whence) {
- case SEEK_CUR:
- assert(startPos + offset < _bufferSize);
- _ptr += offset;
- break;
- case SEEK_SET:
- assert(offset < (int32)_bufferSize);
- _ptr = _buffer + offset;
- break;
- case SEEK_END:
- assert((int32)_bufferSize - offset >= 0);
- _ptr = _buffer + (_bufferSize - offset);
- break;
- }
-
- return true;
-}
-
-void VirtualIndexFile::close() {
- if (_changed && !_fileName.empty()) {
- Common::WriteStream *outFile = g_sci->getSaveFileManager()->openForSaving(_fileName);
- outFile->write(_buffer, _bufferSize);
- delete outFile;
- }
-
- // Maintain the buffer, and seek to the beginning of it
- _ptr = _buffer;
-}
-
-#endif
-
} // End of namespace Sci
diff --git a/engines/sci/engine/file.h b/engines/sci/engine/file.h
index 54627d5228..982d7b7823 100644
--- a/engines/sci/engine/file.h
+++ b/engines/sci/engine/file.h
@@ -43,7 +43,6 @@ enum {
#define VIRTUALFILE_HANDLE_START 32000
#define VIRTUALFILE_HANDLE_SCI32SAVE 32100
-#define PHANTASMAGORIA_SAVEGAME_INDEX "phantsg.dir"
#define VIRTUALFILE_HANDLE_SCIAUDIO 32300
#define VIRTUALFILE_HANDLE_END 32300
@@ -93,50 +92,7 @@ private:
void addAsVirtualFiles(Common::String title, Common::String fileMask);
};
-
-#ifdef ENABLE_SCI32
-
-/**
- * An implementation of a virtual file that supports basic read and write
- * operations simultaneously.
- *
- * This class has been initially implemented for Phantasmagoria, which has its
- * own custom save/load code. The load code keeps checking for the existence
- * of the save index file and keeps closing and reopening it for each save
- * slot. This is notoriously slow and clumsy, and introduces noticeable delays,
- * especially for non-desktop systems. Also, its game scripts request to open
- * the index file for reading and writing with the same parameters
- * (SaveManager::setCurrentSave and SaveManager::getCurrentSave). Moreover,
- * the game scripts reopen the index file for writing in order to update it
- * and seek within it. We do not support seeking in writeable streams, and the
- * fact that our saved games are ZIP files makes this operation even more
- * expensive. Finally, the savegame index file is supposed to be expanded when
- * a new save slot is added.
- * For the aforementioned reasons, this class has been implemented, which offers
- * the basic functionality needed by the game scripts in Phantasmagoria.
- */
-class VirtualIndexFile {
-public:
- VirtualIndexFile(Common::String fileName);
- VirtualIndexFile(uint32 initialSize);
- ~VirtualIndexFile();
-
- uint32 read(char *buffer, uint32 size);
- uint32 readLine(char *buffer, uint32 size);
- uint32 write(const char *buffer, uint32 size);
- bool seek(int32 offset, int whence);
- void close();
-
-private:
- char *_buffer;
- uint32 _bufferSize;
- char *_ptr;
-
- Common::String _fileName;
- bool _changed;
-};
-
-#endif
+uint findFreeFileHandle(EngineState *s);
} // End of namespace Sci
diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp
index 2fc338b618..2afb8b73d1 100644
--- a/engines/sci/engine/kernel.cpp
+++ b/engines/sci/engine/kernel.cpp
@@ -885,8 +885,8 @@ void Kernel::loadKernelNames(GameFeatures *features) {
// how kDoSound is called from Sound::play().
// Known games that use this:
// GK2 demo
- // KQ7 1.4
- // PQ4 SWAT demo
+ // KQ7 1.4/1.51
+ // PQ:SWAT demo
// LSL6
// PQ4CD
// QFG4CD
@@ -897,7 +897,7 @@ void Kernel::loadKernelNames(GameFeatures *features) {
_kernelNames = Common::StringArray(sci2_default_knames, kKernelEntriesGk2Demo);
// OnMe is IsOnMe here, but they should be compatible
- _kernelNames[0x23] = "Robot"; // Graph in SCI2
+ _kernelNames[0x23] = g_sci->getGameId() == GID_LSL6HIRES ? "Empty" : "Robot"; // Graph in SCI2
_kernelNames[0x2e] = "Priority"; // DisposeTextBitmap in SCI2
} else {
// Normal SCI2.1 kernel table
diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h
index d95e228045..5ff4f932be 100644
--- a/engines/sci/engine/kernel.h
+++ b/engines/sci/engine/kernel.h
@@ -441,6 +441,15 @@ reg_t kDoAudioFade(EngineState *s, int argc, reg_t *argv);
reg_t kDoAudioHasSignal(EngineState *s, int argc, reg_t *argv);
reg_t kDoAudioSetLoop(EngineState *s, int argc, reg_t *argv);
+reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv);
+reg_t kPlayVMDOpen(EngineState *s, int argc, reg_t *argv);
+reg_t kPlayVMDInit(EngineState *s, int argc, reg_t *argv);
+reg_t kPlayVMDClose(EngineState *s, int argc, reg_t *argv);
+reg_t kPlayVMDPlayUntilEvent(EngineState *s, int argc, reg_t *argv);
+reg_t kPlayVMDShowCursor(EngineState *s, int argc, reg_t *argv);
+reg_t kPlayVMDSetBlackoutArea(EngineState *s, int argc, reg_t *argv);
+reg_t kPlayVMDRestrictPalette(EngineState *s, int argc, reg_t *argv);
+
reg_t kIsHiRes(EngineState *s, int argc, reg_t *argv);
reg_t kArray(EngineState *s, int argc, reg_t *argv);
reg_t kListAt(EngineState *s, int argc, reg_t *argv);
@@ -538,8 +547,17 @@ reg_t kMakeSaveCatName(EngineState *s, int argc, reg_t *argv);
reg_t kMakeSaveFileName(EngineState *s, int argc, reg_t *argv);
reg_t kSetScroll(EngineState *s, int argc, reg_t *argv);
-reg_t kPalCycle(EngineState *s, int argc, reg_t *argv);
+reg_t kPaletteSetFromResource32(EngineState *s, int argc, reg_t *argv);
+reg_t kPaletteFindColor32(EngineState *s, int argc, reg_t *argv);
reg_t kPaletteSetFade(EngineState *s, int argc, reg_t *argv);
+
+reg_t kPalCycle(EngineState *s, int argc, reg_t *argv);
+reg_t kPalCycleSetCycle(EngineState *s, int argc, reg_t *argv);
+reg_t kPalCycleDoCycle(EngineState *s, int argc, reg_t *argv);
+reg_t kPalCyclePause(EngineState *s, int argc, reg_t *argv);
+reg_t kPalCycleOn(EngineState *s, int argc, reg_t *argv);
+reg_t kPalCycleOff(EngineState *s, int argc, reg_t *argv);
+
reg_t kPalVarySetVary(EngineState *s, int argc, reg_t *argv);
reg_t kPalVarySetPercent(EngineState *s, int argc, reg_t *argv);
reg_t kPalVaryGetPercent(EngineState *s, int argc, reg_t *argv);
diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h
index dacaafe757..8a1176eed8 100644
--- a/engines/sci/engine/kernel_tables.h
+++ b/engines/sci/engine/kernel_tables.h
@@ -291,12 +291,13 @@ static const SciKernelMapSubEntry kPalVary_subops[] = {
// version, subId, function-mapping, signature, workarounds
static const SciKernelMapSubEntry kPalette_subops[] = {
- { SIG_SCIALL, 1, MAP_CALL(PaletteSetFromResource), "i(i)", NULL },
+ { SIG_SCI16, 1, MAP_CALL(PaletteSetFromResource), "i(i)", NULL },
{ SIG_SCI16, 2, MAP_CALL(PaletteSetFlag), "iii", NULL },
{ SIG_SCI16, 3, MAP_CALL(PaletteUnsetFlag), "iii", kPaletteUnsetFlag_workarounds },
#ifdef ENABLE_SCI32
+ { SIG_SCI32, 1, MAP_CALL(PaletteSetFromResource32), "i(i)", NULL },
{ SIG_SCI32, 2, MAP_CALL(PaletteSetFade), "iii", NULL },
- { SIG_SCI32, 3, MAP_CALL(PaletteFindColor), "iii", NULL },
+ { SIG_SCI32, 3, MAP_CALL(PaletteFindColor32), "iii", NULL },
#endif
{ SIG_SCI16, 4, MAP_CALL(PaletteSetIntensity), "iii(i)", NULL },
{ SIG_SCI16, 5, MAP_CALL(PaletteFindColor), "iii", NULL },
@@ -335,6 +336,16 @@ static const SciKernelMapSubEntry kFileIO_subops[] = {
#ifdef ENABLE_SCI32
// version, subId, function-mapping, signature, workarounds
+static const SciKernelMapSubEntry kPalCycle_subops[] = {
+ { SIG_SCI32, 0, MAP_CALL(PalCycleSetCycle), "iii(i)", NULL },
+ { SIG_SCI32, 1, MAP_CALL(PalCycleDoCycle), "i(i)", NULL },
+ { SIG_SCI32, 2, MAP_CALL(PalCyclePause), "(i)", NULL },
+ { SIG_SCI32, 3, MAP_CALL(PalCycleOn), "(i)", NULL },
+ { SIG_SCI32, 4, MAP_CALL(PalCycleOff), "(i)", NULL },
+ SCI_SUBOPENTRY_TERMINATOR
+};
+
+// version, subId, function-mapping, signature, workarounds
static const SciKernelMapSubEntry kSave_subops[] = {
{ SIG_SCI32, 0, MAP_CALL(SaveGame), "[r0]i[r0](r0)", NULL },
{ SIG_SCI32, 1, MAP_CALL(RestoreGame), "[r0]i[r0]", NULL },
@@ -412,6 +423,22 @@ static const SciKernelMapSubEntry kList_subops[] = {
SCI_SUBOPENTRY_TERMINATOR
};
+// There are a lot of subops to PlayVMD, but only a few of them are ever
+// actually used by games
+// version, subId, function-mapping, signature, workarounds
+static const SciKernelMapSubEntry kPlayVMD_subops[] = {
+ { SIG_SINCE_SCI21, 0, MAP_CALL(PlayVMDOpen), "r(i)(i)", NULL },
+ { SIG_SINCE_SCI21, 1, MAP_CALL(PlayVMDInit), "ii(i)(i)(ii)", NULL },
+ { SIG_SINCE_SCI21, 6, MAP_CALL(PlayVMDClose), "", NULL },
+ { SIG_SINCE_SCI21, 14, MAP_CALL(PlayVMDPlayUntilEvent), "i(i)(i)", NULL },
+ { SIG_SINCE_SCI21, 16, MAP_CALL(PlayVMDShowCursor), "i", NULL },
+ { SIG_SINCE_SCI21, 17, MAP_DUMMY(PlayVMDStartBlob), "", NULL },
+ { SIG_SINCE_SCI21, 18, MAP_DUMMY(PlayVMDStopBlobs), "", NULL },
+ { SIG_SINCE_SCI21, 21, MAP_CALL(PlayVMDSetBlackoutArea), "iiii", NULL },
+ { SIG_SINCE_SCI21, 23, MAP_CALL(PlayVMDRestrictPalette), "ii", NULL },
+ SCI_SUBOPENTRY_TERMINATOR
+};
+
// version, subId, function-mapping, signature, workarounds
static const SciKernelMapSubEntry kRemapColors_subops[] = {
{ SIG_SCI32, 0, MAP_CALL(RemapColorsOff), "(i)", NULL },
@@ -746,7 +773,7 @@ static SciKernelMapEntry s_kernelMap[] = {
{ MAP_CALL(MakeSaveCatName), SIG_EVERYWHERE, "rr", NULL, NULL },
{ MAP_CALL(MakeSaveFileName), SIG_EVERYWHERE, "rri", NULL, NULL },
{ MAP_CALL(SetScroll), SIG_EVERYWHERE, "oiiiii(i)", NULL, NULL },
- { MAP_CALL(PalCycle), SIG_EVERYWHERE, "i(.*)", NULL, NULL },
+ { MAP_CALL(PalCycle), SIG_EVERYWHERE, "(.*)", kPalCycle_subops, NULL },
// SCI2 Empty functions
@@ -792,7 +819,7 @@ static SciKernelMapEntry s_kernelMap[] = {
{ MAP_CALL(IsOnMe), SIG_EVERYWHERE, "iioi", NULL, NULL },
{ MAP_CALL(List), SIG_SINCE_SCI21, SIGFOR_ALL, "(.*)", kList_subops, NULL },
{ MAP_CALL(MulDiv), SIG_EVERYWHERE, "iii", NULL, NULL },
- { MAP_CALL(PlayVMD), SIG_EVERYWHERE, "(.*)", NULL, NULL },
+ { MAP_CALL(PlayVMD), SIG_EVERYWHERE, "(.*)", kPlayVMD_subops, NULL },
{ MAP_CALL(Robot), SIG_EVERYWHERE, "(.*)", NULL, NULL },
{ MAP_CALL(Save), SIG_EVERYWHERE, "i(.*)", kSave_subops, NULL },
{ MAP_CALL(Text), SIG_SINCE_SCI21MID, SIGFOR_ALL, "i(.*)", kText_subops, NULL },
diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp
index d604bb85d0..4508a481a0 100644
--- a/engines/sci/engine/kfile.cpp
+++ b/engines/sci/engine/kfile.cpp
@@ -29,6 +29,7 @@
#include "common/savefile.h"
#include "common/system.h"
#include "common/translation.h"
+#include "common/memstream.h"
#include "gui/saveload.h"
@@ -263,19 +264,6 @@ reg_t kFileIOOpen(EngineState *s, int argc, reg_t *argv) {
}
#ifdef ENABLE_SCI32
- if (name == PHANTASMAGORIA_SAVEGAME_INDEX) {
- if (s->_virtualIndexFile) {
- return make_reg(0, VIRTUALFILE_HANDLE_SCI32SAVE);
- } else {
- Common::String englishName = g_sci->getSciLanguageString(name, K_LANG_ENGLISH);
- Common::String wrappedName = g_sci->wrapFilename(englishName);
- if (!g_sci->getSaveFileManager()->listSavefiles(wrappedName).empty()) {
- s->_virtualIndexFile = new VirtualIndexFile(wrappedName);
- return make_reg(0, VIRTUALFILE_HANDLE_SCI32SAVE);
- }
- }
- }
-
// Shivers is trying to store savegame descriptions and current spots in
// separate .SG files, which are hardcoded in the scripts.
// Essentially, there is a normal save file, created by the executable
@@ -313,18 +301,18 @@ reg_t kFileIOOpen(EngineState *s, int argc, reg_t *argv) {
listSavegames(saves);
int savegameNr = findSavegame(saves, slotNumber - SAVEGAMEID_OFFICIALRANGE_START);
- if (!s->_virtualIndexFile) {
- // Make the virtual file buffer big enough to avoid having it grow dynamically.
- // 50 bytes should be more than enough.
- s->_virtualIndexFile = new VirtualIndexFile(50);
- }
+ int size = strlen(saves[savegameNr].name) + 2;
+ char *buf = (char *)malloc(size);
+ strcpy(buf, saves[savegameNr].name);
+ buf[size - 1] = 0; // Spot description (empty)
- s->_virtualIndexFile->seek(0, SEEK_SET);
- s->_virtualIndexFile->write(saves[savegameNr].name, strlen(saves[savegameNr].name));
- s->_virtualIndexFile->write("\0", 1);
- s->_virtualIndexFile->write("\0", 1); // Spot description (empty)
- s->_virtualIndexFile->seek(0, SEEK_SET);
- return make_reg(0, VIRTUALFILE_HANDLE_SCI32SAVE);
+ uint handle = findFreeFileHandle(s);
+
+ s->_fileHandles[handle]._in = new Common::MemoryReadStream((byte *)buf, size, DisposeAfterUse::YES);
+ s->_fileHandles[handle]._out = nullptr;
+ s->_fileHandles[handle]._name = "";
+
+ return make_reg(0, handle);
}
}
#endif
@@ -349,13 +337,6 @@ reg_t kFileIOClose(EngineState *s, int argc, reg_t *argv) {
uint16 handle = argv[0].toUint16();
-#ifdef ENABLE_SCI32
- if (handle == VIRTUALFILE_HANDLE_SCI32SAVE) {
- s->_virtualIndexFile->close();
- return SIGNAL_REG;
- }
-#endif
-
if (handle >= VIRTUALFILE_HANDLE_START) {
// it's a virtual handle? ignore it
return SIGNAL_REG;
@@ -381,17 +362,9 @@ reg_t kFileIOReadRaw(EngineState *s, int argc, reg_t *argv) {
char *buf = new char[size];
debugC(kDebugLevelFile, "kFileIO(readRaw): %d, %d", handle, size);
-#ifdef ENABLE_SCI32
- if (handle == VIRTUALFILE_HANDLE_SCI32SAVE) {
- bytesRead = s->_virtualIndexFile->read(buf, size);
- } else {
-#endif
- FileHandle *f = getFileFromHandle(s, handle);
- if (f)
- bytesRead = f->_in->read(buf, size);
-#ifdef ENABLE_SCI32
- }
-#endif
+ FileHandle *f = getFileFromHandle(s, handle);
+ if (f)
+ bytesRead = f->_in->read(buf, size);
// TODO: What happens if less bytes are read than what has
// been requested? (i.e. if bytesRead is non-zero, but still
@@ -411,20 +384,11 @@ reg_t kFileIOWriteRaw(EngineState *s, int argc, reg_t *argv) {
s->_segMan->memcpy((byte *)buf, argv[1], size);
debugC(kDebugLevelFile, "kFileIO(writeRaw): %d, %d", handle, size);
-#ifdef ENABLE_SCI32
- if (handle == VIRTUALFILE_HANDLE_SCI32SAVE) {
- s->_virtualIndexFile->write(buf, size);
+ FileHandle *f = getFileFromHandle(s, handle);
+ if (f) {
+ f->_out->write(buf, size);
success = true;
- } else {
-#endif
- FileHandle *f = getFileFromHandle(s, handle);
- if (f) {
- f->_out->write(buf, size);
- success = true;
- }
-#ifdef ENABLE_SCI32
}
-#endif
delete[] buf;
if (success)
@@ -463,13 +427,6 @@ reg_t kFileIOUnlink(EngineState *s, int argc, reg_t *argv) {
const Common::String wrappedName = g_sci->wrapFilename(name);
result = saveFileMan->removeSavefile(wrappedName);
}
-
-#ifdef ENABLE_SCI32
- if (name == PHANTASMAGORIA_SAVEGAME_INDEX) {
- delete s->_virtualIndexFile;
- s->_virtualIndexFile = 0;
- }
-#endif
} else {
const Common::String wrappedName = g_sci->wrapFilename(name);
result = saveFileMan->removeSavefile(wrappedName);
@@ -488,12 +445,7 @@ reg_t kFileIOReadString(EngineState *s, int argc, reg_t *argv) {
debugC(kDebugLevelFile, "kFileIO(readString): %d, %d", handle, maxsize);
uint32 bytesRead;
-#ifdef ENABLE_SCI32
- if (handle == VIRTUALFILE_HANDLE_SCI32SAVE)
- bytesRead = s->_virtualIndexFile->readLine(buf, maxsize);
- else
-#endif
- bytesRead = fgets_wrapper(s, buf, maxsize, handle);
+ bytesRead = fgets_wrapper(s, buf, maxsize, handle);
s->_segMan->memcpy(argv[0], (const byte*)buf, maxsize);
delete[] buf;
@@ -520,13 +472,6 @@ reg_t kFileIOWriteString(EngineState *s, int argc, reg_t *argv) {
return NULL_REG;
}
-#ifdef ENABLE_SCI32
- if (handle == VIRTUALFILE_HANDLE_SCI32SAVE) {
- s->_virtualIndexFile->write(str.c_str(), str.size());
- return NULL_REG;
- }
-#endif
-
FileHandle *f = getFileFromHandle(s, handle);
if (f) {
@@ -547,11 +492,6 @@ reg_t kFileIOSeek(EngineState *s, int argc, reg_t *argv) {
uint16 whence = argv[2].toUint16();
debugC(kDebugLevelFile, "kFileIO(seek): %d, %d, %d", handle, offset, whence);
-#ifdef ENABLE_SCI32
- if (handle == VIRTUALFILE_HANDLE_SCI32SAVE)
- return make_reg(0, s->_virtualIndexFile->seek(offset, whence));
-#endif
-
FileHandle *f = getFileFromHandle(s, handle);
if (f && f->_in) {
@@ -591,14 +531,6 @@ reg_t kFileIOFindNext(EngineState *s, int argc, reg_t *argv) {
reg_t kFileIOExists(EngineState *s, int argc, reg_t *argv) {
Common::String name = s->_segMan->getString(argv[0]);
-#ifdef ENABLE_SCI32
- // Cache the file existence result for the Phantasmagoria
- // save index file, as the game scripts keep checking for
- // its existence.
- if (name == PHANTASMAGORIA_SAVEGAME_INDEX && s->_virtualIndexFile)
- return TRUE_REG;
-#endif
-
bool exists = false;
if (g_sci->getGameId() == GID_PEPPER) {
@@ -611,6 +543,9 @@ reg_t kFileIOExists(EngineState *s, int argc, reg_t *argv) {
return NULL_REG;
}
+ // TODO: It may apparently be worth caching the existence of
+ // phantsg.dir, and possibly even keeping it open persistently
+
// Check for regular file
exists = Common::File::exists(name);
diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp
index 019a06930c..9cfe53255b 100644
--- a/engines/sci/engine/kgraphics32.cpp
+++ b/engines/sci/engine/kgraphics32.cpp
@@ -790,6 +790,19 @@ reg_t kMorphOn(EngineState *s, int argc, reg_t *argv) {
return s->r_acc;
}
+reg_t kPaletteSetFromResource32(EngineState *s, int argc, reg_t *argv) {
+ const GuiResourceId paletteId = argv[0].toUint16();
+ g_sci->_gfxPalette32->loadPalette(paletteId);
+ return s->r_acc;
+}
+
+reg_t kPaletteFindColor32(EngineState *s, int argc, reg_t *argv) {
+ const uint8 r = argv[0].toUint16();
+ const uint8 g = argv[1].toUint16();
+ const uint8 b = argv[2].toUint16();
+ return make_reg(0, g_sci->_gfxPalette32->matchColor(r, g, b));
+}
+
reg_t kPaletteSetFade(EngineState *s, int argc, reg_t *argv) {
uint16 fromColor = argv[0].toUint16();
uint16 toColor = argv[1].toUint16();
@@ -862,67 +875,57 @@ reg_t kPalVaryMergeStart(EngineState *s, int argc, reg_t *argv) {
return make_reg(0, g_sci->_gfxPalette32->getVaryPercent());
}
-enum {
- kSetCycle = 0,
- kDoCycle = 1,
- kCyclePause = 2,
- kCycleOn = 3,
- kCycleOff = 4
-};
-
reg_t kPalCycle(EngineState *s, int argc, reg_t *argv) {
- // Examples: GK1 room 480 (Bayou ritual), LSL6 room 100 (title screen)
+ if (!s)
+ return make_reg(0, getSciVersion());
+ error("not supposed to call this");
+}
- switch (argv[0].toUint16()) {
- case kSetCycle: {
- uint16 fromColor = argv[1].toUint16();
- uint16 toColor = argv[2].toUint16();
- int16 direction = argv[3].toSint16();
- uint16 delay = (argc == 4 ? 0 : argv[4].toUint16());
-
- g_sci->_gfxPalette32->setCycle(fromColor, toColor, direction, delay);
- }
- break;
- case kDoCycle: {
- uint16 fromColor = argv[1].toUint16();
- int16 speed = (argc == 2) ? 1 : argv[2].toSint16();
- g_sci->_gfxPalette32->doCycle(fromColor, speed);
- }
- break;
- case kCyclePause: {
- if (argc == 1) {
- g_sci->_gfxPalette32->cycleAllPause();
- } else {
- uint16 fromColor = argv[1].toUint16();
- g_sci->_gfxPalette32->cyclePause(fromColor);
- }
- }
- break;
- case kCycleOn: {
- if (argc == 1) {
- g_sci->_gfxPalette32->cycleAllOn();
- } else {
- uint16 fromColor = argv[1].toUint16();
- g_sci->_gfxPalette32->cycleOn(fromColor);
- }
- }
- break;
- case kCycleOff: {
- if (argc == 1) {
- g_sci->_gfxPalette32->cycleAllOff();
- } else {
- uint16 fromColor = argv[1].toUint16();
- g_sci->_gfxPalette32->cycleOff(fromColor);
- }
- break;
- }
- default:
- // In SCI2.1 there are no values above 4, so should never get here;
- // SCI just returns early if this ever happens.
- assert(false);
- break;
+reg_t kPalCycleSetCycle(EngineState *s, int argc, reg_t *argv) {
+ const uint16 fromColor = argv[0].toUint16();
+ const uint16 toColor = argv[1].toUint16();
+ const int16 direction = argv[2].toSint16();
+ const uint16 delay = argc > 3 ? argv[3].toUint16() : 0;
+
+ g_sci->_gfxPalette32->setCycle(fromColor, toColor, direction, delay);
+ return s->r_acc;
+}
+
+reg_t kPalCycleDoCycle(EngineState *s, int argc, reg_t *argv) {
+ const uint16 fromColor = argv[0].toUint16();
+ const int16 speed = argc > 1 ? argv[1].toSint16() : 1;
+
+ g_sci->_gfxPalette32->doCycle(fromColor, speed);
+ return s->r_acc;
+}
+
+reg_t kPalCyclePause(EngineState *s, int argc, reg_t *argv) {
+ if (argc == 0) {
+ g_sci->_gfxPalette32->cycleAllPause();
+ } else {
+ const uint16 fromColor = argv[0].toUint16();
+ g_sci->_gfxPalette32->cyclePause(fromColor);
}
+ return s->r_acc;
+}
+reg_t kPalCycleOn(EngineState *s, int argc, reg_t *argv) {
+ if (argc == 0) {
+ g_sci->_gfxPalette32->cycleAllOn();
+ } else {
+ const uint16 fromColor = argv[0].toUint16();
+ g_sci->_gfxPalette32->cycleOn(fromColor);
+ }
+ return s->r_acc;
+}
+
+reg_t kPalCycleOff(EngineState *s, int argc, reg_t *argv) {
+ if (argc == 0) {
+ g_sci->_gfxPalette32->cycleAllOff();
+ } else {
+ const uint16 fromColor = argv[0].toUint16();
+ g_sci->_gfxPalette32->cycleOff(fromColor);
+ }
return s->r_acc;
}
diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp
index 065625f85f..1924848717 100644
--- a/engines/sci/engine/kmisc.cpp
+++ b/engines/sci/engine/kmisc.cpp
@@ -409,6 +409,15 @@ reg_t kGetConfig(EngineState *s, int argc, reg_t *argv) {
} else if (setting == "startroom") {
// Debug setting in LSL7, specifies the room to start from.
s->_segMan->strcpy(data, "");
+ } else if (setting == "game") {
+ // Hoyle 5 startup, specifies the number of the game to start.
+ s->_segMan->strcpy(data, "");
+ } else if (setting == "laptop") {
+ // Hoyle 5 startup.
+ s->_segMan->strcpy(data, "");
+ } else if (setting == "jumpto") {
+ // Hoyle 5 startup.
+ s->_segMan->strcpy(data, "");
} else {
error("GetConfig: Unknown configuration setting %s", setting.c_str());
}
diff --git a/engines/sci/engine/kvideo.cpp b/engines/sci/engine/kvideo.cpp
index 8db0c542eb..1096e78cca 100644
--- a/engines/sci/engine/kvideo.cpp
+++ b/engines/sci/engine/kvideo.cpp
@@ -40,7 +40,8 @@
#include "video/qt_decoder.h"
#include "sci/video/seq_decoder.h"
#ifdef ENABLE_SCI32
-#include "video/coktel_decoder.h"
+#include "sci/graphics/frameout.h"
+#include "sci/graphics/video32.h"
#include "sci/video/robot_decoder.h"
#endif
@@ -289,113 +290,73 @@ reg_t kRobot(EngineState *s, int argc, reg_t *argv) {
}
reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) {
- uint16 operation = argv[0].toUint16();
- Video::VideoDecoder *videoDecoder = 0;
- bool reshowCursor = g_sci->_gfxCursor->isVisible();
- Common::String warningMsg;
-
- switch (operation) {
- case 0: // init
- s->_videoState.reset();
- s->_videoState.fileName = s->_segMan->derefString(argv[1]);
+ if (!s)
+ return make_reg(0, getSciVersion());
+ error("not supposed to call this");
+}
- if (argc > 2 && argv[2] != NULL_REG)
- warning("kPlayVMD: third parameter isn't 0 (it's %04x:%04x - %s)", PRINT_REG(argv[2]), s->_segMan->getObjectName(argv[2]));
- break;
- case 1:
- {
- // Set VMD parameters. Called with a maximum of 6 parameters:
- //
- // x, y, flags, gammaBoost, gammaFirst, gammaLast
- //
- // gammaBoost boosts palette colors in the range gammaFirst to
- // gammaLast, but only if bit 4 in flags is set. Percent value such that
- // 0% = no amplification These three parameters are optional if bit 4 is
- // clear. Also note that the x, y parameters play subtle games if used
- // with subfx 21. The subtleness has to do with creation of temporary
- // planes and positioning relative to such planes.
-
- uint16 flags = argv[3].getOffset();
- Common::String flagspec;
-
- if (argc > 3) {
- if (flags & kDoubled)
- flagspec += "doubled ";
- if (flags & kDropFrames)
- flagspec += "dropframes ";
- if (flags & kBlackLines)
- flagspec += "blacklines ";
- if (flags & kUnkBit3)
- flagspec += "bit3 ";
- if (flags & kGammaBoost)
- flagspec += "gammaboost ";
- if (flags & kHoldBlackFrame)
- flagspec += "holdblack ";
- if (flags & kHoldLastFrame)
- flagspec += "holdlast ";
- if (flags & kUnkBit7)
- flagspec += "bit7 ";
- if (flags & kStretch)
- flagspec += "stretch";
-
- warning("VMDFlags: %s", flagspec.c_str());
-
- s->_videoState.flags = flags;
- }
+reg_t kPlayVMDOpen(EngineState *s, int argc, reg_t *argv) {
+ const Common::String fileName = s->_segMan->getString(argv[0]);
+ // argv[1] is an optional cache size argument which we do not use
+ // const uint16 cacheSize = argc > 1 ? CLIP<int16>(argv[1].toSint16(), 16, 1024) : 0;
+ const VMDPlayer::OpenFlags flags = argc > 2 ? (VMDPlayer::OpenFlags)argv[2].toUint16() : VMDPlayer::kOpenFlagNone;
- warning("x, y: %d, %d", argv[1].getOffset(), argv[2].getOffset());
- s->_videoState.x = argv[1].getOffset();
- s->_videoState.y = argv[2].getOffset();
+ return make_reg(0, g_sci->_video32->getVMDPlayer().open(fileName, flags));
+}
- if (argc > 4 && flags & 16)
- warning("gammaBoost: %d%% between palette entries %d and %d", argv[4].getOffset(), argv[5].getOffset(), argv[6].getOffset());
- break;
+reg_t kPlayVMDInit(EngineState *s, int argc, reg_t *argv) {
+ const int16 x = argv[0].toSint16();
+ const int16 y = argv[1].toSint16();
+ const VMDPlayer::PlayFlags flags = argc > 2 ? (VMDPlayer::PlayFlags)argv[2].toUint16() : VMDPlayer::kPlayFlagNone;
+ int16 boostPercent;
+ int16 boostStartColor;
+ int16 boostEndColor;
+ if (argc > 5 && (flags & VMDPlayer::kPlayFlagBoost)) {
+ boostPercent = argv[3].toSint16();
+ boostStartColor = argv[4].toSint16();
+ boostEndColor = argv[5].toSint16();
+ } else {
+ boostPercent = 0;
+ boostStartColor = -1;
+ boostEndColor = -1;
}
- case 6: // Play
- videoDecoder = new Video::AdvancedVMDDecoder();
- if (s->_videoState.fileName.empty()) {
- // Happens in Lighthouse
- warning("kPlayVMD: Empty filename passed");
- return s->r_acc;
- }
+ g_sci->_video32->getVMDPlayer().init(x, y, flags, boostPercent, boostStartColor, boostEndColor);
- if (!videoDecoder->loadFile(s->_videoState.fileName)) {
- warning("Could not open VMD %s", s->_videoState.fileName.c_str());
- break;
- }
+ return make_reg(0, 0);
+}
- if (reshowCursor)
- g_sci->_gfxCursor->kernelHide();
+reg_t kPlayVMDClose(EngineState *s, int argc, reg_t *argv) {
+ return make_reg(0, g_sci->_video32->getVMDPlayer().close());
+}
- playVideo(videoDecoder, s->_videoState);
+reg_t kPlayVMDPlayUntilEvent(EngineState *s, int argc, reg_t *argv) {
+ const VMDPlayer::EventFlags flags = (VMDPlayer::EventFlags)argv[0].toUint16();
+ const int16 lastFrameNo = argc > 1 ? argv[1].toSint16() : -1;
+ const int16 yieldInterval = argc > 2 ? argv[2].toSint16() : -1;
+ return make_reg(0, g_sci->_video32->getVMDPlayer().kernelPlayUntilEvent(flags, lastFrameNo, yieldInterval));
+}
- if (reshowCursor)
- g_sci->_gfxCursor->kernelShow();
- break;
- case 23: // set video palette range
- s->_vmdPalStart = argv[1].toUint16();
- s->_vmdPalEnd = argv[2].toUint16();
- break;
- case 14:
- // Takes an additional integer parameter (e.g. 3)
- case 16:
- // Takes an additional parameter, usually 0
- case 21:
- // Looks to be setting the video size and position. Called with 4 extra integer
- // parameters (e.g. 86, 41, 235, 106)
- default:
- warningMsg = Common::String::format("PlayVMD - unsupported subop %d. Params: %d (", operation, argc);
+reg_t kPlayVMDShowCursor(EngineState *s, int argc, reg_t *argv) {
+ g_sci->_video32->getVMDPlayer().setShowCursor((bool)argv[0].toUint16());
+ return s->r_acc;
+}
- for (int i = 0; i < argc; i++) {
- warningMsg += Common::String::format("%04x:%04x", PRINT_REG(argv[i]));
- warningMsg += (i == argc - 1 ? ")" : ", ");
- }
+reg_t kPlayVMDSetBlackoutArea(EngineState *s, int argc, reg_t *argv) {
+ const int16 scriptWidth = g_sci->_gfxFrameout->getCurrentBuffer().scriptWidth;
+ const int16 scriptHeight = g_sci->_gfxFrameout->getCurrentBuffer().scriptHeight;
- warning("%s", warningMsg.c_str());
- break;
- }
+ Common::Rect blackoutArea;
+ blackoutArea.left = MAX((int16)0, argv[0].toSint16());
+ blackoutArea.top = MAX((int16)0, argv[1].toSint16());
+ blackoutArea.right = MIN(scriptWidth, (int16)(argv[2].toSint16() + 1));
+ blackoutArea.bottom = MIN(scriptHeight, (int16)(argv[3].toSint16() + 1));
+ g_sci->_video32->getVMDPlayer().setBlackoutArea(blackoutArea);
+ return s->r_acc;
+}
+reg_t kPlayVMDRestrictPalette(EngineState *s, int argc, reg_t *argv) {
+ g_sci->_video32->getVMDPlayer().restrictPalette(argv[0].toUint16(), argv[1].toUint16());
return s->r_acc;
}
diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp
index 0972aec4a4..31fb848a2c 100644
--- a/engines/sci/engine/savegame.cpp
+++ b/engines/sci/engine/savegame.cpp
@@ -398,8 +398,13 @@ void EngineState::saveLoadWithSerializer(Common::Serializer &s) {
_segMan->saveLoadWithSerializer(s);
g_sci->_soundCmd->syncPlayList(s);
- // NOTE: This will be GfxPalette32 for SCI32 engine games
- g_sci->_gfxPalette16->saveLoadWithSerializer(s);
+
+#ifdef ENABLE_SCI32
+ if (getSciVersion() >= SCI_VERSION_2) {
+ g_sci->_gfxPalette32->saveLoadWithSerializer(s);
+ } else
+#endif
+ g_sci->_gfxPalette16->saveLoadWithSerializer(s);
}
void Vocabulary::saveLoadWithSerializer(Common::Serializer &s) {
@@ -767,7 +772,7 @@ void GfxPalette32::saveLoadWithSerializer(Common::Serializer &s) {
s.syncAsSint16LE(_varyFromColor);
s.syncAsSint16LE(_varyToColor);
s.syncAsUint16LE(_varyNumTimesPaused);
- s.syncAsByte(_versionUpdated);
+ s.syncAsByte(_needsUpdate);
s.syncAsSint32LE(_varyTime);
s.syncAsUint32LE(_varyLastTick);
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp
index 70436e1269..e6eed0b4b7 100644
--- a/engines/sci/engine/script_patches.cpp
+++ b/engines/sci/engine/script_patches.cpp
@@ -1453,6 +1453,167 @@ static const SciScriptPatcherEntry kq6Signatures[] = {
};
// ===========================================================================
+
+// King's Quest 7 has really weird subtitles. It seems as if the subtitles were
+// not fully finished.
+//
+// Method kqMessager::findTalker in script 0 tries to figure out, which class to use for
+// displaying subtitles. It uses the "talker" data of the given message to do that.
+// Strangely this "talker" data seems to be quite broken.
+// For example chapter 2 starts with a cutscene.
+// Troll king: "Welcome, most beautiful of princesses!" - talker 6
+// Which is followed by the princess going
+// "Hmm?" - which is set to talker 99, normally the princess is talker 7.
+//
+// Talker 99 is seen as unknown and thus treated as "narrator", which makes
+// the scripts put the text at the top of the game screen and even use a
+// different font.
+//
+// In other cases, when the player character thinks to himself talker 99
+// is also used. In such situations it may make somewhat sense to do so,
+// but putting the text at the top of the screen is also irritating to the player.
+// It's really weird.
+//
+// The scripts also put the regular text in the middle of the screen, blocking
+// animations.
+//
+// And for certain rooms, the subtitle box may use another color
+// like for example pink/purple at the start of chapter 5.
+//
+// We fix all of that (hopefully - lots of testing is required).
+// We put the text at the bottom of the play screen.
+// We also make the scripts use the regular KQTalker instead of KQNarrator.
+// And we also make the subtitle box use color 255, which is fixed white.
+//
+// Applies to at least: PC CD 1.4 English, 1.51 English, 1.51 German, 2.00 English
+// Patched method: KQNarrator::init (script 31)
+static const uint16 kq7SignatureSubtitleFix1[] = {
+ SIG_MAGICDWORD,
+ 0x39, 0x25, // pushi 25h (fore)
+ 0x78, // push1
+ 0x39, 0x06, // pushi 06 - sets back to 6
+ 0x39, 0x26, // pushi 26 (back)
+ 0x78, // push1
+ 0x78, // push1 - sets back to 1
+ 0x39, 0x2a, // pushi 2Ah (font)
+ 0x78, // push1
+ 0x89, 0x16, // lsg global[16h] - sets font to global[16h]
+ 0x7a, // push2 (y)
+ 0x78, // push1
+ 0x76, // push0 - sets y to 0
+ 0x54, SIG_UINT16(0x0018), // self 18h
+ SIG_END
+};
+
+static const uint16 kq7PatchSubtitleFix1[] = {
+ 0x33, 0x12, // jmp [skip special init code]
+ PATCH_END
+};
+
+// Applies to at least: PC CD 1.51 English, 1.51 German, 2.00 English
+// Patched method: Narrator::init (script 64928)
+static const uint16 kq7SignatureSubtitleFix2[] = {
+ SIG_MAGICDWORD,
+ 0x89, 0x5a, // lsg global[5a]
+ 0x35, 0x02, // ldi 02
+ 0x12, // and
+ 0x31, 0x1e, // bnt [skip audio volume code]
+ 0x38, SIG_ADDTOOFFSET(+2), // pushi masterVolume (0212h for 2.00, 0219h for 1.51)
+ 0x76, // push0
+ 0x81, 0x01, // lag global[1]
+ 0x4a, 0x04, 0x00, // send 04
+ 0x65, 0x32, // aTop curVolume
+ 0x38, SIG_ADDTOOFFSET(+2), // pushi masterVolume (0212h for 2.00, 0219h for 1.51)
+ 0x78, // push1
+ 0x67, 0x32, // pTos curVolume
+ 0x35, 0x02, // ldi 02
+ 0x06, // mul
+ 0x36, // push
+ 0x35, 0x03, // ldi 03
+ 0x08, // div
+ 0x36, // push
+ 0x81, 0x01, // lag global[1]
+ 0x4a, 0x06, 0x00, // send 06
+ // end of volume code
+ 0x35, 0x01, // ldi 01
+ 0x65, 0x28, // aTop initialized
+ SIG_END
+};
+
+static const uint16 kq7PatchSubtitleFix2[] = {
+ PATCH_ADDTOOFFSET(+5), // skip to bnt
+ 0x31, 0x1b, // bnt [skip audio volume code]
+ PATCH_ADDTOOFFSET(+15), // right after "aTop curVolume / pushi masterVolume / push1"
+ 0x7a, // push2
+ 0x06, // mul (saves 3 bytes in total)
+ 0x36, // push
+ 0x35, 0x03, // ldi 03
+ 0x08, // div
+ 0x36, // push
+ 0x81, 0x01, // lag global[1]
+ 0x4a, 0x06, 0x00, // send 06
+ // end of volume code
+ 0x35, 118, // ldi 118d
+ 0x65, 0x16, // aTop y
+ 0x78, // push1 (saves 1 byte)
+ 0x69, 0x28, // sTop initialized
+ PATCH_END
+};
+
+// Applies to at least: PC CD 1.51 English, 1.51 German, 2.00 English
+// Patched method: Narrator::say (script 64928)
+static const uint16 kq7SignatureSubtitleFix3[] = {
+ SIG_MAGICDWORD,
+ 0x63, 0x28, // pToa initialized
+ 0x18, // not
+ 0x31, 0x07, // bnt [skip init code]
+ 0x38, SIG_ADDTOOFFSET(+2), // pushi init (008Eh for 2.00, 0093h for 1.51)
+ 0x76, // push0
+ 0x54, SIG_UINT16(0x0004), // self 04
+ // end of init code
+ 0x8f, 0x00, // lsp param[0]
+ 0x35, 0x01, // ldi 01
+ 0x1e, // gt?
+ 0x31, 0x08, // bnt [set acc to 0]
+ 0x87, 0x02, // lap param[2]
+ 0x31, 0x04, // bnt [set acc to 0]
+ 0x87, 0x02, // lap param[2]
+ 0x33, 0x02, // jmp [over set acc to 0 code]
+ 0x35, 0x00, // ldi 00
+ 0x65, 0x18, // aTop caller
+ SIG_END
+};
+
+static const uint16 kq7PatchSubtitleFix3[] = {
+ PATCH_ADDTOOFFSET(+2), // skip over "pToa initialized code"
+ 0x2f, 0x0c, // bt [skip init code] - saved 1 byte
+ 0x38,
+ PATCH_GETORIGINALBYTE(+6),
+ PATCH_GETORIGINALBYTE(+7), // pushi (init)
+ 0x76, // push0
+ 0x54, PATCH_UINT16(0x0004), // self 04
+ // additionally set background color here (5 bytes)
+ 0x34, PATCH_UINT16(255), // pushi 255d
+ 0x65, 0x2e, // aTop back
+ // end of init code
+ 0x8f, 0x00, // lsp param[0]
+ 0x35, 0x01, // ldi 01 - this may get optimized to get another byte
+ 0x1e, // gt?
+ 0x31, 0x04, // bnt [set acc to 0]
+ 0x87, 0x02, // lap param[2]
+ 0x2f, 0x02, // bt [over set acc to 0 code]
+ PATCH_END
+};
+
+// script, description, signature patch
+static const SciScriptPatcherEntry kq7Signatures[] = {
+ { true, 31, "subtitle fix 1/3", 1, kq7SignatureSubtitleFix1, kq7PatchSubtitleFix1 },
+ { true, 64928, "subtitle fix 2/3", 1, kq7SignatureSubtitleFix2, kq7PatchSubtitleFix2 },
+ { true, 64928, "subtitle fix 3/3", 1, kq7SignatureSubtitleFix3, kq7PatchSubtitleFix3 },
+ SCI_SIGNATUREENTRY_TERMINATOR
+};
+
+// ===========================================================================
// Script 210 in the German version of Longbow handles the case where Robin
// hands out the scroll to Marion and then types his name using the hand code.
// The German version script contains a typo (probably a copy/paste error),
@@ -1506,9 +1667,9 @@ static const uint16 longbowPatchShowHandCode[] = {
// that's why I rather patched the code, that uses the locals for a lookup.
// Which means it doesn't matter anymore when those locals are overwritten.
//
-// Applies to at least: English PC floppy, German PC floppy (not tested), English Amiga floppy
+// Applies to at least: English PC floppy, German PC floppy, English Amiga floppy
// Responsible method: export 2 of script 225
-// Fixes bug: #6571
+// Fixes bug: #6751
static const uint16 longbowSignatureBerryBushFix[] = {
0x89, 0x70, // lsg global[70h]
0x35, 0x03, // ldi 03h
@@ -4453,6 +4614,9 @@ void ScriptPatcher::processScript(uint16 scriptNr, byte *scriptData, const uint3
case GID_KQ6:
signatureTable = kq6Signatures;
break;
+ case GID_KQ7:
+ signatureTable = kq7Signatures;
+ break;
case GID_LAURABOW:
signatureTable = laurabow1Signatures;
break;
diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp
index fda78317b5..2c85907628 100644
--- a/engines/sci/engine/state.cpp
+++ b/engines/sci/engine/state.cpp
@@ -70,9 +70,6 @@ static const uint16 s_halfWidthSJISMap[256] = {
EngineState::EngineState(SegManager *segMan)
: _segMan(segMan),
-#ifdef ENABLE_SCI32
- _virtualIndexFile(0),
-#endif
_dirseeker() {
reset(false);
@@ -80,9 +77,6 @@ EngineState::EngineState(SegManager *segMan)
EngineState::~EngineState() {
delete _msgState;
-#ifdef ENABLE_SCI32
- delete _virtualIndexFile;
-#endif
}
void EngineState::reset(bool isRestoring) {
diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h
index cf9a753f5c..dd8d76f002 100644
--- a/engines/sci/engine/state.h
+++ b/engines/sci/engine/state.h
@@ -131,10 +131,6 @@ public:
int16 _lastSaveVirtualId; // last virtual id fed to kSaveGame, if no kGetSaveFiles was called inbetween
int16 _lastSaveNewId; // last newly created filename-id by kSaveGame
-#ifdef ENABLE_SCI32
- VirtualIndexFile *_virtualIndexFile;
-#endif
-
// see detection.cpp / SciEngine::loadGameState()
bool _delayedRestoreGame; // boolean, that triggers delayed restore (triggered by ScummVM menu)
int _delayedRestoreGameId; // the saved game id, that it supposed to get restored (triggered by ScummVM menu)
@@ -205,6 +201,7 @@ public:
uint16 _memorySegmentSize;
byte _memorySegment[kMemorySegmentMax];
+ // TODO: Excise video code from the state manager
VideoState _videoState;
uint16 _vmdPalStart, _vmdPalEnd;
bool _syncedAudioOptions;
diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp
index 2a2540b470..f304f774af 100644
--- a/engines/sci/engine/workarounds.cpp
+++ b/engines/sci/engine/workarounds.cpp
@@ -298,6 +298,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = {
{ GID_KQ6, -1, 907, 0, "tomato", "doVerb", NULL, 2, { WORKAROUND_FAKE, 0 } }, // when looking at the rotten tomato in the inventory - bug #5331
{ GID_KQ6, -1, 928, 0, NULL, "startText", NULL, 0, { WORKAROUND_FAKE, 0 } }, // gets caused by Text+Audio support (see script patcher)
{ GID_KQ7, -1, 64996, 0, "User", "handleEvent", NULL, 1, { WORKAROUND_FAKE, 0 } }, // called when pushing a keyboard key
+ { GID_KQ7, 2450, 2450, 0, "exBridge", "handleEvent", NULL, 0, { WORKAROUND_FAKE, 0 } }, // called when walking up to the throne in the cave in chapter 2
{ GID_LAURABOW, 37, 0, 0, "CB1", "doit", NULL, 1, { WORKAROUND_FAKE, 0 } }, // when going up the stairs - bug #5084
{ GID_LAURABOW, -1, 967, 0, "myIcon", "cycle", NULL, 1, { WORKAROUND_FAKE, 0 } }, // having any portrait conversation coming up - initial bug #4971
{ GID_LAURABOW2, -1, 24, 0, "gcWin", "open", NULL, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu
diff --git a/engines/sci/graphics/celobj32.cpp b/engines/sci/graphics/celobj32.cpp
index f8cd5fd171..48de054a31 100644
--- a/engines/sci/graphics/celobj32.cpp
+++ b/engines/sci/graphics/celobj32.cpp
@@ -83,9 +83,11 @@ const CelScalerTable *CelScaler::getScalerTable(const Ratio &scaleX, const Ratio
#pragma mark -
#pragma mark CelObj
+bool CelObj::_drawBlackLines = false;
void CelObj::init() {
CelObj::deinit();
+ _drawBlackLines = false;
_nextCacheId = 1;
_scaler = new CelScaler();
_cache = new CelCache;
@@ -407,6 +409,7 @@ void CelObj::draw(Buffer &target, const ScreenItem &screenItem, const Common::Re
const Common::Point &scaledPosition = screenItem._scaledPosition;
const Ratio &scaleX = screenItem._ratioX;
const Ratio &scaleY = screenItem._ratioY;
+ _drawBlackLines = screenItem._drawBlackLines;
if (_remap) {
// NOTE: In the original code this check was `g_Remap_numActiveRemaps && _remap`,
@@ -488,6 +491,8 @@ void CelObj::draw(Buffer &target, const ScreenItem &screenItem, const Common::Re
}
}
}
+
+ _drawBlackLines = false;
}
void CelObj::draw(Buffer &target, const ScreenItem &screenItem, const Common::Rect &targetRect, bool mirrorX) {
@@ -565,12 +570,7 @@ uint8 CelObj::readPixel(uint16 x, const uint16 y, bool mirrorX) const {
void CelObj::submitPalette() const {
if (_hunkPaletteOffset) {
- Palette palette;
-
- byte *res = getResPointer();
- // NOTE: In SCI engine this uses HunkPalette::Init.
- // TODO: Use a better size value
- g_sci->_gfxPalette32->createFromData(res + _hunkPaletteOffset, 999999, &palette);
+ HunkPalette palette(getResPointer() + _hunkPaletteOffset);
g_sci->_gfxPalette32->submit(palette);
}
}
@@ -627,7 +627,7 @@ void CelObj::putCopyInCache(const int cacheIndex) const {
#pragma mark -
#pragma mark CelObj - Drawing
-template<typename MAPPER, typename SCALER>
+template<typename MAPPER, typename SCALER, bool DRAW_BLACK_LINES>
struct RENDERER {
MAPPER &_mapper;
SCALER &_scaler;
@@ -645,6 +645,12 @@ struct RENDERER {
const int16 targetWidth = targetRect.width();
const int16 targetHeight = targetRect.height();
for (int16 y = 0; y < targetHeight; ++y) {
+ if (DRAW_BLACK_LINES && (y % 2) == 0) {
+ memset(targetPixel, 0, targetWidth);
+ targetPixel += targetWidth + skipStride;
+ continue;
+ }
+
_scaler.setTarget(targetRect.left, targetRect.top + y);
for (int16 x = 0; x < targetWidth; ++x) {
@@ -661,7 +667,7 @@ void CelObj::render(Buffer &target, const Common::Rect &targetRect, const Common
MAPPER mapper;
SCALER scaler(*this, targetRect.left - scaledPosition.x + targetRect.width(), scaledPosition);
- RENDERER<MAPPER, SCALER> renderer(mapper, scaler, _transparentColor);
+ RENDERER<MAPPER, SCALER, false> renderer(mapper, scaler, _transparentColor);
renderer.draw(target, targetRect, scaledPosition);
}
@@ -670,8 +676,13 @@ void CelObj::render(Buffer &target, const Common::Rect &targetRect, const Common
MAPPER mapper;
SCALER scaler(*this, targetRect, scaledPosition, scaleX, scaleY);
- RENDERER<MAPPER, SCALER> renderer(mapper, scaler, _transparentColor);
- renderer.draw(target, targetRect, scaledPosition);
+ if (_drawBlackLines) {
+ RENDERER<MAPPER, SCALER, true> renderer(mapper, scaler, _transparentColor);
+ renderer.draw(target, targetRect, scaledPosition);
+ } else {
+ RENDERER<MAPPER, SCALER, false> renderer(mapper, scaler, _transparentColor);
+ renderer.draw(target, targetRect, scaledPosition);
+ }
}
void dummyFill(Buffer &target, const Common::Rect &targetRect) {
diff --git a/engines/sci/graphics/celobj32.h b/engines/sci/graphics/celobj32.h
index e405592b5f..eb6ce3a3c9 100644
--- a/engines/sci/graphics/celobj32.h
+++ b/engines/sci/graphics/celobj32.h
@@ -228,6 +228,18 @@ class ScreenItem;
class CelObj {
protected:
/**
+ * When true, every second line of the cel will be
+ * rendered as a black line.
+ *
+ * @see ScreenItem::_drawBlackLines
+ * @note Using a static member because otherwise this
+ * would otherwise need to be copied down through
+ * several calls. (SSCI did similar, using a global
+ * variable.)
+ */
+ static bool _drawBlackLines;
+
+ /**
* When true, this cel will be horizontally mirrored
* when it is drawn. This is an internal flag that is
* set by draw methods based on the combination of the
diff --git a/engines/sci/graphics/controls32.cpp b/engines/sci/graphics/controls32.cpp
index 4cbb4541df..6b91bb4679 100644
--- a/engines/sci/graphics/controls32.cpp
+++ b/engines/sci/graphics/controls32.cpp
@@ -459,7 +459,7 @@ void ScrollWindow::hide() {
return;
}
- g_sci->_gfxFrameout->deleteScreenItem(_screenItem, _plane);
+ g_sci->_gfxFrameout->deleteScreenItem(*_screenItem, _plane);
_screenItem = nullptr;
g_sci->_gfxFrameout->frameOut(true);
diff --git a/engines/sci/graphics/cursor.h b/engines/sci/graphics/cursor.h
index 8d125c45b3..5125469cfe 100644
--- a/engines/sci/graphics/cursor.h
+++ b/engines/sci/graphics/cursor.h
@@ -25,6 +25,8 @@
#include "common/array.h"
#include "common/hashmap.h"
+#include "sci/sci.h"
+#include "sci/graphics/helpers.h"
namespace Sci {
diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp
index c0feea8999..a7899b8d89 100644
--- a/engines/sci/graphics/frameout.cpp
+++ b/engines/sci/graphics/frameout.cpp
@@ -115,6 +115,7 @@ GfxFrameout::GfxFrameout(SegManager *segMan, ResourceManager *resMan, GfxCoordAd
}
switch (g_sci->getGameId()) {
+ case GID_HOYLE5:
case GID_GK2:
case GID_LIGHTHOUSE:
case GID_LSL7:
@@ -278,20 +279,52 @@ bool GfxFrameout::checkForFred(const reg_t object) {
#pragma mark -
#pragma mark Screen items
-void GfxFrameout::deleteScreenItem(ScreenItem *screenItem, Plane *plane) {
- if (screenItem->_created == 0) {
- screenItem->_created = 0;
- screenItem->_updated = 0;
- screenItem->_deleted = getScreenCount();
+void GfxFrameout::addScreenItem(ScreenItem &screenItem) const {
+ Plane *plane = _planes.findByObject(screenItem._plane);
+ if (plane == nullptr) {
+ error("GfxFrameout::addScreenItem: Could not find plane %04x:%04x for screen item %04x:%04x", PRINT_REG(screenItem._plane), PRINT_REG(screenItem._object));
+ }
+ plane->_screenItemList.add(&screenItem);
+}
+
+void GfxFrameout::updateScreenItem(ScreenItem &screenItem) const {
+ // TODO: In SCI3+ this will need to go through Plane
+// Plane *plane = _planes.findByObject(screenItem._plane);
+// if (plane == nullptr) {
+// error("GfxFrameout::updateScreenItem: Could not find plane %04x:%04x for screen item %04x:%04x", PRINT_REG(screenItem._plane), PRINT_REG(screenItem._object));
+// }
+
+ screenItem.update();
+}
+
+void GfxFrameout::deleteScreenItem(ScreenItem &screenItem) {
+ Plane *plane = _planes.findByObject(screenItem._plane);
+ if (plane == nullptr) {
+ error("GfxFrameout::deleteScreenItem: Could not find plane %04x:%04x for screen item %04x:%04x", PRINT_REG(screenItem._plane), PRINT_REG(screenItem._object));
+ }
+ if (plane->_screenItemList.findByObject(screenItem._object) == nullptr) {
+ error("GfxFrameout::deleteScreenItem: Screen item %04x:%04x not found in plane %04x:%04x", PRINT_REG(screenItem._object), PRINT_REG(screenItem._plane));
+ }
+ deleteScreenItem(screenItem, *plane);
+}
+
+void GfxFrameout::deleteScreenItem(ScreenItem &screenItem, Plane &plane) {
+ if (screenItem._created == 0) {
+ screenItem._created = 0;
+ screenItem._updated = 0;
+ screenItem._deleted = getScreenCount();
} else {
- plane->_screenItemList.erase(screenItem);
- plane->_screenItemList.pack();
+ plane._screenItemList.erase(&screenItem);
+ plane._screenItemList.pack();
}
}
-void GfxFrameout::deleteScreenItem(ScreenItem *screenItem, const reg_t planeObject) {
+void GfxFrameout::deleteScreenItem(ScreenItem &screenItem, const reg_t planeObject) {
Plane *plane = _planes.findByObject(planeObject);
- deleteScreenItem(screenItem, plane);
+ if (plane == nullptr) {
+ error("GfxFrameout::deleteScreenItem: Could not find plane %04x:%04x for screen item %04x:%04x", PRINT_REG(planeObject), PRINT_REG(screenItem._object));
+ }
+ deleteScreenItem(screenItem, *plane);
}
void GfxFrameout::kernelAddScreenItem(const reg_t object) {
@@ -364,7 +397,7 @@ void GfxFrameout::kernelDeleteScreenItem(const reg_t object) {
return;
}
- deleteScreenItem(screenItem, plane);
+ deleteScreenItem(*screenItem, *plane);
}
#pragma mark -
@@ -540,7 +573,7 @@ void GfxFrameout::frameOut(const bool shouldShowBits, const Common::Rect &eraseR
// _robot->frameAlmostVisible();
// }
- _palette->updateHardware();
+ _palette->updateHardware(!shouldShowBits);
if (shouldShowBits) {
showBits();
@@ -1111,7 +1144,7 @@ void GfxFrameout::palMorphFrameOut(const int8 *styleRanges, const ShowStyleEntry
_palette->submit(nextPalette);
_palette->updateFFrame();
- _palette->updateHardware();
+ _palette->updateHardware(false);
showBits();
_frameNowVisible = true;
@@ -1483,6 +1516,10 @@ void GfxFrameout::processShowStyles() {
}
}
+ if (g_engine->shouldQuit()) {
+ return;
+ }
+
if (doFrameOut) {
frameOut(true);
@@ -1490,9 +1527,7 @@ void GfxFrameout::processShowStyles() {
// fast, but the throttle value is arbitrary. Someone on
// real hardware probably needs to test what the actual
// speed of these transitions should be
- EngineState *state = g_sci->getEngineState();
- state->speedThrottler(33);
- state->_throttleTrigger = true;
+ throttle();
}
} while(continueProcessing && doFrameOut);
}
diff --git a/engines/sci/graphics/frameout.h b/engines/sci/graphics/frameout.h
index cc62c61d22..99658ede6a 100644
--- a/engines/sci/graphics/frameout.h
+++ b/engines/sci/graphics/frameout.h
@@ -202,14 +202,29 @@ private:
public:
/**
+ * Adds a screen item.
+ */
+ void addScreenItem(ScreenItem &screenItem) const;
+
+ /**
+ * Updates a screen item.
+ */
+ void updateScreenItem(ScreenItem &screenItem) const;
+
+ /**
+ * Deletes a screen item.
+ */
+ void deleteScreenItem(ScreenItem &screenItem);
+
+ /**
* Deletes a screen item from the given plane.
*/
- void deleteScreenItem(ScreenItem *screenItem, Plane *plane);
+ void deleteScreenItem(ScreenItem &screenItem, Plane &plane);
/**
* Deletes a screen item from the given plane.
*/
- void deleteScreenItem(ScreenItem *screenItem, const reg_t plane);
+ void deleteScreenItem(ScreenItem &screenItem, const reg_t plane);
void kernelAddScreenItem(const reg_t object);
void kernelUpdateScreenItem(const reg_t object);
diff --git a/engines/sci/graphics/paint32.cpp b/engines/sci/graphics/paint32.cpp
index bfd46484e9..74eb1629d0 100644
--- a/engines/sci/graphics/paint32.cpp
+++ b/engines/sci/graphics/paint32.cpp
@@ -81,7 +81,7 @@ void GfxPaint32::kernelDeleteLine(const reg_t screenItemObject, const reg_t plan
}
_segMan->freeHunkEntry(screenItem->_celInfo.bitmap);
- g_sci->_gfxFrameout->deleteScreenItem(screenItem, plane);
+ g_sci->_gfxFrameout->deleteScreenItem(*screenItem, *plane);
}
void GfxPaint32::plotter(int x, int y, int color, void *data) {
diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h
index 7335dc59d0..2178de8a91 100644
--- a/engines/sci/graphics/palette.h
+++ b/engines/sci/graphics/palette.h
@@ -51,7 +51,7 @@ public:
bool setAmiga();
void modifyAmigaPalette(byte *data);
void setEGA();
- virtual void set(Palette *sciPal, bool force, bool forceRealMerge = false);
+ void set(Palette *sciPal, bool force, bool forceRealMerge = false);
bool insert(Palette *newPalette, Palette *destPalette);
bool merge(Palette *pFrom, bool force, bool forceRealMerge);
uint16 matchColor(byte r, byte g, byte b);
@@ -63,11 +63,11 @@ public:
void drewPicture(GuiResourceId pictureId);
- virtual bool kernelSetFromResource(GuiResourceId resourceId, bool force);
+ bool kernelSetFromResource(GuiResourceId resourceId, bool force);
void kernelSetFlag(uint16 fromColor, uint16 toColor, uint16 flag);
void kernelUnsetFlag(uint16 fromColor, uint16 toColor, uint16 flag);
void kernelSetIntensity(uint16 fromColor, uint16 toColor, uint16 intensity, bool setPalette);
- virtual int16 kernelFindColor(uint16 r, uint16 g, uint16 b);
+ int16 kernelFindColor(uint16 r, uint16 g, uint16 b);
bool kernelAnimate(byte fromColor, byte toColor, int speed);
void kernelAnimateSet();
reg_t kernelSave();
@@ -81,7 +81,7 @@ public:
int16 kernelPalVaryGetCurrentStep();
int16 kernelPalVaryChangeTarget(GuiResourceId resourceId);
void kernelPalVaryChangeTicks(uint16 ticks);
- virtual void kernelPalVaryPause(bool pause);
+ void kernelPalVaryPause(bool pause);
void kernelPalVaryDeinit();
void palVaryUpdate();
void palVaryPrepareForTransition();
@@ -89,7 +89,7 @@ public:
Palette _sysPalette;
- virtual void saveLoadWithSerializer(Common::Serializer &s);
+ void saveLoadWithSerializer(Common::Serializer &s);
void palVarySaveLoadPalette(Common::Serializer &s, Palette *palette);
byte findMacIconBarColor(byte r, byte g, byte b);
diff --git a/engines/sci/graphics/palette32.cpp b/engines/sci/graphics/palette32.cpp
index 0840e82a40..2a98c237b0 100644
--- a/engines/sci/graphics/palette32.cpp
+++ b/engines/sci/graphics/palette32.cpp
@@ -27,19 +27,109 @@
#include "sci/sci.h"
#include "sci/event.h"
#include "sci/resource.h"
+#include "sci/util.h"
#include "sci/graphics/palette32.h"
#include "sci/graphics/remap32.h"
#include "sci/graphics/screen.h"
namespace Sci {
-GfxPalette32::GfxPalette32(ResourceManager *resMan, GfxScreen *screen)
- : GfxPalette(resMan, screen),
+#pragma mark HunkPalette
+
+HunkPalette::HunkPalette(byte *rawPalette) :
+ _version(0),
+ // NOTE: The header size in palettes is garbage. In at least KQ7 2.00b and
+ // Phant1, the 999.pal sets this value to 0. In most other palettes it is
+ // set to 14, but the *actual* size of the header structure used in SSCI is
+ // 13, which is reflected by `kHunkPaletteHeaderSize`.
+ // _headerSize(rawPalette[0]),
+ _numPalettes(rawPalette[10]),
+ _data(nullptr) {
+ assert(_numPalettes == 0 || _numPalettes == 1);
+ if (_numPalettes) {
+ _data = rawPalette;
+ _version = getEntryHeader().version;
+ }
+}
+
+void HunkPalette::setVersion(const uint32 version) {
+ if (_numPalettes != _data[10]) {
+ error("Invalid HunkPalette");
+ }
+
+ if (_numPalettes) {
+ const EntryHeader header = getEntryHeader();
+ if (header.version != _version) {
+ error("Invalid HunkPalette");
+ }
+
+ WRITE_SCI11ENDIAN_UINT32(getPalPointer() + kEntryVersionOffset, version);
+ _version = version;
+ }
+}
+
+const HunkPalette::EntryHeader HunkPalette::getEntryHeader() const {
+ const byte *const data = getPalPointer();
+
+ EntryHeader header;
+ header.startColor = data[10];
+ header.numColors = READ_SCI11ENDIAN_UINT16(data + 14);
+ header.used = data[16];
+ header.sharedUsed = data[17];
+ header.version = READ_SCI11ENDIAN_UINT32(data + kEntryVersionOffset);
+
+ return header;
+}
+
+const Palette HunkPalette::toPalette() const {
+ Palette outPalette;
+
+ for (int16 i = 0; i < ARRAYSIZE(outPalette.colors); ++i) {
+ outPalette.colors[i].used = false;
+ outPalette.colors[i].r = 0;
+ outPalette.colors[i].g = 0;
+ outPalette.colors[i].b = 0;
+ }
+
+ if (_numPalettes) {
+ const EntryHeader header = getEntryHeader();
+ byte *data = getPalPointer() + kEntryHeaderSize;
+
+ int16 end = header.startColor + header.numColors;
+ assert(end <= 256);
+
+ if (header.sharedUsed) {
+ for (int16 i = header.startColor; i < end; ++i) {
+ outPalette.colors[i].used = header.used;
+ outPalette.colors[i].r = *data++;
+ outPalette.colors[i].g = *data++;
+ outPalette.colors[i].b = *data++;
+ }
+ } else {
+ for (int16 i = header.startColor; i < end; ++i) {
+ outPalette.colors[i].used = *data++;
+ outPalette.colors[i].r = *data++;
+ outPalette.colors[i].g = *data++;
+ outPalette.colors[i].b = *data++;
+ }
+ }
+ }
+
+ return outPalette;
+}
+
+
+#pragma mark -
+#pragma mark GfxPalette32
+
+GfxPalette32::GfxPalette32(ResourceManager *resMan)
+ : _resMan(resMan),
// Palette versioning
_version(1),
- _versionUpdated(false),
- _sourcePalette(_sysPalette),
- _nextPalette(_sysPalette),
+ _needsUpdate(false),
+ _currentPalette(),
+ _sourcePalette(),
+ _nextPalette(),
// Clut
_clutTable(nullptr),
// Palette varying
@@ -55,102 +145,91 @@ GfxPalette32::GfxPalette32(ResourceManager *resMan, GfxScreen *screen)
// Palette cycling
_cyclers(),
_cycleMap() {
- _varyPercent = _varyTargetPercent;
- for (int i = 0, len = ARRAYSIZE(_fadeTable); i < len; ++i) {
- _fadeTable[i] = 100;
- }
- // NOTE: In SCI engine, the palette manager constructor loads
- // the default palette, but in ScummVM this initialisation
- // is performed by SciEngine::run; see r49523 for details
+ _varyPercent = _varyTargetPercent;
+ for (int i = 0, len = ARRAYSIZE(_fadeTable); i < len; ++i) {
+ _fadeTable[i] = 100;
+ }
+
+ loadPalette(999);
}
GfxPalette32::~GfxPalette32() {
+#ifdef ENABLE_SCI3_GAMES
unloadClut();
+#endif
varyOff();
cycleAllOff();
}
inline void mergePaletteInternal(Palette *const to, const Palette *const from) {
- for (int i = 0, len = ARRAYSIZE(to->colors); i < len; ++i) {
+ // The last color is always white, so it is not copied.
+ // (Some palettes try to set the last color, which causes
+ // churning in the palettes when they are merged)
+ for (int i = 0, len = ARRAYSIZE(to->colors) - 1; i < len; ++i) {
if (from->colors[i].used) {
to->colors[i] = from->colors[i];
}
}
}
-void GfxPalette32::submit(Palette &palette) {
- // TODO: The resource manager in SCI32 retains raw data of palettes from
- // the ResourceManager (ResourceMgr) through SegManager (MemoryMgr), and
- // the version number for submitted palettes is set in the raw palette
- // data in memory as an int at an offset
- // `rawData + *rawData[0x0a] * 2 + 31`. However, ScummVM does not retain
- // resource data like this, so this versioning code, while accurate to
- // the original engine, does not do much.
- // (Hopefully this was an optimisation mechanism in SCI engine and not a
- // clever thing to keep the same palette submitted many times from
- // overwriting other palette entries.)
- if (palette.timestamp == _version) {
+void GfxPalette32::submit(const Palette &palette) {
+ const Palette oldSourcePalette(_sourcePalette);
+ mergePaletteInternal(&_sourcePalette, &palette);
+
+ if (!_needsUpdate && _sourcePalette != oldSourcePalette) {
+ ++_version;
+ _needsUpdate = true;
+ }
+}
+
+void GfxPalette32::submit(HunkPalette &hunkPalette) {
+ if (hunkPalette.getVersion() == _version) {
return;
}
- Palette oldSourcePalette(_sourcePalette);
+ const Palette oldSourcePalette(_sourcePalette);
+ const Palette palette = hunkPalette.toPalette();
mergePaletteInternal(&_sourcePalette, &palette);
- if (!_versionUpdated && _sourcePalette != oldSourcePalette) {
+ if (!_needsUpdate && oldSourcePalette != _sourcePalette) {
++_version;
- _versionUpdated = true;
+ _needsUpdate = true;
}
- // Technically this information is supposed to be persisted through a
- // HunkPalette object; right now it would just be lost once the temporary
- // palette was destroyed.
- palette.timestamp = _version;
+ hunkPalette.setVersion(_version);
}
-bool GfxPalette32::kernelSetFromResource(GuiResourceId resourceId, bool force) {
- // TODO: In SCI32, palettes that come from resources come in as
- // HunkPalette objects, not SOLPalette objects. The HunkPalettes
- // have some extra persistence stuff associated with them, such that
- // when they are passed to GfxPalette32::submit, they would get the
- // version number of GfxPalette32 assigned to them.
- Palette palette;
+bool GfxPalette32::loadPalette(const GuiResourceId resourceId) {
+ Resource *palResource = _resMan->findResource(ResourceId(kResourceTypePalette, resourceId), false);
- if (createPaletteFromResourceInternal(resourceId, &palette)) {
- submit(palette);
- return true;
+ if (!palResource) {
+ return false;
}
- return false;
+ HunkPalette palette(palResource->data);
+ submit(palette);
+ return true;
}
-// In SCI32 engine this method is SOLPalette::Match(Rgb24 *)
-// and is called as PaletteMgr.Current().Match(color)
-int16 GfxPalette32::kernelFindColor(uint16 r, uint16 g, uint16 b) {
- // SQ6 SCI32 engine takes the 16-bit r, g, b arguments from the
- // VM and puts them into al, ah, dl. For compatibility, make sure
- // to discard any high bits here too
- r = r & 0xFF;
- g = g & 0xFF;
- b = b & 0xFF;
+int16 GfxPalette32::matchColor(const uint8 r, const uint8 g, const uint8 b) {
int16 bestIndex = 0;
int bestDifference = 0xFFFFF;
int difference;
- // SQ6 DOS really does check only the first 236 entries
- for (int i = 0, channelDifference; i < 236; ++i) {
- difference = _sysPalette.colors[i].r - r;
+ for (int i = 0, channelDifference; i < g_sci->_gfxRemap32->getStartColor(); ++i) {
+ difference = _currentPalette.colors[i].r - r;
difference *= difference;
if (bestDifference <= difference) {
continue;
}
- channelDifference = _sysPalette.colors[i].g - g;
+ channelDifference = _currentPalette.colors[i].g - g;
difference += channelDifference * channelDifference;
if (bestDifference <= difference) {
continue;
}
- channelDifference = _sysPalette.colors[i].b - b;
+ channelDifference = _currentPalette.colors[i].b - b;
difference += channelDifference * channelDifference;
if (bestDifference <= difference) {
continue;
@@ -162,56 +241,56 @@ int16 GfxPalette32::kernelFindColor(uint16 r, uint16 g, uint16 b) {
return bestIndex;
}
-// TODO: set is overridden for the time being to send palettes coming from
-// various draw methods like GfxPicture::drawSci32Vga and GfxView::draw to
-// _nextPalette instead of _sysPalette. In the SCI32 engine, CelObj palettes
-// (which are stored as Hunk palettes) are submitted by GraphicsMgr::FrameOut
-// to PaletteMgr::Submit by way of calls to CelObj::SubmitPalette.
-// GfxPalette::set is very similar to GfxPalette32::submit, except that SCI32
-// does not do any fancy best-fit merging and so does not accept arguments
-// like `force` and `forceRealMerge`.
-void GfxPalette32::set(Palette *newPalette, bool force, bool forceRealMerge) {
- submit(*newPalette);
-}
-
bool GfxPalette32::updateForFrame() {
applyAll();
- _versionUpdated = false;
- return g_sci->_gfxRemap32->remapAllTables(_nextPalette != _sysPalette);
+ _needsUpdate = false;
+ return g_sci->_gfxRemap32->remapAllTables(_nextPalette != _currentPalette);
}
void GfxPalette32::updateFFrame() {
for (int i = 0; i < ARRAYSIZE(_nextPalette.colors); ++i) {
_nextPalette.colors[i] = _sourcePalette.colors[i];
}
- _versionUpdated = false;
- g_sci->_gfxRemap32->remapAllTables(_nextPalette != _sysPalette);
+ _needsUpdate = false;
+ g_sci->_gfxRemap32->remapAllTables(_nextPalette != _currentPalette);
}
-void GfxPalette32::updateHardware() {
- if (_sysPalette == _nextPalette) {
+void GfxPalette32::updateHardware(const bool updateScreen) {
+ if (_currentPalette == _nextPalette) {
return;
}
byte bpal[3 * 256];
- for (int i = 0; i < ARRAYSIZE(_sysPalette.colors); ++i) {
- _sysPalette.colors[i] = _nextPalette.colors[i];
+ for (int i = 0; i < ARRAYSIZE(_currentPalette.colors) - 1; ++i) {
+ _currentPalette.colors[i] = _nextPalette.colors[i];
// NOTE: If the brightness option in the user configuration file is set,
// SCI engine adjusts palette brightnesses here by mapping RGB values to values
// in some hard-coded brightness tables. There is no reason on modern hardware
// to implement this, unless it is discovered that some game uses a non-standard
// brightness setting by default
- if (_sysPalette.colors[i].used) {
- bpal[i * 3 ] = _sysPalette.colors[i].r;
- bpal[i * 3 + 1] = _sysPalette.colors[i].g;
- bpal[i * 3 + 2] = _sysPalette.colors[i].b;
- }
+
+ // All color entries MUST be copied, not just "used" entries, otherwise
+ // uninitialised memory from bpal makes its way into the system palette.
+ // This would not normally be a problem, except that games sometimes use
+ // unused palette entries. e.g. Phant1 title screen references palette
+ // entries outside its own palette, so will render garbage colors where
+ // the game expects them to be black
+ bpal[i * 3 ] = _currentPalette.colors[i].r;
+ bpal[i * 3 + 1] = _currentPalette.colors[i].g;
+ bpal[i * 3 + 2] = _currentPalette.colors[i].b;
}
+ // The last color must always be white
+ bpal[255 * 3 ] = 255;
+ bpal[255 * 3 + 1] = 255;
+ bpal[255 * 3 + 2] = 255;
+
g_system->getPaletteManager()->setPalette(bpal, 0, 256);
- g_sci->getEventManager()->updateScreen();
+ if (updateScreen) {
+ g_sci->getEventManager()->updateScreen();
+ }
}
void GfxPalette32::applyAll() {
@@ -223,6 +302,7 @@ void GfxPalette32::applyAll() {
#pragma mark -
#pragma mark Colour look-up
+#ifdef ENABLE_SCI3_GAMES
bool GfxPalette32::loadClut(uint16 clutId) {
// loadClut() will load a color lookup table from a clu file and set
// the palette found in the file. This is to be used with Phantasmagoria 2.
@@ -272,27 +352,20 @@ void GfxPalette32::unloadClut() {
delete[] _clutTable;
_clutTable = nullptr;
}
+#endif
#pragma mark -
#pragma mark Varying
-inline bool GfxPalette32::createPaletteFromResourceInternal(const GuiResourceId paletteId, Palette *const out) const {
- Resource *palResource = _resMan->findResource(ResourceId(kResourceTypePalette, paletteId), false);
+inline Palette GfxPalette32::getPaletteFromResourceInternal(const GuiResourceId resourceId) const {
+ Resource *palResource = _resMan->findResource(ResourceId(kResourceTypePalette, resourceId), false);
if (!palResource) {
- return false;
+ error("Could not load vary palette %d", resourceId);
}
- createFromData(palResource->data, palResource->size, out);
- return true;
-}
-
-inline Palette GfxPalette32::getPaletteFromResourceInternal(const GuiResourceId paletteId) const {
- Palette palette;
- if (!createPaletteFromResourceInternal(paletteId, &palette)) {
- error("Could not load vary target %d", paletteId);
- }
- return palette;
+ HunkPalette rawPalette(palResource->data);
+ return rawPalette.toPalette();
}
inline void GfxPalette32::setVaryTimeInternal(const int16 percent, const int time) {
@@ -316,8 +389,6 @@ inline void GfxPalette32::setVaryTimeInternal(const int16 percent, const int tim
}
}
-// TODO: This gets called *a lot* in at least the first scene
-// of SQ6. Optimisation would not be the worst idea in the world.
void GfxPalette32::kernelPalVarySet(const GuiResourceId paletteId, const int16 percent, const int time, const int16 fromColor, const int16 toColor) {
Palette palette = getPaletteFromResourceInternal(paletteId);
setVary(&palette, percent, time, fromColor, toColor);
@@ -585,18 +656,15 @@ void GfxPalette32::setCycle(const uint8 fromColor, const uint8 toColor, const in
// SCI engine overrides the first oldest cycler that it finds where
// т€œoldestт€ is determined by the difference between the tick and now
if (cycler == nullptr) {
- int maxUpdateDelta = -1;
- // Optimization: Unlike actual SCI (SQ6) engine, we call
- // getTickCount only once and store it, instead of calling it
- // twice on each iteration through the loop
const uint32 now = g_sci->getTickCount();
+ uint32 minUpdateDelta = 0xFFFFFFFF;
for (cyclerIndex = 0; cyclerIndex < numCyclers; ++cyclerIndex) {
PalCycler *candidate = _cyclers[cyclerIndex];
- const int32 updateDelta = now - candidate->lastUpdateTick;
- if (updateDelta >= maxUpdateDelta) {
- maxUpdateDelta = updateDelta;
+ const uint32 updateDelta = now - candidate->lastUpdateTick;
+ if (updateDelta < minUpdateDelta) {
+ minUpdateDelta = updateDelta;
cycler = candidate;
}
}
diff --git a/engines/sci/graphics/palette32.h b/engines/sci/graphics/palette32.h
index 7dda53e5c1..dc2158022f 100644
--- a/engines/sci/graphics/palette32.h
+++ b/engines/sci/graphics/palette32.h
@@ -26,6 +26,118 @@
#include "sci/graphics/palette.h"
namespace Sci {
+
+/**
+ * HunkPalette represents a raw palette resource
+ * read from disk.
+ */
+class HunkPalette {
+public:
+ HunkPalette(byte *rawPalette);
+
+ /**
+ * Gets the version of the palette.
+ */
+ uint32 getVersion() const { return _version; }
+
+ /**
+ * Sets the version of the palette.
+ */
+ void setVersion(const uint32 version);
+
+ /**
+ * Converts the hunk palette to a standard
+ * palette.
+ */
+ const Palette toPalette() const;
+
+private:
+ enum {
+ /**
+ * The size of the HunkPalette header.
+ */
+ kHunkPaletteHeaderSize = 13,
+
+ /**
+ * The size of a palette entry header.
+ */
+ kEntryHeaderSize = 22,
+
+ /**
+ * The offset of the hunk palette version
+ * within the palette entry header.
+ */
+ kEntryVersionOffset = 18
+ };
+
+ /**
+ * The header for a palette inside the
+ * HunkPalette.
+ */
+ struct EntryHeader {
+ /**
+ * The start color.
+ */
+ uint8 startColor;
+
+ /**
+ * The number of palette colors in this
+ * entry.
+ */
+ uint16 numColors;
+
+ /**
+ * The default `used` flag.
+ */
+ bool used;
+
+ /**
+ * Whether or not all palette entries
+ * share the same `used` value in
+ * `defaultFlag`.
+ */
+ bool sharedUsed;
+
+ /**
+ * The palette version.
+ */
+ uint32 version;
+ };
+
+ /**
+ * The version number from the last time this
+ * palette was submitted to GfxPalette32.
+ */
+ uint32 _version;
+
+ /**
+ * The number of palettes stored in the hunk
+ * palette. In SCI32 games this is always 1.
+ */
+ uint8 _numPalettes;
+
+ /**
+ * The raw palette data for this hunk palette.
+ */
+ byte *_data;
+
+ /**
+ * Returns a struct that describes the palette
+ * held by this HunkPalette. The entry header
+ * is reconstructed on every call from the raw
+ * palette data.
+ */
+ const EntryHeader getEntryHeader() const;
+
+ /**
+ * Returns a pointer to the palette data within
+ * the hunk palette.
+ */
+ byte *getPalPointer() const {
+ return _data + kHunkPaletteHeaderSize + (2 * _numPalettes);
+ }
+};
+
enum PalCyclerDirection {
PalCycleBackward = 0,
PalCycleForward = 1
@@ -72,28 +184,29 @@ struct PalCycler {
uint16 numTimesPaused;
};
-class GfxPalette32 : public GfxPalette {
+class GfxPalette32 {
public:
- GfxPalette32(ResourceManager *resMan, GfxScreen *screen);
+ GfxPalette32(ResourceManager *resMan);
~GfxPalette32();
private:
- // NOTE: currentPalette in SCI engine is called _sysPalette
- // here.
+ ResourceManager *_resMan;
/**
* The palette revision version. Increments once per game
- * loop that changes the source palette. TODO: Possibly
- * other areas also change _version, double-check once it
- * is all implemented.
+ * loop that changes the source palette.
*/
uint32 _version;
/**
- * Whether or not the palette manager version was updated
- * during this loop.
+ * Whether or not the hardware palette needs updating.
+ */
+ bool _needsUpdate;
+
+ /**
+ * The currently displayed palette.
*/
- bool _versionUpdated;
+ Palette _currentPalette;
/**
* The unmodified source palette loaded by kPalette. Additional
@@ -104,7 +217,7 @@ private:
/**
* The palette to be used when the hardware is next updated.
- * On update, _nextPalette is transferred to _sysPalette.
+ * On update, _nextPalette is transferred to _currentPalette.
*/
Palette _nextPalette;
@@ -112,24 +225,33 @@ private:
Palette getPaletteFromResourceInternal(const GuiResourceId paletteId) const;
public:
- virtual void saveLoadWithSerializer(Common::Serializer &s) override;
+ void saveLoadWithSerializer(Common::Serializer &s);
inline const Palette &getNextPalette() const { return _nextPalette; };
- inline const Palette &getCurrentPalette() const { return _sysPalette; };
+ inline const Palette &getCurrentPalette() const { return _currentPalette; };
- bool kernelSetFromResource(GuiResourceId resourceId, bool force) override;
- int16 kernelFindColor(uint16 r, uint16 g, uint16 b) override;
- void set(Palette *newPalette, bool force, bool forceRealMerge = false) override;
+ /**
+ * Loads a palette into GfxPalette32 with the given resource
+ * ID.
+ */
+ bool loadPalette(const GuiResourceId resourceId);
+
+ /**
+ * Finds the nearest color in the current palette matching the
+ * given RGB value.
+ */
+ int16 matchColor(const uint8 r, const uint8 g, const uint8 b);
/**
* Submits a palette to display. Entries marked as т€œusedт€ in the
* submitted palette are merged into the existing entries of
* _sourcePalette.
*/
- void submit(Palette &palette);
+ void submit(const Palette &palette);
+ void submit(HunkPalette &palette);
bool updateForFrame();
void updateFFrame();
- void updateHardware();
+ void updateHardware(const bool updateScreen = true);
void applyAll();
#pragma mark -
@@ -213,7 +335,7 @@ public:
void kernelPalVarySetTarget(const GuiResourceId paletteId);
void kernelPalVarySetStart(const GuiResourceId paletteId);
void kernelPalVaryMergeStart(const GuiResourceId paletteId);
- virtual void kernelPalVaryPause(bool pause) override;
+ void kernelPalVaryPause(bool pause);
void setVary(const Palette *const targetPalette, const int16 percent, const int time, const int16 fromColor, const int16 toColor);
void setVaryPercent(const int16 percent, const int time, const int16 fromColor, const int16 fromColorAlternate);
diff --git a/engines/sci/graphics/plane32.cpp b/engines/sci/graphics/plane32.cpp
index 175875c414..aa629e4081 100644
--- a/engines/sci/graphics/plane32.cpp
+++ b/engines/sci/graphics/plane32.cpp
@@ -47,6 +47,7 @@ uint16 Plane::_nextObjectId = 20000;
Plane::Plane(const Common::Rect &gameRect, PlanePictureCodes pictureId) :
_pictureId(pictureId),
_mirrored(false),
+_type(kPlaneTypeColored),
_back(0),
_priorityChanged(0),
_object(make_reg(0, _nextObjectId++)),
@@ -63,6 +64,7 @@ _gameRect(gameRect) {
}
Plane::Plane(reg_t object) :
+_type(kPlaneTypeColored),
_priorityChanged(false),
_object(object),
_redrawAllCount(g_sci->_gfxFrameout->getScreenCount()),
@@ -93,6 +95,7 @@ _moved(0) {
Plane::Plane(const Plane &other) :
_pictureId(other._pictureId),
_mirrored(other._mirrored),
+_type(other._type),
_back(other._back),
_object(other._object),
_priority(other._priority),
@@ -595,8 +598,10 @@ void Plane::filterDownEraseRects(DrawList &drawList, RectList &eraseList, RectLi
Common::Rect outRects[4];
const Common::Rect &r2 = *higherEraseList[i];
int splitCount = splitRects(r2, r, outRects);
- while (splitCount--) {
- higherEraseList.add(outRects[splitCount]);
+ if (splitCount > 0) {
+ while (splitCount--) {
+ higherEraseList.add(outRects[splitCount]);
+ }
}
higherEraseList.erase_at(i);
}
diff --git a/engines/sci/graphics/plane32.h b/engines/sci/graphics/plane32.h
index a1739264e8..3981a2b319 100644
--- a/engines/sci/graphics/plane32.h
+++ b/engines/sci/graphics/plane32.h
@@ -150,6 +150,11 @@ private:
public:
/**
+ * The type of the plane.
+ */
+ PlaneType _type;
+
+ /**
* The color to use when erasing the plane. Only
* applies to planes of type kPlaneTypeColored.
*/
@@ -186,8 +191,6 @@ public:
*/
int _redrawAllCount;
- PlaneType _type;
-
/**
* Flags indicating the state of the plane.
* - `created` is set when the plane is first created,
diff --git a/engines/sci/graphics/screen_item32.cpp b/engines/sci/graphics/screen_item32.cpp
index ebaf132890..7383dc222e 100644
--- a/engines/sci/graphics/screen_item32.cpp
+++ b/engines/sci/graphics/screen_item32.cpp
@@ -42,7 +42,8 @@ _pictureId(-1),
_created(g_sci->_gfxFrameout->getScreenCount()),
_updated(0),
_deleted(0),
-_mirrorX(false) {
+_mirrorX(false),
+_drawBlackLines(false) {
SegManager *segMan = g_sci->getEngineState()->_segMan;
setFromObject(segMan, object, true, true);
@@ -62,7 +63,8 @@ _pictureId(-1),
_created(g_sci->_gfxFrameout->getScreenCount()),
_updated(0),
_deleted(0),
-_mirrorX(false) {}
+_mirrorX(false),
+_drawBlackLines(false) {}
ScreenItem::ScreenItem(const reg_t plane, const CelInfo32 &celInfo, const Common::Rect &rect) :
_plane(plane),
@@ -77,7 +79,8 @@ _pictureId(-1),
_created(g_sci->_gfxFrameout->getScreenCount()),
_updated(0),
_deleted(0),
-_mirrorX(false) {
+_mirrorX(false),
+_drawBlackLines(false) {
if (celInfo.type == kCelTypeColor) {
_insetRect = rect;
}
@@ -97,7 +100,8 @@ _pictureId(-1),
_created(g_sci->_gfxFrameout->getScreenCount()),
_updated(0),
_deleted(0),
-_mirrorX(false) {}
+_mirrorX(false),
+_drawBlackLines(false) {}
ScreenItem::ScreenItem(const ScreenItem &other) :
_plane(other._plane),
@@ -108,7 +112,8 @@ _celObj(nullptr),
_object(other._object),
_mirrorX(other._mirrorX),
_scaledPosition(other._scaledPosition),
-_screenRect(other._screenRect) {
+_screenRect(other._screenRect),
+_drawBlackLines(other._drawBlackLines) {
if (other._useInsetRect) {
_insetRect = other._insetRect;
}
@@ -134,6 +139,7 @@ void ScreenItem::operator=(const ScreenItem &other) {
}
_scale = other._scale;
_scaledPosition = other._scaledPosition;
+ _drawBlackLines = other._drawBlackLines;
}
ScreenItem::~ScreenItem() {
diff --git a/engines/sci/graphics/screen_item32.h b/engines/sci/graphics/screen_item32.h
index caa7a9d725..3d9d5ef3d7 100644
--- a/engines/sci/graphics/screen_item32.h
+++ b/engines/sci/graphics/screen_item32.h
@@ -64,12 +64,12 @@ private:
*/
static uint16 _nextObjectId;
+public:
/**
* The parent plane of this screen item.
*/
reg_t _plane;
-public:
/**
* Scaling data used to calculate the final screen
* dimensions of the screen item as well as the scaling
@@ -180,7 +180,7 @@ public:
* plane is a pic type and its picture resource ID has
* changed
*/
- int _created, _updated, _deleted; // ?
+ int _created, _updated, _deleted;
/**
* For screen items that represent picture cels, this
@@ -214,6 +214,14 @@ public:
Common::Rect _screenRect;
/**
+ * Whether or not the screen item should be drawn
+ * with black lines drawn every second line. This is
+ * used when pixel doubling videos to improve apparent
+ * sharpness at the cost of your eyesight.
+ */
+ bool _drawBlackLines;
+
+ /**
* Initialises static Plane members.
*/
static void init();
diff --git a/engines/sci/graphics/video32.cpp b/engines/sci/graphics/video32.cpp
new file mode 100644
index 0000000000..dd841f5b4c
--- /dev/null
+++ b/engines/sci/graphics/video32.cpp
@@ -0,0 +1,415 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "audio/mixer.h"
+#include "common/config-manager.h"
+#include "sci/console.h"
+#include "sci/event.h"
+#include "sci/graphics/cursor.h"
+#include "sci/graphics/frameout.h"
+#include "sci/graphics/palette32.h"
+#include "sci/graphics/text32.h"
+#include "sci/graphics/video32.h"
+#include "sci/sci.h"
+#include "video/coktel_decoder.h"
+
+namespace Sci {
+
+#pragma mark VMDPlayer
+
+VMDPlayer::VMDPlayer(SegManager *segMan, EventManager *eventMan) :
+ _segMan(segMan),
+ _eventMan(eventMan),
+ _decoder(new Video::AdvancedVMDDecoder(Audio::Mixer::kSFXSoundType)),
+
+ _isOpen(false),
+ _isInitialized(false),
+ _yieldInterval(0),
+ _lastYieldedFrameNo(0),
+
+ _plane(nullptr),
+ _screenItem(nullptr),
+ _planeIsOwned(true),
+ _priority(0),
+ _doublePixels(false),
+ _stretchVertical(false),
+ _blackLines(false),
+ _leaveScreenBlack(false),
+ _leaveLastFrame(false),
+
+ _blackoutPlane(nullptr),
+
+ _startColor(0),
+ _endColor(255),
+ _blackPalette(false),
+
+ _boostPercent(100),
+ _boostStartColor(0),
+ _boostEndColor(255),
+
+ _showCursor(false) {}
+
+VMDPlayer::~VMDPlayer() {
+ close();
+ delete _decoder;
+}
+
+#pragma mark -
+#pragma mark VMDPlayer - Playback
+
+VMDPlayer::IOStatus VMDPlayer::open(const Common::String &fileName, const OpenFlags flags) {
+ if (_isOpen) {
+ error("Attempted to play %s, but another VMD was loaded", fileName.c_str());
+ }
+
+ if (_decoder->loadFile(fileName)) {
+ if (flags & kOpenFlagMute) {
+ _decoder->setVolume(0);
+ }
+ _isOpen = true;
+ return kIOSuccess;
+ } else {
+ return kIOError;
+ }
+}
+
+void VMDPlayer::init(const int16 x, const int16 y, const PlayFlags flags, const int16 boostPercent, const int16 boostStartColor, const int16 boostEndColor) {
+ _x = getSciVersion() >= SCI_VERSION_3 ? x : (x & ~1);
+ _y = y;
+ _doublePixels = flags & kPlayFlagDoublePixels;
+ _blackLines = ConfMan.getBool("enable_black_lined_video") && (flags & kPlayFlagBlackLines);
+ _boostPercent = 100 + (flags & kPlayFlagBoost ? boostPercent : 0);
+ _boostStartColor = CLIP<int16>(boostStartColor, 0, 255);
+ _boostEndColor = CLIP<int16>(boostEndColor, 0, 255);
+ _leaveScreenBlack = flags & kPlayFlagLeaveScreenBlack;
+ _leaveLastFrame = flags & kPlayFlagLeaveLastFrame;
+ _blackPalette = flags & kPlayFlagBlackPalette;
+ _stretchVertical = flags & kPlayFlagStretchVertical;
+}
+
+VMDPlayer::IOStatus VMDPlayer::close() {
+ if (!_isOpen) {
+ return kIOSuccess;
+ }
+
+ _decoder->close();
+ _isOpen = false;
+ _isInitialized = false;
+
+ if (!_planeIsOwned && _screenItem != nullptr) {
+ g_sci->_gfxFrameout->deleteScreenItem(*_screenItem);
+ _screenItem = nullptr;
+ } else if (_plane != nullptr) {
+ g_sci->_gfxFrameout->deletePlane(*_plane);
+ _plane = nullptr;
+ }
+
+ if (!_leaveLastFrame && _leaveScreenBlack) {
+ // This call *actually* deletes the plane/screen item
+ g_sci->_gfxFrameout->frameOut(true);
+ }
+
+ if (_blackoutPlane != nullptr) {
+ g_sci->_gfxFrameout->deletePlane(*_blackoutPlane);
+ _blackoutPlane = nullptr;
+ }
+
+ if (!_leaveLastFrame && !_leaveScreenBlack) {
+ // This call *actually* deletes the blackout plane
+ g_sci->_gfxFrameout->frameOut(true);
+ }
+
+ if (!_showCursor) {
+ g_sci->_gfxCursor->kernelShow();
+ }
+
+ _lastYieldedFrameNo = 0;
+ _planeIsOwned = true;
+ _priority = 0;
+ return kIOSuccess;
+}
+
+VMDPlayer::EventFlags VMDPlayer::kernelPlayUntilEvent(const EventFlags flags, const int16 lastFrameNo, const int16 yieldInterval) {
+ assert(lastFrameNo >= -1);
+
+ const int32 maxFrameNo = (int32)(_decoder->getFrameCount() - 1);
+
+ if ((flags & kEventFlagToFrame) && lastFrameNo > 0) {
+ _decoder->setEndFrame(MIN((int32)lastFrameNo, maxFrameNo));
+ } else {
+ _decoder->setEndFrame(maxFrameNo);
+ }
+
+ if (flags & kEventFlagYieldToVM) {
+ _yieldInterval = 3;
+ if (yieldInterval == -1 && !(flags & kEventFlagToFrame)) {
+ _yieldInterval = lastFrameNo;
+ } else if (yieldInterval != -1) {
+ _yieldInterval = MIN((int32)yieldInterval, maxFrameNo);
+ }
+ } else {
+ _yieldInterval = maxFrameNo;
+ }
+
+ return playUntilEvent(flags);
+}
+
+VMDPlayer::EventFlags VMDPlayer::playUntilEvent(const EventFlags flags) {
+ // Flushing all the keyboard and mouse events out of the event manager to
+ // avoid letting any events queued from before the video started from
+ // accidentally activating an event callback
+ for (;;) {
+ const SciEvent event = _eventMan->getSciEvent(SCI_EVENT_KEYBOARD | SCI_EVENT_MOUSE_PRESS | SCI_EVENT_MOUSE_RELEASE | SCI_EVENT_QUIT);
+ if (event.type == SCI_EVENT_NONE) {
+ break;
+ } else if (event.type == SCI_EVENT_QUIT) {
+ return kEventFlagEnd;
+ }
+ }
+
+ _decoder->pauseVideo(false);
+
+ if (flags & kEventFlagReverse) {
+ // NOTE: This flag may not work properly since SSCI does not care
+ // if a video has audio, but the VMD decoder does.
+ const bool success = _decoder->setReverse(true);
+ assert(success);
+ _decoder->setVolume(0);
+ }
+
+ if (!_isInitialized) {
+ _isInitialized = true;
+
+ if (!_showCursor) {
+ g_sci->_gfxCursor->kernelHide();
+ }
+
+ Common::Rect vmdRect(_x,
+ _y,
+ _x + _decoder->getWidth(),
+ _y + _decoder->getHeight());
+ ScaleInfo vmdScaleInfo;
+
+ if (!_blackoutRect.isEmpty() && _planeIsOwned) {
+ _blackoutPlane = new Plane(_blackoutRect);
+ g_sci->_gfxFrameout->addPlane(*_blackoutPlane);
+ }
+
+ if (_doublePixels) {
+ vmdScaleInfo.x = 256;
+ vmdScaleInfo.y = 256;
+ vmdScaleInfo.signal = kScaleSignalDoScaling32;
+ vmdRect.right += vmdRect.width();
+ vmdRect.bottom += vmdRect.height();
+ } else if (_stretchVertical) {
+ vmdScaleInfo.y = 256;
+ vmdScaleInfo.signal = kScaleSignalDoScaling32;
+ vmdRect.bottom += vmdRect.height();
+ }
+
+ const int16 screenWidth = g_sci->_gfxFrameout->getCurrentBuffer().screenWidth;
+ const int16 screenHeight = g_sci->_gfxFrameout->getCurrentBuffer().screenHeight;
+ const int16 scriptWidth = g_sci->_gfxFrameout->getCurrentBuffer().scriptWidth;
+ const int16 scriptHeight = g_sci->_gfxFrameout->getCurrentBuffer().scriptHeight;
+
+ BitmapResource vmdBitmap(_segMan, vmdRect.width(), vmdRect.height(), 255, 0, 0, screenWidth, screenHeight, 0, false);
+
+ if (screenWidth != scriptWidth || screenHeight != scriptHeight) {
+ mulru(vmdRect, Ratio(scriptWidth, screenWidth), Ratio(scriptHeight, screenHeight), 1);
+ }
+
+ CelInfo32 vmdCelInfo;
+ vmdCelInfo.bitmap = vmdBitmap.getObject();
+ _decoder->setSurfaceMemory(vmdBitmap.getPixels(), vmdBitmap.getWidth(), vmdBitmap.getHeight(), 1);
+
+ if (_planeIsOwned) {
+ _x = 0;
+ _y = 0;
+ _plane = new Plane(vmdRect, kPlanePicColored);
+ if (_priority) {
+ _plane->_priority = _priority;
+ }
+ g_sci->_gfxFrameout->addPlane(*_plane);
+ _screenItem = new ScreenItem(_plane->_object, vmdCelInfo, Common::Point(), vmdScaleInfo);
+ } else {
+ _screenItem = new ScreenItem(_plane->_object, vmdCelInfo, Common::Point(_x, _y), vmdScaleInfo);
+ if (_priority) {
+ _screenItem->_priority = _priority;
+ }
+ }
+
+ if (_blackLines) {
+ _screenItem->_drawBlackLines = true;
+ }
+
+ // NOTE: There was code for positioning the screen item using insetRect
+ // here, but none of the game scripts seem to use this functionality.
+
+ g_sci->_gfxFrameout->addScreenItem(*_screenItem);
+
+ _decoder->start();
+ }
+
+ EventFlags stopFlag = kEventFlagNone;
+ while (!g_engine->shouldQuit()) {
+ if (_decoder->endOfVideo()) {
+ stopFlag = kEventFlagEnd;
+ break;
+ }
+
+ g_sci->getEngineState()->speedThrottler(_decoder->getTimeToNextFrame());
+ g_sci->getEngineState()->_throttleTrigger = true;
+ if (_decoder->needsUpdate()) {
+ renderFrame();
+ }
+
+ const int currentFrameNo = _decoder->getCurFrame();
+
+ if (_yieldInterval > 0 &&
+ currentFrameNo != _lastYieldedFrameNo &&
+ (currentFrameNo % _yieldInterval) == 0
+ ) {
+ _lastYieldedFrameNo = currentFrameNo;
+ stopFlag = kEventFlagYieldToVM;
+ break;
+ }
+
+ SciEvent event = _eventMan->getSciEvent(SCI_EVENT_MOUSE_PRESS | SCI_EVENT_PEEK);
+ if ((flags & kEventFlagMouseDown) && event.type == SCI_EVENT_MOUSE_PRESS) {
+ stopFlag = kEventFlagMouseDown;
+ break;
+ }
+
+ event = _eventMan->getSciEvent(SCI_EVENT_KEYBOARD | SCI_EVENT_PEEK);
+ if ((flags & kEventFlagEscapeKey) && event.type == SCI_EVENT_KEYBOARD) {
+ bool stop = false;
+ if (getSciVersion() < SCI_VERSION_3) {
+ while ((event = _eventMan->getSciEvent(SCI_EVENT_KEYBOARD)),
+ event.type != SCI_EVENT_NONE) {
+ if (event.character == SCI_KEY_ESC) {
+ stop = true;
+ break;
+ }
+ }
+ } else {
+ stop = (event.character == SCI_KEY_ESC);
+ }
+
+ if (stop) {
+ stopFlag = kEventFlagEscapeKey;
+ break;
+ }
+ }
+
+ // TODO: Hot rectangles
+ if ((flags & kEventFlagHotRectangle) /* && event.type == SCI_EVENT_HOT_RECTANGLE */) {
+ warning("Hot rectangles not implemented in VMD player");
+ stopFlag = kEventFlagHotRectangle;
+ break;
+ }
+ }
+
+ _decoder->pauseVideo(true);
+ return stopFlag;
+}
+
+#pragma mark -
+#pragma mark VMDPlayer - Rendering
+
+void VMDPlayer::renderFrame() const {
+ // This writes directly to the CelObjMem we already created,
+ // so no need to take its return value
+ _decoder->decodeNextFrame();
+
+ // NOTE: Normally this would write a hunk palette at the end of the
+ // video bitmap that CelObjMem would read out and submit, but instead
+ // we are just submitting it directly here because the decoder exposes
+ // this information a little bit differently than the one in SSCI
+ const bool dirtyPalette = _decoder->hasDirtyPalette();
+ if (dirtyPalette) {
+ Palette palette;
+ palette.timestamp = g_sci->getTickCount();
+ for (uint16 i = 0; i < _startColor; ++i) {
+ palette.colors[i].used = false;
+ }
+ for (uint16 i = _endColor; i < 256; ++i) {
+ palette.colors[i].used = false;
+ }
+ if (_blackPalette) {
+ for (uint16 i = _startColor; i <= _endColor; ++i) {
+ palette.colors[i].r = palette.colors[i].g = palette.colors[i].b = 0;
+ palette.colors[i].used = true;
+ }
+ } else {
+ fillPalette(palette);
+ }
+
+ g_sci->_gfxPalette32->submit(palette);
+ g_sci->_gfxFrameout->updateScreenItem(*_screenItem);
+ g_sci->_gfxFrameout->frameOut(true);
+
+ if (_blackPalette) {
+ fillPalette(palette);
+ g_sci->_gfxPalette32->submit(palette);
+ g_sci->_gfxPalette32->updateForFrame();
+ g_sci->_gfxPalette32->updateHardware();
+ }
+ } else {
+ g_sci->_gfxFrameout->updateScreenItem(*_screenItem);
+ g_sci->getSciDebugger()->onFrame();
+ g_sci->_gfxFrameout->frameOut(true);
+ g_sci->_gfxFrameout->throttle();
+ }
+}
+
+void VMDPlayer::fillPalette(Palette &palette) const {
+ const byte *vmdPalette = _decoder->getPalette() + _startColor * 3;
+ for (uint16 i = _startColor; i <= _endColor; ++i) {
+ int16 r = *vmdPalette++;
+ int16 g = *vmdPalette++;
+ int16 b = *vmdPalette++;
+
+ if (_boostPercent != 100 && i >= _boostStartColor && i <= _boostEndColor) {
+ r = CLIP<int16>(r * _boostPercent / 100, 0, 255);
+ g = CLIP<int16>(g * _boostPercent / 100, 0, 255);
+ b = CLIP<int16>(b * _boostPercent / 100, 0, 255);
+ }
+
+ palette.colors[i].r = r;
+ palette.colors[i].g = g;
+ palette.colors[i].b = b;
+ palette.colors[i].used = true;
+ }
+}
+
+#pragma mark -
+#pragma mark VMDPlayer - Palette
+
+void VMDPlayer::restrictPalette(const uint8 startColor, const int16 endColor) {
+ _startColor = startColor;
+ // At least GK2 sends 256 as the end color, which is wrong,
+ // but works in the original engine as the storage size is 4 bytes
+ // and used values are clamped to 0-255
+ _endColor = MIN((int16)255, endColor);
+}
+
+} // End of namespace Sci
diff --git a/engines/sci/graphics/video32.h b/engines/sci/graphics/video32.h
new file mode 100644
index 0000000000..7033f7c647
--- /dev/null
+++ b/engines/sci/graphics/video32.h
@@ -0,0 +1,312 @@
+/* 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 SCI_GRAPHICS_VIDEO32_H
+#define SCI_GRAPHICS_VIDEO32_H
+
+namespace Video { class AdvancedVMDDecoder; }
+namespace Sci {
+class Plane;
+class ScreenItem;
+class SegManager;
+
+#pragma mark VMDPlayer
+
+/**
+ * VMDPlayer is used to play VMD videos.
+ */
+class VMDPlayer {
+public:
+ enum OpenFlags {
+ kOpenFlagNone = 0,
+ kOpenFlagMute = 1
+ };
+
+ enum IOStatus {
+ kIOSuccess = 0,
+ kIOError = 0xFFFF
+ };
+
+ enum PlayFlags {
+ kPlayFlagNone = 0,
+ kPlayFlagDoublePixels = 1,
+ kPlayFlagBlackLines = 4,
+ kPlayFlagBoost = 0x10,
+ kPlayFlagLeaveScreenBlack = 0x20,
+ kPlayFlagLeaveLastFrame = 0x40,
+ kPlayFlagBlackPalette = 0x80,
+ kPlayFlagStretchVertical = 0x100
+ };
+
+ enum EventFlags {
+ kEventFlagNone = 0,
+ kEventFlagEnd = 1,
+ kEventFlagEscapeKey = 2,
+ kEventFlagMouseDown = 4,
+ kEventFlagHotRectangle = 8,
+ kEventFlagToFrame = 0x10,
+ kEventFlagYieldToVM = 0x20,
+ kEventFlagReverse = 0x80
+ };
+
+ VMDPlayer(SegManager *segMan, EventManager *eventMan);
+ ~VMDPlayer();
+
+private:
+ SegManager *_segMan;
+ EventManager *_eventMan;
+ Video::AdvancedVMDDecoder *_decoder;
+
+#pragma mark -
+#pragma mark VMDPlayer - Playback
+public:
+ /**
+ * Opens a stream to a VMD resource.
+ */
+ IOStatus open(const Common::String &fileName, const OpenFlags flags);
+
+ /**
+ * Initializes the VMD rendering parameters for the
+ * current VMD. This must be called after `open`.
+ */
+ void init(const int16 x, const int16 y, const PlayFlags flags, const int16 boostPercent, const int16 boostStartColor, const int16 boostEndColor);
+
+ /**
+ * Stops playback and closes the currently open VMD stream.
+ */
+ IOStatus close();
+
+ // NOTE: Was WaitForEvent in SSCI
+ EventFlags kernelPlayUntilEvent(const EventFlags flags, const int16 lastFrameNo, const int16 yieldInterval);
+
+private:
+ /**
+ * Whether or not a VMD stream has been opened with
+ * `open`.
+ */
+ bool _isOpen;
+
+ /**
+ * Whether or not a VMD player has been initialised
+ * with `init`.
+ */
+ bool _isInitialized;
+
+ /**
+ * For VMDs played with the `kEventFlagYieldToVM` flag,
+ * the number of frames that should be rendered until
+ * yielding back to the SCI VM.
+ */
+ int32 _yieldInterval;
+
+ /**
+ * For VMDs played with the `kEventFlagYieldToVM` flag,
+ * the last frame when control of the main thread was
+ * yielded back to the SCI VM.
+ */
+ int _lastYieldedFrameNo;
+
+ /**
+ * Plays the VMD until an event occurs (e.g. user
+ * presses escape, clicks, etc.).
+ */
+ EventFlags playUntilEvent(const EventFlags flags);
+
+#pragma mark -
+#pragma mark VMDPlayer - Rendering
+private:
+ /**
+ * The location of the VMD plane, in game script
+ * coordinates.
+ */
+ int16 _x, _y;
+
+ /**
+ * The plane where the VMD will be drawn.
+ */
+ Plane *_plane;
+
+ /**
+ * The screen item representing the VMD surface.
+ */
+ ScreenItem *_screenItem;
+
+ // TODO: planeIsOwned and priority are used in SCI3+ only
+
+ /**
+ * If true, the plane for this VMD was set
+ * externally and is not owned by this VMDPlayer.
+ */
+ bool _planeIsOwned;
+
+ /**
+ * The screen priority of the video.
+ * @see ScreenItem::_priority
+ */
+ int _priority;
+
+ /**
+ * Whether or not the video should be pixel doubled.
+ */
+ bool _doublePixels;
+
+ /**
+ * Whether or not the video should be pixel doubled
+ * vertically only.
+ */
+ bool _stretchVertical;
+
+ /**
+ * Whether or not black lines should be rendered
+ * across the video.
+ */
+ bool _blackLines;
+
+ /**
+ * Whether or not the playback area of the VMD
+ * should be left black at the end of playback.
+ */
+ bool _leaveScreenBlack;
+
+ /**
+ * Whether or not the area of the VMD should be left
+ * displaying the final frame of the video.
+ */
+ bool _leaveLastFrame;
+
+ /**
+ * Renders a frame of video to the output bitmap.
+ */
+ void renderFrame() const;
+
+ /**
+ * Fills the given palette with RGB values from
+ * the VMD palette, applying brightness boost if
+ * it is enabled.
+ */
+ void fillPalette(Palette &palette) const;
+
+#pragma mark -
+#pragma mark VMDPlayer - Blackout
+public:
+ /**
+ * Sets the area of the screen that should be blacked out
+ * during VMD playback.
+ */
+ void setBlackoutArea(const Common::Rect &rect) { _blackoutRect = rect; }
+
+private:
+ /**
+ * The dimensions of the blackout plane.
+ */
+ Common::Rect _blackoutRect;
+
+ /**
+ * An optional plane that will be used to black out
+ * areas of the screen outside of the VMD surface.
+ */
+ Plane *_blackoutPlane;
+
+#pragma mark -
+#pragma mark VMDPlayer - Palette
+public:
+ /**
+ * Restricts use of the system palette by VMD playback to
+ * the given range of palette indexes.
+ */
+ void restrictPalette(const uint8 startColor, const int16 endColor);
+
+private:
+ /**
+ * The first color in the system palette that the VMD
+ * can write to.
+ */
+ uint8 _startColor;
+
+ /**
+ * The last color in the system palette that the VMD
+ * can write to.
+ */
+ uint8 _endColor;
+
+ /**
+ * If true, video frames are rendered after a blank
+ * palette is submitted to the palette manager,
+ * which is then restored after the video pixels
+ * have already been rendered.
+ */
+ bool _blackPalette;
+
+#pragma mark -
+#pragma mark VMDPlayer - Brightness boost
+private:
+ /**
+ * The amount of brightness boost for the video.
+ * Values above 100 increase brightness; values below
+ * 100 reduce it.
+ */
+ int16 _boostPercent;
+
+ /**
+ * The first color in the palette that should be
+ * brightness boosted.
+ */
+ uint8 _boostStartColor;
+
+ /**
+ * The last color in the palette that should be
+ * brightness boosted.
+ */
+ uint8 _boostEndColor;
+
+#pragma mark -
+#pragma mark VMDPlayer - Mouse cursor
+public:
+ /**
+ * Sets whether or not the mouse cursor should be drawn.
+ * This does not have any effect during playback, but can
+ * be used to prevent the mouse cursor from being shown
+ * again after the video has finished.
+ */
+ void setShowCursor(const bool shouldShow) { _showCursor = shouldShow; }
+
+private:
+ /**
+ * Whether or not the mouse cursor should be shown
+ * during playback.
+ */
+ bool _showCursor;
+};
+
+class Video32 {
+public:
+ Video32(SegManager *segMan, EventManager *eventMan) :
+ _VMDPlayer(segMan, eventMan) {}
+
+ VMDPlayer &getVMDPlayer() { return _VMDPlayer; }
+
+private:
+ VMDPlayer _VMDPlayer;
+};
+} // End of namespace Sci
+
+#endif
diff --git a/engines/sci/module.mk b/engines/sci/module.mk
index 5d54e2a52c..1511356747 100644
--- a/engines/sci/module.mk
+++ b/engines/sci/module.mk
@@ -91,6 +91,7 @@ MODULE_OBJS += \
graphics/remap32.o \
graphics/screen_item32.o \
graphics/text32.o \
+ graphics/video32.o \
sound/audio32.o \
sound/decoders/sol.o \
video/robot_decoder.o
diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp
index 3e50fc1082..48278e35a7 100644
--- a/engines/sci/resource.cpp
+++ b/engines/sci/resource.cpp
@@ -1367,6 +1367,7 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType resource
if (!file->open(source->getLocationName())) {
warning("ResourceManager::processPatch(): failed to open %s", source->getLocationName().c_str());
delete source;
+ delete file;
return;
}
fileStream = file;
@@ -1376,6 +1377,7 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType resource
if (fsize < 3) {
debug("Patching %s failed - file too small", source->getLocationName().c_str());
delete source;
+ delete fileStream;
return;
}
diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp
index 41fa144b06..3ea2756f56 100644
--- a/engines/sci/sci.cpp
+++ b/engines/sci/sci.cpp
@@ -69,7 +69,9 @@
#include "sci/graphics/palette32.h"
#include "sci/graphics/remap32.h"
#include "sci/graphics/text32.h"
+#include "sci/graphics/video32.h"
#include "sci/sound/audio32.h"
+// TODO: Move this to video32
#include "sci/video/robot_decoder.h"
#endif
@@ -92,6 +94,7 @@ SciEngine::SciEngine(OSystem *syst, const ADGameDescription *desc, SciGameId gam
_sync = nullptr;
#ifdef ENABLE_SCI32
_audio32 = nullptr;
+ _video32 = nullptr;
#endif
_features = 0;
_resMan = 0;
@@ -164,13 +167,15 @@ SciEngine::~SciEngine() {
DebugMan.clearAllDebugChannels();
#ifdef ENABLE_SCI32
- // _gfxPalette32 is the same as _gfxPalette16
- // and will be destroyed when _gfxPalette16 is
- // destroyed
delete _gfxControls32;
delete _gfxPaint32;
delete _gfxText32;
delete _robotDecoder;
+ // GfxFrameout and GfxPalette32 must be deleted after Video32 since
+ // destruction of screen items in the Video32 destructor relies on these
+ // components
+ delete _video32;
+ delete _gfxPalette32;
delete _gfxFrameout;
delete _gfxRemap32;
delete _audio32;
@@ -277,15 +282,20 @@ Common::Error SciEngine::run() {
if (getGameId() == GID_CHRISTMAS1990)
_vocabulary = new Vocabulary(_resMan, false);
+ _gamestate = new EngineState(segMan);
+ _eventMan = new EventManager(_resMan->detectFontExtended());
#ifdef ENABLE_SCI32
if (getSciVersion() >= SCI_VERSION_2_1_EARLY) {
_audio32 = new Audio32(_resMan);
} else
#endif
_audio = new AudioPlayer(_resMan);
+#ifdef ENABLE_SCI32
+ if (getSciVersion() >= SCI_VERSION_2) {
+ _video32 = new Video32(segMan, _eventMan);
+ }
+#endif
_sync = new Sync(_resMan, segMan);
- _gamestate = new EngineState(segMan);
- _eventMan = new EventManager(_resMan->detectFontExtended());
// Create debugger console. It requires GFX and _gamestate to be initialized
_console = new Console(this);
@@ -358,6 +368,17 @@ Common::Error SciEngine::run() {
}
}
+ if (getGameId() == GID_KQ7 && ConfMan.getBool("subtitles")) {
+ showScummVMDialog("Subtitles are enabled, but subtitling in King's"
+ " Quest 7 was unfinished and disabled in the release"
+ " version of the game. ScummVM allows the subtitles"
+ " to be re-enabled, but because they were removed from"
+ " the original game, they do not always render"
+ " properly or reflect the actual game speech."
+ " This is not a ScummVM bug -- it is a problem with"
+ " the game's assets.");
+ }
+
// Show a warning if the user has selected a General MIDI device, no GM patch exists
// (i.e. patch 4) and the game is one of the known 8 SCI1 games that Sierra has provided
// after market patches for in their "General MIDI Utility".
@@ -698,8 +719,7 @@ void SciEngine::initGraphics() {
#ifdef ENABLE_SCI32
if (getSciVersion() >= SCI_VERSION_2) {
- _gfxPalette32 = new GfxPalette32(_resMan, _gfxScreen);
- _gfxPalette16 = _gfxPalette32;
+ _gfxPalette32 = new GfxPalette32(_resMan);
_gfxRemap32 = new GfxRemap32();
} else {
#endif
@@ -748,8 +768,10 @@ void SciEngine::initGraphics() {
}
#endif
- // Set default (EGA, amiga or resource 999) palette
- _gfxPalette16->setDefault();
+ if (getSciVersion() < SCI_VERSION_2) {
+ // Set default (EGA, amiga or resource 999) palette
+ _gfxPalette16->setDefault();
+ }
}
void SciEngine::initStackBaseWithSelector(Selector selector) {
diff --git a/engines/sci/sci.h b/engines/sci/sci.h
index 3216fa13b9..0020d25b91 100644
--- a/engines/sci/sci.h
+++ b/engines/sci/sci.h
@@ -80,9 +80,11 @@ class GfxText32;
class GfxTransitions;
#ifdef ENABLE_SCI32
+// TODO: Move RobotDecoder to Video32
class RobotDecoder;
class GfxFrameout;
class Audio32;
+class Video32;
#endif
// our engine debug levels
@@ -138,6 +140,7 @@ enum SciGameId {
GID_HOYLE2,
GID_HOYLE3,
GID_HOYLE4,
+ GID_HOYLE5,
GID_ICEMAN,
GID_INNDEMO,
GID_ISLANDBRAIN,
@@ -371,6 +374,7 @@ public:
#ifdef ENABLE_SCI32
Audio32 *_audio32;
+ Video32 *_video32;
RobotDecoder *_robotDecoder;
GfxFrameout *_gfxFrameout; // kFrameout and the like for 32-bit gfx
#endif
diff --git a/engines/sci/sound/audio32.cpp b/engines/sci/sound/audio32.cpp
index 4689d13d7d..0cf8e3cb13 100644
--- a/engines/sci/sound/audio32.cpp
+++ b/engines/sci/sound/audio32.cpp
@@ -124,10 +124,10 @@ Audio32::Audio32(ResourceManager *resMan) :
_attenuatedMixing(true),
- _monitoredChannelIndex(-1),
- _monitoredBuffer(nullptr),
- _monitoredBufferSize(0),
- _numMonitoredSamples(0) {
+ _monitoredChannelIndex(-1),
+ _monitoredBuffer(nullptr),
+ _monitoredBufferSize(0),
+ _numMonitoredSamples(0) {
if (getSciVersion() < SCI_VERSION_3) {
_channels.resize(5);
@@ -146,19 +146,13 @@ Audio32::Audio32(ResourceManager *resMan) :
default:
break;
}
- } else if (getSciVersion() == SCI_VERSION_2_1_EARLY) {
- switch (g_sci->getGameId()) {
- // 1.51 uses the non-standard attenuation, but 2.00b
+ } else if (getSciVersion() == SCI_VERSION_2_1_EARLY && g_sci->getGameId() == GID_KQ7) {
+ // KQ7 1.51 uses the non-standard attenuation, but 2.00b
// does not, which is strange.
- case GID_KQ7:
- _useModifiedAttenuation = true;
- default:
- break;
- }
+ _useModifiedAttenuation = true;
}
_mixer->playStream(Audio::Mixer::kSFXSoundType, &_handle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true);
- _mixer->pauseHandle(_handle, true);
}
Audio32::~Audio32() {
@@ -240,16 +234,16 @@ int Audio32::writeAudioInternal(Audio::RewindableAudioStream *const sourceStream
int Audio32::readBuffer(Audio::st_sample_t *buffer, const int numSamples) {
Common::StackLock lock(_mutex);
+ if (_pausedAtTick != 0 || _numActiveChannels == 0) {
+ return 0;
+ }
+
// ResourceManager is not thread-safe so we need to
// avoid calling into it from the audio thread, but at
// the same time we need to be able to clear out any
// finished channels on a regular basis
_inAudioThread = true;
- // The system mixer should not try to get data when
- // Audio32 is paused
- assert(_pausedAtTick == 0 && _numActiveChannels > 0);
-
freeUnusedChannels();
// The caller of `readBuffer` is a rate converter,
@@ -359,6 +353,16 @@ int Audio32::readBuffer(Audio::st_sample_t *buffer, const int numSamples) {
maxSamplesWritten = _numMonitoredSamples;
}
} else if (!channel.stream->endOfStream() || channel.loop) {
+ if (_monitoredChannelIndex != -1) {
+ // Audio that is not on the monitored channel is silent
+ // when the monitored channel is active, but the stream still
+ // needs to be read in order to ensure that sound effects sync
+ // up once the monitored channel is turned off. The easiest
+ // way to guarantee this is to just do the normal channel read,
+ // but set the channel volume to zero so nothing is mixed in
+ leftVolume = rightVolume = 0;
+ }
+
const int channelSamplesWritten = writeAudioInternal(channel.stream, channel.converter, buffer, numSamples, leftVolume, rightVolume, channel.loop);
if (channelSamplesWritten > maxSamplesWritten) {
maxSamplesWritten = channelSamplesWritten;
@@ -652,7 +656,6 @@ uint16 Audio32::play(int16 channelIndex, const ResourceId resourceId, const bool
if (_numActiveChannels == 1) {
_startedAtTick = now;
- _mixer->pauseHandle(_handle, false);
}
return channel.duration;
@@ -683,7 +686,6 @@ bool Audio32::resume(const int16 channelIndex) {
_startedAtTick += now - _pausedAtTick;
_pausedAtTick = 0;
- _mixer->pauseHandle(_handle, false);
return true;
} else if (channelIndex == kRobotChannel) {
for (int i = 0; i < _numActiveChannels; ++i) {
@@ -720,7 +722,6 @@ bool Audio32::pause(const int16 channelIndex) {
if (channelIndex == kAllChannels) {
if (_pausedAtTick == 0) {
_pausedAtTick = now;
- _mixer->pauseHandle(_handle, true);
didPause = true;
}
} else if (channelIndex == kRobotChannel) {
@@ -773,9 +774,6 @@ int16 Audio32::stop(const int16 channelIndex) {
// NOTE: SSCI stops the DSP interrupt and frees the
// global decompression buffer here if there are no
// more active channels
- if (_numActiveChannels == 0) {
- _mixer->pauseHandle(_handle, true);
- }
return oldNumChannels;
}
@@ -891,17 +889,15 @@ reg_t Audio32::kernelPlay(const bool autoPlay, const int argc, const reg_t *cons
#pragma mark Effects
int16 Audio32::getVolume(const int16 channelIndex) const {
- Common::StackLock lock(_mutex);
if (channelIndex < 0 || channelIndex >= _numActiveChannels) {
return _mixer->getChannelVolume(_handle) * kMaxVolume / Audio::Mixer::kMaxChannelVolume;
}
+ Common::StackLock lock(_mutex);
return getChannel(channelIndex).volume;
}
void Audio32::setVolume(const int16 channelIndex, int16 volume) {
- Common::StackLock lock(_mutex);
-
volume = MIN((int16)kMaxVolume, volume);
if (channelIndex == kAllChannels) {
ConfMan.setInt("sfx_volume", volume * Audio::Mixer::kMaxChannelVolume / kMaxVolume);
@@ -909,6 +905,7 @@ void Audio32::setVolume(const int16 channelIndex, int16 volume) {
_mixer->setChannelVolume(_handle, volume * Audio::Mixer::kMaxChannelVolume / kMaxVolume);
g_engine->syncSoundSettings();
} else if (channelIndex != kNoExistingChannel) {
+ Common::StackLock lock(_mutex);
getChannel(channelIndex).volume = volume;
}
}
diff --git a/engines/sci/sound/audio32.h b/engines/sci/sound/audio32.h
index 42211eb890..b0c1ba1998 100644
--- a/engines/sci/sound/audio32.h
+++ b/engines/sci/sound/audio32.h
@@ -108,7 +108,7 @@ struct AudioChannel {
/**
* The end volume of a fade.
*/
- uint32 fadeTargetVolume;
+ int fadeTargetVolume;
/**
* Whether or not the channel should be stopped and
diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp
index 3f34ecc2f8..487d30e840 100644
--- a/engines/sci/sound/music.cpp
+++ b/engines/sci/sound/music.cpp
@@ -354,12 +354,14 @@ void SciMusic::soundInitSnd(MusicEntry *pSnd) {
pSnd->pStreamAud = Audio::makeRawStream(channelData + track->digitalSampleStart,
track->digitalSampleSize - track->digitalSampleStart - endPart,
track->digitalSampleRate, flags, DisposeAfterUse::NO);
+ assert(pSnd->pStreamAud);
delete pSnd->pLoopStream;
pSnd->pLoopStream = 0;
pSnd->soundType = Audio::Mixer::kSFXSoundType;
pSnd->hCurrentAud = Audio::SoundHandle();
pSnd->playBed = false;
pSnd->overridePriority = false;
+ pSnd->isSample = true;
} else {
// play MIDI track
Common::StackLock lock(_mutex);
@@ -659,6 +661,7 @@ void SciMusic::soundKill(MusicEntry *pSnd) {
pSnd->pStreamAud = NULL;
delete pSnd->pLoopStream;
pSnd->pLoopStream = 0;
+ pSnd->isSample = false;
}
_mutex.lock();
diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp
index c3c159de55..b9a764c93a 100644
--- a/engines/sci/sound/soundcmd.cpp
+++ b/engines/sci/sound/soundcmd.cpp
@@ -722,7 +722,7 @@ reg_t SoundCommandParser::kDoSoundSetVolume(int argc, reg_t *argv, reg_t acc) {
// SSCI unconditionally sets volume if it is digital audio
if (_soundVersion >= SCI_VERSION_2_1_EARLY && musicSlot->isSample) {
_music->soundSetVolume(musicSlot, value);
- } else
+ }
#endif
if (musicSlot->volume != value) {
musicSlot->volume = value;
diff --git a/engines/scumm/actor.cpp b/engines/scumm/actor.cpp
index cd54c175cc..b3e7926015 100644
--- a/engines/scumm/actor.cpp
+++ b/engines/scumm/actor.cpp
@@ -259,6 +259,8 @@ void Actor_v0::initActor(int mode) {
_limb_flipped[i] = false;
}
+ walkBoxQueueReset();
+
if (_vm->_game.features & GF_DEMO) {
_sound[0] = v0ActorDemoTalk[_number];
} else {
@@ -266,6 +268,116 @@ void Actor_v0::initActor(int mode) {
}
}
+void Actor_v0::walkBoxQueueReset() {
+ _walkboxHistory.clear();
+ _walkboxQueueIndex = 0;
+
+ for (uint i = 0; i < ARRAYSIZE(_walkboxQueue); ++i) {
+ _walkboxQueue[i] = kInvalidBox;
+ }
+}
+
+bool Actor_v0::walkBoxQueueAdd(int box) {
+
+ if (_walkboxQueueIndex == ARRAYSIZE(_walkboxQueue))
+ return false;
+
+ _walkboxQueue[_walkboxQueueIndex++] = box;
+ _walkboxHistory.push_back(box);
+ return true;
+}
+
+void Actor_v0::walkboxQueueReverse() {
+ int j = ARRAYSIZE(_walkboxQueue) - 1;
+
+ while (_walkboxQueue[j] == kInvalidBox && j >= 1)
+ --j;
+
+ if (j <= 1)
+ return;
+
+ for (int i = 1; i < j && j >= 1 ; ++i, --j) {
+
+ byte tmp = _walkboxQueue[i];
+
+ _walkboxQueue[i] = _walkboxQueue[j];
+ _walkboxQueue[j] = tmp;
+ }
+}
+
+bool Actor_v0::walkBoxQueueFind(int box) {
+
+ for (uint i = 0; i < _walkboxHistory.size(); ++i) {
+ if (box == _walkboxHistory[i])
+ return true;
+ }
+
+ return false;
+}
+
+bool Actor_v0::walkBoxQueuePrepare() {
+ walkBoxQueueReset();
+ int BoxFound = _walkbox;
+
+ if (BoxFound == _walkdata.destbox) {
+
+ _newWalkBoxEntered = true;
+ return true;
+ }
+
+ // Build a series of walkboxes from our current position, to the target
+ do {
+ // Add the current box to the queue
+ if (!walkBoxQueueAdd(BoxFound))
+ return false;
+
+ // Loop until we find a walkbox which hasn't been tested
+ while (_walkboxQueueIndex > 0) {
+
+ // Check if the dest box is a direct neighbour
+ if ((BoxFound = _vm->getNextBox(BoxFound, _walkdata.destbox)) == kInvalidBox) {
+
+ // Its not, start hunting through this boxes immediate connections
+ byte* boxm = _vm->getBoxConnectionBase(_walkboxQueue[_walkboxQueueIndex - 1]);
+
+ // Attempt to find one, which we havn't already used
+ for (; *boxm != kInvalidBox; ++boxm) {
+ if (walkBoxQueueFind(*boxm) != true)
+ break;
+ }
+
+ BoxFound = *boxm;
+ }
+
+ // Found one?
+ if (BoxFound != kInvalidBox) {
+
+ // Did we find a connection to the final walkbox
+ if (BoxFound == _walkdata.destbox) {
+
+ _newWalkBoxEntered = true;
+
+ walkBoxQueueAdd(BoxFound);
+
+ walkboxQueueReverse();
+ return true;
+ }
+
+ // Nope, check the next box
+ break;
+ }
+
+ // Drop this box, its useless to us
+ _walkboxQueue[--_walkboxQueueIndex] = kInvalidBox;
+
+ BoxFound = _walkboxQueue[_walkboxQueueIndex - 1];
+ }
+
+ } while (_walkboxQueueIndex > 0);
+
+ return false;
+}
+
void Actor::setBox(int box) {
_walkbox = box;
setupActorScale();
@@ -634,17 +746,18 @@ void Actor::startWalkActor(int destX, int destY, int dir) {
_walkdata.dest.y = abr.y;
_walkdata.destbox = abr.box;
_walkdata.destdir = dir;
-
+ _walkdata.point3.x = 32000;
+ _walkdata.curbox = _walkbox;
+
if (_vm->_game.version == 0) {
- ((Actor_v0*)this)->_newWalkBoxEntered = true;
+ ((Actor_v0 *)this)->walkBoxQueuePrepare();
+
} else if (_vm->_game.version <= 2) {
_moving = (_moving & ~(MF_LAST_LEG | MF_IN_LEG)) | MF_NEW_LEG;
} else {
_moving = (_moving & MF_IN_LEG) | MF_NEW_LEG;
}
- _walkdata.point3.x = 32000;
- _walkdata.curbox = _walkbox;
}
void Actor::startWalkAnim(int cmd, int angle) {
@@ -861,13 +974,7 @@ L2C36:;
stopActorMoving();
return;
}
- // 2C98: Yes, an exact copy of what just occurred.. the original does this, so im doing it...
- // Just to keep me sane when going over it :)
- if (A == 0xFF) {
- setActorFromTmp();
- stopActorMoving();
- return;
- }
+
return;
}
@@ -1398,13 +1505,13 @@ void Actor::putActor(int dstX, int dstY, int newRoom) {
showActor();
}
- // V0 always sets the actor to face the camera upon entering a room
if (_vm->_game.version == 0) {
- _walkdata.dest = _pos;
- ((Actor_v0*)this)->_newWalkBoxEntered = true;
- ((Actor_v0*)this)->_CurrentWalkTo = _pos;
+ ((Actor_v0 *)this)->_newWalkBoxEntered = false;
+ ((Actor_v0 *)this)->_CurrentWalkTo = _pos;
+ ((Actor_v0 *)this)->_NewWalkTo = _pos;
+ // V0 always sets the actor to face the camera upon entering a room
setDirection(oldDirToNewDir(2));
}
}
@@ -1549,7 +1656,7 @@ AdjustBoxResult Actor_v0::adjustPosInBorderWalkbox(AdjustBoxResult box) {
if (A < box.x)
return box;
- if (A < 0xA0 || A == 0xA0)
+ if (A <= 0xA0)
A = 0;
Result.x = A;
@@ -1980,9 +2087,10 @@ void ScummEngine::processActors() {
if (_game.version == 0) {
// 0x057B
Actor_v0 *a0 = (Actor_v0*) a;
- if (a0->_speaking & 1)
+ if (a0->_speaking & 1) {
a0->_speaking ^= 0xFE;
-
+ ++_V0Delay._actorRedrawCount;
+ }
// 0x22B5
if (a0->_miscflags & kActorMiscFlagHide)
continue;
@@ -2404,8 +2512,13 @@ void Actor_v0::limbFrameCheck(int limb) {
void Actor_v0::animateCostume() {
speakCheck();
- if (_vm->_costumeLoader->increaseAnims(this))
+ byte count = _vm->_costumeLoader->increaseAnims(this);
+
+ if (count) {
+ _vm->_V0Delay._actorLimbRedrawDrawCount += count;
+
_needRedraw = true;
+ }
}
void Actor_v0::speakCheck() {
@@ -3254,7 +3367,7 @@ void Actor_v0::animateActor(int anim) {
} else {
- if (anim > 4 && anim <= 7)
+ if (anim >= 4 && anim <= 7)
_facing = normalizeAngle(oldDirToNewDir(dir));
}
}
@@ -3311,13 +3424,13 @@ void Actor_v0::setActorFromTmp() {
}
void Actor_v0::actorSetWalkTo() {
-
+
if (_newWalkBoxEntered == false)
return;
_newWalkBoxEntered = false;
- int nextBox = ((ScummEngine_v0*)_vm)->walkboxFindTarget(this, _walkdata.destbox, _walkdata.dest);
+ int nextBox = ((ScummEngine_v0 *)_vm)->walkboxFindTarget(this, _walkdata.destbox, _walkdata.dest);
if (nextBox != kInvalidBox) {
_walkdata.curbox = nextBox;
}
@@ -3350,10 +3463,38 @@ void Actor_v0::saveLoadWithSerializer(Serializer *ser) {
MKLINE(Actor_v0, _walkYCount, sleByte, VER(97)),
MKLINE(Actor_v0, _walkYCountInc, sleByte, VER(97)),
MKLINE(Actor_v0, _walkMaxXYCountInc, sleByte, VER(97)),
+
+ MKARRAY(Actor_v0, _walkboxQueue[0], sleByte, 16, VER(98)),
+ MKLINE(Actor_v0, _walkboxQueueIndex, sleByte, VER(98)),
MKEND()
};
ser->saveLoadEntries(this, actorEntries);
+
+ // When loading, we need to ensure the limbs are restarted
+ if (ser->isLoading()) {
+
+ // valid costume command?
+ if (_costCommand != 0xFF) {
+
+ // Do we have a walkbox queue?
+ if (_walkboxQueueIndex < 1) {
+ _costCommand = 0xFF;
+
+ // Standing Still
+ setDirection(_facing);
+ speakCheck();
+
+ } else {
+ // Force limb direction update
+ _facing = 0;
+ directionUpdate();
+
+ // Begin walking
+ animateActor(newDirToOldDir(_facing));
+ }
+ }
+ }
}
void Actor::saveLoadWithSerializer(Serializer *ser) {
@@ -3496,6 +3637,8 @@ void Actor::saveLoadWithSerializer(Serializer *ser) {
_walkdata.point3.x >>= V12_X_SHIFT;
_walkdata.point3.y >>= V12_Y_SHIFT;
}
+
+ setDirection(_facing);
}
}
diff --git a/engines/scumm/actor.h b/engines/scumm/actor.h
index c1a3f23318..62ba161f4e 100644
--- a/engines/scumm/actor.h
+++ b/engines/scumm/actor.h
@@ -350,6 +350,11 @@ class Actor_v0 : public Actor_v2 {
public:
Common::Point _CurrentWalkTo, _NewWalkTo;
+ Common::Array<byte> _walkboxHistory;
+
+ byte _walkboxQueue[0x10];
+ byte _walkboxQueueIndex;
+
byte _costCommandNew;
byte _costCommand;
byte _miscflags;
@@ -380,6 +385,12 @@ public:
bool _limb_flipped[8];
+private:
+
+ bool walkBoxQueueAdd(int box);
+ bool walkBoxQueueFind(int box);
+ void walkboxQueueReverse();
+
public:
Actor_v0(ScummEngine *scumm, int id) : Actor_v2(scumm, id) {}
@@ -401,6 +412,9 @@ public:
byte actorWalkY();
byte updateWalkbox();
+ void walkBoxQueueReset();
+ bool walkBoxQueuePrepare();
+
AdjustBoxResult adjustXYToBeInBox(int dstX, int dstY);
AdjustBoxResult adjustPosInBorderWalkbox(AdjustBoxResult box);
diff --git a/engines/scumm/boxes.cpp b/engines/scumm/boxes.cpp
index 087d8425ac..b5caec3c4f 100644
--- a/engines/scumm/boxes.cpp
+++ b/engines/scumm/boxes.cpp
@@ -692,6 +692,22 @@ byte *ScummEngine::getBoxMatrixBaseAddr() {
return ptr;
}
+byte *ScummEngine::getBoxConnectionBase(int box) {
+ byte *boxm = getBoxMatrixBaseAddr();
+
+ int boxIndex = 0;
+
+ for (; boxIndex != box; ++boxIndex) {
+
+ while (*boxm != 0xFF) {
+ ++boxm;
+ }
+
+ ++boxm;
+ }
+
+ return boxm;
+}
/**
* Compute if there is a way that connects box 'from' with box 'to'.
* Returns the number of a box adjacent to 'from' that is the next on the
@@ -719,21 +735,18 @@ int ScummEngine::getNextBox(byte from, byte to) {
boxm = getBoxMatrixBaseAddr();
if (_game.version == 0) {
- // calculate shortest paths
- byte *itineraryMatrix = (byte *)malloc(numOfBoxes * numOfBoxes);
- calcItineraryMatrix(itineraryMatrix, numOfBoxes);
- dest = to;
- do {
- dest = itineraryMatrix[numOfBoxes * from + dest];
- } while (dest != Actor::kInvalidBox && !areBoxesNeighbors(from, dest));
+ boxm = getBoxConnectionBase(from);
- if (dest == Actor::kInvalidBox)
- dest = -1;
+ for (; *boxm != 0xFF; ++boxm) {
+ if (*boxm == to)
+ break;
+ }
- free(itineraryMatrix);
- return dest;
- } else if (_game.version <= 2) {
+ return *boxm;
+
+ }
+ else if (_game.version <= 2) {
// The v2 box matrix is a real matrix with numOfBoxes rows and columns.
// The first numOfBoxes bytes contain indices to the start of the corresponding
// row (although that seems unnecessary to me - the value is easily computable.
@@ -967,6 +980,7 @@ void ScummEngine::calcItineraryMatrix(byte *itineraryMatrix, int num) {
// 255 (= infinity) to all other boxes.
for (i = 0; i < num; i++) {
for (j = 0; j < num; j++) {
+
if (i == j) {
adjacentMatrix[i * boxSize + j] = 0;
itineraryMatrix[i * boxSize + j] = j;
@@ -1159,21 +1173,32 @@ bool ScummEngine::areBoxesNeighbors(int box1nr, int box2nr) {
}
byte ScummEngine_v0::walkboxFindTarget(Actor *a, int destbox, Common::Point walkdest) {
- Actor_v0 *Actor = (Actor_v0*)a;
+ Actor_v0 *Actor = (Actor_v0 *)a;
+ byte nextBox = kOldInvalidBox;
- byte nextBox = getNextBox(a->_walkbox, destbox);
+ // Do we have a walkbox queue to process
+ if (Actor->_walkboxQueueIndex > 1) {
+ nextBox = Actor->_walkboxQueue[--Actor->_walkboxQueueIndex];
- if (nextBox != 0xFF && nextBox == destbox && areBoxesNeighbors(a->_walkbox, nextBox)) {
+ if (Actor->_walkboxQueueIndex <= 1) {
+ Actor->walkBoxQueueReset();
+ }
+ }
+
+ // Target box reached?
+ if (nextBox != Actor::kInvalidBox && nextBox == destbox && areBoxesNeighbors(a->_walkbox, nextBox)) {
Actor->_NewWalkTo = walkdest;
return nextBox;
}
- if (nextBox != 0xFF && nextBox != a->_walkbox) {
+ // Next box reached
+ if (nextBox != Actor::kInvalidBox && nextBox != a->_walkbox) {
- getClosestPtOnBox(getBoxCoordinates(nextBox), a->getPos().x, a->getPos().y, Actor->_NewWalkTo.x, Actor->_NewWalkTo.y);
+ getClosestPtOnBox(getBoxCoordinates(nextBox), a->getRealPos().x, a->getRealPos().y, Actor->_NewWalkTo.x, Actor->_NewWalkTo.y);
} else {
+
if (walkdest.x == -1)
Actor->_NewWalkTo = Actor->_CurrentWalkTo;
else
diff --git a/engines/scumm/gfx.cpp b/engines/scumm/gfx.cpp
index 1d1b6b4f13..48818b8abf 100644
--- a/engines/scumm/gfx.cpp
+++ b/engines/scumm/gfx.cpp
@@ -3795,6 +3795,11 @@ void ScummEngine::fadeOut(int effect) {
_textSurface.fillRect(Common::Rect(0, vs->topline * _textSurfaceMultiplier, _textSurface.pitch, (vs->topline + vs->h) * _textSurfaceMultiplier), 0);
#endif
+ // V0 wipes the text area before fading out
+ if (_game.version == 0) {
+ updateDirtyScreen(kTextVirtScreen);
+ }
+
// TheDig can disable fadeIn(), and may call fadeOut() several times
// successively. Disabling the _screenEffectFlag check forces the screen
// to get cleared. This fixes glitches, at least, in the first cutscenes
diff --git a/engines/scumm/gfx.h b/engines/scumm/gfx.h
index 42844daf30..86913f9e2e 100644
--- a/engines/scumm/gfx.h
+++ b/engines/scumm/gfx.h
@@ -58,7 +58,7 @@ struct CameraData {
/** Virtual screen identifiers */
enum VirtScreenNumber {
kMainVirtScreen = 0, // The 'stage'
- kTextVirtScreen = 1, // In V1-V3 games: the area where text is printed
+ kTextVirtScreen = 1, // In V0-V3 games: the area where text is printed
kVerbVirtScreen = 2, // The verb area
kUnkVirtScreen = 3 // ?? Not sure what this one is good for...
};
diff --git a/engines/scumm/object.cpp b/engines/scumm/object.cpp
index db836467ef..da94a34baf 100644
--- a/engines/scumm/object.cpp
+++ b/engines/scumm/object.cpp
@@ -1126,6 +1126,7 @@ void ScummEngine_v80he::clearDrawQueues() {
*/
void ScummEngine::markObjectRectAsDirty(int obj) {
int i, strip;
+ ++_V0Delay._objectRedrawCount;
for (i = 1; i < _numLocalObjects; i++) {
if (_objs[i].obj_nr == (uint16)obj) {
@@ -1133,6 +1134,7 @@ void ScummEngine::markObjectRectAsDirty(int obj) {
const int minStrip = MAX(_screenStartStrip, _objs[i].x_pos / 8);
const int maxStrip = MIN(_screenEndStrip+1, _objs[i].x_pos / 8 + _objs[i].width / 8);
for (strip = minStrip; strip < maxStrip; strip++) {
+ ++_V0Delay._objectStripRedrawCount;
setGfxUsageBit(strip, USAGE_BIT_DIRTY);
}
}
diff --git a/engines/scumm/saveload.h b/engines/scumm/saveload.h
index 753287e217..fb2d45df8c 100644
--- a/engines/scumm/saveload.h
+++ b/engines/scumm/saveload.h
@@ -47,7 +47,7 @@ namespace Scumm {
* only saves/loads those which are valid for the version of the savegame
* which is being loaded/saved currently.
*/
-#define CURRENT_VER 97
+#define CURRENT_VER 98
/**
* An auxillary macro, used to specify savegame versions. We use this instead
diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp
index 3b7dea194b..72c6909f8c 100644
--- a/engines/scumm/scumm.cpp
+++ b/engines/scumm/scumm.cpp
@@ -733,10 +733,39 @@ ScummEngine_v0::ScummEngine_v0(OSystem *syst, const DetectorResult &dr)
VAR_IS_SOUND_RUNNING = 0xFF;
VAR_ACTIVE_VERB = 0xFF;
+ DelayReset();
+
if (strcmp(dr.fp.pattern, "maniacdemo.d64") == 0 )
_game.features |= GF_DEMO;
}
+void ScummEngine_v0::DelayReset() {
+ _V0Delay._screenScroll = false;
+ _V0Delay._objectRedrawCount = 0;
+ _V0Delay._objectStripRedrawCount = 0;
+ _V0Delay._actorRedrawCount = 0;
+ _V0Delay._actorLimbRedrawDrawCount = 0;
+}
+
+int ScummEngine_v0::DelayCalculateDelta() {
+ float Time = 0;
+
+ // These values are made up, based on trial/error with visual inspection against WinVice
+ // If anyone feels inclined, the routines in the original engine could be profiled
+ // and these values changed accordindly.
+ Time += _V0Delay._objectRedrawCount * 7;
+ Time += _V0Delay._objectStripRedrawCount * 0.6;
+ Time += _V0Delay._actorRedrawCount * 2.0;
+ Time += _V0Delay._actorLimbRedrawDrawCount * 0.3;
+
+ if (_V0Delay._screenScroll)
+ Time += 3.6f;
+
+ DelayReset();
+
+ return floor(Time + 0.5);
+}
+
ScummEngine_v6::ScummEngine_v6(OSystem *syst, const DetectorResult &dr)
: ScummEngine(syst, dr) {
_blastObjectQueuePos = 0;
@@ -2079,13 +2108,24 @@ Common::Error ScummEngine::go() {
if (delta < 1) // Ensure we don't get into an endless loop
delta = 1; // by not decreasing sleepers.
- // WORKAROUND: walking speed in the original v0/v1 interpreter
+ // WORKAROUND: Unfortunately the MOS 6502 wasn't always fast enough for MM
+ // a number of situations can lead to the engine running at less than 60 ticks per second, without this drop
+ // - A single kid is able to escape via the Dungeon Door (after pushing the brick)
+ // - During the intro, calls to 'SetState08' are made for the lights on the mansion, with a 'breakHere'
+ // in between each, the reduction in ticks then occurs while affected stripes are being redrawn.
+ // The music buildup is then out of sync with the text "A Lucasfilm Games Production".
+ // Each call to 'breakHere' has been replaced with calls to 'Delay' in the V1/V2 versions of the game
+ if (_game.version == 0) {
+ delta += ((ScummEngine_v0 *)this)->DelayCalculateDelta();
+ }
+
+ // WORKAROUND: walking speed in the original v1 interpreter
// is sometimes slower (e.g. during scrolling) than in ScummVM.
// This is important for the door-closing action in the dungeon,
// otherwise (delta < 6) a single kid is able to escape.
- if ((_game.version == 0 && isScriptRunning(132)) ||
- (_game.version == 1 && isScriptRunning(137)))
- delta = 6;
+ if (_game.version == 1 && isScriptRunning(137)) {
+ delta = 6;
+ }
// Wait...
waitForTimer(delta * 1000 / 60 - diff);
@@ -2452,6 +2492,8 @@ void ScummEngine_v8::scummLoop_handleSaveLoad() {
void ScummEngine::scummLoop_handleDrawing() {
if (camera._cur != camera._last || _bgNeedsRedraw || _fullRedraw) {
+ _V0Delay._screenScroll = true;
+
redrawBGAreas();
}
diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h
index f9758aec33..2906fc71f5 100644
--- a/engines/scumm/scumm.h
+++ b/engines/scumm/scumm.h
@@ -298,7 +298,14 @@ struct StringTab : StringSlot {
}
};
+struct ScummEngine_v0_Delays {
+ bool _screenScroll;
+ uint _objectRedrawCount;
+ uint _objectStripRedrawCount;
+ uint _actorRedrawCount;
+ uint _actorLimbRedrawDrawCount;
+};
enum WhereIsObject {
WIO_NOT_FOUND = -1,
@@ -1097,6 +1104,8 @@ public:
// Indy4 Amiga specific
byte *_verbPalette;
+ ScummEngine_v0_Delays _V0Delay;
+
protected:
int _shadowPaletteSize;
byte _currentPalette[3 * 256];
@@ -1131,6 +1140,8 @@ public:
byte getNumBoxes();
byte *getBoxMatrixBaseAddr();
+ byte *getBoxConnectionBase(int box);
+
int getNextBox(byte from, byte to);
void setBoxFlags(int box, int val);
diff --git a/engines/scumm/scumm_v0.h b/engines/scumm/scumm_v0.h
index 4098d639c4..5f40940166 100644
--- a/engines/scumm/scumm_v0.h
+++ b/engines/scumm/scumm_v0.h
@@ -70,6 +70,10 @@ public:
byte walkboxFindTarget(Actor *a, int destbox, Common::Point walkdest);
+ /* Delay calculation */
+ void DelayReset();
+ int DelayCalculateDelta();
+
protected:
virtual void resetRoomObject(ObjectData *od, const byte *room, const byte *searchptr = NULL);
diff --git a/engines/sky/compact.cpp b/engines/sky/compact.cpp
index ee165934a0..ce62dcb2ae 100644
--- a/engines/sky/compact.cpp
+++ b/engines/sky/compact.cpp
@@ -236,6 +236,8 @@ SkyCompact::SkyCompact() {
for (cnt = 0; cnt < _numSaveIds; cnt++)
_saveIds[cnt] = FROM_LE_16(_saveIds[cnt]);
_resetDataPos = _cptFile->pos();
+
+ checkAndFixOfficerBluntError();
}
SkyCompact::~SkyCompact() {
@@ -257,6 +259,21 @@ SkyCompact::~SkyCompact() {
delete _cptFile;
}
+/* WORKAROUND for bug #2687:
+ The first release of scummvm with externalized, binary compact data has one broken 16 bit reference.
+ When talking to Officer Blunt on ground level while in a crouched position, the game enters an
+ unfinishable state because Blunt jumps into the lake and can no longer be interacted with.
+ This fixes the problem when playing with a broken sky.cpt */
+#define SCUMMVM_BROKEN_TALK_INDEX 158
+void SkyCompact::checkAndFixOfficerBluntError() {
+ // Retrieve the table with the animation ids to use for talking
+ uint16 *talkTable = (uint16*)fetchCpt(CPT_TALK_TABLE_LIST);
+ if (talkTable[SCUMMVM_BROKEN_TALK_INDEX] == ID_SC31_GUARD_TALK) {
+ debug(1, "SKY.CPT with Officer Blunt bug encountered, fixing talk gfx.");
+ talkTable[SCUMMVM_BROKEN_TALK_INDEX] = ID_SC31_GUARD_TALK2;
+ }
+}
+
// needed for some workaround where the engine has to check if it's currently processing joey, for example
bool SkyCompact::cptIsId(Compact *cpt, uint16 id) {
return (cpt == fetchCpt(id));
diff --git a/engines/sky/compact.h b/engines/sky/compact.h
index 0bd5b4943b..86db0ba55b 100644
--- a/engines/sky/compact.h
+++ b/engines/sky/compact.h
@@ -78,6 +78,8 @@ public:
uint16 giveDataListLen(uint16 listNum);
const char *nameForType(uint16 type);
private:
+ void checkAndFixOfficerBluntError();
+
uint16 _numDataLists;
uint16 *_dataListLen;
uint16 *_rawBuf;
diff --git a/engines/sky/logic.cpp b/engines/sky/logic.cpp
index e1175f9936..ad656ac8df 100644
--- a/engines/sky/logic.cpp
+++ b/engines/sky/logic.cpp
@@ -1717,7 +1717,7 @@ bool Logic::fnSpeakMe(uint32 targetId, uint32 mesgNum, uint32 animNum) {
on other screens, as the lack of speech files for these lines
will cause Foster's speech to be aborted if the timing is bad.
*/
- if (targetId == 0x4039 && animNum == 0x9B && Logic::_scriptVariables[SCREEN] != 38) {
+ if (targetId == ID_DANIELLE && animNum == 0x9B && Logic::_scriptVariables[SCREEN] != 38) {
return false;
}
diff --git a/engines/wage/design.cpp b/engines/wage/design.cpp
index f2a8aba812..2bfea9df7d 100644
--- a/engines/wage/design.cpp
+++ b/engines/wage/design.cpp
@@ -474,28 +474,27 @@ void Design::drawBitmap(Graphics::ManagedSurface *surface, Common::SeekableReadS
in.skip(numBytes);
- if (_boundsCalculationMode)
- return;
-
- Graphics::FloodFill ff(&tmp, kColorWhite, kColorGreen);
- for (int yy = 0; yy < h; yy++) {
- ff.addSeed(0, yy);
- ff.addSeed(w - 1, yy);
- }
- for (int xx = 0; xx < w; xx++) {
- ff.addSeed(xx, 0);
- ff.addSeed(xx, h - 1);
- }
- ff.fill();
-
- for (y = 0; y < h && y1 + y < surface->h; y++) {
- byte *src = (byte *)tmp.getBasePtr(0, y);
- byte *dst = (byte *)surface->getBasePtr(x1, y1 + y);
- for (x = 0; x < w; x++) {
- if (*src != kColorGreen)
- *dst = *src;
- src++;
- dst++;
+ if (!_boundsCalculationMode) {
+ Graphics::FloodFill ff(&tmp, kColorWhite, kColorGreen);
+ for (int yy = 0; yy < h; yy++) {
+ ff.addSeed(0, yy);
+ ff.addSeed(w - 1, yy);
+ }
+ for (int xx = 0; xx < w; xx++) {
+ ff.addSeed(xx, 0);
+ ff.addSeed(xx, h - 1);
+ }
+ ff.fill();
+
+ for (y = 0; y < h && y1 + y < surface->h; y++) {
+ byte *src = (byte *)tmp.getBasePtr(0, y);
+ byte *dst = (byte *)surface->getBasePtr(x1, y1 + y);
+ for (x = 0; x < w; x++) {
+ if (*src != kColorGreen)
+ *dst = *src;
+ src++;
+ dst++;
+ }
}
}
diff --git a/engines/wage/dialog.cpp b/engines/wage/dialog.cpp
index d9bb3e6a61..86080c9a6f 100644
--- a/engines/wage/dialog.cpp
+++ b/engines/wage/dialog.cpp
@@ -86,6 +86,8 @@ Dialog::Dialog(Gui *gui, int width, const char *text, DialogButtonArray *buttons
}
Dialog::~Dialog() {
+ for (uint i = 0; i < _buttons->size(); i++)
+ delete _buttons->operator[](i);
}
const Graphics::Font *Dialog::getDialogFont() {
diff --git a/engines/wage/gui.cpp b/engines/wage/gui.cpp
index 310e5734b7..099279158f 100644
--- a/engines/wage/gui.cpp
+++ b/engines/wage/gui.cpp
@@ -83,7 +83,7 @@ static const MenuData menuSubItems[] = {
};
static void cursorTimerHandler(void *refCon) {
- Gui *gui = (Gui *)refCon;
+ Gui *gui = (Gui *)refCon;
int x = gui->_cursorX;
int y = gui->_cursorY;
diff --git a/engines/wage/macwindow.cpp b/engines/wage/macwindow.cpp
index 8903936061..db8ef38c39 100644
--- a/engines/wage/macwindow.cpp
+++ b/engines/wage/macwindow.cpp
@@ -264,16 +264,16 @@ void MacWindow::setHighlight(WindowClick highlightedPart) {
_highlightedPart = highlightedPart;
_borderIsDirty = true;
- }
+}
- void MacWindow::setScroll(float scrollPos, float scrollSize) {
+void MacWindow::setScroll(float scrollPos, float scrollSize) {
if (_scrollPos == scrollPos && _scrollSize == scrollSize)
return;
_scrollPos = scrollPos;
_scrollSize = scrollSize;
_borderIsDirty = true;
- }
+}
void MacWindow::drawBox(Graphics::ManagedSurface *g, int x, int y, int w, int h) {
diff --git a/engines/wage/macwindowmanager.cpp b/engines/wage/macwindowmanager.cpp
index 5cc54d648a..6ca2efd7c9 100644
--- a/engines/wage/macwindowmanager.cpp
+++ b/engines/wage/macwindowmanager.cpp
@@ -117,9 +117,9 @@ static const byte macCursorBeam[] = {
};
MacWindowManager::MacWindowManager() {
- _screen = 0;
- _lastId = 0;
- _activeWindow = -1;
+ _screen = 0;
+ _lastId = 0;
+ _activeWindow = -1;
_menu = 0;
@@ -141,21 +141,21 @@ MacWindowManager::MacWindowManager() {
}
MacWindowManager::~MacWindowManager() {
- for (int i = 0; i < _lastId; i++)
- delete _windows[i];
+ for (int i = 0; i < _lastId; i++)
+ delete _windows[i];
}
MacWindow *MacWindowManager::addWindow(bool scrollable, bool resizable, bool editable) {
- MacWindow *w = new MacWindow(_lastId, scrollable, resizable, editable, this);
+ MacWindow *w = new MacWindow(_lastId, scrollable, resizable, editable, this);
- _windows.push_back(w);
- _windowStack.push_back(w);
+ _windows.push_back(w);
+ _windowStack.push_back(w);
- setActive(_lastId);
+ setActive(_lastId);
- _lastId++;
+ _lastId++;
- return w;
+ return w;
}
Menu *MacWindowManager::addMenu() {
@@ -169,20 +169,20 @@ Menu *MacWindowManager::addMenu() {
}
void MacWindowManager::setActive(int id) {
- if (_activeWindow == id)
- return;
+ if (_activeWindow == id)
+ return;
- if (_activeWindow != -1)
- _windows[_activeWindow]->setActive(false);
+ if (_activeWindow != -1)
+ _windows[_activeWindow]->setActive(false);
- _activeWindow = id;
+ _activeWindow = id;
- _windows[id]->setActive(true);
+ _windows[id]->setActive(true);
- _windowStack.remove(_windows[id]);
- _windowStack.push_back(_windows[id]);
+ _windowStack.remove(_windows[id]);
+ _windowStack.push_back(_windows[id]);
- _fullRefresh = true;
+ _fullRefresh = true;
}
struct PlotData {
@@ -241,28 +241,28 @@ void MacWindowManager::drawDesktop() {
}
void MacWindowManager::draw() {
- assert(_screen);
+ assert(_screen);
if (_fullRefresh)
drawDesktop();
- for (Common::List<BaseMacWindow *>::const_iterator it = _windowStack.begin(); it != _windowStack.end(); it++) {
- BaseMacWindow *w = *it;
- if (w->draw(_screen, _fullRefresh)) {
- w->setDirty(false);
+ for (Common::List<BaseMacWindow *>::const_iterator it = _windowStack.begin(); it != _windowStack.end(); it++) {
+ BaseMacWindow *w = *it;
+ if (w->draw(_screen, _fullRefresh)) {
+ w->setDirty(false);
Common::Rect clip(w->getDimensions().left - 2, w->getDimensions().top - 2, w->getDimensions().right - 2, w->getDimensions().bottom - 2);
clip.clip(_screen->getBounds());
- g_system->copyRectToScreen(_screen->getBasePtr(clip.left, clip.top), _screen->pitch, clip.left, clip.top, clip.width(), clip.height());
- }
- }
+ g_system->copyRectToScreen(_screen->getBasePtr(clip.left, clip.top), _screen->pitch, clip.left, clip.top, clip.width(), clip.height());
+ }
+ }
// Menu is drawn on top of everything and always
if (_menu)
_menu->draw(_screen, _fullRefresh);
- _fullRefresh = false;
+ _fullRefresh = false;
}
bool MacWindowManager::processEvent(Common::Event &event) {
@@ -270,9 +270,9 @@ bool MacWindowManager::processEvent(Common::Event &event) {
if (_menu && _menu->processEvent(event))
return true;
- if (event.type != Common::EVENT_MOUSEMOVE && event.type != Common::EVENT_LBUTTONDOWN &&
- event.type != Common::EVENT_LBUTTONUP)
- return false;
+ if (event.type != Common::EVENT_MOUSEMOVE && event.type != Common::EVENT_LBUTTONDOWN &&
+ event.type != Common::EVENT_LBUTTONUP)
+ return false;
if (_windows[_activeWindow]->isEditable() && _windows[_activeWindow]->getType() == kWindowWindow &&
((MacWindow *)_windows[_activeWindow])->getInnerDimensions().contains(event.mouse.x, event.mouse.y)) {
@@ -287,19 +287,19 @@ bool MacWindowManager::processEvent(Common::Event &event) {
}
}
- for (Common::List<BaseMacWindow *>::const_iterator it = _windowStack.end(); it != _windowStack.begin();) {
- it--;
- BaseMacWindow *w = *it;
+ for (Common::List<BaseMacWindow *>::const_iterator it = _windowStack.end(); it != _windowStack.begin();) {
+ it--;
+ BaseMacWindow *w = *it;
- if (w->hasAllFocus() || w->getDimensions().contains(event.mouse.x, event.mouse.y)) {
- if (event.type == Common::EVENT_LBUTTONDOWN || event.type == Common::EVENT_LBUTTONUP)
- setActive(w->getId());
+ if (w->hasAllFocus() || w->getDimensions().contains(event.mouse.x, event.mouse.y)) {
+ if (event.type == Common::EVENT_LBUTTONDOWN || event.type == Common::EVENT_LBUTTONUP)
+ setActive(w->getId());
- return w->processEvent(event);
- }
- }
+ return w->processEvent(event);
+ }
+ }
- return false;
+ return false;
}
//////////////////////
@@ -376,5 +376,4 @@ void MacWindowManager::popCursor() {
CursorMan.popCursor();
}
-
} // End of namespace Wage
diff --git a/engines/wage/world.cpp b/engines/wage/world.cpp
index 53fc1b4742..0e40e114b4 100644
--- a/engines/wage/world.cpp
+++ b/engines/wage/world.cpp
@@ -119,6 +119,8 @@ bool World::loadWorld(Common::MacResManager *resMan) {
out.open("code.bin");
out.write(buf, res->size());
out.close();
+ free(buf);
+ delete res;
#endif
if ((resArray = resMan->getResIDArray(MKTAG('G','C','O','D'))).size() == 0)
@@ -415,7 +417,7 @@ Common::String *World::loadStringFromDITL(Common::MacResManager *resMan, int res
}
static bool invComparator(const Obj *l, const Obj *r) {
- return l->_index < r->_index;
+ return l->_index < r->_index;
}
void World::move(Obj *obj, Chr *chr) {
@@ -455,7 +457,7 @@ void World::move(Obj *obj, Scene *scene, bool skipSort) {
}
static bool chrComparator(const Chr *l, const Chr *r) {
- return l->_index < r->_index;
+ return l->_index < r->_index;
}
void World::move(Chr *chr, Scene *scene, bool skipSort) {
diff --git a/engines/wintermute/ad/ad_entity.cpp b/engines/wintermute/ad/ad_entity.cpp
index 1bbadeb7f7..0909d7ef91 100644
--- a/engines/wintermute/ad/ad_entity.cpp
+++ b/engines/wintermute/ad/ad_entity.cpp
@@ -1134,4 +1134,7 @@ bool AdEntity::setSprite(const char *filename) {
}
}
+Common::String AdEntity::debuggerToString() const {
+ return Common::String::format("%p: Entity \"%s\"; (X,Y): (%d, %d), rotate(%d): %f deg, scale(%d): (%f, %f)%%", (const void *)this, getName(), _posX, _posY, _rotatable, _rotate, _zoomable, _scaleX, _scaleY);
+}
} // End of namespace Wintermute
diff --git a/engines/wintermute/ad/ad_entity.h b/engines/wintermute/ad/ad_entity.h
index 7e1525b7c1..678608af36 100644
--- a/engines/wintermute/ad/ad_entity.h
+++ b/engines/wintermute/ad/ad_entity.h
@@ -60,6 +60,7 @@ public:
virtual bool scSetProperty(const char *name, ScValue *value) override;
virtual bool scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, const char *name) override;
virtual const char *scToString() override;
+ Common::String debuggerToString() const override;
private:
int32 _walkToX;
int32 _walkToY;
diff --git a/engines/wintermute/ad/ad_game.cpp b/engines/wintermute/ad/ad_game.cpp
index df0328ce5e..088184b0f6 100644
--- a/engines/wintermute/ad/ad_game.cpp
+++ b/engines/wintermute/ad/ad_game.cpp
@@ -2280,4 +2280,7 @@ bool AdGame::onScriptShutdown(ScScript *script) {
return STATUS_OK;
}
+Common::String AdGame::debuggerToString() const {
+ return Common::String::format("%p: Game \"%s\"", (const void *)this, getName());
+}
} // End of namespace Wintermute
diff --git a/engines/wintermute/ad/ad_game.h b/engines/wintermute/ad/ad_game.h
index ebb37e9a07..0e5abc9b3b 100644
--- a/engines/wintermute/ad/ad_game.h
+++ b/engines/wintermute/ad/ad_game.h
@@ -130,6 +130,7 @@ public:
virtual bool scSetProperty(const char *name, ScValue *value) override;
virtual bool scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, const char *name) override;
bool validMouse();
+ Common::String debuggerToString() const override;
private:
virtual bool externalCall(ScScript *script, ScStack *stack, ScStack *thisStack, char *name) override;
diff --git a/engines/wintermute/ad/ad_scene.cpp b/engines/wintermute/ad/ad_scene.cpp
index 02a6aeb801..b57faef69b 100644
--- a/engines/wintermute/ad/ad_scene.cpp
+++ b/engines/wintermute/ad/ad_scene.cpp
@@ -2998,4 +2998,9 @@ bool AdScene::getRegionObjects(AdRegion *region, BaseArray<AdObject *> &objects,
return STATUS_OK;
}
+
+Common::String AdScene::debuggerToString() const {
+ return Common::String::format("%p: Scene \"%s\", paralax: %d, autoscroll: %d", (const void *)this, getName(), _paralaxScrolling, _autoScroll);
+}
} // End of namespace Wintermute
+
diff --git a/engines/wintermute/ad/ad_scene.h b/engines/wintermute/ad/ad_scene.h
index 1ca52bdda9..71567d2475 100644
--- a/engines/wintermute/ad/ad_scene.h
+++ b/engines/wintermute/ad/ad_scene.h
@@ -160,7 +160,7 @@ public:
virtual bool scSetProperty(const char *name, ScValue *value) override;
virtual bool scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, const char *name) override;
virtual const char *scToString() override;
-
+ virtual Common::String debuggerToString() const override;
private:
bool persistState(bool saving = true);
diff --git a/engines/wintermute/base/base_frame.cpp b/engines/wintermute/base/base_frame.cpp
index 471185f2d2..910ab64a76 100644
--- a/engines/wintermute/base/base_frame.cpp
+++ b/engines/wintermute/base/base_frame.cpp
@@ -764,4 +764,7 @@ const char *BaseFrame::scToString() {
return "[frame]";
}
+Common::String BaseFrame::debuggerToString() const {
+ return Common::String::format("%p: Frame \"%s\": #subframes %d ", (const void *)this, getName(), _subframes.size());
+}
} // End of namespace Wintermute
diff --git a/engines/wintermute/base/base_frame.h b/engines/wintermute/base/base_frame.h
index ff9e67a166..8d261c9e71 100644
--- a/engines/wintermute/base/base_frame.h
+++ b/engines/wintermute/base/base_frame.h
@@ -65,6 +65,8 @@ public:
virtual bool scSetProperty(const char *name, ScValue *value) override;
virtual bool scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, const char *name) override;
virtual const char *scToString() override;
+ virtual Common::String debuggerToString() const override;
+
private:
bool _keyframe;
bool _editorExpanded;
diff --git a/engines/wintermute/base/base_game.cpp b/engines/wintermute/base/base_game.cpp
index 668053bb3a..ce4c5fdda5 100644
--- a/engines/wintermute/base/base_game.cpp
+++ b/engines/wintermute/base/base_game.cpp
@@ -71,6 +71,10 @@
#include "common/system.h"
#include "common/file.h"
+#if EXTENDED_DEBUGGER_ENABLED == true
+#include "engines/wintermute/base/scriptables/debuggable/debuggable_script_engine.h"
+#endif
+
namespace Wintermute {
//////////////////////////////////////////////////////////////////////
@@ -398,7 +402,11 @@ bool BaseGame::initialize1() {
break;
}
+#if EXTENDED_DEBUGGER_ENABLED == true
+ _scEngine = new DebuggableScEngine(this);
+#else
_scEngine = new ScEngine(this);
+#endif
if (_scEngine == nullptr) {
break;
}
diff --git a/engines/wintermute/base/base_game.h b/engines/wintermute/base/base_game.h
index e535cc9618..409cc20ba4 100644
--- a/engines/wintermute/base/base_game.h
+++ b/engines/wintermute/base/base_game.h
@@ -34,7 +34,11 @@
#include "engines/wintermute/persistent.h"
#include "engines/wintermute/coll_templ.h"
#include "engines/wintermute/math/rect32.h"
+#include "engines/wintermute/debugger.h"
#include "common/events.h"
+#if EXTENDED_DEBUGGER_ENABLED == true
+#include "engines/wintermute/base/scriptables/debuggable/debuggable_script_engine.h"
+#endif
namespace Wintermute {
@@ -148,7 +152,11 @@ public:
BaseRenderer *_renderer;
BaseSoundMgr *_soundMgr;
+#if EXTENDED_DEBUGGER_ENABLED == true
+ DebuggableScEngine *_scEngine;
+#else
ScEngine *_scEngine;
+#endif
BaseScriptable *_mathClass;
BaseSurfaceStorage *_surfaceStorage;
BaseFontStorage *_fontStorage;
diff --git a/engines/wintermute/base/base_region.cpp b/engines/wintermute/base/base_region.cpp
index 9a31f5cd66..02ab365eff 100644
--- a/engines/wintermute/base/base_region.cpp
+++ b/engines/wintermute/base/base_region.cpp
@@ -532,4 +532,7 @@ bool BaseRegion::mimic(BaseRegion *region, float scale, int x, int y) {
return createRegion() ? STATUS_OK : STATUS_FAILED;
}
+Common::String BaseRegion::debuggerToString() const {
+ return Common::String::format("%p: Region \"%s\": Rect (top, right, bottom, left): (%d, %d, %d, %d), active: %d ", (const void *)this, getName(), _rect.top, _rect.right, _rect.bottom, _rect.left, _active);
+}
} // End of namespace Wintermute
diff --git a/engines/wintermute/base/base_region.h b/engines/wintermute/base/base_region.h
index fc3389c501..4cb5dd85d6 100644
--- a/engines/wintermute/base/base_region.h
+++ b/engines/wintermute/base/base_region.h
@@ -59,6 +59,8 @@ public:
virtual bool scSetProperty(const char *name, ScValue *value) override;
virtual bool scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, const char *name) override;
virtual const char *scToString() override;
+ virtual Common::String debuggerToString() const override;
+
private:
float _lastMimicScale;
int32 _lastMimicX;
diff --git a/engines/wintermute/base/base_script_holder.cpp b/engines/wintermute/base/base_script_holder.cpp
index 5b1c961479..7427a9b082 100644
--- a/engines/wintermute/base/base_script_holder.cpp
+++ b/engines/wintermute/base/base_script_holder.cpp
@@ -42,7 +42,7 @@ IMPLEMENT_PERSISTENT(BaseScriptHolder, false)
//////////////////////////////////////////////////////////////////////
BaseScriptHolder::BaseScriptHolder(BaseGame *inGame) : BaseScriptable(inGame) {
setName("<unnamed>");
-
+ _ready = false;
_freezable = true;
_filename = nullptr;
}
@@ -312,7 +312,11 @@ bool BaseScriptHolder::addScript(const char *filename) {
if (!scr) {
if (_gameRef->_editorForceScripts) {
// editor hack
+#if EXTENDED_DEBUGGER_ENABLED
+ scr = new DebuggableScript(_gameRef, _gameRef->_scEngine);
+#else
scr = new ScScript(_gameRef, _gameRef->_scEngine);
+#endif
scr->_filename = new char[strlen(filename) + 1];
strcpy(scr->_filename, filename);
scr->_state = SCRIPT_ERROR;
@@ -462,8 +466,15 @@ void BaseScriptHolder::makeFreezable(bool freezable) {
ScScript *BaseScriptHolder::invokeMethodThread(const char *methodName) {
for (int i = _scripts.size() - 1; i >= 0; i--) {
if (_scripts[i]->canHandleMethod(methodName)) {
-
+#if EXTENDED_DEBUGGER_ENABLED == true
+ DebuggableScEngine* debuggableEngine;
+ debuggableEngine = dynamic_cast<DebuggableScEngine*>(_scripts[i]->_engine);
+ // TODO: Not pretty
+ assert(debuggableEngine);
+ ScScript *thread = new DebuggableScript(_gameRef, debuggableEngine);
+#else
ScScript *thread = new ScScript(_gameRef, _scripts[i]->_engine);
+#endif
if (thread) {
bool ret = thread->createMethodThread(_scripts[i], methodName);
if (DID_SUCCEED(ret)) {
diff --git a/engines/wintermute/base/base_scriptable.cpp b/engines/wintermute/base/base_scriptable.cpp
index c65d30d941..01f6f9e02f 100644
--- a/engines/wintermute/base/base_scriptable.cpp
+++ b/engines/wintermute/base/base_scriptable.cpp
@@ -188,4 +188,9 @@ ScScript *BaseScriptable::invokeMethodThread(const char *methodName) {
return nullptr;
}
+Common::String BaseScriptable::debuggerToString() const {
+ return Common::String::format("%p: BaseScriptable %s", (const void *)this, getName());
+}
+
+
} // End of namespace Wintermute
diff --git a/engines/wintermute/base/base_scriptable.h b/engines/wintermute/base/base_scriptable.h
index b32668d6c8..7b4f269871 100644
--- a/engines/wintermute/base/base_scriptable.h
+++ b/engines/wintermute/base/base_scriptable.h
@@ -63,6 +63,7 @@ public:
virtual void scSetBool(bool val);
virtual int scCompare(BaseScriptable *val);
virtual void scDebuggerDesc(char *buf, int bufSize);
+ virtual Common::String debuggerToString() const;
int32 _refCount;
ScValue *_scValue;
ScValue *_scProp;
diff --git a/engines/wintermute/base/base_sprite.cpp b/engines/wintermute/base/base_sprite.cpp
index 09e138a1fd..f282004a59 100644
--- a/engines/wintermute/base/base_sprite.cpp
+++ b/engines/wintermute/base/base_sprite.cpp
@@ -826,4 +826,7 @@ bool BaseSprite::killAllSounds() {
return STATUS_OK;
}
+Common::String BaseSprite::debuggerToString() const {
+ return Common::String::format("%p: Sprite \"%s\"", (const void *)this, getName());
+}
} // End of namespace Wintermute
diff --git a/engines/wintermute/base/base_sprite.h b/engines/wintermute/base/base_sprite.h
index ec71512ec9..2313b7b3dc 100644
--- a/engines/wintermute/base/base_sprite.h
+++ b/engines/wintermute/base/base_sprite.h
@@ -69,6 +69,7 @@ public:
virtual bool scSetProperty(const char *name, ScValue *value) override;
virtual bool scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, const char *name) override;
virtual const char *scToString() override;
+ Common::String debuggerToString() const override;
private:
BaseObject *_owner;
bool _canBreak;
diff --git a/engines/wintermute/base/base_sub_frame.cpp b/engines/wintermute/base/base_sub_frame.cpp
index 6d0c48ff17..8068e61168 100644
--- a/engines/wintermute/base/base_sub_frame.cpp
+++ b/engines/wintermute/base/base_sub_frame.cpp
@@ -673,4 +673,8 @@ bool BaseSubFrame::setSurfaceSimple() {
}
}
+Common::String BaseSubFrame::debuggerToString() const {
+ return Common::String::format("%p: BaseSubFrame \"%s\" - Mirror:(%d, %d), Hotspot:(%d, %d), ", (const void *)this, getName(), _mirrorX, _mirrorY, _hotspotX, _hotspotY);
+}
+
} // End of namespace Wintermute
diff --git a/engines/wintermute/base/base_sub_frame.h b/engines/wintermute/base/base_sub_frame.h
index f156c332d6..0fd38f9548 100644
--- a/engines/wintermute/base/base_sub_frame.h
+++ b/engines/wintermute/base/base_sub_frame.h
@@ -86,6 +86,7 @@ public:
virtual bool scSetProperty(const char *name, ScValue *value);
virtual bool scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, const char *name);
virtual const char *scToString();
+ Common::String debuggerToString() const override;
};
diff --git a/engines/wintermute/base/base_viewport.cpp b/engines/wintermute/base/base_viewport.cpp
index bf3700a14e..aed0355eb9 100644
--- a/engines/wintermute/base/base_viewport.cpp
+++ b/engines/wintermute/base/base_viewport.cpp
@@ -96,4 +96,7 @@ int BaseViewport::getHeight() const {
return _rect.bottom - _rect.top;
}
+Common::String BaseViewport::debuggerToString() const {
+ return Common::String::format("%p: BaseViewport: (top, right, bottom, left): (%d, %d, %d, %d)", (const void *)this, _rect.top, _rect.right, _rect.bottom, _rect.left);
+}
} // End of namespace Wintermute
diff --git a/engines/wintermute/base/base_viewport.h b/engines/wintermute/base/base_viewport.h
index eae756f9c6..c2e8727ad8 100644
--- a/engines/wintermute/base/base_viewport.h
+++ b/engines/wintermute/base/base_viewport.h
@@ -48,6 +48,7 @@ public:
BaseObject *_mainObject;
BaseViewport(BaseGame *inGame = nullptr);
virtual ~BaseViewport();
+ virtual Common::String debuggerToString() const;
private:
Rect32 _rect;
};
diff --git a/engines/wintermute/base/scriptables/debuggable/debuggable_script.cpp b/engines/wintermute/base/scriptables/debuggable/debuggable_script.cpp
new file mode 100644
index 0000000000..5a2291894f
--- /dev/null
+++ b/engines/wintermute/base/scriptables/debuggable/debuggable_script.cpp
@@ -0,0 +1,148 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/tokenizer.h"
+#include "debuggable_script.h"
+#include "engines/wintermute/base/scriptables/script_stack.h"
+#include "engines/wintermute/base/scriptables/script_value.h"
+#include "engines/wintermute/base/scriptables/debuggable/debuggable_script_engine.h"
+#include "engines/wintermute/debugger/breakpoint.h"
+#include "engines/wintermute/debugger/script_monitor.h"
+#include "engines/wintermute/debugger/watch_instance.h"
+
+namespace Wintermute {
+
+DebuggableScript::DebuggableScript(BaseGame *inGame, DebuggableScEngine *engine) : ScScript(inGame, engine), _engine(engine), _stepDepth(kDefaultStepDepth) {
+ _engine->_watches.subscribe(this);
+ for (uint i = 0; i < _engine->_watches.size(); i++) {
+ _watchInstances.push_back(new WatchInstance(_engine->_watches[i], this));
+ }
+}
+
+DebuggableScript::~DebuggableScript() {
+ for (uint i = 0; i < _watchInstances.size(); i++) {
+ delete _watchInstances[i];
+ }
+ _engine->_watches.unsubscribe(this);
+}
+void DebuggableScript::preInstHook(uint32 inst) {}
+
+void DebuggableScript::postInstHook(uint32 inst) {
+ if (inst == II_DBG_LINE) {
+ for (uint j = 0; j < _engine->_breakpoints.size(); j++) {
+ _engine->_breakpoints[j]->evaluate(this);
+ }
+
+ if (_callStack->_sP <= _stepDepth) {
+ _engine->_monitor->notifyStep(this);
+ }
+ }
+
+ for (uint i = 0; i < _watchInstances.size(); i++) {
+ this->_watchInstances[i]->evaluate();
+ }
+
+}
+
+void DebuggableScript::setStepDepth(int depth) {
+ _stepDepth = depth;
+}
+
+void DebuggableScript::step() {
+ setStepDepth(_callStack->_sP);
+ // TODO double check
+}
+
+void DebuggableScript::stepContinue() {
+ setStepDepth(kDefaultStepDepth);
+}
+
+void DebuggableScript::stepFinish() {
+ setStepDepth(_callStack->_sP - 1);
+}
+
+ScValue *DebuggableScript::resolveName(const Common::String &name) {
+
+ Common::String trimmed = name;
+ trimmed.trim();
+ Common::StringTokenizer st = Common::StringTokenizer(trimmed.c_str(), ".");
+ Common::String nextToken;
+
+ nextToken = st.nextToken();
+
+
+ char cstr[256]; // TODO not pretty
+ Common::strlcpy(cstr, nextToken.c_str(), nextToken.size() + 1);
+ cstr[255] = '\0'; // We 0-terminate it just in case it's > 256 chars.
+
+ ScValue *value = getVar(cstr);
+ ScValue *res = new ScValue(_gameRef);
+
+ if (value == nullptr) {
+ return res;
+ }
+
+ nextToken = st.nextToken();
+
+ while (nextToken.size() > 0 && (value->isObject() || value->isNative())) {
+ value = value->getProp(nextToken.c_str());
+ nextToken = st.nextToken();
+ if (value == nullptr) {
+ return res;
+ }
+ }
+
+ res->copy(value);
+
+ return res;
+}
+
+uint DebuggableScript::dbgGetLine() const {
+ return _currentLine;
+}
+
+Common::String DebuggableScript::dbgGetFilename() const {
+ return _filename;
+}
+
+void DebuggableScript::updateWatches() {
+ // We drop obsolete watches
+ for (uint i = 0; i < _watchInstances.size(); i++) {
+ Watch *findMe = _watchInstances[i]->_watch;
+ if (Common::find(_engine->_watches.begin(), _engine->_watches.end(), findMe) == _engine->_watches.end()) {
+ // Not found on engine-wide list, must have been removed from watches. Must remove it from local list.
+ delete _watchInstances[i];
+ _watchInstances.remove_at(i);
+ }
+ }
+
+ // We add any new watches
+ for (uint i = 0; i < _engine->_watches.size(); i++) {
+ Watch *findMe = _engine->_watches[i];
+ if (Common::find(_engine->_watches.begin(), _engine->_watches.end(), findMe) == _engine->_watches.end()) {
+ // Not found on local list, must be a new one.
+ _watchInstances.push_back(new WatchInstance(_engine->_watches[i], this));
+ }
+ }
+}
+} // End of namespace Wintermute
+
diff --git a/engines/wintermute/base/scriptables/debuggable/debuggable_script.h b/engines/wintermute/base/scriptables/debuggable/debuggable_script.h
new file mode 100644
index 0000000000..b32a5ca4af
--- /dev/null
+++ b/engines/wintermute/base/scriptables/debuggable/debuggable_script.h
@@ -0,0 +1,67 @@
+/* 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 DEBUGGABLE_SCRIPT_H_
+#define DEBUGGABLE_SCRIPT_H_
+#include "engines/wintermute/base/scriptables/script.h"
+
+namespace Wintermute {
+class ScriptMonitor;
+class Watch;
+class WatchInstance;
+class DebuggableScEngine;
+
+class DebuggableScript : public ScScript {
+ static const int kDefaultStepDepth = -2;
+ int32 _stepDepth;
+ DebuggableScEngine *_engine;
+ BaseArray<WatchInstance *> _watchInstances;
+ virtual void preInstHook(uint32 inst) override;
+ virtual void postInstHook(uint32 inst) override;
+ void setStepDepth(int depth);
+public:
+ DebuggableScript(BaseGame *inGame, DebuggableScEngine *engine);
+ virtual ~DebuggableScript();
+ ScValue *resolveName(const Common::String &name);
+ /**
+ * Return argument to last II_DBG_LINE encountered
+ */
+ virtual uint dbgGetLine() const;
+ virtual Common::String dbgGetFilename() const;
+ /**
+ * Execute one more instruction
+ */
+ void step();
+ /**
+ * Continue execution
+ */
+ void stepContinue();
+ /**
+ * Continue execution until the activation record on top of the stack is popped
+ */
+ void stepFinish();
+ void updateWatches();
+};
+
+} // End of namespace Wintermute
+
+#endif /* DEBUGGABLE_SCRIPT_H_ */
diff --git a/engines/wintermute/base/scriptables/debuggable/debuggable_script_engine.cpp b/engines/wintermute/base/scriptables/debuggable/debuggable_script_engine.cpp
new file mode 100644
index 0000000000..28a00cd4ae
--- /dev/null
+++ b/engines/wintermute/base/scriptables/debuggable/debuggable_script_engine.cpp
@@ -0,0 +1,35 @@
+/* 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 "debuggable_script_engine.h"
+#include "debuggable_script.h"
+#include "engines/wintermute/debugger/watch_instance.h"
+
+namespace Wintermute {
+
+DebuggableScEngine::DebuggableScEngine(BaseGame *inGame) : ScEngine(inGame), _monitor(nullptr) {}
+
+void DebuggableScEngine::attachMonitor(ScriptMonitor *monitor) {
+ _monitor = monitor;
+}
+
+} // End of namespace Wintermute
diff --git a/engines/wintermute/base/scriptables/debuggable/debuggable_script_engine.h b/engines/wintermute/base/scriptables/debuggable/debuggable_script_engine.h
new file mode 100644
index 0000000000..a4d9d2bfe7
--- /dev/null
+++ b/engines/wintermute/base/scriptables/debuggable/debuggable_script_engine.h
@@ -0,0 +1,110 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef DEBUGGABLE_SCRIPT_ENGINE_H_
+#define DEBUGGABLE_SCRIPT_ENGINE_H_
+#include "engines/wintermute/base/scriptables/script_engine.h"
+#include "engines/wintermute/coll_templ.h"
+#include "common/algorithm.h"
+#include "engines/wintermute/base/scriptables/debuggable/debuggable_script.h"
+
+namespace Wintermute {
+
+class Breakpoint;
+class Watch;
+class DebuggableScript;
+class DebuggableScEngine;
+class ScriptMonitor;
+
+class PublisherWArray : private Common::Array<Watch *> {
+ Common::Array<DebuggableScript *> _subscribers;
+ void notifySubscribers() {
+ for (uint i = 0; i < _subscribers.size(); i++) {
+ _subscribers[i]->updateWatches();
+ }
+ }
+public:
+ void subscribe(DebuggableScript *script) {
+ if (Common::find(_subscribers.begin(), _subscribers.end(), script) == _subscribers.end()) {
+ // If not already contained
+ _subscribers.push_back(script);
+ }
+ }
+
+ void unsubscribe(DebuggableScript *script) {
+ int location = -1;
+ for (uint i = 0; i < _subscribers.size() && location == -1; i++) {
+ if (_subscribers[i] == script) {
+ location = i;
+ }
+ }
+ if (location >= 0) {
+ _subscribers.remove_at(location);
+ } else {
+ // TODO: If this happens... it's funny. Some script out there forgot to subscribe.
+ }
+ }
+
+ void push_back(Watch *newElement) {
+ Common::Array<Watch *>::push_back(newElement);
+ notifySubscribers();
+ }
+
+ size_type size() {
+ return Common::Array<Watch *>::size();
+ }
+
+ iterator begin() {
+ return Common::Array<Watch *>::begin();
+ }
+
+ iterator end() {
+ return Common::Array<Watch *>::end();
+ }
+
+ Watch *&operator[](size_type idx) {
+ return Common::Array<Watch *>::operator[](idx);
+ }
+ Watch *remove_at(size_type idx) {
+ Watch *res = Common::Array<Watch *>::remove_at(idx);
+ notifySubscribers();
+ return res;
+ }
+};
+
+class DebuggableScEngine : public ScEngine {
+ Common::Array<Breakpoint *> _breakpoints;
+ PublisherWArray _watches;
+ ScriptMonitor *_monitor;
+public:
+ DebuggableScEngine(BaseGame *inGame);
+ void attachMonitor(ScriptMonitor *);
+
+ friend class DebuggerController;
+ friend class DebuggableScript;
+ friend class ScScript;
+ friend class WatchableScriptArray;
+};
+
+} // End of namespace Wintermute
+
+#endif /* DEBUGGABLE_SCRIPT_ENGINE_H_ */
diff --git a/engines/wintermute/base/scriptables/script.cpp b/engines/wintermute/base/scriptables/script.cpp
index 44fd117e61..938ec031da 100644
--- a/engines/wintermute/base/scriptables/script.cpp
+++ b/engines/wintermute/base/scriptables/script.cpp
@@ -32,7 +32,9 @@
#include "engines/wintermute/base/scriptables/script_engine.h"
#include "engines/wintermute/base/scriptables/script_stack.h"
#include "common/memstream.h"
-
+#if EXTENDED_DEBUGGER_ENABLED == true
+#include "engines/wintermute/base/scriptables/debuggable/debuggable_script.h"
+#endif
namespace Wintermute {
IMPLEMENT_PERSISTENT(ScScript, false)
@@ -522,6 +524,9 @@ bool ScScript::executeInstruction() {
ScValue *op2;
uint32 inst = getDWORD();
+
+ preInstHook(inst);
+
switch (inst) {
case II_DEF_VAR:
@@ -1092,6 +1097,7 @@ bool ScScript::executeInstruction() {
ret = STATUS_FAILED;
} // switch(instruction)
+ postInstHook(inst);
//delete op;
return ret;
@@ -1314,8 +1320,15 @@ ScScript *ScScript::invokeEventHandler(const Common::String &eventName, bool unb
if (!pos) {
return nullptr;
}
-
+#if EXTENDED_DEBUGGER_ENABLED == true
+ // TODO: Not pretty
+ DebuggableScEngine* debuggableEngine;
+ debuggableEngine = dynamic_cast<DebuggableScEngine*>(_engine);
+ assert(debuggableEngine);
+ ScScript *thread = new DebuggableScript(_gameRef, debuggableEngine);
+#else
ScScript *thread = new ScScript(_gameRef, _engine);
+#endif
if (thread) {
bool ret = thread->createThread(this, pos, eventName);
if (DID_SUCCEED(ret)) {
@@ -1434,18 +1447,6 @@ bool ScScript::finishThreads() {
return STATUS_OK;
}
-
-//////////////////////////////////////////////////////////////////////////
-// IWmeDebugScript interface implementation
-int ScScript::dbgGetLine() {
- return _currentLine;
-}
-
-//////////////////////////////////////////////////////////////////////////
-const char *ScScript::dbgGetFilename() {
- return _filename;
-}
-
//////////////////////////////////////////////////////////////////////////
void ScScript::afterLoad() {
if (_buffer == nullptr) {
@@ -1466,4 +1467,8 @@ void ScScript::afterLoad() {
}
}
+void ScScript::preInstHook(uint32 inst) {}
+
+void ScScript::postInstHook(uint32 inst) {}
+
} // End of namespace Wintermute
diff --git a/engines/wintermute/base/scriptables/script.h b/engines/wintermute/base/scriptables/script.h
index 1edeae5b55..c1d1cce4ee 100644
--- a/engines/wintermute/base/scriptables/script.h
+++ b/engines/wintermute/base/scriptables/script.h
@@ -33,12 +33,15 @@
#include "engines/wintermute/base/base.h"
#include "engines/wintermute/base/scriptables/dcscript.h" // Added by ClassView
#include "engines/wintermute/coll_templ.h"
+#include "engines/wintermute/persistent.h"
namespace Wintermute {
class BaseScriptHolder;
class BaseObject;
class ScEngine;
class ScStack;
+class ScValue;
+
class ScScript : public BaseClass {
public:
BaseArray<int> _breakpoints;
@@ -50,7 +53,7 @@ public:
bool copyParameters(ScStack *stack);
void afterLoad();
-private:
+protected:
ScValue *_operand;
ScValue *_reg1;
public:
@@ -125,7 +128,7 @@ public:
ScValue *_globals;
ScEngine *_engine;
int32 _currentLine;
- bool executeInstruction();
+ virtual bool executeInstruction();
char *getString();
uint32 getDWORD();
double getFloat();
@@ -162,11 +165,8 @@ private:
bool initScript();
bool initTables();
-
-// IWmeDebugScript interface implementation
-public:
- virtual int dbgGetLine();
- virtual const char *dbgGetFilename();
+ virtual void preInstHook(uint32 inst);
+ virtual void postInstHook(uint32 inst);
};
} // End of namespace Wintermute
diff --git a/engines/wintermute/base/scriptables/script_engine.cpp b/engines/wintermute/base/scriptables/script_engine.cpp
index cdf55a304c..26122094f1 100644
--- a/engines/wintermute/base/scriptables/script_engine.cpp
+++ b/engines/wintermute/base/scriptables/script_engine.cpp
@@ -144,7 +144,15 @@ ScScript *ScEngine::runScript(const char *filename, BaseScriptHolder *owner) {
}
// add new script
+#if EXTENDED_DEBUGGER_ENABLED == true
+ DebuggableScEngine* debuggableEngine;
+ debuggableEngine = dynamic_cast<DebuggableScEngine*>(this);
+ // TODO: Not pretty
+ assert(debuggableEngine);
+ ScScript *script = new DebuggableScript(_gameRef, debuggableEngine);
+#else
ScScript *script = new ScScript(_gameRef, this);
+#endif
bool ret = script->create(filename, compBuffer, compSize, owner);
if (DID_FAIL(ret)) {
_gameRef->LOG(ret, "Error running script '%s'...", filename);
diff --git a/engines/wintermute/base/scriptables/script_engine.h b/engines/wintermute/base/scriptables/script_engine.h
index bdb139e1f8..8b7e4acd19 100644
--- a/engines/wintermute/base/scriptables/script_engine.h
+++ b/engines/wintermute/base/scriptables/script_engine.h
@@ -66,20 +66,6 @@ public:
Common::String _filename;
};
- class CScBreakpoint {
- public:
- CScBreakpoint(const char *filename) {
- _filename = filename;
- }
-
- ~CScBreakpoint() {
- _lines.clear();
- }
-
- Common::String _filename;
- BaseArray<int> _lines;
- };
-
public:
bool clearGlobals(bool includingNatives = false);
bool tickUnbreakable();
diff --git a/engines/wintermute/debugger.cpp b/engines/wintermute/debugger.cpp
index 5b617d9db9..c643c33246 100644
--- a/engines/wintermute/debugger.cpp
+++ b/engines/wintermute/debugger.cpp
@@ -21,29 +21,289 @@
*/
#include "engines/wintermute/debugger.h"
-#include "engines/wintermute/wintermute.h"
#include "engines/wintermute/base/base_engine.h"
#include "engines/wintermute/base/base_file_manager.h"
-#include "engines/wintermute/base/base_game.h"
+#include "engines/wintermute/base/scriptables/script_value.h"
+#include "engines/wintermute/debugger/debugger_controller.h"
+#include "engines/wintermute/wintermute.h"
+
+#define CONTROLLER _engineRef->_dbgController
namespace Wintermute {
Console::Console(WintermuteEngine *vm) : GUI::Debugger(), _engineRef(vm) {
registerCmd("show_fps", WRAP_METHOD(Console, Cmd_ShowFps));
registerCmd("dump_file", WRAP_METHOD(Console, Cmd_DumpFile));
+ registerCmd("show_fps", WRAP_METHOD(Console, Cmd_ShowFps));
+ registerCmd("dump_file", WRAP_METHOD(Console, Cmd_DumpFile));
+ registerCmd("help", WRAP_METHOD(Console, Cmd_Help));
+ // Actual (script) debugger commands
+ registerCmd(STEP_CMD, WRAP_METHOD(Console, Cmd_Step));
+ registerCmd(CONTINUE_CMD, WRAP_METHOD(Console, Cmd_Continue));
+ registerCmd(FINISH_CMD, WRAP_METHOD(Console, Cmd_Finish));
+ registerCmd(WATCH_CMD, WRAP_METHOD(Console, Cmd_Watch));
+ registerCmd(BREAK_CMD, WRAP_METHOD(Console, Cmd_AddBreakpoint));
+ registerCmd(LIST_CMD, WRAP_METHOD(Console, Cmd_List));
+ registerCmd(REMOVE_BREAKPOINT_CMD, WRAP_METHOD(Console, Cmd_RemoveBreakpoint));
+ registerCmd(DISABLE_BREAKPOINT_CMD, WRAP_METHOD(Console, Cmd_DisableBreakpoint));
+ registerCmd(ENABLE_BREAKPOINT_CMD, WRAP_METHOD(Console, Cmd_EnableBreakpoint));
+ registerCmd(REMOVE_WATCH_CMD, WRAP_METHOD(Console, Cmd_RemoveWatch));
+ registerCmd(DISABLE_WATCH_CMD, WRAP_METHOD(Console, Cmd_DisableWatch));
+ registerCmd(ENABLE_WATCH_CMD, WRAP_METHOD(Console, Cmd_EnableWatch));
+ registerCmd(PRINT_CMD, WRAP_METHOD(Console, Cmd_Print));
+ registerCmd(SET_CMD, WRAP_METHOD(Console, Cmd_Set));
+ registerCmd(INFO_CMD, WRAP_METHOD(Console, Cmd_Info));
+ registerCmd(SET_PATH_CMD, WRAP_METHOD(Console, Cmd_SourcePath));
+ registerCmd(TOP_CMD, WRAP_METHOD(Console, Cmd_Top));
}
Console::~Console(void) {
+}
+
+bool Console::Cmd_Help(int argc, const char **argv) {
+ if (argc == 1) {
+ // Debugger::Cmd_Help(argc, argv);
+ debugPrintf("\nType help somecommand to get specific help.\n");
+ } else {
+ printUsage(argv[1]);
+ }
+ return true;
+}
+void Console::printUsage(const Common::String &command) {
+ // TODO: This is horrible and would probably benefit from a map or something.
+ if (command.equals(BREAK_CMD)) {
+ debugPrintf("Usage: %s <file path> <line> to break at line <line> of file <file path>\n", command.c_str());
+ } else if (command.equals(REMOVE_BREAKPOINT_CMD)) {
+ debugPrintf("Usage: %s <id> to remove breakpoint #id\n", command.c_str());
+ } else if (command.equals(ENABLE_BREAKPOINT_CMD)) {
+ debugPrintf("Usage: %s <id> to enable breakpoint #id\n", command.c_str());
+ } else if (command.equals(DISABLE_BREAKPOINT_CMD)) {
+ debugPrintf("Usage: %s <id> to disable breakpoint #id\n", command.c_str());
+ } else if (command.equals(REMOVE_WATCH_CMD)) {
+ debugPrintf("Usage: %s <id> to remove watchpoint #id\n", command.c_str());
+ } else if (command.equals(ENABLE_WATCH_CMD)) {
+ debugPrintf("Usage: %s <id> to enable watchpoint #id\n", command.c_str());
+ } else if (command.equals(DISABLE_WATCH_CMD)) {
+ debugPrintf("Usage: %s <id> to disable watchpoint #id\n", command.c_str());
+ } else if (command.equals(INFO_CMD)) {
+ debugPrintf("Usage: %s [watch|breakpoints]\n", command.c_str());
+ } else if (command.equals(WATCH_CMD)) {
+ debugPrintf("Usage: %s <file path> <name> to watch for <name> in file <file path>\n", command.c_str());
+ } else if (command.equals(STEP_CMD)) {
+ debugPrintf("Usage: %s to step\n", command.c_str());
+ } else if (command.equals(CONTINUE_CMD)) {
+ debugPrintf("Usage: %s to continue\n", command.c_str());
+ } else if (command.equals(FINISH_CMD)) {
+ debugPrintf("Usage: %s to finish\n", command.c_str());
+ } else if (command.equals(PRINT_CMD)) {
+ debugPrintf("Usage: %s <name> to print value of <name>\n", command.c_str());
+ } else if (command.equals(SET_CMD)) {
+ debugPrintf("Usage: %s <name> = <value> to set <name> to <value>\n", command.c_str());
+ } else {
+ debugPrintf("No help about this command, sorry.");
+ }
+}
+
+bool Console::Cmd_AddBreakpoint(int argc, const char **argv) {
+ if (argc == 3) {
+ Wintermute::Error error = CONTROLLER->addBreakpoint(argv[1], atoi(argv[2]));
+ printError(argv[0], error);
+ } else {
+ printUsage(argv[0]);
+ }
+ return true;
+}
+
+bool Console::Cmd_RemoveBreakpoint(int argc, const char **argv) {
+ if (argc == 2) {
+ Error error = CONTROLLER->removeBreakpoint(atoi(argv[1]));
+ printError(argv[0], error);
+ } else {
+ printUsage(argv[0]);
+ }
+ return true;
+}
+
+bool Console::Cmd_EnableBreakpoint(int argc, const char **argv) {
+ if (argc == 2) {
+ Error error = CONTROLLER->enableBreakpoint(atoi(argv[1]));
+ printError(argv[0], error);
+ } else {
+ printUsage(argv[0]);
+ }
+ return true;
+}
+
+bool Console::Cmd_DisableBreakpoint(int argc, const char **argv) {
+ if (argc == 2) {
+ Error error = CONTROLLER->disableBreakpoint(atoi(argv[1]));
+ debugPrintf("%s: %s\n", argv[0], error.getErrorDisplayStr().c_str());
+ } else {
+ printUsage(argv[0]);
+ }
+ return true;
+}
+
+bool Console::Cmd_RemoveWatch(int argc, const char **argv) {
+ if (argc == 2) {
+ Error error = CONTROLLER->removeWatchpoint(atoi(argv[1]));
+ printError(argv[0], error);
+ } else {
+ printUsage(argv[0]);
+ }
+
+ return true;
+}
+
+bool Console::Cmd_EnableWatch(int argc, const char **argv) {
+ if (argc == 2) {
+ Error error = CONTROLLER->enableWatchpoint(atoi(argv[1]));
+ printError(argv[0], error);
+ } else {
+ printUsage(argv[0]);
+ }
+ return true;
+}
+
+bool Console::Cmd_DisableWatch(int argc, const char **argv) {
+ if (argc == 2) {
+ Error error = CONTROLLER->disableWatchpoint(atoi(argv[1]));
+ printError(argv[0], error);
+ } else {
+ printUsage(argv[0]);
+ }
+ return true;
+}
+
+bool Console::Cmd_Watch(int argc, const char **argv) {
+ if (argc == 3) {
+ Error error = CONTROLLER->addWatch(argv[1], argv[2]);
+ printError(argv[0], error);
+ } else {
+ printUsage(argv[0]);
+ }
+ return true;
+}
+
+bool Console::Cmd_Info(int argc, const char **argv) {
+ if (argc == 2 && !strncmp(argv[1], "breakpoints", 10)) {
+ Common::Array<BreakpointInfo> breakpoints = CONTROLLER->getBreakpoints();
+ for (uint i = 0; i < breakpoints.size(); i++) {
+ debugPrintf("%d %s:%d x%d, enabled: %d \n", i, breakpoints[i]._filename.c_str(), breakpoints[i]._line, breakpoints[i]._hits, breakpoints[i]._enabled);
+ }
+ return 1;
+ } else if (argc == 2 && !strncmp(argv[1], WATCH_CMD, 5)) {
+ Common::Array<WatchInfo>watchlist = CONTROLLER->getWatchlist();
+ for (uint i = 0; i < watchlist.size(); i++) {
+ debugPrintf("%d %s:%s x%d \n", i, watchlist[i]._filename.c_str(), watchlist[i]._symbol.c_str(), watchlist[i]._hits);
+ }
+ return 1;
+ } else {
+ printUsage(argv[0]);
+ return 1;
+ }
+}
+
+bool Console::Cmd_Step(int argc, const char **argv) {
+ if (argc == 1) {
+ Error error = CONTROLLER->step();
+ if (error.getErrorLevel() == SUCCESS) {
+ return false;
+ } else {
+ printError(argv[0], error);
+ return true;
+ }
+ } else {
+ printUsage(argv[0]);
+ return true;
+ }
+}
+
+bool Console::Cmd_Continue(int argc, const char **argv) {
+ if (argc == 1) {
+ Error error = CONTROLLER->stepContinue();
+ if (error.getErrorLevel() == SUCCESS) {
+ return false;
+ } else {
+ printError(argv[0], error);
+ return true;
+ }
+ } else {
+ printUsage(argv[0]);
+ return true;
+ }
+}
+
+bool Console::Cmd_Finish(int argc, const char **argv) {
+ if (argc == 1) {
+ Error error = CONTROLLER->stepFinish();
+ printError(argv[0], error);
+ if (error.getErrorLevel() == SUCCESS) {
+ return false;
+ } else {
+ printError(argv[0], error);
+ return true;
+ }
+ } else {
+ printUsage(argv[0]);
+ return true;
+ }
+}
+
+bool Console::Cmd_List(int argc, const char **argv) {
+ Error error = printSource();
+ if (error.getErrorLevel() != SUCCESS) {
+ printError(argv[0], error);
+ }
+ return true;
+}
+
+bool Console::Cmd_Print(int argc, const char **argv) {
+ if (argc == 2) {
+ Error error = Error(SUCCESS, OK, 0);
+ Common::String temp = CONTROLLER->readValue(argv[1], &error);
+ if (error.getErrorLevel() == SUCCESS) {
+ debugPrintf("%s = %s \n", argv[1], temp.c_str());
+ return true;
+ } else {
+ printError(argv[0], error);
+ return true;
+ }
+ } else {
+ printUsage(argv[0]);
+ return true;
+ }
+}
+
+
+bool Console::Cmd_Set(int argc, const char **argv) {
+ if (argc == 4 && !strncmp("=", argv[2], 1)) {
+ ScValue *val = nullptr;
+ Error error = CONTROLLER->setValue(argv[1], argv[3], val);
+ if (error.getErrorLevel() == SUCCESS) {
+ assert(val);
+ debugPrintf("%s = %s\n", argv[1], val->getString());
+ } else {
+ printError(argv[0], error);
+ }
+ } else {
+ printUsage(argv[0]);
+ }
+ return true;
}
bool Console::Cmd_ShowFps(int argc, const char **argv) {
- if (argc > 1) {
+ if (argc == 2) {
if (Common::String(argv[1]) == "true") {
- _engineRef->_game->setShowFPS(true);
+ CONTROLLER->showFps(true);
} else if (Common::String(argv[1]) == "false") {
- _engineRef->_game->setShowFPS(false);
+ CONTROLLER->showFps(false);
+ } else {
+ debugPrintf("%s: argument 1 must be \"true\" or \"false\"\n", argv[0]);
}
+ } else {
+ debugPrintf("Usage: %s [true|false]\n", argv[0]);
}
return true;
}
@@ -81,4 +341,80 @@ bool Console::Cmd_DumpFile(int argc, const char **argv) {
return true;
}
+
+bool Console::Cmd_SourcePath(int argc, const char **argv) {
+ if (argc != 2) {
+ debugPrintf("Usage: %s <source path>\n", argv[0]);
+ return true;
+ } else {
+ if (CONTROLLER->setSourcePath(Common::String(argv[1])).getErrorCode() == OK) {
+ debugPrintf("Source path set to '%s'\n", CONTROLLER->getSourcePath().c_str());
+ } else {
+ debugPrintf("Error setting source path. Note that \"\" is illegal.");
+ }
+ return true;
+ }
+}
+
+void Console::notifyBreakpoint(const char *filename, int line) {
+ debugPrintf("Breakpoint hit %s: %d\n", filename, line);
+ printSource(0);
+ attach();
+ onFrame();
+}
+
+void Console::notifyStep(const char *filename, int line) {
+ debugPrintf("Step: %s:%d\n", filename, line);
+ printSource(0);
+ attach();
+ onFrame();
+}
+
+void Console::notifyWatch(const char *filename, const char *symbol, const char *newValue) {
+ debugPrintf("Watch: %s:%s <---- %s\n", filename, symbol, newValue);
+ printSource(0);
+ attach();
+ onFrame();
+}
+
+Error Console::printSource(int n) {
+
+ Error* error = nullptr;
+ Listing *listing = CONTROLLER->getListing(error);
+ Error err(*error);
+ delete error;
+
+ if (err.getErrorLevel() == SUCCESS || err.getErrorLevel() == WARNING) {
+ Common::Array<ListingLine> lines = listing->getLines(CONTROLLER->getLastLine(), n/2, n/2);
+ for (uint i = 0; i < lines.size(); i++) {
+ if (lines[i].number == CONTROLLER->getLastLine()) {
+ debugPrintf(" -> ");
+ } else {
+ debugPrintf(" ");
+ }
+ debugPrintf("%d", lines[i].number);
+ debugPrintf("%s", lines[i].text.c_str());
+ debugPrintf("\n");
+ }
+ }
+
+ delete listing;
+ return err;
+}
+
+bool Console::Cmd_Top(int argc, const char **argv) {
+ Common::Array<TopEntry> entries = CONTROLLER->getTop();
+ for (uint i = 0; i < entries.size(); i++) {
+ if (entries[i].current) {
+ debugPrintf("%d*: %s\n", i, entries[i].filename.c_str());
+ } else {
+ debugPrintf("%d: %s\n", i, entries[i].filename.c_str());
+ }
+ }
+ return true;
+}
+
+void Console::printError(const Common::String &command, Error error) {
+ debugPrintf("%s: %s\n", command.c_str(), error.getErrorDisplayStr().c_str());
+}
} // End of namespace Wintermute
diff --git a/engines/wintermute/debugger.h b/engines/wintermute/debugger.h
index 625da0ce41..e5008bee3b 100644
--- a/engines/wintermute/debugger.h
+++ b/engines/wintermute/debugger.h
@@ -23,20 +23,134 @@
#ifndef WINTERMUTE_DEBUGGER_H
#define WINTERMUTE_DEBUGGER_H
+#define EXTENDED_DEBUGGER_ENABLED true
+
#include "gui/debugger.h"
-namespace Wintermute {
+#if EXTENDED_DEBUGGER_ENABLED == true
+#include "engines/wintermute/base/scriptables/debuggable/debuggable_script.h"
+#else
+#include "engines/wintermute/base/scriptables/script.h"
+#endif
+
+#define DEFAULT_SOURCE_PADDING 5
+
+#define STEP_CMD "step"
+#define CONTINUE_CMD "continue"
+#define FINISH_CMD "finish"
+#define WATCH_CMD "watch"
+#define BREAK_CMD "break"
+#define LIST_CMD "list"
+#define REMOVE_BREAKPOINT_CMD "del"
+#define DISABLE_BREAKPOINT_CMD "disable"
+#define ENABLE_BREAKPOINT_CMD "enable"
+#define REMOVE_WATCH_CMD "delw"
+#define DISABLE_WATCH_CMD "disablew"
+#define ENABLE_WATCH_CMD "enablew"
+#define INFO_CMD "info"
+#define SET_CMD "set"
+#define PRINT_CMD "print"
+#define SET_PATH_CMD "set_path"
+#define TOP_CMD "top"
+
+namespace Wintermute {
class WintermuteEngine;
+class Adapter;
+class DebuggerController;
+class Error;
+
class Console : public GUI::Debugger {
public:
Console(WintermuteEngine *vm);
virtual ~Console();
-
+ /*
+ * Debug commands
+ */
+ bool Cmd_Help(int argc, const char **argv);
bool Cmd_ShowFps(int argc, const char **argv);
bool Cmd_DumpFile(int argc, const char **argv);
+
+#if EXTENDED_DEBUGGER_ENABLED == true
+ /**
+ * Step - break again on next line
+ */
+ bool Cmd_Step(int argc, const char **argv);
+ /**
+ * Continue execution
+ */
+ bool Cmd_Continue(int argc, const char **argv);
+ /**
+ * Only break again when the current function is finished
+ * (activation record is popped)
+ */
+ bool Cmd_Finish(int argc, const char **argv);
+ bool Cmd_Print(int argc, const char **argv);
+ bool Cmd_Set(int argc, const char **argv);
+ // Breakpoints
+ bool Cmd_AddBreakpoint(int argc, const char **argv);
+ bool Cmd_RemoveBreakpoint(int argc, const char **argv);
+ bool Cmd_EnableBreakpoint(int argc, const char **argv);
+ bool Cmd_DisableBreakpoint(int argc, const char **argv);
+ /**
+ * Add a watch.
+ *
+ * It monitors the value of some variable x against its
+ * last known state and it breaks if it has changed since.
+ *
+ */
+ bool Cmd_Watch(int argc, const char **argv);
+ bool Cmd_RemoveWatch(int argc, const char **argv);
+ bool Cmd_EnableWatch(int argc, const char **argv);
+ bool Cmd_DisableWatch(int argc, const char **argv);
+ /**
+ * Print info re:watch and breakpoints.
+ * This differs from e.g. gdb in that we have separate lists.
+ */
+ bool Cmd_Info(int argc, const char **argv);
+ /**
+ * Print source
+ */
+ bool Cmd_List(int argc, const char **argv);
+ /**
+ * Set (DOS-style) source path for debugging.
+ * This is where you will (optionally) put your sources
+ * to enable printing of sources as you step through the
+ * scripts.
+ *
+ * Please note that we have no checksum or anything
+ * to make sure your source files are up to date.
+ *
+ * YOU HAVE to make sure of that.
+ *
+ * You have been warned! :)
+ */
+ bool Cmd_SourcePath(int argc, const char **argv);
+
+ /**
+ * Top
+ */
+ bool Cmd_Top(int argc, const char **argv);
+
+ Error printSource(int n = DEFAULT_SOURCE_PADDING);
+
+ /**
+ * Hooks for the controller to open the console
+ */
+ void notifyBreakpoint(const char *filename, int line);
+ void notifyStep(const char *filename, int line);
+ /**
+ * To be called by the adapter when a watched variable
+ * is changed.
+ * Opens a console and prints info and listing if available.
+ */
+ void notifyWatch(const char *filename, const char *symbol, const char *newValue);
+#endif
+
private:
- WintermuteEngine *_engineRef;
+ const WintermuteEngine *_engineRef;
+ void printError(const Common::String &command, Error error);
+ void printUsage(const Common::String &command);
};
}
diff --git a/engines/wintermute/debugger/breakpoint.cpp b/engines/wintermute/debugger/breakpoint.cpp
new file mode 100644
index 0000000000..7f2a02b0ea
--- /dev/null
+++ b/engines/wintermute/debugger/breakpoint.cpp
@@ -0,0 +1,68 @@
+/* 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 "breakpoint.h"
+#include "engines/wintermute/base/scriptables/debuggable/debuggable_script.h"
+#include "script_monitor.h"
+
+namespace Wintermute {
+
+Breakpoint::Breakpoint(const Common::String &filename, uint line, ScriptMonitor *monitor) :
+ _filename(filename), _line(line), _monitor(monitor), _enabled(0), _hits(0) {}
+
+void Breakpoint::hit(DebuggableScript *script) {
+ _hits++;
+ _monitor->onBreakpoint(this, script);
+}
+
+Common::String Breakpoint::getFilename() const {
+ return _filename;
+}
+int Breakpoint::getLine() const {
+ return _line;
+}
+int Breakpoint::getHits() const {
+ return _hits;
+}
+bool Breakpoint::isEnabled() const {
+ return _enabled;
+}
+void Breakpoint::enable() {
+ _enabled = true;
+}
+void Breakpoint::disable() {
+ _enabled = false;
+}
+
+void Breakpoint::evaluate(DebuggableScript *script) {
+ if (isEnabled() &&
+ getLine() == script->_currentLine &&
+ !getFilename().compareTo(script->_filename)) {
+ hit(script);
+ }
+}
+
+Breakpoint::~Breakpoint() {
+ // Nothing to take care of in here
+}
+
+} // End of namespace Wintermute
diff --git a/engines/wintermute/debugger/breakpoint.h b/engines/wintermute/debugger/breakpoint.h
new file mode 100644
index 0000000000..3757791ba3
--- /dev/null
+++ b/engines/wintermute/debugger/breakpoint.h
@@ -0,0 +1,58 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef BREAKPOINT_H_
+#define BREAKPOINT_H_
+#include "common/str.h"
+
+namespace Wintermute {
+
+class ScriptMonitor;
+class DebuggableScript;
+
+class Breakpoint {
+ const Common::String _filename;
+ const uint _line;
+ uint _hits;
+ bool _enabled;
+ ScriptMonitor *_monitor;
+ void hit(DebuggableScript *script);
+public:
+ Breakpoint(const Common::String &filename, uint line, ScriptMonitor *monitor);
+ /**
+ * This should be called inside the interpreter; the breakpoint is evaluated
+ * in the context of script, and, if it is enabled and filename & line match,
+ * the attached ScriptMonitor is notified.
+ */
+ void evaluate(DebuggableScript* script);
+ Common::String getFilename() const;
+ int getLine() const;
+ int getHits() const;
+ bool isEnabled() const;
+ void enable();
+ void disable();
+ virtual ~Breakpoint();
+};
+
+} // End of namespace Wintermute
+
+#endif /* BREAKPOINT_H_ */
diff --git a/engines/wintermute/debugger/debugger_controller.cpp b/engines/wintermute/debugger/debugger_controller.cpp
new file mode 100644
index 0000000000..aef96ed9c9
--- /dev/null
+++ b/engines/wintermute/debugger/debugger_controller.cpp
@@ -0,0 +1,325 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/algorithm.h"
+#include "common/str.h"
+#include "common/tokenizer.h"
+#include "engines/wintermute/debugger.h"
+#include "engines/wintermute/base/base_file_manager.h"
+#include "engines/wintermute/base/base_engine.h"
+#include "engines/wintermute/base/base_game.h"
+#include "engines/wintermute/base/scriptables/script.h"
+#include "engines/wintermute/base/scriptables/script_value.h"
+#include "engines/wintermute/base/scriptables/script_stack.h"
+#include "engines/wintermute/debugger/breakpoint.h"
+#include "engines/wintermute/debugger/debugger_controller.h"
+#include "engines/wintermute/debugger/watch.h"
+#include "engines/wintermute/debugger/listing_providers/blank_listing_provider.h"
+#include "engines/wintermute/debugger/listing_providers/cached_source_listing_provider.h"
+#include "engines/wintermute/debugger/listing_providers/source_listing.h"
+#define SCENGINE _engine->_game->_scEngine
+#define DEBUGGER _engine->_debugger
+
+namespace Wintermute {
+
+DebuggerController::~DebuggerController() {
+ delete _sourceListingProvider;
+}
+
+DebuggerController::DebuggerController(WintermuteEngine *vm) : _engine(vm) {
+ _sourceListingProvider = new CachedSourceListingProvider();
+ clear();
+}
+
+bool DebuggerController::bytecodeExists(const Common::String &filename) {
+ uint32 compSize;
+ byte *compBuffer = SCENGINE->getCompiledScript(filename.c_str(), &compSize);
+ if (!compBuffer) {
+ return false;
+ } else {
+ return true;
+ }
+}
+
+Error DebuggerController::addBreakpoint(const char *filename, int line) {
+ assert(SCENGINE);
+ if (bytecodeExists(filename)) {
+ SCENGINE->_breakpoints.push_back(new Breakpoint(filename, line, this));
+ return Error(SUCCESS, OK);
+ } else {
+ return Error(ERROR, NO_SUCH_BYTECODE);
+ }
+}
+
+Error DebuggerController::removeBreakpoint(uint id) {
+ assert(SCENGINE);
+ if (SCENGINE->_breakpoints.size() > id) {
+ SCENGINE->_breakpoints.remove_at(id);
+ return Error(SUCCESS, OK);
+ } else {
+ return Error(ERROR, NO_SUCH_BREAKPOINT, id);
+ }
+}
+
+Error DebuggerController::disableBreakpoint(uint id) {
+ assert(SCENGINE);
+ if (SCENGINE->_breakpoints.size() > id) {
+ SCENGINE->_breakpoints[id]->disable();
+ return Error(SUCCESS, OK);
+ } else {
+ return Error(ERROR, NO_SUCH_BREAKPOINT, id);
+ }
+}
+
+Error DebuggerController::enableBreakpoint(uint id) {
+ assert(SCENGINE);
+ if (SCENGINE->_breakpoints.size() > id) {
+ SCENGINE->_breakpoints[id]->enable();
+ return Error(SUCCESS, OK);
+ } else {
+ return Error(ERROR, NO_SUCH_BREAKPOINT, id);
+ }
+}
+
+Error DebuggerController::removeWatchpoint(uint id) {
+ assert(SCENGINE);
+ if (SCENGINE->_watches.size() > id) {
+ SCENGINE->_watches.remove_at(id);
+ return Error(SUCCESS, OK);
+ } else {
+ return Error(ERROR, NO_SUCH_BREAKPOINT, id);
+ }
+}
+
+
+Error DebuggerController::disableWatchpoint(uint id) {
+ assert(SCENGINE);
+ if (SCENGINE->_watches.size() > id) {
+ SCENGINE->_watches[id]->disable();
+ return Error(SUCCESS, OK);
+ } else {
+ return Error(ERROR, NO_SUCH_BREAKPOINT, id);
+ }
+}
+
+Error DebuggerController::enableWatchpoint(uint id) {
+ assert(SCENGINE);
+ if (SCENGINE->_watches.size() > id) {
+ SCENGINE->_watches[id]->enable();
+ return Error(SUCCESS, OK);
+ } else {
+ return Error(ERROR, NO_SUCH_BREAKPOINT, id);
+ }
+
+}
+
+Error DebuggerController::addWatch(const char *filename, const char *symbol) {
+ assert(SCENGINE);
+ if (!bytecodeExists(filename)) {
+ return Error(ERROR, NO_SUCH_BYTECODE, filename);
+ }
+ SCENGINE->_watches.push_back(new Watch(filename, symbol, this));
+ return Error(SUCCESS, OK, "Watchpoint added");
+}
+
+void DebuggerController::onBreakpoint(const Breakpoint *breakpoint, DebuggableScript *script) {
+ _lastScript = script;
+ _lastLine = script->_currentLine;
+ DEBUGGER->notifyBreakpoint(script->dbgGetFilename().c_str(), script->_currentLine);
+}
+
+void DebuggerController::notifyStep(DebuggableScript *script) {
+ _lastScript = script;
+ _lastLine = script->_currentLine;
+ DEBUGGER->notifyStep(script->dbgGetFilename().c_str(), script->_currentLine);
+}
+
+void DebuggerController::onWatch(const Watch *watch, DebuggableScript *script) {
+ _lastScript = script; // If script has changed do we still care?
+ _lastLine = script->_currentLine;
+ Common::String symbol = watch->getSymbol();
+ DEBUGGER->notifyWatch(script->dbgGetFilename().c_str(), symbol.c_str(), script->resolveName(symbol)->getString());
+}
+
+Error DebuggerController::step() {
+ if (!_lastScript) {
+ return Error(ERROR, NOT_ALLOWED);
+ }
+ _lastScript->step();
+ clear();
+ return Error(SUCCESS, OK);
+}
+
+Error DebuggerController::stepContinue() {
+ if (!_lastScript) {
+ return Error(ERROR, NOT_ALLOWED);
+ }
+ _lastScript->stepContinue();
+ return Error(SUCCESS, OK);
+}
+
+Error DebuggerController::stepFinish() {
+ if (!_lastScript) {
+ return Error(ERROR, NOT_ALLOWED);
+ }
+ _lastScript->stepFinish();
+ clear();
+ return Error(SUCCESS, OK);
+}
+
+void DebuggerController::clear() {
+ _lastScript = nullptr;
+ _lastLine = -1;
+}
+
+Common::String DebuggerController::readValue(const Common::String &name, Error *error) {
+ if (!_lastScript) {
+ delete error;
+ error = new Error(ERROR, NOT_ALLOWED);
+ return Common::String();
+ }
+ char cstr[256]; // TODO not pretty
+ Common::strlcpy(cstr, name.c_str(), name.size() + 1);
+ cstr[255] = '\0'; // We 0-terminate it just in case it's longer than 255.
+ return _lastScript->resolveName(cstr)->getString();
+}
+
+Error DebuggerController::setValue(const Common::String &name, const Common::String &value, ScValue *&var) {
+ if (!_lastScript) {
+ return Error(ERROR, NOT_ALLOWED);
+ }
+
+ Common::String trimmed = value;
+ trimmed.trim();
+ char cstr[256];
+ Common::strlcpy(cstr, name.c_str(), name.size() + 1); // TODO not pretty
+
+ var = _lastScript->getVar(cstr);
+ if (var->_type == VAL_INT) {
+ char *endptr;
+ int res = strtol(trimmed.c_str(), &endptr, 10); // TODO: Hex too?
+ if (endptr == trimmed.c_str()) {
+ return Error(ERROR, PARSE_ERROR);
+ } else if (endptr == trimmed.c_str() + trimmed.size()) {
+ // We've parsed all of it, have we?
+ var->setInt(res);
+ } else {
+ assert(false);
+ return Error(ERROR, PARSE_ERROR);
+ // Something funny happened here.
+ }
+ } else if (var->_type == VAL_FLOAT) {
+ char *endptr;
+ float res = (float)strtod(trimmed.c_str(), &endptr);
+ if (endptr == trimmed.c_str()) {
+ return Error(ERROR, PARSE_ERROR);
+ } else if (endptr == trimmed.c_str() + trimmed.size()) {
+ // We've parsed all of it, have we?
+ var->setFloat(res);
+ } else {
+ return Error(ERROR, PARSE_ERROR);
+ assert(false);
+ // Something funny happened here.
+ }
+ } else if (var->_type == VAL_BOOL) {
+ Common::String str = Common::String(trimmed);
+ bool valAsBool;
+ if (Common::parseBool(trimmed, valAsBool)) {
+ var->setBool(valAsBool);
+ } else {
+ return Error(ERROR, PARSE_ERROR);
+ }
+ } else if (var->_type == VAL_STRING) {
+ var->setString(trimmed);
+ } else {
+ return Error(ERROR, NOT_YET_IMPLEMENTED);
+ }
+ return Error(SUCCESS, OK);
+}
+
+void DebuggerController::showFps(bool show) {
+ _engine->_game->setShowFPS(show);
+}
+
+Common::Array<BreakpointInfo> DebuggerController::getBreakpoints() const {
+ assert(SCENGINE);
+ Common::Array<BreakpointInfo> breakpoints;
+ for (uint i = 0; i < SCENGINE->_breakpoints.size(); i++) {
+ BreakpointInfo bpInfo;
+ bpInfo._filename = SCENGINE->_breakpoints[i]->getFilename();
+ bpInfo._line = SCENGINE->_breakpoints[i]->getLine();
+ bpInfo._hits = SCENGINE->_breakpoints[i]->getHits();
+ bpInfo._enabled = SCENGINE->_breakpoints[i]->isEnabled();
+ breakpoints.push_back(bpInfo);
+ }
+ return breakpoints;
+}
+
+Common::Array<WatchInfo> DebuggerController::getWatchlist() const {
+ Common::Array<WatchInfo> watchlist;
+ for (uint i = 0; i < SCENGINE->_watches.size(); i++) {
+ WatchInfo watchInfo;
+ watchInfo._filename = SCENGINE->_watches[i]->getFilename();
+ watchInfo._symbol = SCENGINE->_watches[i]->getSymbol();
+ watchlist.push_back(watchInfo);
+ }
+ return watchlist;
+}
+
+uint32 DebuggerController::getLastLine() const {
+ return _lastLine;
+}
+
+Common::String DebuggerController::getSourcePath() const {
+ return _sourceListingProvider->getPath();
+}
+
+Error DebuggerController::setSourcePath(const Common::String &sourcePath) {
+ ErrorCode err = _sourceListingProvider->setPath(sourcePath);
+ return Error((err == OK ? SUCCESS : ERROR), err);
+}
+
+Listing* DebuggerController::getListing(Error* &error) {
+ delete (error);
+ if (_lastScript == nullptr) {
+ error = new Error(ERROR, NOT_ALLOWED);
+ return nullptr;
+ }
+ ErrorCode err;
+ Listing* res = _sourceListingProvider->getListing(SCENGINE->_currentScript->_filename, err);
+ error = new Error(err == OK ? SUCCESS : ERROR, err);
+ return res;
+}
+
+Common::Array<TopEntry> DebuggerController::getTop() const {
+ Common::Array<TopEntry> res;
+ assert(SCENGINE);
+ for (uint i = 0; i < SCENGINE->_scripts.size(); i++) {
+ TopEntry entry;
+ entry.filename = SCENGINE->_scripts[i]->_filename;
+ entry.current = (SCENGINE->_scripts[i] == SCENGINE->_currentScript);
+ res.push_back(entry);
+ }
+ return res;
+}
+
+} // end of namespace Wintermute
diff --git a/engines/wintermute/debugger/debugger_controller.h b/engines/wintermute/debugger/debugger_controller.h
new file mode 100644
index 0000000000..345b42f0cb
--- /dev/null
+++ b/engines/wintermute/debugger/debugger_controller.h
@@ -0,0 +1,119 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef WINTERMUTE_DEBUGGER_ADAPTER_H
+#define WINTERMUTE_DEBUGGER_ADAPTER_H
+
+#include "common/str.h"
+#include "engines/wintermute/coll_templ.h"
+#include "engines/wintermute/wintermute.h"
+#include "engines/wintermute/debugger/listing_providers/source_listing_provider.h"
+#include "script_monitor.h"
+#include "error.h"
+#include "listing.h"
+namespace Wintermute {
+
+class ScScript;
+class DebuggableScript;
+class ScValue;
+
+struct BreakpointInfo {
+ Common::String _filename;
+ int _line;
+ int _hits;
+ bool _enabled;
+};
+
+struct WatchInfo {
+ Common::String _filename;
+ Common::String _symbol;
+ int _hits;
+ bool _enabled;
+};
+
+struct TopEntry {
+ bool current;
+ Common::String filename;
+ int watches;
+ int breakpointInfo;
+};
+
+class DebuggerController : public ScriptMonitor {
+ SourceListingProvider *_sourceListingProvider;
+ const WintermuteEngine *_engine;
+ DebuggableScript *_lastScript;
+ uint32 _lastDepth;
+ uint32 _lastLine;
+ void clear();
+ bool bytecodeExists(const Common::String &filename);
+public:
+ DebuggerController(WintermuteEngine *vm);
+ ~DebuggerController();
+ Common::Array<TopEntry> getTop() const;
+ /**
+ * Get the last line # we've stopped at
+ */
+ uint32 getLastLine() const;
+ Error addBreakpoint(const char *filename, int line);
+ Error removeBreakpoint(uint id);
+ Error disableBreakpoint(uint id);
+ Error enableBreakpoint(uint id);
+ Error addWatch(const char *filename, const char *symbol);
+ Error removeWatchpoint(uint id);
+ Error disableWatchpoint(uint id);
+ Error enableWatchpoint(uint id);
+ Common::Array<BreakpointInfo> getBreakpoints() const;
+ Common::Array<WatchInfo> getWatchlist() const;
+ /**
+ * @brief step one instruction
+ */
+ Error step();
+ /**
+ * @brief continue execution and don't step until next breakpoint
+ */
+ Error stepContinue();
+ /**
+ * @brief continue execution and don't step until the current activation record is popped
+ */
+ Error stepFinish();
+ /**
+ * @brief read value for a variable accessible from within the current scope.
+ */
+ Common::String readValue(const Common::String &name, Error *error);
+ /**
+ * @brief set value for a variable accessible from within the current scope.
+ */
+ Error setValue(const Common::String &name, const Common::String &value, ScValue*&var);
+ Error setSourcePath(const Common::String &sourcePath);
+ Common::String getSourcePath() const;
+ Listing *getListing(Error* &err);
+ void showFps(bool show);
+ /**
+ * Inherited from ScriptMonitor
+ */
+ void onBreakpoint(const Breakpoint *breakpoint, DebuggableScript *script);
+ void onWatch(const Watch *watch, DebuggableScript *script);
+ void notifyStep(DebuggableScript *script) override;
+};
+}
+
+#endif // WINTERMUTE_DEBUGGER_H
diff --git a/engines/wintermute/debugger/error.cpp b/engines/wintermute/debugger/error.cpp
new file mode 100644
index 0000000000..dd6e41c7bc
--- /dev/null
+++ b/engines/wintermute/debugger/error.cpp
@@ -0,0 +1,137 @@
+/* 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 "error.h"
+#include "engines/wintermute/debugger.h"
+
+namespace Wintermute {
+
+Error::Error(ErrorLevel errorLevel,
+ ErrorCode errorCode,
+ Common::String errorExtraString,
+ int errorExtraInt) :
+ _errorLevel(errorLevel),
+ _errorCode(errorCode),
+ _errorExtraInt(errorExtraInt),
+ _errorExtraString(errorExtraString){}
+
+Error::Error(ErrorLevel errorLevel,
+ ErrorCode errorCode,
+ int errorExtraInt) :
+ _errorLevel(errorLevel),
+ _errorCode(errorCode),
+ _errorExtraInt(errorExtraInt),
+ _errorExtraString(""){}
+
+Error::Error(ErrorLevel errorLevel,
+ ErrorCode errorCode) :
+ _errorLevel(errorLevel),
+ _errorCode(errorCode),
+ _errorExtraInt(0),
+ _errorExtraString(""){}
+
+Error::Error(ErrorLevel errorLevel,
+ ErrorCode errorCode,
+ Common::String errorExtraString) :
+ _errorLevel(errorLevel),
+ _errorCode(errorCode),
+ _errorExtraInt(0),
+ _errorExtraString(errorExtraString){}
+
+ErrorLevel Error::getErrorLevel() const {
+ return _errorLevel;
+}
+
+ErrorCode Error::getErrorCode() const {
+ return _errorCode;
+}
+
+Common::String Error::getErrorLevelStr() const {
+ switch (this->_errorLevel) {
+ case SUCCESS:
+ return "SUCCESS";
+ break;
+ case NOTICE:
+ return "NOTICE";
+ break;
+ case WARNING:
+ return "WARNING";
+ break;
+ case ERROR:
+ return "ERROR";
+ break;
+ }
+ return "SUCCESS";
+}
+
+Common::String Error::getErrorDisplayStr() const {
+
+ Common::String errorStr;
+
+ switch (this->_errorLevel) {
+ case SUCCESS:
+ errorStr += "OK!";
+ break;
+ case WARNING:
+ errorStr += "WARNING: ";
+ break;
+ case ERROR:
+ errorStr += "ERROR: ";
+ break;
+ case NOTICE:
+ errorStr += "NOTICE: ";
+ break;
+ default:
+ // Um...
+ break;
+ }
+
+ switch (this->_errorCode) {
+ case OK:
+ break;
+ case NOT_ALLOWED:
+ errorStr += "Could not execute requested operation. This is allowed only after a break.";
+ break;
+ case NO_SUCH_SOURCE:
+ errorStr += Common::String::format("Can't find source for %s. Double check you source path.", this->_errorExtraString.c_str());
+ break;
+ case NO_SUCH_BYTECODE:
+ errorStr += Common::String::format("No such script: %s. Can't find bytecode; double check the script path.", this->_errorExtraString.c_str());
+ break;
+ case SOURCE_PATH_NOT_SET:
+ errorStr += Common::String("Source path not set. Source won't be displayed. Try 'help " + Common::String(SET_PATH_CMD) + "'.");
+ break;
+ case NO_SUCH_BREAKPOINT:
+ errorStr += Common::String::format("No such breakpoint %d.", this->_errorExtraInt);
+ break;
+ case WRONG_TYPE:
+ errorStr += Common::String::format("Incompatible type: %s.", this->_errorExtraString.c_str());
+ break;
+ default:
+ errorStr += Common::String::format("Unknown condition %d", this->_errorCode);
+ break;
+ }
+
+ return errorStr;
+}
+
+} // End namespace Wintermute
diff --git a/engines/wintermute/debugger/error.h b/engines/wintermute/debugger/error.h
new file mode 100644
index 0000000000..4e5b973445
--- /dev/null
+++ b/engines/wintermute/debugger/error.h
@@ -0,0 +1,73 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef ERROR_H_
+#define ERROR_H_
+
+#include "common/str.h"
+
+namespace Wintermute {
+
+enum ErrorLevel {
+ SUCCESS,
+ NOTICE,
+ WARNING,
+ ERROR
+};
+
+enum ErrorCode {
+ OK,
+ NO_SUCH_SOURCE,
+ COULD_NOT_OPEN,
+ NO_SUCH_LINE,
+ NOT_ALLOWED,
+ NO_SUCH_BYTECODE,
+ DUPLICATE_BREAKPOINT,
+ NO_SUCH_BREAKPOINT,
+ WRONG_TYPE,
+ PARSE_ERROR,
+ NOT_YET_IMPLEMENTED,
+ SOURCE_PATH_NOT_SET,
+ ILLEGAL_PATH,
+ UNKNOWN_ERROR
+};
+
+
+class Error {
+ const ErrorLevel _errorLevel;
+ const ErrorCode _errorCode;
+ const int _errorExtraInt;
+ const Common::String _errorExtraString;
+public:
+ Error(ErrorLevel, ErrorCode);
+ Error(ErrorLevel, ErrorCode, int errorExtraInt);
+ Error(ErrorLevel, ErrorCode, Common::String errorExtraString);
+ Error(ErrorLevel, ErrorCode, Common::String errorExtraString, int errorExtraInt);
+ ErrorLevel getErrorLevel() const;
+ ErrorCode getErrorCode() const;
+ Common::String getErrorLevelStr() const;
+ Common::String getErrorDisplayStr() const;
+};
+
+} // End of namespace Wintermute
+
+#endif /* ERROR_H_ */
diff --git a/engines/wintermute/debugger/listing.cpp b/engines/wintermute/debugger/listing.cpp
new file mode 100644
index 0000000000..b8707fb842
--- /dev/null
+++ b/engines/wintermute/debugger/listing.cpp
@@ -0,0 +1,46 @@
+/* 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 "listing.h"
+#include "common/array.h"
+
+namespace Wintermute {
+
+Common::Array<ListingLine> Listing::getLines(uint begin, uint end) {
+ assert(begin <= end);
+ Common::Array<ListingLine> ret;
+ for (uint i = begin; i <= end; i++) {
+ ListingLine listingline;
+ listingline.number = i;
+ listingline.text = getLine(i);
+ ret.push_back(listingline);
+ }
+ return ret;
+}
+
+Common::Array<ListingLine> Listing::getLines(uint centre, uint before, uint after) {
+ uint begin = MAX(centre - before, (uint)1); // Line numbers start from 1
+ uint end = MIN(centre + after, (uint)(getLength() - 1)); // Line numbers start from 1
+ return getLines(begin, end);
+}
+
+} // End of namespace Wintermute
diff --git a/engines/wintermute/debugger/listing.h b/engines/wintermute/debugger/listing.h
new file mode 100644
index 0000000000..2ef21b702d
--- /dev/null
+++ b/engines/wintermute/debugger/listing.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 LISTING_H_
+#define LISTING_H_
+
+#include "common/array.h"
+
+
+namespace Common {
+
+class String;
+
+}
+
+namespace Wintermute {
+
+struct ListingLine {
+ uint number;
+ Common::String text;
+};
+
+class Listing {
+public:
+ virtual ~Listing() {};
+ /**
+ * @brief get the listing length (in lines)
+ */
+ virtual uint getLength() const = 0;
+ /**
+ * @brief return a specific line from a listing
+ * @param n line number
+ */
+ virtual Common::String getLine(uint n) = 0;
+ /**
+ * @brief shorthand to get a lump of lines instead of calling getLine a number of times
+ * Generally you won't need to redefine these
+ */
+ virtual Common::Array<ListingLine> getLines(uint centre, uint before, uint after);
+ virtual Common::Array<ListingLine> getLines(uint beginning, uint end);
+};
+
+} // End of namespace Wintermute
+
+#endif /* LISTING_H_ */
diff --git a/engines/wintermute/debugger/listing_provider.h b/engines/wintermute/debugger/listing_provider.h
new file mode 100644
index 0000000000..b5ea23e49b
--- /dev/null
+++ b/engines/wintermute/debugger/listing_provider.h
@@ -0,0 +1,42 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef LISTING_PROVIDER_H_
+#define LISTING_PROVIDER_H_
+
+#include "listing.h"
+#include "engines/wintermute/debugger/error.h"
+
+namespace Wintermute {
+
+class ListingProvider {
+public:
+ virtual ~ListingProvider() {};
+ /**
+ * Get a listing. When implementing this, the result should be safe to delete for the caller.
+ */
+ virtual Listing *getListing(const Common::String &filename, ErrorCode &error) = 0;
+};
+
+} // End of namespace Wintermute
+
+#endif /* LISTING_PROVIDER_H_ */
diff --git a/engines/wintermute/debugger/listing_providers/basic_source_listing_provider.cpp b/engines/wintermute/debugger/listing_providers/basic_source_listing_provider.cpp
new file mode 100644
index 0000000000..30d29ee23e
--- /dev/null
+++ b/engines/wintermute/debugger/listing_providers/basic_source_listing_provider.cpp
@@ -0,0 +1,92 @@
+/* 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 "basic_source_listing_provider.h"
+#include "engines/wintermute/base/base_file_manager.h"
+
+namespace Wintermute {
+BasicSourceListingProvider::BasicSourceListingProvider() : _fsDirectory(nullptr) {
+}
+
+BasicSourceListingProvider::~BasicSourceListingProvider() {
+}
+
+SourceListing *BasicSourceListingProvider::getListing(const Common::String &filename, ErrorCode &_err) {
+ _err = OK;
+ if (!_fsDirectory) {
+ _err = SOURCE_PATH_NOT_SET;
+ return nullptr;
+ };
+
+ Common::String unixFilename;
+
+ for (uint i = 0; i < filename.size(); i++) {
+ if (filename[i] == '\\') {
+ unixFilename.insertChar('/', unixFilename.size());
+ } else {
+ unixFilename.insertChar(filename[i], unixFilename.size());
+ }
+ }
+
+ Common::SeekableReadStream *file = _fsDirectory->createReadStreamForMember(unixFilename);
+ Common::Array<Common::String> strings;
+
+ if (!file) {
+ _err = NO_SUCH_SOURCE;
+ } else {
+ if (file->err()) {
+ _err = UNKNOWN_ERROR;
+ }
+ while (!file->eos()) {
+ strings.push_back(file->readLine());
+ if (file->err()) {
+ _err = UNKNOWN_ERROR;
+ }
+ }
+ }
+
+ if (_err == OK) {
+ return new SourceListing(strings);
+ } else {
+ return nullptr;
+ }
+}
+
+ErrorCode BasicSourceListingProvider::setPath(const Common::String &path) {
+ if (path == "")
+ return ILLEGAL_PATH;
+ delete _fsDirectory;
+ Common::FSNode node(path);
+ if (node.exists() && node.isDirectory()) {
+ _fsDirectory = new Common::FSDirectory(node, 64);
+ return OK;
+ } else {
+ return COULD_NOT_OPEN;
+ }
+}
+
+Common::String BasicSourceListingProvider::getPath() const {
+ if (!_fsDirectory) return "";
+ return _fsDirectory->getFSNode().getPath();
+}
+
+}
diff --git a/engines/wintermute/debugger/listing_providers/basic_source_listing_provider.h b/engines/wintermute/debugger/listing_providers/basic_source_listing_provider.h
new file mode 100644
index 0000000000..e242205578
--- /dev/null
+++ b/engines/wintermute/debugger/listing_providers/basic_source_listing_provider.h
@@ -0,0 +1,44 @@
+/* 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 BASIC_SOURCE_LISTING_PROVIDER_H_
+#define BASIC_SOURCE_LISTING_PROVIDER_H_
+
+#include "engines/wintermute/debugger/listing_provider.h"
+#include "source_listing_provider.h"
+#include "source_listing.h"
+#include "common/fs.h"
+
+namespace Wintermute {
+
+class BasicSourceListingProvider : public SourceListingProvider {
+ Common::FSDirectory *_fsDirectory;
+public:
+ BasicSourceListingProvider();
+ virtual ~BasicSourceListingProvider();
+ SourceListing *getListing(const Common::String &filename, ErrorCode &err);
+ ErrorCode setPath(const Common::String &path);
+ Common::String getPath() const;
+};
+
+}
+#endif /* BASIC_SOURCE_LISTING_PROVIDER_H_ */
diff --git a/engines/wintermute/debugger/listing_providers/blank_listing.cpp b/engines/wintermute/debugger/listing_providers/blank_listing.cpp
new file mode 100644
index 0000000000..928c91dc7f
--- /dev/null
+++ b/engines/wintermute/debugger/listing_providers/blank_listing.cpp
@@ -0,0 +1,38 @@
+/* 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 "blank_listing.h"
+#include "limits.h"
+
+namespace Wintermute {
+
+BlankListing::BlankListing(const Common::String filename) : _filename(filename) {}
+
+uint BlankListing::getLength() const { return UINT_MAX; }
+
+Common::String BlankListing::getLine(uint n) {
+ return "<no source for " + _filename + " ~~~ line: " + Common::String::format("%d", n) + ">";
+}
+BlankListing::~BlankListing() {}
+
+}
+
diff --git a/engines/wintermute/debugger/listing_providers/blank_listing.h b/engines/wintermute/debugger/listing_providers/blank_listing.h
new file mode 100644
index 0000000000..8c5ea19aa7
--- /dev/null
+++ b/engines/wintermute/debugger/listing_providers/blank_listing.h
@@ -0,0 +1,39 @@
+/* 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 BLANK_LISTING_H_
+#define BLANK_LISTING_H_
+#include "engines/wintermute/debugger/listing.h"
+
+namespace Wintermute {
+class BlankListing : public Listing {
+ const Common::String _filename;
+public:
+ BlankListing(const Common::String filename);
+ virtual ~BlankListing();
+ virtual uint getLength() const;
+ virtual Common::String getLine(uint n);
+};
+
+} // End of namespace Wintermute
+
+#endif
diff --git a/engines/wintermute/debugger/listing_providers/blank_listing_provider.cpp b/engines/wintermute/debugger/listing_providers/blank_listing_provider.cpp
new file mode 100644
index 0000000000..58e9e7e156
--- /dev/null
+++ b/engines/wintermute/debugger/listing_providers/blank_listing_provider.cpp
@@ -0,0 +1,35 @@
+/* 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 "blank_listing_provider.h"
+#include "blank_listing.h"
+namespace Wintermute {
+BlankListingProvider::BlankListingProvider() {}
+
+BlankListingProvider::~BlankListingProvider() {}
+
+Listing *BlankListingProvider::getListing(const Common::String &filename, ErrorCode &error) {
+ Listing *l = new BlankListing(filename);
+ error = OK;
+ return l; // Delete this sometime please.
+}
+} // End of namespace Wintermute
diff --git a/engines/wintermute/debugger/listing_providers/blank_listing_provider.h b/engines/wintermute/debugger/listing_providers/blank_listing_provider.h
new file mode 100644
index 0000000000..e583455c92
--- /dev/null
+++ b/engines/wintermute/debugger/listing_providers/blank_listing_provider.h
@@ -0,0 +1,38 @@
+/* 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 BLANK_LISTING_PROVIDER_H_
+#define BLANK_LISTING_PROVIDER_H_
+
+#include "engines/wintermute/debugger/listing.h"
+#include "engines/wintermute/debugger/listing_provider.h"
+#include "engines/wintermute/debugger/error.h"
+
+namespace Wintermute {
+class BlankListingProvider : public ListingProvider {
+public:
+ BlankListingProvider();
+ ~BlankListingProvider();
+ Listing *getListing(const Common::String &filename, ErrorCode &error);
+};
+} // End of namespace Wintermute
+#endif
diff --git a/engines/wintermute/debugger/listing_providers/cached_source_listing_provider.cpp b/engines/wintermute/debugger/listing_providers/cached_source_listing_provider.cpp
new file mode 100644
index 0000000000..20fe708380
--- /dev/null
+++ b/engines/wintermute/debugger/listing_providers/cached_source_listing_provider.cpp
@@ -0,0 +1,80 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "cached_source_listing_provider.h"
+#include "basic_source_listing_provider.h"
+#include "blank_listing_provider.h"
+#include "source_listing.h"
+
+namespace Wintermute {
+
+CachedSourceListingProvider::CachedSourceListingProvider() {
+ _sourceListingProvider = new BasicSourceListingProvider();
+ _fallbackListingProvider = new BlankListingProvider();
+}
+
+CachedSourceListingProvider::~CachedSourceListingProvider() {
+ delete _sourceListingProvider;
+ delete _fallbackListingProvider;
+ for (Common::HashMap<Common::String, SourceListing*>::iterator it = _cached.begin();
+ it != _cached.end(); it++) {
+ delete (it->_value);
+ }
+}
+
+Listing *CachedSourceListingProvider::getListing(const Common::String &filename, Wintermute::ErrorCode &error) {
+ if (_cached.contains(filename)) {
+ error = OK;
+ SourceListing *copy = new SourceListing(*_cached.getVal(filename));
+ return copy;
+ } else {
+ ErrorCode inner;
+ SourceListing *res = _sourceListingProvider->getListing(filename, inner);
+ if (inner == OK) {
+ SourceListing *copy = new SourceListing(*res);
+ _cached.setVal(filename, copy); // The cached copy is deleted on destruction
+ return res;
+ } else {
+ delete res;
+ return _fallbackListingProvider->getListing(filename, error);
+ }
+ }
+}
+
+void CachedSourceListingProvider::invalidateCache() {
+ for (Common::HashMap<Common::String, SourceListing*>::iterator it = _cached.begin();
+ it != _cached.end(); it++) {
+ delete (it->_value);
+ }
+ _cached.clear();
+}
+
+ErrorCode CachedSourceListingProvider::setPath(const Common::String &path) {
+ invalidateCache();
+ return _sourceListingProvider->setPath(path);
+}
+
+Common::String CachedSourceListingProvider::getPath() const {
+ return _sourceListingProvider->getPath();
+}
+
+} // End of namespace Wintermute
diff --git a/engines/wintermute/debugger/listing_providers/cached_source_listing_provider.h b/engines/wintermute/debugger/listing_providers/cached_source_listing_provider.h
new file mode 100644
index 0000000000..6e4925f2b4
--- /dev/null
+++ b/engines/wintermute/debugger/listing_providers/cached_source_listing_provider.h
@@ -0,0 +1,52 @@
+/* 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 CACHED_LISTING_PROVIDER_H_
+#define CACHED_LISTING_PROVIDER_H_
+
+#include "common/hashmap.h"
+#include "common/hash-str.h"
+#include "engines/wintermute/debugger/error.h"
+#include "source_listing_provider.h"
+
+namespace Wintermute {
+
+class BasicSourceListingProvider;
+class BlankListingProvider;
+class Listing;
+
+class CachedSourceListingProvider : public SourceListingProvider {
+ BasicSourceListingProvider *_sourceListingProvider;
+ BlankListingProvider *_fallbackListingProvider;
+ Common::HashMap<Common::String, SourceListing *> _cached;
+ void invalidateCache();
+public:
+ CachedSourceListingProvider();
+ virtual ~CachedSourceListingProvider();
+ ErrorCode setPath(const Common::String &path);
+ Common::String getPath() const;
+ Listing *getListing(const Common::String &filename, ErrorCode &err);
+};
+
+} // End of namespace Wintermute
+
+#endif /* CACHED_LISTING_PROVIDER_H_ */
diff --git a/engines/wintermute/debugger/listing_providers/source_listing.cpp b/engines/wintermute/debugger/listing_providers/source_listing.cpp
new file mode 100644
index 0000000000..ff81e20f02
--- /dev/null
+++ b/engines/wintermute/debugger/listing_providers/source_listing.cpp
@@ -0,0 +1,57 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "source_listing.h"
+
+namespace Wintermute {
+
+SourceListing::SourceListing(const Common::Array<Common::String> &strings) : _strings(strings) {}
+
+SourceListing::~SourceListing() {}
+
+uint SourceListing::getLength() const {
+ return _strings.size();
+}
+
+Common::String SourceListing::getLine(uint n) {
+ uint index = n - 1; // Line numbers start from 1, arrays from 0
+ /*
+ * Clients should not ask for a line number that
+ * is not in the source file.
+ * 0 is undefined, n - 1 is undefined.
+ * It is easy for the client to check that n > 0
+ * and n < getLength(), so it should just not happen.
+ * We return '^', after vim, to misbehaving clients.
+ */
+ if (n == 0) {
+ return Common::String("^");
+ }
+ if (index < getLength()) {
+ return _strings[index];
+ } else {
+ return Common::String("^");
+ }
+}
+
+} // End of namespace Wintermute
+
+
diff --git a/engines/wintermute/debugger/listing_providers/source_listing.h b/engines/wintermute/debugger/listing_providers/source_listing.h
new file mode 100644
index 0000000000..bf08578218
--- /dev/null
+++ b/engines/wintermute/debugger/listing_providers/source_listing.h
@@ -0,0 +1,37 @@
+/* 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 SOURCE_LISTING_H_
+#define SOURCE_LISTING_H_
+#include "engines/wintermute/debugger/listing.h"
+
+namespace Wintermute {
+class SourceListing : public Listing {
+ const Common::Array<Common::String> _strings;
+public:
+ SourceListing(const Common::Array<Common::String> &strings);
+ virtual ~SourceListing();
+ virtual uint getLength() const;
+ virtual Common::String getLine(uint n);
+};
+}
+#endif /* DUMMY_LISTING_H_ */
diff --git a/engines/wintermute/debugger/listing_providers/source_listing_provider.h b/engines/wintermute/debugger/listing_providers/source_listing_provider.h
new file mode 100644
index 0000000000..18f05e56ed
--- /dev/null
+++ b/engines/wintermute/debugger/listing_providers/source_listing_provider.h
@@ -0,0 +1,49 @@
+/* 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 SOURCE_LISTING_PROVIDER_H_
+#define SOURCE_LISTING_PROVIDER_H_
+
+#include "engines/wintermute/debugger/error.h"
+#include "engines/wintermute/debugger/listing_provider.h"
+#include "common/str.h"
+
+namespace Wintermute {
+
+class SourceListing;
+class Listing;
+
+class SourceListingProvider : ListingProvider {
+public:
+ virtual ~SourceListingProvider() {};
+ /**
+ * Get a listing. When implementing this, the result should be safe to delete for the caller.
+ */
+ virtual Listing *getListing(const Common::String &filename, ErrorCode &err) = 0;
+ virtual ErrorCode setPath(const Common::String &path) = 0;
+ virtual Common::String getPath() const = 0;
+
+};
+
+} // End of namespace Wintermute
+
+#endif /* SOURCE_LISTING_PROVIDER_H_ */
diff --git a/engines/wintermute/debugger/script_monitor.cpp b/engines/wintermute/debugger/script_monitor.cpp
new file mode 100644
index 0000000000..2e9370c923
--- /dev/null
+++ b/engines/wintermute/debugger/script_monitor.cpp
@@ -0,0 +1,26 @@
+/* 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 "script_monitor.h"
+
+namespace Wintermute {
+}
diff --git a/engines/wintermute/debugger/script_monitor.h b/engines/wintermute/debugger/script_monitor.h
new file mode 100644
index 0000000000..e9559e2ade
--- /dev/null
+++ b/engines/wintermute/debugger/script_monitor.h
@@ -0,0 +1,43 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef SCRIPTMONITOR_H_
+#define SCRIPTMONITOR_H_
+
+namespace Wintermute {
+
+class DebuggableScript;
+class Breakpoint;
+class Watch;
+
+class ScriptMonitor {
+public:
+
+ virtual ~ScriptMonitor() {};
+ virtual void notifyStep(DebuggableScript* script) = 0;
+ virtual void onBreakpoint(const Breakpoint* breakpoint, DebuggableScript* script) = 0;
+ virtual void onWatch(const Watch* watch, DebuggableScript* script) = 0;
+};
+
+} // End of namespace Wintermute
+
+#endif /* SCRIPTMONITOR_H_ */
diff --git a/engines/wintermute/debugger/watch.cpp b/engines/wintermute/debugger/watch.cpp
new file mode 100644
index 0000000000..410756fdc8
--- /dev/null
+++ b/engines/wintermute/debugger/watch.cpp
@@ -0,0 +1,42 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "watch.h"
+#include "watch_instance.h"
+#include "script_monitor.h"
+
+namespace Wintermute {
+
+Watch::Watch(const Common::String &filename, const Common::String &symbol, ScriptMonitor* monitor) : _enabled(false), _filename(filename), _symbol(symbol), _monitor(monitor) {}
+
+Watch::~Watch() { /* Nothing to take care of in here */ }
+
+void Watch::trigger(WatchInstance* instance) {
+ _monitor->onWatch(this, instance->_script);
+}
+
+Common::String Watch::getFilename() const { return _filename; }
+Common::String Watch::getSymbol() const { return _symbol; }
+bool Watch::isEnabled() const { return _enabled; }
+void Watch::enable() { _enabled = true; }
+void Watch::disable() { _enabled = false; }
+}
diff --git a/engines/wintermute/debugger/watch.h b/engines/wintermute/debugger/watch.h
new file mode 100644
index 0000000000..cbffe43b41
--- /dev/null
+++ b/engines/wintermute/debugger/watch.h
@@ -0,0 +1,51 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef WATCH_H_
+#define WATCH_H_
+
+#include "common/str.h"
+
+namespace Wintermute {
+
+class ScValue;
+class ScScript;
+class WatchInstance;
+class ScriptMonitor;
+
+class Watch {
+ const Common::String _filename;
+ const Common::String _symbol;
+ int _enabled;
+ ScriptMonitor *_monitor;
+public:
+ Watch(const Common::String &filename, const Common::String &symbol, ScriptMonitor*);
+ Common::String getFilename() const;
+ Common::String getSymbol() const;
+ bool isEnabled() const;
+ void enable();
+ void disable();
+ void trigger(WatchInstance*);
+ virtual ~Watch();
+};
+}
+#endif /* WATCH_H_ */
diff --git a/engines/wintermute/debugger/watch_instance.cpp b/engines/wintermute/debugger/watch_instance.cpp
new file mode 100644
index 0000000000..2d31221ad4
--- /dev/null
+++ b/engines/wintermute/debugger/watch_instance.cpp
@@ -0,0 +1,53 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "watch_instance.h"
+#include "engines/wintermute/base/scriptables/script_value.h"
+#include "engines/wintermute/base/scriptables/debuggable/debuggable_script.h"
+#include "engines/wintermute/debugger/watch.h"
+
+namespace Wintermute {
+
+WatchInstance::WatchInstance(Watch* watch, DebuggableScript* script) : _watch(watch), _script(script), _lastValue(nullptr) {}
+WatchInstance::~WatchInstance() { delete _lastValue; }
+
+void WatchInstance::evaluate() {
+ if (_watch->isEnabled()) {
+ if (!_watch->getFilename().compareTo(_script->_filename)) {
+
+ if(_lastValue == nullptr) {
+ _lastValue = new ScValue(_script->_gameRef);
+ // ^^ This here is NULL by default
+ }
+ ScValue* currentValue = _script->resolveName(_watch->getSymbol());
+ if(ScValue::compare(
+ currentValue,
+ _lastValue
+ )) {
+ _lastValue->copy(currentValue);
+ _watch->trigger(this);
+ }
+ delete currentValue;
+ }
+ }
+}
+} // End of namespace Wintermute
diff --git a/engines/wintermute/debugger/watch_instance.h b/engines/wintermute/debugger/watch_instance.h
new file mode 100644
index 0000000000..84fb62968d
--- /dev/null
+++ b/engines/wintermute/debugger/watch_instance.h
@@ -0,0 +1,44 @@
+/* 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 WATCH_INSTANCE_H_
+#define WATCH_INSTANCE_H_
+
+namespace Wintermute {
+class Watch;
+class ScValue;
+class DebuggableScript;
+
+class WatchInstance {
+ Watch* _watch;
+ ScValue *_lastValue;
+ DebuggableScript* _script;
+public:
+ WatchInstance (Watch* watch, DebuggableScript* script);
+ ~WatchInstance();
+ void evaluate();
+friend class DebuggableScript;
+friend class Watch;
+};
+} // End of namespace Wintermute
+
+#endif /* WATCH_INSTANCE_H_ */
diff --git a/engines/wintermute/module.mk b/engines/wintermute/module.mk
index 4c95314a02..2c9c2e0180 100644
--- a/engines/wintermute/module.mk
+++ b/engines/wintermute/module.mk
@@ -27,6 +27,8 @@ MODULE_OBJS := \
ad/ad_talk_holder.o \
ad/ad_talk_node.o \
ad/ad_waypoint_group.o \
+ base/scriptables/debuggable/debuggable_script.o \
+ base/scriptables/debuggable/debuggable_script_engine.o \
base/scriptables/script.o \
base/scriptables/script_engine.o \
base/scriptables/script_stack.o \
@@ -88,6 +90,18 @@ MODULE_OBJS := \
base/saveload.o \
base/save_thumb_helper.o \
base/timer.o \
+ debugger/breakpoint.o \
+ debugger/debugger_controller.o \
+ debugger/error.o \
+ debugger/listing_providers/blank_listing.o \
+ debugger/listing_providers/blank_listing_provider.o \
+ debugger/listing_providers/basic_source_listing_provider.o \
+ debugger/listing_providers/cached_source_listing_provider.o \
+ debugger/listing_providers/source_listing.o \
+ debugger/listing.o \
+ debugger/script_monitor.o \
+ debugger/watch.o \
+ debugger/watch_instance.o \
detection.o \
math/math_util.o \
math/matrix4.o \
diff --git a/engines/wintermute/wintermute.cpp b/engines/wintermute/wintermute.cpp
index 955f2dc1c2..05dfb961cb 100644
--- a/engines/wintermute/wintermute.cpp
+++ b/engines/wintermute/wintermute.cpp
@@ -41,6 +41,7 @@
#include "engines/wintermute/base/base_file_manager.h"
#include "engines/wintermute/base/gfx/base_renderer.h"
#include "engines/wintermute/base/scriptables/script_engine.h"
+#include "engines/wintermute/debugger/debugger_controller.h"
namespace Wintermute {
@@ -49,6 +50,7 @@ namespace Wintermute {
WintermuteEngine::WintermuteEngine() : Engine(g_system) {
_game = new AdGame("");
_debugger = nullptr;
+ _dbgController = nullptr;
_trigDebug = false;
_gameDescription = nullptr;
}
@@ -76,6 +78,7 @@ WintermuteEngine::WintermuteEngine(OSystem *syst, const WMEGameDescription *desc
_game = nullptr;
_debugger = nullptr;
+ _dbgController = nullptr;
_trigDebug = false;
}
@@ -112,6 +115,7 @@ Common::Error WintermuteEngine::run() {
}
// Create debugger console. It requires GFX to be initialized
+ _dbgController = new DebuggerController(this);
_debugger = new Console(this);
// DebugMan.enableDebugChannel("enginelog");
@@ -171,7 +175,6 @@ int WintermuteEngine::init() {
}
_game->initialize3();
-
// initialize sound manager (non-fatal if we fail)
ret = _game->_soundMgr->initialize();
if (DID_FAIL(ret)) {
@@ -200,6 +203,8 @@ int WintermuteEngine::init() {
_game->loadGame(slot);
}
+ _game->_scEngine->attachMonitor(_dbgController);
+
// all set, ready to go
return 0;
}
diff --git a/engines/wintermute/wintermute.h b/engines/wintermute/wintermute.h
index f61a809b22..a8f9a18530 100644
--- a/engines/wintermute/wintermute.h
+++ b/engines/wintermute/wintermute.h
@@ -33,6 +33,8 @@ namespace Wintermute {
class Console;
class BaseGame;
class SystemClassRegistry;
+class DebuggerController;
+
// our engine debug channels
enum {
kWintermuteDebugLog = 1 << 0, // The debug-logs from the original engine
@@ -49,7 +51,7 @@ public:
WintermuteEngine();
~WintermuteEngine();
- virtual GUI::Debugger *getDebugger() { return _debugger; }
+ virtual Wintermute::Console *getConsole() { return _debugger; }
void trigDebugger() { _trigDebug = true; }
virtual Common::Error run();
@@ -66,11 +68,13 @@ private:
int init();
void deinit();
int messageLoop();
- GUI::Debugger *_debugger;
+ Wintermute::Console *_debugger;
BaseGame *_game;
+ Wintermute::DebuggerController *_dbgController;
const WMEGameDescription *_gameDescription;
friend class Console;
+ friend class DebuggerController;
};
} // End of namespace Wintermute
diff --git a/graphics/VectorRenderer.cpp b/graphics/VectorRenderer.cpp
index f426dd8c41..73dc6309b2 100644
--- a/graphics/VectorRenderer.cpp
+++ b/graphics/VectorRenderer.cpp
@@ -55,7 +55,34 @@ void VectorRenderer::drawStep(const Common::Rect &area, const DrawStep &step, ui
_dynamicData = extra;
- (this->*(step.drawingCall))(area, step);
+ Common::Rect noClip = Common::Rect(0, 0, 0, 0);
+ (this->*(step.drawingCall))(area, step, noClip);
+}
+
+void VectorRenderer::drawStepClip(const Common::Rect &area, const Common::Rect &clip, const DrawStep &step, uint32 extra) {
+
+ if (step.bgColor.set)
+ setBgColor(step.bgColor.r, step.bgColor.g, step.bgColor.b);
+
+ if (step.fgColor.set)
+ setFgColor(step.fgColor.r, step.fgColor.g, step.fgColor.b);
+
+ if (step.bevelColor.set)
+ setBevelColor(step.bevelColor.r, step.bevelColor.g, step.bevelColor.b);
+
+ if (step.gradColor1.set && step.gradColor2.set)
+ setGradientColors(step.gradColor1.r, step.gradColor1.g, step.gradColor1.b,
+ step.gradColor2.r, step.gradColor2.g, step.gradColor2.b);
+
+ setShadowOffset(_disableShadows ? 0 : step.shadow);
+ setBevel(step.bevel);
+ setGradientFactor(step.factor);
+ setStrokeWidth(step.stroke);
+ setFillMode((FillMode)step.fillMode);
+
+ _dynamicData = extra;
+
+ (this->*(step.drawingCall))(area, step, clip);
}
int VectorRenderer::stepGetRadius(const DrawStep &step, const Common::Rect &area) {
diff --git a/graphics/VectorRenderer.h b/graphics/VectorRenderer.h
index 6b657f758d..0352808706 100644
--- a/graphics/VectorRenderer.h
+++ b/graphics/VectorRenderer.h
@@ -38,7 +38,7 @@ class VectorRenderer;
struct DrawStep;
-typedef void (VectorRenderer::*DrawingFunctionCallback)(const Common::Rect &, const Graphics::DrawStep &);
+typedef void (VectorRenderer::*DrawingFunctionCallback)(const Common::Rect &, const Graphics::DrawStep &, const Common::Rect &);
struct DrawStep {
@@ -142,6 +142,7 @@ public:
* @param y2 Vertical (Y) coordinate for the line end
*/
virtual void drawLine(int x1, int y1, int x2, int y2) = 0;
+ virtual void drawLineClip(int x1, int y1, int x2, int y2, Common::Rect clipping) = 0;
/**
* Draws a circle centered at (x,y) with radius r.
@@ -151,6 +152,7 @@ public:
* @param r Radius of the circle.
*/
virtual void drawCircle(int x, int y, int r) = 0;
+ virtual void drawCircleClip(int x, int y, int r, Common::Rect clipping) = 0;
/**
* Draws a square starting at (x,y) with the given width and height.
@@ -161,6 +163,7 @@ public:
* @param h Height of the square
*/
virtual void drawSquare(int x, int y, int w, int h) = 0;
+ virtual void drawSquareClip(int x, int y, int w, int h, Common::Rect clipping) = 0;
/**
* Draws a rounded square starting at (x,y) with the given width and height.
@@ -173,6 +176,7 @@ public:
* @param r Radius of the corners.
*/
virtual void drawRoundedSquare(int x, int y, int r, int w, int h) = 0;
+ virtual void drawRoundedSquareClip(int x, int y, int r, int w, int h, Common::Rect clipping) = 0;
/**
* Draws a triangle starting at (x,y) with the given base and height.
@@ -186,6 +190,7 @@ public:
* @param orient Orientation of the triangle.
*/
virtual void drawTriangle(int x, int y, int base, int height, TriangleOrientation orient) = 0;
+ virtual void drawTriangleClip(int x, int y, int base, int height, TriangleOrientation orient, Common::Rect clipping) = 0;
/**
* Draws a beveled square like the ones in the Classic GUI themes.
@@ -199,6 +204,7 @@ public:
* @param bevel Amount of bevel. Must be positive.
*/
virtual void drawBeveledSquare(int x, int y, int w, int h, int bevel) = 0;
+ virtual void drawBeveledSquareClip(int x, int y, int w, int h, int bevel, Common::Rect clipping) = 0;
/**
* Draws a tab-like shape, specially thought for the Tab widget.
@@ -212,6 +218,7 @@ public:
* @param r Radius of the corners of the tab (0 for squared tabs).
*/
virtual void drawTab(int x, int y, int r, int w, int h) = 0;
+ virtual void drawTabClip(int x, int y, int r, int w, int h, Common::Rect clipping) = 0;
/**
@@ -222,6 +229,11 @@ public:
drawLine(x + w, y, x, y + h);
}
+ virtual void drawCrossClip(int x, int y, int w, int h, Common::Rect clipping) {
+ drawLineClip(x, y, x + w, y + w, clipping);
+ drawLineClip(x + w, y, x, y + h, clipping);
+ }
+
/**
* Set the active foreground painting color for the renderer.
* All the foreground drawing from then on will be done with that color, unless
@@ -278,6 +290,7 @@ public:
* Defaults to using the active Foreground color for filling.
*/
virtual void fillSurface() = 0;
+ virtual void fillSurfaceClip(Common::Rect clipping) = 0;
/**
* Clears the active surface.
@@ -355,68 +368,68 @@ public:
/**
* DrawStep callback functions for each drawing feature
*/
- void drawCallback_CIRCLE(const Common::Rect &area, const DrawStep &step) {
+ void drawCallback_CIRCLE(const Common::Rect &area, const DrawStep &step, const Common::Rect &clip) {
uint16 x, y, w, h, radius;
radius = stepGetRadius(step, area);
stepGetPositions(step, area, x, y, w, h);
- drawCircle(x + radius, y + radius, radius);
+ drawCircleClip(x + radius, y + radius, radius, clip);
}
- void drawCallback_SQUARE(const Common::Rect &area, const DrawStep &step) {
+ void drawCallback_SQUARE(const Common::Rect &area, const DrawStep &step, const Common::Rect &clip) {
uint16 x, y, w, h;
stepGetPositions(step, area, x, y, w, h);
- drawSquare(x, y, w, h);
+ drawSquareClip(x, y, w, h, clip);
}
- void drawCallback_LINE(const Common::Rect &area, const DrawStep &step) {
+ void drawCallback_LINE(const Common::Rect &area, const DrawStep &step, const Common::Rect &clip) {
uint16 x, y, w, h;
stepGetPositions(step, area, x, y, w, h);
- drawLine(x, y, x + w, y + w);
+ drawLineClip(x, y, x + w, y + w, clip);
}
- void drawCallback_ROUNDSQ(const Common::Rect &area, const DrawStep &step) {
+ void drawCallback_ROUNDSQ(const Common::Rect &area, const DrawStep &step, const Common::Rect &clip) {
uint16 x, y, w, h;
stepGetPositions(step, area, x, y, w, h);
- drawRoundedSquare(x, y, stepGetRadius(step, area), w, h);
+ drawRoundedSquareClip(x, y, stepGetRadius(step, area), w, h, clip);
}
- void drawCallback_FILLSURFACE(const Common::Rect &area, const DrawStep &step) {
- fillSurface();
+ void drawCallback_FILLSURFACE(const Common::Rect &area, const DrawStep &step, const Common::Rect &clip) {
+ fillSurfaceClip(clip);
}
- void drawCallback_TRIANGLE(const Common::Rect &area, const DrawStep &step) {
+ void drawCallback_TRIANGLE(const Common::Rect &area, const DrawStep &step, const Common::Rect &clip) {
uint16 x, y, w, h;
stepGetPositions(step, area, x, y, w, h);
- drawTriangle(x, y, w, h, (TriangleOrientation)step.extraData);
+ drawTriangleClip(x, y, w, h, (TriangleOrientation)step.extraData, clip);
}
- void drawCallback_BEVELSQ(const Common::Rect &area, const DrawStep &step) {
+ void drawCallback_BEVELSQ(const Common::Rect &area, const DrawStep &step, const Common::Rect &clip) {
uint16 x, y, w, h;
stepGetPositions(step, area, x, y, w, h);
- drawBeveledSquare(x, y, w, h, _bevel);
+ drawBeveledSquareClip(x, y, w, h, _bevel, clip);
}
- void drawCallback_TAB(const Common::Rect &area, const DrawStep &step) {
+ void drawCallback_TAB(const Common::Rect &area, const DrawStep &step, const Common::Rect &clip) {
uint16 x, y, w, h;
stepGetPositions(step, area, x, y, w, h);
- drawTab(x, y, stepGetRadius(step, area), w, h);
+ drawTabClip(x, y, stepGetRadius(step, area), w, h, clip);
}
- void drawCallback_BITMAP(const Common::Rect &area, const DrawStep &step) {
+ void drawCallback_BITMAP(const Common::Rect &area, const DrawStep &step, const Common::Rect &clip) {
uint16 x, y, w, h;
stepGetPositions(step, area, x, y, w, h);
- blitAlphaBitmap(step.blitSrc, Common::Rect(x, y, x + w, y + h));
+ blitAlphaBitmapClip(step.blitSrc, Common::Rect(x, y, x + w, y + h), clip);
}
- void drawCallback_CROSS(const Common::Rect &area, const DrawStep &step) {
+ void drawCallback_CROSS(const Common::Rect &area, const DrawStep &step, const Common::Rect &clip) {
uint16 x, y, w, h;
stepGetPositions(step, area, x, y, w, h);
- drawCross(x, y, w, h);
+ drawCrossClip(x, y, w, h, clip);
}
- void drawCallback_VOID(const Common::Rect &area, const DrawStep &step) {}
+ void drawCallback_VOID(const Common::Rect &area, const DrawStep &step, const Common::Rect &clip) {}
/**
* Draws the specified draw step on the screen.
@@ -426,6 +439,7 @@ public:
* @param step Pointer to a DrawStep struct.
*/
virtual void drawStep(const Common::Rect &area, const DrawStep &step, uint32 extra = 0);
+ virtual void drawStepClip(const Common::Rect &area, const Common::Rect &clip, const DrawStep &step, uint32 extra = 0);
/**
* Copies the part of the current frame to the system overlay.
@@ -466,8 +480,10 @@ public:
* blitted into the active surface, at the position specified by "r".
*/
virtual void blitSubSurface(const Graphics::Surface *source, const Common::Rect &r) = 0;
+ virtual void blitSubSurfaceClip(const Graphics::Surface *source, const Common::Rect &r, const Common::Rect &clipping) = 0;
virtual void blitAlphaBitmap(const Graphics::Surface *source, const Common::Rect &r) = 0;
+ virtual void blitAlphaBitmapClip(const Graphics::Surface *source, const Common::Rect &r, const Common::Rect &clipping) = 0;
/**
* Draws a string into the screen. Wrapper for the Graphics::Font string drawing
diff --git a/graphics/VectorRendererSpec.cpp b/graphics/VectorRendererSpec.cpp
index 258d935440..fc741f6e77 100644
--- a/graphics/VectorRendererSpec.cpp
+++ b/graphics/VectorRendererSpec.cpp
@@ -108,6 +108,33 @@ inline frac_t fp_sqroot(uint32 x) {
BE_DRAWCIRCLE_BOTTOM(ptr3,ptr4,x,y,px,py); \
} while (0)
+#define BE_DRAWCIRCLE_TOP_CLIP(ptr1,ptr2,x,y,px,py,realX1,realY1,realX2,realY2) do { \
+ if (IS_IN_CLIP((realX1) + (y), (realY1) - (x))) \
+ *(ptr1 + (y) - (px)) = color; \
+ if (IS_IN_CLIP((realX1) + (x), (realY1) - (y))) \
+ *(ptr1 + (x) - (py)) = color; \
+ if (IS_IN_CLIP((realX2) - (x), (realY2) - (y))) \
+ *(ptr2 - (x) - (py)) = color; \
+ if (IS_IN_CLIP((realX2) - (y), (realY2) - (x))) \
+ *(ptr2 - (y) - (px)) = color; \
+} while (0)
+
+#define BE_DRAWCIRCLE_BOTTOM_CLIP(ptr3,ptr4,x,y,px,py,realX3,realY3,realX4,realY4) do { \
+ if (IS_IN_CLIP((realX3) - (y), (realY3) + (x))) \
+ *(ptr3 - (y) + (px)) = color; \
+ if (IS_IN_CLIP((realX3) - (x), (realY3) + (y))) \
+ *(ptr3 - (x) + (py)) = color; \
+ if (IS_IN_CLIP((realX4) + (x), (realY4) + (y))) \
+ *(ptr4 + (x) + (py)) = color; \
+ if (IS_IN_CLIP((realX4) + (y), (realY4) + (x))) \
+ *(ptr4 + (y) + (px)) = color; \
+} while (0)
+
+#define BE_DRAWCIRCLE_CLIP(ptr1,ptr2,ptr3,ptr4,x,y,px,py,realX1,realY1,realX2,realY2,realX3,realY3,realX4,realY4) do { \
+ BE_DRAWCIRCLE_TOP_CLIP(ptr1,ptr2,x,y,px,py,realX1,realY1,realX2,realY2); \
+ BE_DRAWCIRCLE_BOTTOM_CLIP(ptr3,ptr4,x,y,px,py,realX3,realY3,realX4,realY4); \
+} while (0)
+
#define BE_DRAWCIRCLE_BCOLOR(ptr1,ptr2,ptr3,ptr4,x,y,px,py) do { \
*(ptr1 + (y) - (px)) = color1; \
*(ptr1 + (x) - (py)) = color1; \
@@ -119,6 +146,25 @@ inline frac_t fp_sqroot(uint32 x) {
*(ptr4 + (y) + (px)) = color2; \
} while (0)
+#define BE_DRAWCIRCLE_BCOLOR_CLIP(ptr1,ptr2,ptr3,ptr4,x,y,px,py,realX1,realY1,realX2,realY2,realX3,realY3,realX4,realY4) do { \
+ if (IS_IN_CLIP((realX1) + (y), (realY1) - (x))) \
+ *(ptr1 + (y) - (px)) = color1; \
+ if (IS_IN_CLIP((realX1) + (x), (realY1) - (y))) \
+ *(ptr1 + (x) - (py)) = color1; \
+ if (IS_IN_CLIP((realX2) - (x), (realY2) - (y))) \
+ *(ptr2 - (x) - (py)) = color1; \
+ if (IS_IN_CLIP((realX2) - (y), (realY2) - (x))) \
+ *(ptr2 - (y) - (px)) = color1; \
+ if (IS_IN_CLIP((realX3) - (y), (realY3) + (x))) \
+ *(ptr3 - (y) + (px)) = color1; \
+ if (IS_IN_CLIP((realX3) - (x), (realY3) + (y))) \
+ *(ptr3 - (x) + (py)) = color1; \
+ if (IS_IN_CLIP((realX4) + (x), (realY4) + (y))) \
+ *(ptr4 + (x) + (py)) = color2; \
+ if (IS_IN_CLIP((realX4) + (y), (realY4) + (x))) \
+ *(ptr4 + (y) + (px)) = color2; \
+} while (0)
+
#define BE_DRAWCIRCLE_BCOLOR_TR_CW(ptr,x,y,px,py,a) do { \
this->blendPixelPtr(ptr + (y) - (px), color, a); \
} while (0)
@@ -127,6 +173,16 @@ inline frac_t fp_sqroot(uint32 x) {
this->blendPixelPtr(ptr + (x) - (py), color, a); \
} while (0)
+#define BE_DRAWCIRCLE_BCOLOR_TR_CW_CLIP(ptr,x,y,px,py,a,realX,realY) do { \
+ if (IS_IN_CLIP((realX) + (y), (realY) - (x))) \
+ this->blendPixelPtr(ptr + (y) - (px), color, a); \
+} while (0)
+
+#define BE_DRAWCIRCLE_BCOLOR_TR_CCW_CLIP(ptr,x,y,px,py,a,realX,realY) do { \
+ if (IS_IN_CLIP((realX) + (x), (realY) - (y))) \
+ this->blendPixelPtr(ptr + (x) - (py), color, a); \
+} while (0)
+
#define BE_DRAWCIRCLE_BCOLOR_TL_CW(ptr,x,y,px,py,a) do { \
this->blendPixelPtr(ptr - (x) - (py), color, a); \
} while (0)
@@ -135,6 +191,16 @@ inline frac_t fp_sqroot(uint32 x) {
this->blendPixelPtr(ptr - (y) - (px), color, a); \
} while (0)
+#define BE_DRAWCIRCLE_BCOLOR_TL_CW_CLIP(ptr,x,y,px,py,a,realX,realY) do { \
+ if (IS_IN_CLIP((realX) - (x), (realY) - (y))) \
+ this->blendPixelPtr(ptr - (x) - (py), color, a); \
+} while (0)
+
+#define BE_DRAWCIRCLE_BCOLOR_TL_CCW_CLIP(ptr,x,y,px,py,a,realX,realY) do { \
+ if (IS_IN_CLIP((realX) - (y), (realY) - (x))) \
+ this->blendPixelPtr(ptr - (y) - (px), color, a); \
+} while (0)
+
#define BE_DRAWCIRCLE_BCOLOR_BL_CW(ptr,x,y,px,py,a) do { \
this->blendPixelPtr(ptr - (y) + (px), color, a); \
} while (0)
@@ -143,6 +209,16 @@ inline frac_t fp_sqroot(uint32 x) {
this->blendPixelPtr(ptr - (x) + (py), color, a); \
} while (0)
+#define BE_DRAWCIRCLE_BCOLOR_BL_CW_CLIP(ptr,x,y,px,py,a,realX,realY) do { \
+ if (IS_IN_CLIP((realX) - (y), (realY) + (x))) \
+ this->blendPixelPtr(ptr - (y) + (px), color, a); \
+} while (0)
+
+#define BE_DRAWCIRCLE_BCOLOR_BL_CCW_CLIP(ptr,x,y,px,py,a,realX,realY) do { \
+ if (IS_IN_CLIP((realX) - (x), (realY) + (y))) \
+ this->blendPixelPtr(ptr - (x) + (py), color, a); \
+} while (0)
+
#define BE_DRAWCIRCLE_BCOLOR_BR_CW(ptr,x,y,px,py,a) do { \
this->blendPixelPtr(ptr + (x) + (py), color, a); \
} while (0)
@@ -151,6 +227,16 @@ inline frac_t fp_sqroot(uint32 x) {
this->blendPixelPtr(ptr + (y) + (px), color, a); \
} while (0)
+#define BE_DRAWCIRCLE_BCOLOR_BR_CW_CLIP(ptr,x,y,px,py,a,realX,realY) do { \
+ if (IS_IN_CLIP((realX) + (x), (realY) + (y))) \
+ this->blendPixelPtr(ptr + (x) + (py), color, a); \
+} while (0)
+
+#define BE_DRAWCIRCLE_BCOLOR_BR_CCW_CLIP(ptr,x,y,px,py,a,realX,realY) do { \
+ if (IS_IN_CLIP((realX) + (y), (realY) + (x))) \
+ this->blendPixelPtr(ptr + (y) + (px), color, a); \
+} while (0)
+
#define BE_DRAWCIRCLE_XCOLOR_TOP(ptr1,ptr2,x,y,px,py) do { \
*(ptr1 + (y) - (px)) = color1; \
*(ptr1 + (x) - (py)) = color2; \
@@ -170,6 +256,42 @@ inline frac_t fp_sqroot(uint32 x) {
BE_DRAWCIRCLE_XCOLOR_BOTTOM(ptr3,ptr4,x,y,px,py); \
} while (0)
+#define IS_IN_CLIP(x,y) (_clippingArea.left <= (x) && (x) < _clippingArea.right \
+ && _clippingArea.top <= (y) && (y) < _clippingArea.bottom)
+
+#define BE_DRAWCIRCLE_XCOLOR_TOP_CLIP(ptr1,ptr2,x,y,px,py,realX1,realY1,realX2,realY2) do { \
+ if (IS_IN_CLIP((realX1) + (y), (realY1) - (x))) \
+ *(ptr1 + (y) - (px)) = color1; \
+\
+ if (IS_IN_CLIP((realX1) + (x), (realY1) - (y))) \
+ *(ptr1 + (x) - (py)) = color2; \
+\
+ if (IS_IN_CLIP((realX2) - (x), (realY2) - (y))) \
+ *(ptr2 - (x) - (py)) = color2; \
+\
+ if (IS_IN_CLIP((realX2) - (y), (realY2) - (x))) \
+ *(ptr2 - (y) - (px)) = color1; \
+} while (0)
+
+#define BE_DRAWCIRCLE_XCOLOR_BOTTOM_CLIP(ptr3,ptr4,x,y,px,py,realX3,realY3,realX4,realY4) do { \
+ if (IS_IN_CLIP((realX3) - (y), (realY3) + (x))) \
+ *(ptr3 - (y) + (px)) = color3; \
+\
+ if (IS_IN_CLIP((realX3) - (x), (realY3) + (y))) \
+ *(ptr3 - (x) + (py)) = color4; \
+\
+ if (IS_IN_CLIP((realX4) + (x), (realY4) + (y))) \
+ *(ptr4 + (x) + (py)) = color4; \
+\
+ if (IS_IN_CLIP((realX4) + (y), (realY4) + (x))) \
+ *(ptr4 + (y) + (px)) = color3; \
+} while (0)
+
+#define BE_DRAWCIRCLE_XCOLOR_CLIP(ptr1,ptr2,ptr3,ptr4,x,y,px,py,realX1,realY1,realX2,realY2,realX3,realY3,realX4,realY4) do { \
+ BE_DRAWCIRCLE_XCOLOR_TOP_CLIP(ptr1,ptr2,x,y,px,py,realX1,realY1,realX2,realY2); \
+ BE_DRAWCIRCLE_XCOLOR_BOTTOM_CLIP(ptr3,ptr4,x,y,px,py,realX3,realY3,realX4,realY4); \
+} while (0)
+
#define BE_RESET() do { \
f = 1 - r; \
@@ -337,6 +459,45 @@ void colorFill(PixelType *first, PixelType *last, PixelType color) {
}
}
+template<typename PixelType>
+void colorFillClip(PixelType *first, PixelType *last, PixelType color, int realX, int realY, Common::Rect &clippingArea) {
+ if (realY < clippingArea.top || realY >= clippingArea.bottom)
+ return;
+
+ register int count = (last - first);
+
+ if (realX > clippingArea.right || realX + count < clippingArea.left)
+ return;
+
+ if (realX < clippingArea.left) {
+ register int diff = (clippingArea.left - realX);
+ realX += diff;
+ count -= diff;
+ }
+
+ if (clippingArea.right <= realX + count) {
+ register int diff = (realX + count - clippingArea.right);
+ count -= diff;
+ }
+
+ if (!count)
+ return;
+
+ register int n = (count + 7) >> 3;
+ switch (count % 8) {
+ case 0: do {
+ *first++ = color;
+ case 7: *first++ = color;
+ case 6: *first++ = color;
+ case 5: *first++ = color;
+ case 4: *first++ = color;
+ case 3: *first++ = color;
+ case 2: *first++ = color;
+ case 1: *first++ = color;
+ } while (--n > 0);
+ }
+}
+
VectorRenderer *createRenderer(int mode) {
#ifdef DISABLE_FANCY_THEMES
@@ -376,6 +537,7 @@ VectorRendererSpec(PixelFormat format) :
_alphaMask((0xFF >> format.aLoss) << format.aShift) {
_bitmapAlphaColor = _format.RGBToColor(255, 0, 255);
+ _clippingArea = Common::Rect(0, 0, 32767, 32767);
}
/****************************
@@ -480,6 +642,49 @@ gradientFill(PixelType *ptr, int width, int x, int y) {
template<typename PixelType>
void VectorRendererSpec<PixelType>::
+gradientFillClip(PixelType *ptr, int width, int x, int y, int realX, int realY) {
+ if (realY < _clippingArea.top || realY >= _clippingArea.bottom) return;
+ bool ox = ((y & 1) == 1);
+ int curGrad = 0;
+
+ while (_gradIndexes[curGrad + 1] <= y)
+ curGrad++;
+
+ // precalcGradient assures that _gradIndexes entries always differ in
+ // their value. This assures stripSize is always different from zero.
+ int stripSize = _gradIndexes[curGrad + 1] - _gradIndexes[curGrad];
+
+ int grad = (((y - _gradIndexes[curGrad]) % stripSize) << 2) / stripSize;
+
+ // Dithering:
+ // +--+ +--+ +--+ +--+
+ // | | | | | *| | *|
+ // | | | *| |* | |**|
+ // +--+ +--+ +--+ +--+
+ // 0 1 2 3
+ if (grad == 0 ||
+ _gradCache[curGrad] == _gradCache[curGrad + 1] || // no color change
+ stripSize < 2) { // the stip is small
+ colorFill<PixelType>(ptr, ptr + width, _gradCache[curGrad]);
+ } else if (grad == 3 && ox) {
+ colorFill<PixelType>(ptr, ptr + width, _gradCache[curGrad + 1]);
+ } else {
+ for (int j = x; j < x + width; j++, ptr++) {
+ if (realX + j - x < _clippingArea.left || realX + j - x >= _clippingArea.right) continue;
+ bool oy = ((j & 1) == 1);
+
+ if ((ox && oy) ||
+ ((grad == 2 || grad == 3) && ox && !oy) ||
+ (grad == 3 && oy))
+ *ptr = _gradCache[curGrad + 1];
+ else
+ *ptr = _gradCache[curGrad];
+ }
+ }
+}
+
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
fillSurface() {
byte *ptr = (byte *)_activeSurface->getPixels();
@@ -503,6 +708,44 @@ fillSurface() {
template<typename PixelType>
void VectorRendererSpec<PixelType>::
+fillSurfaceClip(Common::Rect clipping) {
+ int w = _activeSurface->w;
+ int h = _activeSurface->h;
+ if (clipping.isEmpty() || (clipping.left == 0 && clipping.top == 0 && clipping.right == w && clipping.bottom == h)) {
+ fillSurface();
+ return;
+ }
+
+ byte *ptr = (byte *)_activeSurface->getPixels();
+ int pitch = _activeSurface->pitch;
+
+ if (Base::_fillMode == kFillBackground || Base::_fillMode == kFillForeground) {
+ PixelType color = (Base::_fillMode == kFillBackground ? _bgColor : _fgColor);
+ byte *ptrLeft = (ptr + _clippingArea.left), *ptrRight = ptr + _clippingArea.right;
+ for (int i = 0; i < h; i++) {
+ if (_clippingArea.top <= i && i < _clippingArea.bottom) {
+ colorFill<PixelType>((PixelType *)ptrLeft, (PixelType *)ptrRight, color);
+ }
+
+ ptrLeft += pitch;
+ ptrRight += pitch;
+ }
+
+ } else if (Base::_fillMode == kFillGradient) {
+ precalcGradient(h);
+
+ for (int i = 0; i < h; i++) {
+ if (_clippingArea.top <= i && i < _clippingArea.bottom) {
+ gradientFill((PixelType *)ptr + _clippingArea.left, _clippingArea.width(), 0, i);
+ }
+
+ ptr += pitch;
+ }
+ }
+}
+
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
copyFrame(OSystem *sys, const Common::Rect &r) {
sys->copyRectToOverlay(
@@ -554,6 +797,58 @@ blitSubSurface(const Graphics::Surface *source, const Common::Rect &r) {
template<typename PixelType>
void VectorRendererSpec<PixelType>::
+blitSubSurfaceClip(const Graphics::Surface *source, const Common::Rect &r, const Common::Rect &clipping) {
+ if (clipping.isEmpty() || clipping.contains(r)) {
+ blitSubSurface(source, r);
+ return;
+ }
+
+ int16 x = r.left;
+ int16 y = r.top;
+
+ if (r.width() > source->w)
+ x = x + (r.width() >> 1) - (source->w >> 1);
+
+ if (r.height() > source->h)
+ y = y + (r.height() >> 1) - (source->h >> 1);
+
+ int w = source->w, h = source->h;
+ int usedW = w, usedH = h;
+ int offsetX = 0, offsetY = 0;
+
+ if (x > clipping.right || x + w < clipping.left) return;
+ if (y > clipping.bottom || y + h < clipping.top) return;
+ if (x < clipping.left) {
+ offsetX = clipping.left - x;
+ usedW -= offsetX;
+ x = clipping.left;
+ }
+ if (y < clipping.top) {
+ offsetY = clipping.top - y;
+ usedH -= offsetY;
+ y = clipping.top;
+ }
+ if (usedW > clipping.width()) usedW = clipping.width();
+ if (usedH > clipping.height()) usedH = clipping.height();
+
+ byte *dst_ptr = (byte *)_activeSurface->getBasePtr(x, y);
+ const byte *src_ptr = (const byte *)source->getBasePtr(offsetX, offsetY);
+
+ const int dst_pitch = _activeSurface->pitch;
+ const int src_pitch = source->pitch;
+
+ int lines = usedH;
+ const int sz = usedW * sizeof(PixelType);
+
+ while (lines--) {
+ memcpy(dst_ptr, src_ptr, sz);
+ dst_ptr += dst_pitch;
+ src_ptr += src_pitch;
+ }
+}
+
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
blitAlphaBitmap(const Graphics::Surface *source, const Common::Rect &r) {
int16 x = r.left;
int16 y = r.top;
@@ -590,6 +885,65 @@ blitAlphaBitmap(const Graphics::Surface *source, const Common::Rect &r) {
template<typename PixelType>
void VectorRendererSpec<PixelType>::
+blitAlphaBitmapClip(const Graphics::Surface *source, const Common::Rect &r, const Common::Rect &clipping) {
+ if (clipping.isEmpty() || clipping.contains(r)) {
+ blitAlphaBitmap(source, r);
+ return;
+ }
+
+ int16 x = r.left;
+ int16 y = r.top;
+
+ if (r.width() > source->w)
+ x = x + (r.width() >> 1) - (source->w >> 1);
+
+ if (r.height() > source->h)
+ y = y + (r.height() >> 1) - (source->h >> 1);
+
+ int w = source->w, h = source->h;
+ int usedW = w, usedH = h;
+ int offsetX = 0, offsetY = 0;
+
+ if (x > clipping.right || x + w < clipping.left) return;
+ if (y > clipping.bottom || y + h < clipping.top) return;
+ if (x < clipping.left) {
+ offsetX = clipping.left - x;
+ usedW -= offsetX;
+ x = clipping.left;
+ }
+ if (y < clipping.top) {
+ offsetY = clipping.top - y;
+ usedH -= offsetY;
+ y = clipping.top;
+ }
+ if (usedW > clipping.width()) usedW = clipping.width();
+ if (usedH > clipping.height()) usedH = clipping.height();
+
+ PixelType *dst_ptr = (PixelType *)_activeSurface->getBasePtr(x, y);
+ const PixelType *src_ptr = (const PixelType *)source->getBasePtr(offsetX, offsetY);
+
+ int dst_pitch = _activeSurface->pitch / _activeSurface->format.bytesPerPixel;
+ int src_pitch = source->pitch / source->format.bytesPerPixel;
+
+ h = usedH;
+ while (h--) {
+ w = usedW;
+
+ while (w--) {
+ if (*src_ptr != _bitmapAlphaColor)
+ *dst_ptr = *src_ptr;
+
+ dst_ptr++;
+ src_ptr++;
+ }
+
+ dst_ptr = dst_ptr - usedW + dst_pitch;
+ src_ptr = src_ptr - usedW + src_pitch;
+ }
+}
+
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
applyScreenShading(GUI::ThemeEngine::ShadingStyle shadingStyle) {
int pixels = _activeSurface->w * _activeSurface->h;
PixelType *ptr = (PixelType *)_activeSurface->getPixels();
@@ -667,6 +1021,13 @@ blendPixelPtr(PixelType *ptr, PixelType color, uint8 alpha) {
template<typename PixelType>
inline void VectorRendererSpec<PixelType>::
+blendPixelPtrClip(PixelType *ptr, PixelType color, uint8 alpha, int x, int y) {
+ if (IS_IN_CLIP(x, y))
+ blendPixelPtr(ptr, color, alpha);
+}
+
+template<typename PixelType>
+inline void VectorRendererSpec<PixelType>::
blendPixelDestAlphaPtr(PixelType *ptr, PixelType color, uint8 alpha) {
int idst = *ptr;
// This function is only used for corner pixels in rounded rectangles, so
@@ -710,6 +1071,36 @@ darkenFill(PixelType *ptr, PixelType *end) {
}
}
+template<typename PixelType>
+inline void VectorRendererSpec<PixelType>::
+darkenFillClip(PixelType *ptr, PixelType *end, int x, int y) {
+ PixelType mask = (PixelType)((3 << _format.rShift) | (3 << _format.gShift) | (3 << _format.bShift));
+
+ if (!g_system->hasFeature(OSystem::kFeatureOverlaySupportsAlpha)) {
+ // !kFeatureOverlaySupportsAlpha (but might have alpha bits)
+
+ while (ptr != end) {
+ if (IS_IN_CLIP(x, y)) *ptr = ((*ptr & ~mask) >> 2) | _alphaMask;
+ ++ptr;
+ ++x;
+ }
+ } else {
+ // kFeatureOverlaySupportsAlpha
+ // assuming at least 3 alpha bits
+
+ mask |= 3 << _format.aShift;
+ PixelType addA = (PixelType)(3 << (_format.aShift + 6 - _format.aLoss));
+
+ while (ptr != end) {
+ // Darken the color, and increase the alpha
+ // (0% -> 75%, 100% -> 100%)
+ if (IS_IN_CLIP(x, y)) *ptr = (PixelType)(((*ptr & ~mask) >> 2) + addA);
+ ++ptr;
+ ++x;
+ }
+ }
+}
+
/********************************************************************
********************************************************************
* Primitive shapes drawing - Public API calls - VectorRendererSpec *
@@ -818,6 +1209,77 @@ drawLine(int x1, int y1, int x2, int y2) {
}
}
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
+drawLineClip(int x1, int y1, int x2, int y2, Common::Rect clipping) {
+ x1 = CLIP(x1, 0, (int)Base::_activeSurface->w);
+ x2 = CLIP(x2, 0, (int)Base::_activeSurface->w);
+ y1 = CLIP(y1, 0, (int)Base::_activeSurface->h);
+ y2 = CLIP(y2, 0, (int)Base::_activeSurface->h);
+
+ // we draw from top to bottom
+ if (y2 < y1) {
+ SWAP(x1, x2);
+ SWAP(y1, y2);
+ }
+
+ uint dx = ABS(x2 - x1);
+ uint dy = ABS(y2 - y1);
+
+ // this is a point, not a line. stoopid.
+ if (dy == 0 && dx == 0)
+ return;
+
+ if (Base::_strokeWidth == 0)
+ return;
+
+ PixelType *ptr = (PixelType *)_activeSurface->getBasePtr(x1, y1);
+ int pitch = _activeSurface->pitch / _activeSurface->format.bytesPerPixel;
+ int st = Base::_strokeWidth >> 1;
+
+ Common::Rect backup = _clippingArea;
+ _clippingArea = clipping;
+ bool needsClipping = !_clippingArea.isEmpty() && (!_clippingArea.contains(x1, y1) || !_clippingArea.contains(x2, y2));
+ if (!needsClipping) {
+ drawLine(x1, y1, x2, y2);
+ _clippingArea = backup;
+ return;
+ }
+
+ int ptr_x = x1, ptr_y = y1;
+
+ if (dy == 0) { // horizontal lines
+ colorFillClip<PixelType>(ptr, ptr + dx + 1, (PixelType)_fgColor, x1, y1, _clippingArea);
+
+ for (int i = 0, p = pitch; i < st; ++i, p += pitch) {
+ colorFillClip<PixelType>(ptr + p, ptr + dx + 1 + p, (PixelType)_fgColor, x1, y1 + p/pitch, _clippingArea);
+ colorFillClip<PixelType>(ptr - p, ptr + dx + 1 - p, (PixelType)_fgColor, x1, y1 - p/pitch, _clippingArea);
+ }
+
+ } else if (dx == 0) { // vertical lines
+ // these ones use a static pitch increase.
+ while (y1++ <= y2) {
+ colorFillClip<PixelType>(ptr - st, ptr + st, (PixelType)_fgColor, x1 - st, ptr_y, _clippingArea);
+ ptr += pitch;
+ ++ptr_y;
+ }
+
+ } else if (dx == dy) { // diagonal lines
+ // these ones also use a fixed pitch increase
+ pitch += (x2 > x1) ? 1 : -1;
+
+ while (dy--) {
+ colorFillClip<PixelType>(ptr - st, ptr + st, (PixelType)_fgColor, ptr_x - st, ptr_y, _clippingArea);
+ ptr += pitch;
+ ++ptr_y;
+ if (x2 > x1) ++ptr_x; else --ptr_x;
+ }
+
+ } else { // generic lines, use the standard algorithm...
+ drawLineAlgClip(x1, y1, x2, y2, dx, dy, (PixelType)_fgColor);
+ }
+}
+
/** CIRCLES **/
template<typename PixelType>
void VectorRendererSpec<PixelType>::
@@ -857,6 +1319,70 @@ drawCircle(int x, int y, int r) {
}
}
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
+drawCircleClip(int x, int y, int r, Common::Rect clipping) {
+ if (x + r > Base::_activeSurface->w || y + r > Base::_activeSurface->h ||
+ x - r < 0 || y - r < 0 || x == 0 || y == 0 || r <= 0)
+ return;
+
+ Common::Rect backup = _clippingArea;
+ _clippingArea = clipping;
+ bool useClippingVersions = !(_clippingArea.isEmpty() || _clippingArea.contains(Common::Rect(x - r, y - r, x + r, y + r)));
+
+ if (Base::_fillMode != kFillDisabled && Base::_shadowOffset
+ && x + r + Base::_shadowOffset < Base::_activeSurface->w
+ && y + r + Base::_shadowOffset < Base::_activeSurface->h) {
+ if (useClippingVersions)
+ drawCircleAlgClip(x + Base::_shadowOffset + 1, y + Base::_shadowOffset + 1, r, 0, kFillForeground);
+ else
+ drawCircleAlg(x + Base::_shadowOffset + 1, y + Base::_shadowOffset + 1, r, 0, kFillForeground);
+ }
+
+ switch (Base::_fillMode) {
+ case kFillDisabled:
+ if (Base::_strokeWidth) {
+ if (useClippingVersions)
+ drawCircleAlgClip(x, y, r, _fgColor, kFillDisabled);
+ else
+ drawCircleAlg(x, y, r, _fgColor, kFillDisabled);
+ }
+ break;
+
+ case kFillForeground:
+ if (useClippingVersions)
+ drawCircleAlgClip(x, y, r, _fgColor, kFillForeground);
+ else
+ drawCircleAlg(x, y, r, _fgColor, kFillForeground);
+ break;
+
+ case kFillBackground:
+ if (Base::_strokeWidth > 1) {
+ if (useClippingVersions) {
+ drawCircleAlgClip(x, y, r, _fgColor, kFillForeground);
+ drawCircleAlgClip(x, y, r - Base::_strokeWidth, _bgColor, kFillBackground);
+ } else {
+ drawCircleAlg(x, y, r, _fgColor, kFillForeground);
+ drawCircleAlg(x, y, r - Base::_strokeWidth, _bgColor, kFillBackground);
+ }
+ } else {
+ if (useClippingVersions) {
+ drawCircleAlgClip(x, y, r, _bgColor, kFillBackground);
+ drawCircleAlgClip(x, y, r, _fgColor, kFillDisabled);
+ } else {
+ drawCircleAlg(x, y, r, _bgColor, kFillBackground);
+ drawCircleAlg(x, y, r, _fgColor, kFillDisabled);
+ }
+ }
+ break;
+
+ case kFillGradient:
+ break;
+ }
+
+ _clippingArea = backup;
+}
+
/** SQUARES **/
template<typename PixelType>
void VectorRendererSpec<PixelType>::
@@ -894,6 +1420,67 @@ drawSquare(int x, int y, int w, int h) {
}
}
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
+drawSquareClip(int x, int y, int w, int h, Common::Rect clipping) {
+ if (x + w > Base::_activeSurface->w || y + h > Base::_activeSurface->h ||
+ w <= 0 || h <= 0 || x < 0 || y < 0)
+ return;
+
+ Common::Rect backup = _clippingArea;
+ _clippingArea = clipping;
+ bool useClippingVersions = !(_clippingArea.isEmpty() || _clippingArea.contains(Common::Rect(x, y, x + w, y + h)));
+
+ if (Base::_fillMode != kFillDisabled && Base::_shadowOffset
+ && x + w + Base::_shadowOffset < Base::_activeSurface->w
+ && y + h + Base::_shadowOffset < Base::_activeSurface->h) {
+ if (useClippingVersions)
+ drawSquareShadowClip(x, y, w, h, Base::_shadowOffset);
+ else
+ drawSquareShadow(x, y, w, h, Base::_shadowOffset);
+ }
+
+ switch (Base::_fillMode) {
+ case kFillDisabled:
+ if (Base::_strokeWidth) {
+ if (useClippingVersions)
+ drawSquareAlgClip(x, y, w, h, _fgColor, kFillDisabled);
+ else
+ drawSquareAlg(x, y, w, h, _fgColor, kFillDisabled);
+ }
+ break;
+
+ case kFillForeground:
+ if (useClippingVersions)
+ drawSquareAlgClip(x, y, w, h, _fgColor, kFillForeground);
+ else
+ drawSquareAlg(x, y, w, h, _fgColor, kFillForeground);
+ break;
+
+ case kFillBackground:
+ if (useClippingVersions) {
+ drawSquareAlgClip(x, y, w, h, _bgColor, kFillBackground);
+ drawSquareAlgClip(x, y, w, h, _fgColor, kFillDisabled);
+ } else {
+ drawSquareAlg(x, y, w, h, _bgColor, kFillBackground);
+ drawSquareAlg(x, y, w, h, _fgColor, kFillDisabled);
+ }
+ break;
+
+ case kFillGradient:
+ VectorRendererSpec::drawSquareAlg(x, y, w, h, 0, kFillGradient);
+ if (Base::_strokeWidth) {
+ if (useClippingVersions)
+ drawSquareAlgClip(x, y, w, h, _fgColor, kFillDisabled);
+ else
+ drawSquareAlg(x, y, w, h, _fgColor, kFillDisabled);
+ }
+ break;
+ }
+
+ _clippingArea = backup;
+}
+
/** ROUNDED SQUARES **/
template<typename PixelType>
void VectorRendererSpec<PixelType>::
@@ -920,6 +1507,43 @@ drawRoundedSquare(int x, int y, int r, int w, int h) {
template<typename PixelType>
void VectorRendererSpec<PixelType>::
+drawRoundedSquareClip(int x, int y, int r, int w, int h, Common::Rect clipping) {
+ if (x + w > Base::_activeSurface->w || y + h > Base::_activeSurface->h ||
+ w <= 0 || h <= 0 || x < 0 || y < 0 || r <= 0)
+ return;
+
+ if ((r * 2) > w || (r * 2) > h)
+ r = MIN(w / 2, h / 2);
+
+ if (r <= 0)
+ return;
+
+ Common::Rect backup = _clippingArea;
+ _clippingArea = clipping;
+ bool useOriginal = (_clippingArea.isEmpty() || _clippingArea.contains(Common::Rect(x, y, x + w, y + h)));
+
+ if (Base::_fillMode != kFillDisabled && Base::_shadowOffset
+ && x + w + Base::_shadowOffset + 1 < Base::_activeSurface->w
+ && y + h + Base::_shadowOffset + 1 < Base::_activeSurface->h
+ && h > (Base::_shadowOffset + 1) * 2) {
+ if (useOriginal) {
+ drawRoundedSquareShadow(x, y, r, w, h, Base::_shadowOffset);
+ } else {
+ drawRoundedSquareShadowClip(x, y, r, w, h, Base::_shadowOffset);
+ }
+ }
+
+ if (useOriginal) {
+ drawRoundedSquareAlg(x, y, r, w, h, _fgColor, Base::_fillMode);
+ } else {
+ drawRoundedSquareAlgClip(x, y, r, w, h, _fgColor, Base::_fillMode);
+ }
+
+ _clippingArea = backup;
+}
+
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
drawTab(int x, int y, int r, int w, int h) {
if (x + w > Base::_activeSurface->w || y + h > Base::_activeSurface->h ||
w <= 0 || h <= 0 || x < 0 || y < 0 || r > w || r > h)
@@ -956,6 +1580,66 @@ drawTab(int x, int y, int r, int w, int h) {
template<typename PixelType>
void VectorRendererSpec<PixelType>::
+drawTabClip(int x, int y, int r, int w, int h, Common::Rect clipping) {
+ if (x + w > Base::_activeSurface->w || y + h > Base::_activeSurface->h ||
+ w <= 0 || h <= 0 || x < 0 || y < 0 || r > w || r > h)
+ return;
+
+ Common::Rect backup = _clippingArea;
+ _clippingArea = clipping;
+ bool useClippingVersions = !(_clippingArea.isEmpty() || _clippingArea.contains(Common::Rect(x, y, x + w, y + h)));
+
+ if (r == 0 && Base::_bevel > 0) {
+ if (useClippingVersions)
+ drawBevelTabAlgClip(x, y, w, h, Base::_bevel, _bevelColor, _fgColor, (Base::_dynamicData >> 16), (Base::_dynamicData & 0xFFFF));
+ else
+ drawBevelTabAlg(x, y, w, h, Base::_bevel, _bevelColor, _fgColor, (Base::_dynamicData >> 16), (Base::_dynamicData & 0xFFFF));
+ _clippingArea = backup;
+ return;
+ }
+
+ if (r == 0) {
+ _clippingArea = backup;
+ return;
+ }
+
+ switch (Base::_fillMode) {
+ case kFillDisabled:
+ // FIXME: Implement this
+ _clippingArea = backup;
+ return;
+
+ case kFillGradient:
+ case kFillBackground:
+ // FIXME: This is broken for the AA renderer.
+ // See the rounded rect alg for how to fix it. (The border should
+ // be drawn before the interior, both inside drawTabAlg.)
+ if (useClippingVersions) {
+ drawTabShadowClip(x, y, w - 2, h, r);
+ drawTabAlgClip(x, y, w - 2, h, r, _bgColor, Base::_fillMode);
+ if (Base::_strokeWidth)
+ drawTabAlgClip(x, y, w, h, r, _fgColor, kFillDisabled, (Base::_dynamicData >> 16), (Base::_dynamicData & 0xFFFF));
+ } else {
+ drawTabShadow(x, y, w - 2, h, r);
+ drawTabAlg(x, y, w - 2, h, r, _bgColor, Base::_fillMode);
+ if (Base::_strokeWidth)
+ drawTabAlg(x, y, w, h, r, _fgColor, kFillDisabled, (Base::_dynamicData >> 16), (Base::_dynamicData & 0xFFFF));
+ }
+ break;
+
+ case kFillForeground:
+ if (useClippingVersions)
+ drawTabAlgClip(x, y, w, h, r, _fgColor, Base::_fillMode);
+ else
+ drawTabAlg(x, y, w, h, r, _fgColor, Base::_fillMode);
+ break;
+ }
+
+ _clippingArea = backup;
+}
+
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
drawTriangle(int x, int y, int w, int h, TriangleOrientation orient) {
if (x + w > Base::_activeSurface->w || y + h > Base::_activeSurface->h)
@@ -1022,8 +1706,88 @@ drawTriangle(int x, int y, int w, int h, TriangleOrientation orient) {
}
}
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
+drawTriangleClip(int x, int y, int w, int h, TriangleOrientation orient, Common::Rect clipping) {
+ if (x + w > Base::_activeSurface->w || y + h > Base::_activeSurface->h)
+ return;
+ PixelType color = 0;
+ if (Base::_strokeWidth <= 1) {
+ if (Base::_fillMode == kFillForeground)
+ color = _fgColor;
+ else if (Base::_fillMode == kFillBackground)
+ color = _bgColor;
+ } else {
+ if (Base::_fillMode == kFillDisabled)
+ return;
+ color = _fgColor;
+ }
+
+ if (Base::_dynamicData != 0)
+ orient = (TriangleOrientation)Base::_dynamicData;
+
+ Common::Rect backup = _clippingArea;
+ _clippingArea = clipping;
+ bool useClippingVersions = !(_clippingArea.isEmpty() || _clippingArea.contains(Common::Rect(x, y, x + w, y + h)));
+
+ if (w == h) {
+ int newW = w;
+
+ switch (orient) {
+ case kTriangleUp:
+ case kTriangleDown:
+ if (useClippingVersions)
+ drawTriangleVertAlgClip(x, y, newW, newW, (orient == kTriangleDown), color, Base::_fillMode);
+ else
+ drawTriangleVertAlg(x, y, newW, newW, (orient == kTriangleDown), color, Base::_fillMode);
+ break;
+
+ case kTriangleLeft:
+ case kTriangleRight:
+ case kTriangleAuto:
+ break;
+ }
+
+ if (Base::_strokeWidth > 0)
+ if (Base::_fillMode == kFillBackground || Base::_fillMode == kFillGradient) {
+ if (useClippingVersions)
+ drawTriangleVertAlgClip(x, y, newW, newW, (orient == kTriangleDown), color, Base::_fillMode);
+ else
+ drawTriangleVertAlg(x, y, newW, newW, (orient == kTriangleDown), color, Base::_fillMode);
+ }
+ } else {
+ int newW = w;
+ int newH = h;
+
+ switch (orient) {
+ case kTriangleUp:
+ case kTriangleDown:
+ if (useClippingVersions)
+ drawTriangleVertAlgClip(x, y, newW, newH, (orient == kTriangleDown), color, Base::_fillMode);
+ else
+ drawTriangleVertAlg(x, y, newW, newH, (orient == kTriangleDown), color, Base::_fillMode);
+ break;
+
+ case kTriangleLeft:
+ case kTriangleRight:
+ case kTriangleAuto:
+ break;
+ }
+
+ if (Base::_strokeWidth > 0) {
+ if (Base::_fillMode == kFillBackground || Base::_fillMode == kFillGradient) {
+ if (useClippingVersions)
+ drawTriangleVertAlgClip(x, y, newW, newH, (orient == kTriangleDown), _fgColor, kFillDisabled);
+ else
+ drawTriangleVertAlg(x, y, newW, newH, (orient == kTriangleDown), _fgColor, kFillDisabled);
+ }
+ }
+ }
+
+ _clippingArea = backup;
+}
/********************************************************************
@@ -1134,6 +1898,120 @@ drawTabAlg(int x1, int y1, int w, int h, int r, PixelType color, VectorRenderer:
}
}
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
+drawTabAlgClip(int x1, int y1, int w, int h, int r, PixelType color, VectorRenderer::FillMode fill_m, int baseLeft, int baseRight) {
+ // Don't draw anything for empty rects.
+ if (w <= 0 || h <= 0) {
+ return;
+ }
+
+ int f, ddF_x, ddF_y;
+ int x, y, px, py;
+ int pitch = _activeSurface->pitch / _activeSurface->format.bytesPerPixel;
+ int sw = 0, sp = 0, hp = 0;
+
+ PixelType *ptr_tl = (PixelType *)Base::_activeSurface->getBasePtr(x1 + r, y1 + r);
+ PixelType *ptr_tr = (PixelType *)Base::_activeSurface->getBasePtr(x1 + w - r, y1 + r);
+ PixelType *ptr_fill = (PixelType *)Base::_activeSurface->getBasePtr(x1, y1);
+ int tl_x = x1 + r, tl_y = y1 + r;
+ int tr_x = x1 + w - r, tr_y = y1 + r;
+ int fill_x = x1, fill_y = y1;
+
+ int real_radius = r;
+ int short_h = h - r + 2;
+ int long_h = h;
+
+ if (fill_m == kFillDisabled) {
+ while (sw++ < Base::_strokeWidth) {
+ colorFillClip<PixelType>(ptr_fill + sp + r, ptr_fill + w + 1 + sp - r, color, fill_x + r, fill_y + sp/pitch, _clippingArea);
+ colorFillClip<PixelType>(ptr_fill + hp - sp + r, ptr_fill + w + hp + 1 - sp - r, color, fill_x + r, fill_y + hp / pitch - sp / pitch, _clippingArea);
+ sp += pitch;
+
+ BE_RESET();
+ r--;
+
+ while (x++ < y) {
+ BE_ALGORITHM();
+ BE_DRAWCIRCLE_TOP_CLIP(ptr_tr, ptr_tl, x, y, px, py, tr_x, tr_y, tl_x, tl_y);
+
+ if (Base::_strokeWidth > 1)
+ BE_DRAWCIRCLE_TOP_CLIP(ptr_tr, ptr_tl, x, y, px - pitch, py, tr_x, tr_y, tl_x, tl_y);
+ }
+ }
+
+ ptr_fill += pitch * real_radius;
+ fill_y += real_radius;
+ while (short_h--) {
+ colorFillClip<PixelType>(ptr_fill, ptr_fill + Base::_strokeWidth, color, fill_x, fill_y, _clippingArea);
+ colorFillClip<PixelType>(ptr_fill + w - Base::_strokeWidth + 1, ptr_fill + w + 1, color, fill_x + w - Base::_strokeWidth + 1, fill_y, _clippingArea);
+ ptr_fill += pitch;
+ ++fill_y;
+ }
+
+ if (baseLeft) {
+ sw = 0;
+ ptr_fill = (PixelType *)Base::_activeSurface->getBasePtr(x1, y1 + h + 1);
+ fill_x = x1;
+ fill_y = y1 + h + 1;
+ while (sw++ < Base::_strokeWidth) {
+ colorFillClip<PixelType>(ptr_fill - baseLeft, ptr_fill, color, fill_x - baseLeft, fill_y, _clippingArea);
+ ptr_fill += pitch;
+ ++fill_y;
+ }
+ }
+
+ if (baseRight) {
+ sw = 0;
+ ptr_fill = (PixelType *)Base::_activeSurface->getBasePtr(x1 + w, y1 + h + 1);
+ fill_x = x1 + w;
+ fill_y = y1 + h + 1;
+ while (sw++ < Base::_strokeWidth) {
+ colorFillClip<PixelType>(ptr_fill, ptr_fill + baseRight, color, fill_x, fill_y, _clippingArea);
+ ptr_fill += pitch;
+ ++fill_y;
+ }
+ }
+ } else {
+ BE_RESET();
+
+ precalcGradient(long_h);
+
+ PixelType color1, color2;
+ color1 = color2 = color;
+
+ while (x++ < y) {
+ BE_ALGORITHM();
+
+ if (fill_m == kFillGradient) {
+ color1 = calcGradient(real_radius - x, long_h);
+ color2 = calcGradient(real_radius - y, long_h);
+
+ gradientFillClip(ptr_tl - x - py, w - 2 * r + 2 * x, x1 + r - x - y, real_radius - y, tl_x - x, tl_y - y);
+ gradientFillClip(ptr_tl - y - px, w - 2 * r + 2 * y, x1 + r - y - x, real_radius - x, tl_x - y, tl_y - x);
+
+ BE_DRAWCIRCLE_XCOLOR_TOP_CLIP(ptr_tr, ptr_tl, x, y, px, py, tr_x, tr_y, tl_x, tl_y);
+ } else {
+ colorFillClip<PixelType>(ptr_tl - x - py, ptr_tr + x - py, color, tl_x - x, tl_y - y, _clippingArea);
+ colorFillClip<PixelType>(ptr_tl - y - px, ptr_tr + y - px, color, tl_x - y, tl_y - x, _clippingArea);
+
+ BE_DRAWCIRCLE_TOP_CLIP(ptr_tr, ptr_tl, x, y, px, py, tr_x, tr_y, tl_x, tl_y);
+ }
+ }
+
+ ptr_fill += pitch * r;
+ fill_y += r;
+ while (short_h--) {
+ if (fill_m == kFillGradient) {
+ gradientFillClip(ptr_fill, w + 1, x1, real_radius++, fill_x, fill_y);
+ } else {
+ colorFillClip<PixelType>(ptr_fill, ptr_fill + w + 1, color, fill_x, fill_y, _clippingArea);
+ }
+ ptr_fill += pitch;
+ ++fill_y;
+ }
+ }
+}
template<typename PixelType>
void VectorRendererSpec<PixelType>::
@@ -1196,6 +2074,72 @@ drawTabShadow(int x1, int y1, int w, int h, int r) {
}
}
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
+drawTabShadowClip(int x1, int y1, int w, int h, int r) {
+ int offset = 3;
+ int pitch = _activeSurface->pitch / _activeSurface->format.bytesPerPixel;
+
+ // "Harder" shadows when having lower BPP, since we will have artifacts (greenish tint on the modern theme)
+ uint8 expFactor = 3;
+ uint16 alpha = (_activeSurface->format.bytesPerPixel > 2) ? 4 : 8;
+
+ int xstart = x1;
+ int ystart = y1;
+ int width = w;
+ int height = h + offset + 1;
+
+ for (int i = offset; i >= 0; i--) {
+ int f, ddF_x, ddF_y;
+ int x, y, px, py;
+
+ PixelType *ptr_tl = (PixelType *)Base::_activeSurface->getBasePtr(xstart + r, ystart + r);
+ PixelType *ptr_tr = (PixelType *)Base::_activeSurface->getBasePtr(xstart + width - r, ystart + r);
+ PixelType *ptr_fill = (PixelType *)Base::_activeSurface->getBasePtr(xstart, ystart);
+
+ int tl_x = xstart + r, tl_y = ystart + r;
+ int fill_x = xstart, fill_y = ystart;
+
+ int short_h = height - (2 * r) + 2;
+ PixelType color = _format.RGBToColor(0, 0, 0);
+
+ BE_RESET();
+
+ // HACK: As we are drawing circles exploting 8-axis symmetry,
+ // there are 4 pixels on each circle which are drawn twice.
+ // this is ok on filled circles, but when blending on surfaces,
+ // we cannot let it blend twice. awful.
+ uint32 hb = 0;
+
+ while (x++ < y) {
+ BE_ALGORITHM();
+
+ if (((1 << x) & hb) == 0) {
+ blendFillClip(ptr_tl - y - px, ptr_tr + y - px, color, (uint8)alpha, tl_x - y, tl_y - x);
+ hb |= (1 << x);
+ }
+
+ if (((1 << y) & hb) == 0) {
+ blendFillClip(ptr_tl - x - py, ptr_tr + x - py, color, (uint8)alpha, tl_x - x, tl_y - y);
+ hb |= (1 << y);
+ }
+ }
+
+ ptr_fill += pitch * r;
+ fill_y += r;
+ while (short_h--) {
+ blendFillClip(ptr_fill, ptr_fill + width + 1, color, (uint8)alpha, fill_x, fill_y);
+ ptr_fill += pitch;
+ ++fill_y;
+ }
+
+ // Move shadow one pixel upward each iteration
+ xstart += 1;
+ // Multiply with expfactor
+ alpha = (alpha * (expFactor << 8)) >> 9;
+ }
+}
+
/** BEVELED TABS FOR CLASSIC THEME **/
template<typename PixelType>
void VectorRendererSpec<PixelType>::
@@ -1240,6 +2184,57 @@ drawBevelTabAlg(int x, int y, int w, int h, int bevel, PixelType top_color, Pixe
}
}
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
+drawBevelTabAlgClip(int x, int y, int w, int h, int bevel, PixelType top_color, PixelType bottom_color, int baseLeft, int baseRight) {
+ int pitch = _activeSurface->pitch / _activeSurface->format.bytesPerPixel;
+ int i, j;
+
+ PixelType *ptr_left = (PixelType *)_activeSurface->getBasePtr(x, y);
+ int ptr_x = x, ptr_y = y;
+
+ i = bevel;
+ while (i--) {
+ colorFillClip<PixelType>(ptr_left, ptr_left + w, top_color, ptr_x, ptr_y, _clippingArea);
+ ptr_left += pitch;
+ ++ptr_y;
+ }
+
+ if (baseLeft > 0) {
+ i = h - bevel;
+ ptr_left = (PixelType *)_activeSurface->getBasePtr(x, y);
+ ptr_x = x; ptr_y = y;
+ while (i--) {
+ colorFillClip<PixelType>(ptr_left, ptr_left + bevel, top_color, ptr_x, ptr_y, _clippingArea);
+ ptr_left += pitch;
+ ++ptr_y;
+ }
+ }
+
+ i = h - bevel;
+ j = bevel - 1;
+ ptr_left = (PixelType *)_activeSurface->getBasePtr(x + w - bevel, y);
+ ptr_x = x + w - bevel; ptr_y = y;
+ while (i--) {
+ colorFillClip<PixelType>(ptr_left + j, ptr_left + bevel, bottom_color, ptr_x + j, ptr_y, _clippingArea);
+ if (j > 0) j--;
+ ptr_left += pitch;
+ ++ptr_y;
+ }
+
+ i = bevel;
+ ptr_left = (PixelType *)_activeSurface->getBasePtr(x + w - bevel, y + h - bevel);
+ ptr_x = x + w - bevel; ptr_y = y + h - bevel;
+ while (i--) {
+ colorFillClip<PixelType>(ptr_left, ptr_left + baseRight + bevel, bottom_color, ptr_x, ptr_y, _clippingArea);
+
+ if (baseLeft)
+ colorFillClip<PixelType>(ptr_left - w - baseLeft + bevel, ptr_left - w + bevel + bevel, top_color, ptr_x - w - baseLeft + bevel, ptr_y, _clippingArea);
+ ptr_left += pitch;
+ ++ptr_y;
+ }
+}
+
/** SQUARE ALGORITHM **/
template<typename PixelType>
void VectorRendererSpec<PixelType>::
@@ -1278,6 +2273,46 @@ drawSquareAlg(int x, int y, int w, int h, PixelType color, VectorRenderer::FillM
}
}
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
+drawSquareAlgClip(int x, int y, int w, int h, PixelType color, VectorRenderer::FillMode fill_m) {
+ // Do not draw anything for empty rects.
+ if (w <= 0 || h <= 0) {
+ return;
+ }
+
+ PixelType *ptr = (PixelType *)_activeSurface->getBasePtr(x, y);
+ int pitch = _activeSurface->pitch / _activeSurface->format.bytesPerPixel;
+ int max_h = h;
+ int ptr_y = y;
+
+ if (fill_m != kFillDisabled) {
+ while (h--) {
+ if (fill_m == kFillGradient)
+ color = calcGradient(max_h - h, max_h);
+
+ colorFillClip<PixelType>(ptr, ptr + w, color, x, ptr_y, _clippingArea);
+ ptr += pitch;
+ ++ptr_y;
+ }
+ } else {
+ int sw = Base::_strokeWidth, sp = 0, hp = pitch * (h - 1);
+
+ while (sw--) {
+ colorFillClip<PixelType>(ptr + sp, ptr + w + sp, color, x, ptr_y + sp/pitch, _clippingArea);
+ colorFillClip<PixelType>(ptr + hp - sp, ptr + w + hp - sp, color, x, ptr_y + h - sp/pitch, _clippingArea);
+ sp += pitch;
+ }
+
+ while (h--) {
+ colorFillClip<PixelType>(ptr, ptr + Base::_strokeWidth, color, x, ptr_y, _clippingArea);
+ colorFillClip<PixelType>(ptr + w - Base::_strokeWidth, ptr + w, color, x + w - Base::_strokeWidth, ptr_y, _clippingArea);
+ ptr += pitch;
+ ptr_y += 1;
+ }
+ }
+}
+
/** SQUARE ALGORITHM **/
template<typename PixelType>
void VectorRendererSpec<PixelType>::
@@ -1334,6 +2369,72 @@ drawBevelSquareAlg(int x, int y, int w, int h, int bevel, PixelType top_color, P
}
}
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
+drawBevelSquareAlgClip(int x, int y, int w, int h, int bevel, PixelType top_color, PixelType bottom_color, bool fill) {
+ int pitch = _activeSurface->pitch / _activeSurface->format.bytesPerPixel;
+ int i, j;
+ PixelType *ptr_left;
+ int ptr_x, ptr_y;
+
+ // Fill Background
+ ptr_left = (PixelType *)_activeSurface->getBasePtr(x, y);
+ ptr_x = x; ptr_y = y;
+ i = h;
+ if (fill) {
+ assert((_bgColor & ~_alphaMask) == 0); // only support black
+ while (i--) {
+ darkenFillClip(ptr_left, ptr_left + w, ptr_x, ptr_y);
+ ptr_left += pitch;
+ ++ptr_y;
+ }
+ }
+
+ x = MAX(x - bevel, 0);
+ y = MAX(y - bevel, 0);
+
+ w = MIN(w + (bevel * 2), (int)_activeSurface->w);
+ h = MIN(h + (bevel * 2), (int)_activeSurface->h);
+
+ ptr_left = (PixelType *)_activeSurface->getBasePtr(x, y);
+ ptr_x = x; ptr_y = y;
+ i = bevel;
+ while (i--) {
+ colorFillClip<PixelType>(ptr_left, ptr_left + w, top_color, ptr_x, ptr_y, _clippingArea);
+ ptr_left += pitch;
+ ++ptr_y;
+ }
+
+ ptr_left = (PixelType *)_activeSurface->getBasePtr(x, y + bevel);
+ ptr_x = x; ptr_y = y + bevel;
+ i = h - bevel;
+ while (i--) {
+ colorFillClip<PixelType>(ptr_left, ptr_left + bevel, top_color, ptr_x, ptr_y, _clippingArea);
+ ptr_left += pitch;
+ ++ptr_y;
+ }
+
+ ptr_left = (PixelType *)_activeSurface->getBasePtr(x, y + h - bevel);
+ ptr_x = x; ptr_y = y + h - bevel;
+ i = bevel;
+ while (i--) {
+ colorFillClip<PixelType>(ptr_left + i, ptr_left + w, bottom_color, ptr_x + i, ptr_y, _clippingArea);
+ ptr_left += pitch;
+ ++ptr_y;
+ }
+
+ ptr_left = (PixelType *)_activeSurface->getBasePtr(x + w - bevel, y);
+ ptr_x = x + w - bevel; ptr_y = y;
+ i = h - bevel;
+ j = bevel - 1;
+ while (i--) {
+ colorFillClip<PixelType>(ptr_left + j, ptr_left + bevel, bottom_color, ptr_x + j, ptr_y, _clippingArea);
+ if (j > 0) j--;
+ ptr_left += pitch;
+ ++ptr_y;
+ }
+}
+
/** GENERIC LINE ALGORITHM **/
template<typename PixelType>
void VectorRendererSpec<PixelType>::
@@ -1382,6 +2483,59 @@ drawLineAlg(int x1, int y1, int x2, int y2, uint dx, uint dy, PixelType color) {
*ptr = (PixelType)color;
}
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
+drawLineAlgClip(int x1, int y1, int x2, int y2, uint dx, uint dy, PixelType color) {
+ PixelType *ptr = (PixelType *)_activeSurface->getBasePtr(x1, y1);
+ int pitch = _activeSurface->pitch / _activeSurface->format.bytesPerPixel;
+ int xdir = (x2 > x1) ? 1 : -1;
+ int ptr_x = x1, ptr_y = y1;
+
+ if (IS_IN_CLIP(ptr_x, ptr_y)) *ptr = (PixelType)color;
+
+ if (dx > dy) {
+ int ddy = dy * 2;
+ int dysub = ddy - (dx * 2);
+ int error_term = ddy - dx;
+
+ while (dx--) {
+ if (error_term >= 0) {
+ ptr += pitch;
+ ++ptr_y;
+ error_term += dysub;
+ } else {
+ error_term += ddy;
+ }
+
+ ptr += xdir;
+ ptr_x += xdir;
+ if (IS_IN_CLIP(ptr_x, ptr_y)) *ptr = (PixelType)color;
+ }
+ } else {
+ int ddx = dx * 2;
+ int dxsub = ddx - (dy * 2);
+ int error_term = ddx - dy;
+
+ while (dy--) {
+ if (error_term >= 0) {
+ ptr += xdir;
+ ptr_x += xdir;
+ error_term += dxsub;
+ } else {
+ error_term += ddx;
+ }
+
+ ptr += pitch;
+ ++ptr_y;
+ if (IS_IN_CLIP(ptr_x, ptr_y)) *ptr = (PixelType)color;
+ }
+ }
+
+ ptr = (PixelType *)_activeSurface->getBasePtr(x2, y2);
+ ptr_x = x2; ptr_y = y2;
+ if (IS_IN_CLIP(ptr_x, ptr_y)) *ptr = (PixelType)color;
+}
+
/** VERTICAL TRIANGLE DRAWING ALGORITHM **/
/**
FIXED POINT ARITHMETIC
@@ -1580,6 +2734,212 @@ drawTriangleVertAlg(int x1, int y1, int w, int h, bool inverted, PixelType color
}
+/////////////
+
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
+drawTriangleVertAlgClip(int x1, int y1, int w, int h, bool inverted, PixelType color, VectorRenderer::FillMode fill_m) {
+ // Don't draw anything for empty rects. This assures dy is always different
+ // from zero.
+ if (w <= 0 || h <= 0) {
+ return;
+ }
+
+ int pitch = _activeSurface->pitch / _activeSurface->format.bytesPerPixel;
+ int gradient_h = 0;
+ int y_pitch_sign = 1;
+ if (!inverted) {
+ pitch = -pitch;
+ y1 += h;
+ y_pitch_sign = -1;
+ }
+
+ PixelType *ptr_right = (PixelType *)_activeSurface->getBasePtr(x1, y1);
+ PixelType *floor = ptr_right - 1;
+ PixelType *ptr_left = (PixelType *)_activeSurface->getBasePtr(x1 + w, y1);
+
+ int x2 = x1 + w / 2;
+ int y2 = y1 + h;
+ int x_right = x1;
+ int y_right = y1;
+ int x_left = x1 + w;
+ int y_left = y1;
+ int x_floor = x_right - 1;
+ int y_floor = y_right;
+
+#if FIXED_POINT
+ int dx = (x2 - x1) << 8;
+ int dy = (y2 - y1) << 8;
+
+ if (abs(dx) > abs(dy)) {
+#else
+ double dx = (double)x2 - (double)x1;
+ double dy = (double)y2 - (double)y1;
+
+ if (fabs(dx) > fabs(dy)) {
+#endif
+ while (floor++ != ptr_left)
+ blendPixelPtrClip(floor, color, 50, ++x_floor, y_floor);
+
+#if FIXED_POINT
+ // In this branch dx is always different from zero. This is because
+ // abs(dx) is strictly greater than abs(dy), and abs returns zero
+ // as minimal value.
+ int gradient = (dy << 8) / dx;
+ int intery = (y1 << 8) + gradient;
+#else
+ double gradient = dy / dx;
+ double intery = y1 + gradient;
+#endif
+
+ for (int x = x1 + 1; x < x2; x++) {
+#if FIXED_POINT
+ if (intery + gradient > ipart(intery) + 0x100) {
+#else
+ if (intery + gradient > ipart(intery) + 1) {
+#endif
+ ptr_right++;
+ ptr_left--;
+ ++x_right;
+ --x_left;
+ }
+
+ ptr_left += pitch;
+ ptr_right += pitch;
+ y_right += y_pitch_sign;
+ y_left += y_pitch_sign;
+
+ intery += gradient;
+
+ switch (fill_m) {
+ case kFillDisabled:
+ if (IS_IN_CLIP(x_left, y_left)) *ptr_left = color;
+ if (IS_IN_CLIP(x_right, y_right)) *ptr_right = color;
+ break;
+ case kFillForeground:
+ case kFillBackground:
+ colorFillClip<PixelType>(ptr_right + 1, ptr_left, color, x_right+1, y_right, _clippingArea);
+ blendPixelPtrClip(ptr_right, color, rfpart(intery), x_right, y_right);
+ blendPixelPtrClip(ptr_left, color, rfpart(intery), x_left, y_left);
+ break;
+ case kFillGradient:
+ colorFillClip<PixelType>(ptr_right, ptr_left, calcGradient(gradient_h++, h), x_right, y_right, _clippingArea);
+ blendPixelPtrClip(ptr_right, color, rfpart(intery), x_right, y_right);
+ blendPixelPtrClip(ptr_left, color, rfpart(intery), x_left, y_left);
+ break;
+ }
+ }
+
+ return;
+ }
+
+#if FIXED_POINT
+ if (abs(dx) < abs(dy)) {
+#else
+ if (fabs(dx) < fabs(dy)) {
+#endif
+ ptr_left--;
+ --x_left;
+ while (floor++ != ptr_left)
+ blendPixelPtrClip(floor, color, 50, ++x_floor, y_floor);
+
+#if FIXED_POINT
+ int gradient = (dx << 8) / (dy + 0x100);
+ int interx = (x1 << 8) + gradient;
+#else
+ double gradient = dx / (dy + 1);
+ double interx = x1 + gradient;
+#endif
+
+ for (int y = y1 + 1; y < y2; y++) {
+#if FIXED_POINT
+ if (interx + gradient > ipart(interx) + 0x100) {
+#else
+ if (interx + gradient > ipart(interx) + 1) {
+#endif
+ ptr_right++;
+ ptr_left--;
+ ++x_right;
+ --x_left;
+ }
+
+ ptr_left += pitch;
+ ptr_right += pitch;
+ y_right += y_pitch_sign;
+ y_left += y_pitch_sign;
+
+ interx += gradient;
+
+ switch (fill_m) {
+ case kFillDisabled:
+ if (IS_IN_CLIP(x_left, y_left)) *ptr_left = color;
+ if (IS_IN_CLIP(x_right, y_right)) *ptr_right = color;
+ break;
+ case kFillForeground:
+ case kFillBackground:
+ colorFillClip<PixelType>(ptr_right + 1, ptr_left, color, x_right+1, y_right, _clippingArea);
+ blendPixelPtrClip(ptr_right, color, rfpart(interx), x_right, y_right);
+ blendPixelPtrClip(ptr_left, color, rfpart(interx), x_left, y_left);
+ break;
+ case kFillGradient:
+ colorFillClip<PixelType>(ptr_right, ptr_left, calcGradient(gradient_h++, h), x_right, y_right, _clippingArea);
+ blendPixelPtrClip(ptr_right, color, rfpart(interx), x_right, y_right);
+ blendPixelPtrClip(ptr_left, color, rfpart(interx), x_left, y_left);
+ break;
+ }
+ }
+
+ return;
+ }
+
+ ptr_left--;
+ --x_left;
+ while (floor++ != ptr_left)
+ blendPixelPtrClip(floor, color, 50, ++x_floor, y_floor);
+
+#if FIXED_POINT
+ int gradient = (dx / dy) << 8;
+ int interx = (x1 << 8) + gradient;
+#else
+ double gradient = dx / dy;
+ double interx = x1 + gradient;
+#endif
+
+ for (int y = y1 + 1; y < y2; y++) {
+ ptr_right++;
+ ptr_left--;
+ ++x_right;
+ --x_left;
+
+ ptr_left += pitch;
+ ptr_right += pitch;
+ y_right += y_pitch_sign;
+ y_left += y_pitch_sign;
+
+ interx += gradient;
+
+ switch (fill_m) {
+ case kFillDisabled:
+ if (IS_IN_CLIP(x_left, y_left)) *ptr_left = color;
+ if (IS_IN_CLIP(x_right, y_right)) *ptr_right = color;
+ break;
+ case kFillForeground:
+ case kFillBackground:
+ colorFillClip<PixelType>(ptr_right + 1, ptr_left, color, x_right+1, y_right, _clippingArea);
+ blendPixelPtrClip(ptr_right, color, rfpart(interx), x_right, y_right);
+ blendPixelPtrClip(ptr_left, color, rfpart(interx), x_left, y_left);
+ break;
+ case kFillGradient:
+ colorFillClip<PixelType>(ptr_right, ptr_left, calcGradient(gradient_h++, h), x_right, y_right, _clippingArea);
+ blendPixelPtrClip(ptr_right, color, rfpart(interx), x_right, y_right);
+ blendPixelPtrClip(ptr_left, color, rfpart(interx), x_left, y_left);
+ break;
+ }
+ }
+}
+
+/////////////
+
/** VERTICAL TRIANGLE DRAWING - FAST VERSION FOR SQUARED TRIANGLES */
template<typename PixelType>
void VectorRendererSpec<PixelType>::
@@ -1682,6 +3042,9 @@ drawBorderRoundedSquareAlg(int x1, int y1, int r, int w, int h, PixelType color,
while (x++ < (y - 2)) {
BE_ALGORITHM();
+ if (x < _clippingArea.left || x > _clippingArea.right) continue;
+ if (y < _clippingArea.top || y > _clippingArea.bottom) continue;
+
BE_DRAWCIRCLE_BCOLOR_TR_CW(ptr_tr, x, y, px, py, (uint8)(alpha_r + (alphaStep_tr * x)));
BE_DRAWCIRCLE_BCOLOR_BR_CW(ptr_br, x, y, px, py, (uint8)(alpha_b + (alphaStep_br * x)));
BE_DRAWCIRCLE_BCOLOR_BL_CW(ptr_bl, x, y, px, py, (uint8)(alpha_l + (alphaStep_bl * x)));
@@ -1709,6 +3072,74 @@ drawBorderRoundedSquareAlg(int x1, int y1, int r, int w, int h, PixelType color,
template<typename PixelType>
void VectorRendererSpec<PixelType>::
+drawBorderRoundedSquareAlgClip(int x1, int y1, int r, int w, int h, PixelType color, VectorRenderer::FillMode fill_m, uint8 alpha_t, uint8 alpha_r, uint8 alpha_b, uint8 alpha_l) {
+ int f, ddF_x, ddF_y;
+ int x, y, px, py;
+ int pitch = _activeSurface->pitch / _activeSurface->format.bytesPerPixel;
+ int sw = 0, sp = 0, hp = h * pitch;
+
+ PixelType *ptr_tl = (PixelType *)Base::_activeSurface->getBasePtr(x1 + r, y1 + r);
+ PixelType *ptr_tr = (PixelType *)Base::_activeSurface->getBasePtr(x1 + w - r, y1 + r);
+ PixelType *ptr_bl = (PixelType *)Base::_activeSurface->getBasePtr(x1 + r, y1 + h - r);
+ PixelType *ptr_br = (PixelType *)Base::_activeSurface->getBasePtr(x1 + w - r, y1 + h - r);
+ PixelType *ptr_fill = (PixelType *)Base::_activeSurface->getBasePtr(x1, y1);
+
+ int real_radius = r;
+ int short_h = h - (2 * r) + 2;
+
+ PixelType color1 = color;
+ PixelType color2 = color;
+
+ while (sw++ < Base::_strokeWidth) {
+ blendFillClip(ptr_fill + sp + r, ptr_fill + w + 1 + sp - r, color1, alpha_t,
+ x1 + r, y1 + sp/pitch); // top
+ blendFillClip(ptr_fill + hp - sp + r, ptr_fill + w + hp + 1 - sp - r, color2, alpha_b,
+ x1 + r, y1 + (hp - sp)/ pitch); // bottom
+ sp += pitch;
+
+ BE_RESET();
+ r--;
+
+ int alphaStep_tr = ((alpha_t - alpha_r) / (y + 1));
+ int alphaStep_br = ((alpha_r - alpha_b) / (y + 1));
+ int alphaStep_bl = ((alpha_b - alpha_l) / (y + 1));
+ int alphaStep_tl = ((alpha_l - alpha_t) / (y + 1));
+
+ // Avoid blending the last pixels twice, since we have an alpha
+ while (x++ < (y - 2)) {
+ BE_ALGORITHM();
+
+ BE_DRAWCIRCLE_BCOLOR_TR_CW_CLIP(ptr_tr, x, y, px, py, (uint8)(alpha_r + (alphaStep_tr * x)), x1 + w - r, y1 + r);
+ BE_DRAWCIRCLE_BCOLOR_BR_CW_CLIP(ptr_br, x, y, px, py, (uint8)(alpha_b + (alphaStep_br * x)), x1 + w - r, y1 + h - r);
+ BE_DRAWCIRCLE_BCOLOR_BL_CW_CLIP(ptr_bl, x, y, px, py, (uint8)(alpha_l + (alphaStep_bl * x)), x1 + r, y1 + h - r);
+ BE_DRAWCIRCLE_BCOLOR_TL_CW_CLIP(ptr_tl, x, y, px, py, (uint8)(alpha_t + (alphaStep_tl * x)), x1 + r, y1 + r);
+
+ BE_DRAWCIRCLE_BCOLOR_TR_CCW_CLIP(ptr_tr, x, y, px, py, (uint8)(alpha_t - (alphaStep_tr * x)), x1 + w - r, y1 + r);
+ BE_DRAWCIRCLE_BCOLOR_BR_CCW_CLIP(ptr_br, x, y, px, py, (uint8)(alpha_r - (alphaStep_br * x)), x1 + w - r, y1 + h - r);
+ BE_DRAWCIRCLE_BCOLOR_BL_CCW_CLIP(ptr_bl, x, y, px, py, (uint8)(alpha_b - (alphaStep_bl * x)), x1 + r, y1 + h - r);
+ BE_DRAWCIRCLE_BCOLOR_TL_CCW_CLIP(ptr_tl, x, y, px, py, (uint8)(alpha_l - (alphaStep_tl * x)), x1 + r, y1 + r);
+
+ if (Base::_strokeWidth > 1) {
+ BE_DRAWCIRCLE_BCOLOR_CLIP(ptr_tr, ptr_tl, ptr_bl, ptr_br, x - 1, y, px, py,
+ x1 + w - r, y1 + r, x1 + r, y1 + r, x1 + r, y1 + h - r, x1 + w - r, y1 + h - r);
+ BE_DRAWCIRCLE_BCOLOR_CLIP(ptr_tr, ptr_tl, ptr_bl, ptr_br, x, y, px - pitch, py,
+ x1 + w - r, y1 + r, x1 + r, y1 + r, x1 + r, y1 + h - r, x1 + w - r, y1 + h - r);
+ }
+ }
+ }
+
+ ptr_fill += pitch * real_radius;
+ while (short_h--) {
+ blendFillClip(ptr_fill, ptr_fill + Base::_strokeWidth, color1, alpha_l,
+ x1, y1 + real_radius + h - (2 * r) + 2 - short_h - 1); // left
+ blendFillClip(ptr_fill + w - Base::_strokeWidth + 1, ptr_fill + w + 1, color2, alpha_r,
+ x1 + w - Base::_strokeWidth + 1, y1 + real_radius + h - (2 * r) + 2 - short_h - 1); // right
+ ptr_fill += pitch;
+ }
+}
+
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
drawInteriorRoundedSquareAlg(int x1, int y1, int r, int w, int h, PixelType color, VectorRenderer::FillMode fill_m) {
// Do not draw empty space rounded squares.
if (w <= 0 || h <= 0) {
@@ -1740,6 +3171,8 @@ drawInteriorRoundedSquareAlg(int x1, int y1, int r, int w, int h, PixelType colo
while (x++ < y) {
BE_ALGORITHM();
+ if (y1 + r + y < _clippingArea.top || y1 + r + y > _clippingArea.bottom) continue;
+
color1 = calcGradient(real_radius - x, long_h);
color2 = calcGradient(real_radius - y, long_h);
color3 = calcGradient(long_h - r + x, long_h);
@@ -1781,6 +3214,91 @@ drawInteriorRoundedSquareAlg(int x1, int y1, int r, int w, int h, PixelType colo
template<typename PixelType>
void VectorRendererSpec<PixelType>::
+drawInteriorRoundedSquareAlgClip(int x1, int y1, int r, int w, int h, PixelType color, VectorRenderer::FillMode fill_m) {
+ // Do not draw empty space rounded squares.
+ if (w <= 0 || h <= 0) {
+ return;
+ }
+
+ int f, ddF_x, ddF_y;
+ int x, y, px, py;
+ int pitch = _activeSurface->pitch / _activeSurface->format.bytesPerPixel;
+
+ PixelType *ptr_tl = (PixelType *)Base::_activeSurface->getBasePtr(x1 + r, y1 + r);
+ PixelType *ptr_tr = (PixelType *)Base::_activeSurface->getBasePtr(x1 + w - r, y1 + r);
+ PixelType *ptr_bl = (PixelType *)Base::_activeSurface->getBasePtr(x1 + r, y1 + h - r);
+ PixelType *ptr_br = (PixelType *)Base::_activeSurface->getBasePtr(x1 + w - r, y1 + h - r);
+ PixelType *ptr_fill = (PixelType *)Base::_activeSurface->getBasePtr(x1, y1);
+
+ int real_radius = r;
+ int short_h = h - (2 * r) + 2;
+ int long_h = h;
+
+ BE_RESET();
+
+ PixelType color1 = color;
+
+ if (fill_m == kFillGradient) {
+ PixelType color2, color3, color4;
+ precalcGradient(long_h);
+
+ while (x++ < y) {
+ BE_ALGORITHM();
+
+ color1 = calcGradient(real_radius - x, long_h);
+ color2 = calcGradient(real_radius - y, long_h);
+ color3 = calcGradient(long_h - r + x, long_h);
+ color4 = calcGradient(long_h - r + y, long_h);
+
+ //TL = (x1 + r, y1 + r)
+ gradientFillClip(ptr_tl - x - py, w - 2 * r + 2 * x, x1 + r - x - y, real_radius - y,
+ x1 + r - x, y1 + r - y);
+ gradientFillClip(ptr_tl - y - px, w - 2 * r + 2 * y, x1 + r - y - x, real_radius - x,
+ x1 + r - y, y1 + r - x);
+
+ //BL = (x1 + r, y1 + h - r)
+ gradientFillClip(ptr_bl - x + py, w - 2 * r + 2 * x, x1 + r - x - y, long_h - r + y,
+ x1 + r - x, y1 + h - r + y);
+ gradientFillClip(ptr_bl - y + px, w - 2 * r + 2 * y, x1 + r - y - x, long_h - r + x,
+ x1 + r - y, y1 + h - r + x);
+
+ BE_DRAWCIRCLE_XCOLOR_CLIP(ptr_tr, ptr_tl, ptr_bl, ptr_br, x, y, px, py,
+ x1 + w - r, y1 + r, x1 + r, y1 + r, x1 + r, y1 + h - r, x1 + w - r, y1 + h - r);
+ }
+ } else {
+ while (x++ < y) {
+ BE_ALGORITHM();
+
+ colorFillClip<PixelType>(ptr_tl - x - py, ptr_tr + x - py, color1,
+ x1 + r - x, y1 + r - y, _clippingArea);
+ colorFillClip<PixelType>(ptr_tl - y - px, ptr_tr + y - px, color1,
+ x1 + r - y, y1 + r - x, _clippingArea);
+
+ colorFillClip<PixelType>(ptr_bl - x + py, ptr_br + x + py, color1,
+ x1 + r - x, y1 + h - r + y, _clippingArea);
+ colorFillClip<PixelType>(ptr_bl - y + px, ptr_br + y + px, color1,
+ x1 + r - y, y1 + h - r + x, _clippingArea);
+
+ // do not remove - messes up the drawing at lower resolutions
+ BE_DRAWCIRCLE_CLIP(ptr_tr, ptr_tl, ptr_bl, ptr_br, x, y, px, py,
+ x1 + w - r, y1 + r, x1 + r, y1 + r, x1 + r, y1 + h - r, x1 + w - r, y1 + h - r);
+ }
+ }
+
+ ptr_fill += pitch * r;
+ int short_h_orig = short_h;
+ while (short_h--) {
+ if (fill_m == kFillGradient) {
+ gradientFillClip(ptr_fill, w + 1, x1, real_radius++, x1, y1 + r + short_h_orig - short_h -1);
+ } else {
+ colorFillClip<PixelType>(ptr_fill, ptr_fill + w + 1, color1, x1, y1 + r + short_h_orig - short_h - 1, _clippingArea);
+ }
+ ptr_fill += pitch;
+ }
+}
+
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
drawRoundedSquareAlg(int x1, int y1, int r, int w, int h, PixelType color, VectorRenderer::FillMode fill_m) {
const uint8 borderAlpha_t = 0;
const uint8 borderAlpha_r = 127;
@@ -1810,6 +3328,38 @@ drawRoundedSquareAlg(int x1, int y1, int r, int w, int h, PixelType color, Vecto
}
}
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
+drawRoundedSquareAlgClip(int x1, int y1, int r, int w, int h, PixelType color, VectorRenderer::FillMode fill_m) {
+ const uint8 borderAlpha_t = 0;
+ const uint8 borderAlpha_r = 127;
+ const uint8 borderAlpha_b = 255;
+ const uint8 borderAlpha_l = 63;
+
+ const uint8 bevelAlpha_t = 255;
+ const uint8 bevelAlpha_r = 31;
+ const uint8 bevelAlpha_b = 0;
+ const uint8 bevelAlpha_l = 127;
+
+ // If only border is visible
+ if ((!(w <= 0 || h <= 0)) && (fill_m != Base::kFillDisabled)) {
+ if (fill_m == Base::kFillBackground)
+ drawInteriorRoundedSquareAlgClip(x1, y1, r, w, h, _bgColor, fill_m);
+ else
+ drawInteriorRoundedSquareAlgClip(x1, y1, r, w, h, color, fill_m);
+ }
+
+ //I expect these to work fine with clipping:
+ if (Base::_strokeWidth) {
+ if (r != 0 && _bevel > 0) {
+ drawBorderRoundedSquareAlgClip(x1, y1, r, w, h, color, fill_m, borderAlpha_t, borderAlpha_r, borderAlpha_b, borderAlpha_l);
+ drawBorderRoundedSquareAlgClip(x1, y1, r, w, h, _bevelColor, fill_m, bevelAlpha_t, bevelAlpha_r, bevelAlpha_b, bevelAlpha_l);
+ } else {
+ drawBorderRoundedSquareAlgClip(x1, y1, r, w, h, color, fill_m, 255, 255, 255, 255);
+ }
+ }
+}
+
/** CIRCLE ALGORITHM **/
template<typename PixelType>
void VectorRendererSpec<PixelType>::
@@ -1854,7 +3404,47 @@ drawCircleAlg(int x1, int y1, int r, PixelType color, VectorRenderer::FillMode f
}
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
+drawCircleAlgClip(int x1, int y1, int r, PixelType color, VectorRenderer::FillMode fill_m) {
+ int f, ddF_x, ddF_y;
+ int x, y, px, py, sw = 0;
+ int pitch = _activeSurface->pitch / _activeSurface->format.bytesPerPixel;
+ PixelType *ptr = (PixelType *)Base::_activeSurface->getBasePtr(x1, y1);
+
+ if (fill_m == kFillDisabled) {
+ while (sw++ < Base::_strokeWidth) {
+ BE_RESET();
+ r--;
+
+ if (IS_IN_CLIP(x1 + y, y1)) *(ptr + y) = color;
+ if (IS_IN_CLIP(x1 - y, y1)) *(ptr - y) = color;
+ if (IS_IN_CLIP(x1, y1 + y)) *(ptr + py) = color;
+ if (IS_IN_CLIP(x1, y1 - y)) *(ptr - py) = color;
+
+ while (x++ < y) {
+ BE_ALGORITHM();
+ BE_DRAWCIRCLE_CLIP(ptr, ptr, ptr, ptr, x, y, px, py, x1, y1, x1, y1, x1, y1, x1, y1);
+
+ if (Base::_strokeWidth > 1) {
+ BE_DRAWCIRCLE_CLIP(ptr, ptr, ptr, ptr, x - 1, y, px, py, x1, y1, x1, y1, x1, y1, x1, y1);
+ BE_DRAWCIRCLE_CLIP(ptr, ptr, ptr, ptr, x, y, px - pitch, py, x1, y1, x1, y1, x1, y1, x1, y1);
+ }
+ }
+ }
+ } else {
+ colorFillClip<PixelType>(ptr - r, ptr + r, color, x1 - r, y1 + r, _clippingArea);
+ BE_RESET();
+ while (x++ < y) {
+ BE_ALGORITHM();
+ colorFillClip<PixelType>(ptr - x + py, ptr + x + py, color, x1 - x, y1 + y, _clippingArea);
+ colorFillClip<PixelType>(ptr - x - py, ptr + x - py, color, x1 - x, y1 - y, _clippingArea);
+ colorFillClip<PixelType>(ptr - y + px, ptr + y + px, color, x1 - y, y1 + x, _clippingArea);
+ colorFillClip<PixelType>(ptr - y - px, ptr + y - px, color, x1 - y, y1 - x, _clippingArea);
+ }
+ }
+}
/********************************************************************
@@ -1905,6 +3495,54 @@ drawSquareShadow(int x, int y, int w, int h, int offset) {
template<typename PixelType>
void VectorRendererSpec<PixelType>::
+drawSquareShadowClip(int x, int y, int w, int h, int offset) {
+ // Do nothing for empty rects or no shadow offset.
+ if (w <= 0 || h <= 0 || offset <= 0) {
+ return;
+ }
+
+ PixelType *ptr = (PixelType *)_activeSurface->getBasePtr(x + w - 1, y + offset);
+ int pitch = _activeSurface->pitch / _activeSurface->format.bytesPerPixel;
+ int i, j, ptr_x = x+w-1, ptr_y = y+offset;
+
+ i = h - offset;
+
+ while (i--) {
+ j = offset;
+ while (j--)
+ blendPixelPtrClip(ptr + j, 0, ((offset - j) << 8) / offset, ptr_x + j, ptr_y);
+ ptr += pitch;
+ ++ptr_y;
+ }
+
+ ptr = (PixelType *)_activeSurface->getBasePtr(x + offset, y + h - 1);
+ ptr_x = x + offset;
+ ptr_y = y + h - 1;
+
+ while (i++ < offset) {
+ j = w - offset;
+ while (j--)
+ blendPixelPtrClip(ptr + j, 0, ((offset - i) << 8) / offset, ptr_x + j, ptr_y);
+ ptr += pitch;
+ ++ptr_y;
+ }
+
+ ptr = (PixelType *)_activeSurface->getBasePtr(x + w, y + h);
+ ptr_x = x + w;
+ ptr_y = y + h;
+
+ i = 0;
+ while (i++ < offset) {
+ j = offset - 1;
+ while (j--)
+ blendPixelPtrClip(ptr + j, 0, (((offset - j) * (offset - i)) << 8) / (offset * offset), ptr_x + j, ptr_y);
+ ptr += pitch;
+ ++ptr_y;
+ }
+}
+
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
drawRoundedSquareShadow(int x1, int y1, int r, int w, int h, int offset) {
int pitch = _activeSurface->pitch / _activeSurface->format.bytesPerPixel;
@@ -1942,7 +3580,6 @@ drawRoundedSquareShadow(int x1, int y1, int r, int w, int h, int offset) {
while (x++ < y) {
BE_ALGORITHM();
-
if (((1 << x) & hb) == 0) {
blendFill(ptr_tl - y - px, ptr_tr + y - px, color, (uint8)alpha);
@@ -1978,6 +3615,83 @@ drawRoundedSquareShadow(int x1, int y1, int r, int w, int h, int offset) {
}
}
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
+drawRoundedSquareShadowClip(int x1, int y1, int r, int w, int h, int offset) {
+ int pitch = _activeSurface->pitch / _activeSurface->format.bytesPerPixel;
+
+ // "Harder" shadows when having lower BPP, since we will have artifacts (greenish tint on the modern theme)
+ uint8 expFactor = 3;
+ uint16 alpha = (_activeSurface->format.bytesPerPixel > 2) ? 4 : 8;
+
+ // These constants ensure a border of 2px on the left and of each rounded square
+ int xstart = (x1 > 2) ? x1 - 2 : x1;
+ int ystart = y1;
+ int width = w + offset + 2;
+ int height = h + offset + 1;
+
+ for (int i = offset; i >= 0; i--) {
+ int f, ddF_x, ddF_y;
+ int x, y, px, py;
+
+ PixelType *ptr_tl = (PixelType *)Base::_activeSurface->getBasePtr(xstart + r, ystart + r);
+ PixelType *ptr_tr = (PixelType *)Base::_activeSurface->getBasePtr(xstart + width - r, ystart + r);
+ PixelType *ptr_bl = (PixelType *)Base::_activeSurface->getBasePtr(xstart + r, ystart + height - r);
+ PixelType *ptr_br = (PixelType *)Base::_activeSurface->getBasePtr(xstart + width - r, ystart + height - r);
+ PixelType *ptr_fill = (PixelType *)Base::_activeSurface->getBasePtr(xstart, ystart);
+
+ int short_h = height - (2 * r) + 2;
+ PixelType color = _format.RGBToColor(0, 0, 0);
+
+ BE_RESET();
+
+ // HACK: As we are drawing circles exploting 8-axis symmetry,
+ // there are 4 pixels on each circle which are drawn twice.
+ // this is ok on filled circles, but when blending on surfaces,
+ // we cannot let it blend twice. awful.
+ uint32 hb = 0;
+
+ while (x++ < y) {
+ BE_ALGORITHM();
+
+ if (((1 << x) & hb) == 0) {
+ blendFillClip(ptr_tl - y - px, ptr_tr + y - px, color, (uint8)alpha,
+ xstart + r - y, ystart + r - x);
+
+ // Will create a dark line of pixles if left out
+ if (hb > 0) {
+ blendFillClip(ptr_bl - y + px, ptr_br + y + px, color, (uint8)alpha,
+ xstart + r - y, ystart + height - r + x);
+ }
+ hb |= (1 << x);
+ }
+
+ if (((1 << y) & hb) == 0) {
+ blendFillClip(ptr_tl - x - py, ptr_tr + x - py, color, (uint8)alpha, xstart + r - x, ystart + r - y);
+ blendFillClip(ptr_bl - x + py, ptr_br + x + py, color, (uint8)alpha, xstart + r - x, ystart + height - r + y);
+ hb |= (1 << y);
+ }
+ }
+
+ ptr_fill += pitch * r;
+ int orig_short_h = short_h;
+ while (short_h--) {
+ blendFillClip(ptr_fill, ptr_fill + width + 1, color, (uint8)alpha,
+ xstart, ystart + r + orig_short_h - short_h - 1);
+ ptr_fill += pitch;
+ }
+
+ // Make shadow smaller each iteration, and move it one pixel inward
+ xstart += 1;
+ ystart += 1;
+ width -= 2;
+ height -= 2;
+
+ if (_shadowFillMode == kShadowExponential)
+ // Multiply with expfactor
+ alpha = (alpha * (expFactor << 8)) >> 9;
+ }
+}
/******************************************************************************/
diff --git a/graphics/VectorRendererSpec.h b/graphics/VectorRendererSpec.h
index 3e54608b8e..bee6d4c425 100644
--- a/graphics/VectorRendererSpec.h
+++ b/graphics/VectorRendererSpec.h
@@ -51,14 +51,31 @@ public:
VectorRendererSpec(PixelFormat format);
void drawLine(int x1, int y1, int x2, int y2);
+ void drawLineClip(int x1, int y1, int x2, int y2, Common::Rect clipping);
void drawCircle(int x, int y, int r);
+ void drawCircleClip(int x, int y, int r, Common::Rect clipping);
void drawSquare(int x, int y, int w, int h);
+ void drawSquareClip(int x, int y, int w, int h, Common::Rect clipping);
void drawRoundedSquare(int x, int y, int r, int w, int h);
+ void drawRoundedSquareClip(int x, int y, int r, int w, int h, Common::Rect clipping);
void drawTriangle(int x, int y, int base, int height, TriangleOrientation orient);
+ void drawTriangleClip(int x, int y, int base, int height, TriangleOrientation orient, Common::Rect clipping);
void drawTab(int x, int y, int r, int w, int h);
+ void drawTabClip(int x, int y, int r, int w, int h, Common::Rect clipping);
void drawBeveledSquare(int x, int y, int w, int h, int bevel) {
drawBevelSquareAlg(x, y, w, h, bevel, _bevelColor, _fgColor, Base::_fillMode != kFillDisabled);
}
+ void drawBeveledSquareClip(int x, int y, int w, int h, int bevel, Common::Rect clipping) {
+ bool useClippingVersions = !(clipping.isEmpty() || clipping.contains(Common::Rect(x, y, x + w, y + h)));
+ if (useClippingVersions) {
+ Common::Rect backup = _clippingArea;
+ _clippingArea = clipping;
+ drawBevelSquareAlgClip(x, y, w, h, bevel, _bevelColor, _fgColor, Base::_fillMode != kFillDisabled);
+ _clippingArea = backup;
+ } else {
+ drawBevelSquareAlg(x, y, w, h, bevel, _bevelColor, _fgColor, Base::_fillMode != kFillDisabled);
+ }
+ }
void drawString(const Graphics::Font *font, const Common::String &text,
const Common::Rect &area, Graphics::TextAlign alignH,
GUI::ThemeEngine::TextAlignVertical alignV, int deltax, bool elipsis, const Common::Rect &textDrawableArea = Common::Rect(0, 0, 0, 0));
@@ -72,14 +89,19 @@ public:
void copyWholeFrame(OSystem *sys) { copyFrame(sys, Common::Rect(0, 0, _activeSurface->w, _activeSurface->h)); }
void fillSurface();
+ void fillSurfaceClip(Common::Rect clipping);
void blitSurface(const Graphics::Surface *source, const Common::Rect &r);
void blitSubSurface(const Graphics::Surface *source, const Common::Rect &r);
+ void blitSubSurfaceClip(const Graphics::Surface *source, const Common::Rect &r, const Common::Rect &clipping);
void blitAlphaBitmap(const Graphics::Surface *source, const Common::Rect &r);
+ void blitAlphaBitmapClip(const Graphics::Surface *source, const Common::Rect &r, const Common::Rect &clipping);
void applyScreenShading(GUI::ThemeEngine::ShadingStyle shadingStyle);
protected:
+ Common::Rect _clippingArea;
+
/**
* Draws a single pixel on the surface with the given coordinates and
* the given color.
@@ -119,6 +141,7 @@ protected:
* @param alpha Alpha intensity of the pixel (0-255)
*/
inline void blendPixelPtr(PixelType *ptr, PixelType color, uint8 alpha);
+ inline void blendPixelPtrClip(PixelType *ptr, PixelType color, uint8 alpha, int x, int y);
/**
* Blends a single pixel on the surface in the given pixel pointer, using supplied color
@@ -152,40 +175,74 @@ protected:
virtual void drawLineAlg(int x1, int y1, int x2, int y2,
uint dx, uint dy, PixelType color);
+ virtual void drawLineAlgClip(int x1, int y1, int x2, int y2,
+ uint dx, uint dy, PixelType color);
+
virtual void drawCircleAlg(int x, int y, int r,
PixelType color, FillMode fill_m);
+ virtual void drawCircleAlgClip(int x, int y, int r,
+ PixelType color, FillMode fill_m);
+
virtual void drawRoundedSquareAlg(int x1, int y1, int r, int w, int h,
PixelType color, FillMode fill_m);
+ virtual void drawRoundedSquareAlgClip(int x1, int y1, int r, int w, int h,
+ PixelType color, FillMode fill_m);
+
virtual void drawBorderRoundedSquareAlg(int x1, int y1, int r, int w, int h,
PixelType color, FillMode fill_m, uint8 alpha_t, uint8 alpha_r, uint8 alpha_b, uint8 alpha_l);
+ virtual void drawBorderRoundedSquareAlgClip(int x1, int y1, int r, int w, int h,
+ PixelType color, FillMode fill_m, uint8 alpha_t, uint8 alpha_r, uint8 alpha_b, uint8 alpha_l);
+
virtual void drawInteriorRoundedSquareAlg(int x1, int y1, int r, int w, int h,
PixelType color, FillMode fill_m);
+ virtual void drawInteriorRoundedSquareAlgClip(int x1, int y1, int r, int w, int h,
+ PixelType color, FillMode fill_m);
+
virtual void drawSquareAlg(int x, int y, int w, int h,
PixelType color, FillMode fill_m);
+ virtual void drawSquareAlgClip(int x, int y, int w, int h,
+ PixelType color, FillMode fill_m);
+
virtual void drawTriangleVertAlg(int x, int y, int w, int h,
bool inverted, PixelType color, FillMode fill_m);
+ virtual void drawTriangleVertAlgClip(int x, int y, int w, int h,
+ bool inverted, PixelType color, FillMode fill_m);
+
virtual void drawTriangleFast(int x, int y, int size,
bool inverted, PixelType color, FillMode fill_m);
virtual void drawBevelSquareAlg(int x, int y, int w, int h,
int bevel, PixelType top_color, PixelType bottom_color, bool fill);
+ virtual void drawBevelSquareAlgClip(int x, int y, int w, int h,
+ int bevel, PixelType top_color, PixelType bottom_color, bool fill);
+
virtual void drawTabAlg(int x, int y, int w, int h, int r,
PixelType color, VectorRenderer::FillMode fill_m,
int baseLeft = 0, int baseRight = 0);
+ virtual void drawTabAlgClip(int x, int y, int w, int h, int r,
+ PixelType color, VectorRenderer::FillMode fill_m,
+ int baseLeft = 0, int baseRight = 0);
+
virtual void drawTabShadow(int x, int y, int w, int h, int r);
+ virtual void drawTabShadowClip(int x, int y, int w, int h, int r);
+
virtual void drawBevelTabAlg(int x, int y, int w, int h,
int bevel, PixelType topColor, PixelType bottomColor,
int baseLeft = 0, int baseRight = 0);
+ virtual void drawBevelTabAlgClip(int x, int y, int w, int h,
+ int bevel, PixelType topColor, PixelType bottomColor,
+ int baseLeft = 0, int baseRight = 0);
+
/**
* SHADOW DRAWING ALGORITHMS
*
@@ -197,7 +254,9 @@ protected:
* @param offset Intensity/size of the shadow.
*/
virtual void drawSquareShadow(int x, int y, int w, int h, int offset);
+ virtual void drawSquareShadowClip(int x, int y, int w, int h, int offset);
virtual void drawRoundedSquareShadow(int x, int y, int r, int w, int h, int offset);
+ virtual void drawRoundedSquareShadowClip(int x, int y, int r, int w, int h, int offset);
/**
* Calculates the color gradient on a given point.
@@ -212,6 +271,7 @@ protected:
void precalcGradient(int h);
void gradientFill(PixelType *first, int width, int x, int y);
+ void gradientFillClip(PixelType *first, int width, int x, int y, int realX, int realY);
/**
* Fills several pixels in a row with a given color and the specified alpha blending.
@@ -227,7 +287,20 @@ protected:
while (first != last) blendPixelPtr(first++, color, alpha);
}
+ inline void blendFillClip(PixelType *first, PixelType *last, PixelType color, uint8 alpha, int realX, int realY) {
+ if (_clippingArea.top <= realY && realY < _clippingArea.bottom) {
+ while (first != last) {
+ if (_clippingArea.left <= realX && realX < _clippingArea.right)
+ blendPixelPtr(first++, color, alpha);
+ else
+ ++first;
+ ++realX;
+ }
+ }
+ }
+
void darkenFill(PixelType *first, PixelType *last);
+ void darkenFillClip(PixelType *first, PixelType *last, int x, int y);
const PixelFormat _format;
const PixelType _redMask, _greenMask, _blueMask, _alphaMask;
diff --git a/graphics/nine_patch.cpp b/graphics/nine_patch.cpp
index a193200208..8ac6977eed 100644
--- a/graphics/nine_patch.cpp
+++ b/graphics/nine_patch.cpp
@@ -236,6 +236,41 @@ void NinePatchBitmap::blit(Graphics::Surface &target, int dx, int dy, int dw, in
}
}
+void NinePatchBitmap::blitClip(Graphics::Surface &target, Common::Rect clip, int dx, int dy, int dw, int dh) {
+ /* don't draw bitmaps that are smaller than the fixed area */
+ if (dw < _h._fix || dh < _v._fix)
+ return;
+
+ /* if the bitmap is the same size as the origin, then draw it as-is */
+ if (dw == _width && dh == _height) {
+ Common::Rect r(1, 1, dw, dh);
+
+ _bmp->blitClip(target, clip, dx, dy, Graphics::FLIP_NONE, &r);
+ return;
+ }
+
+ /* only recalculate the offsets if they have changed since the last draw */
+ if (_cached_dw != dw || _cached_dh != dh) {
+ _h.calcOffsets(dw);
+ _v.calcOffsets(dh);
+
+ _cached_dw = dw;
+ _cached_dh = dh;
+ }
+
+ /* draw each region */
+ for (uint i = 0; i < _v._m.size(); ++i) {
+ for (uint j = 0; j < _h._m.size(); ++j) {
+ Common::Rect r(_h._m[j]->offset, _v._m[i]->offset,
+ _h._m[j]->offset + _h._m[j]->length, _v._m[i]->offset + _v._m[i]->length);
+
+ _bmp->blitClip(target, clip, dx + _h._m[j]->dest_offset, dy + _v._m[i]->dest_offset,
+ Graphics::FLIP_NONE, &r, TS_ARGB(255, 255, 255, 255),
+ _h._m[j]->dest_length, _v._m[i]->dest_length);
+ }
+ }
+}
+
NinePatchBitmap::~NinePatchBitmap() {
if (_destroy_bmp)
delete _bmp;
diff --git a/graphics/nine_patch.h b/graphics/nine_patch.h
index c62de3f6e2..45e4e0918a 100644
--- a/graphics/nine_patch.h
+++ b/graphics/nine_patch.h
@@ -83,6 +83,7 @@ public:
~NinePatchBitmap();
void blit(Graphics::Surface &target, int dx, int dy, int dw, int dh);
+ void blitClip(Graphics::Surface &target, Common::Rect clip, int dx, int dy, int dw, int dh);
int getWidth() { return _width; }
int getHeight() { return _height; }
diff --git a/graphics/transparent_surface.cpp b/graphics/transparent_surface.cpp
index 19e7655a93..c2903d42c3 100644
--- a/graphics/transparent_surface.cpp
+++ b/graphics/transparent_surface.cpp
@@ -462,6 +462,139 @@ Common::Rect TransparentSurface::blit(Graphics::Surface &target, int posX, int p
return retSize;
}
+Common::Rect TransparentSurface::blitClip(Graphics::Surface &target, Common::Rect clippingArea, int posX, int posY, int flipping, Common::Rect *pPartRect, uint color, int width, int height, TSpriteBlendMode blendMode) {
+ Common::Rect retSize;
+ retSize.top = 0;
+ retSize.left = 0;
+ retSize.setWidth(0);
+ retSize.setHeight(0);
+ // Check if we need to draw anything at all
+ int ca = (color >> kAModShift) & 0xff;
+
+ if (ca == 0) {
+ return retSize;
+ }
+
+ // Create an encapsulating surface for the data
+ TransparentSurface srcImage(*this, false);
+ // TODO: Is the data really in the screen format?
+ if (format.bytesPerPixel != 4) {
+ warning("TransparentSurface can only blit 32bpp images, but got %d", format.bytesPerPixel * 8);
+ return retSize;
+ }
+
+ if (pPartRect) {
+
+ int xOffset = pPartRect->left;
+ int yOffset = pPartRect->top;
+
+ if (flipping & FLIP_V) {
+ yOffset = srcImage.h - pPartRect->bottom;
+ }
+
+ if (flipping & FLIP_H) {
+ xOffset = srcImage.w - pPartRect->right;
+ }
+
+ srcImage.pixels = getBasePtr(xOffset, yOffset);
+ srcImage.w = pPartRect->width();
+ srcImage.h = pPartRect->height();
+
+ debug(6, "Blit(%d, %d, %d, [%d, %d, %d, %d], %08x, %d, %d)", posX, posY, flipping,
+ pPartRect->left, pPartRect->top, pPartRect->width(), pPartRect->height(), color, width, height);
+ } else {
+
+ debug(6, "Blit(%d, %d, %d, [%d, %d, %d, %d], %08x, %d, %d)", posX, posY, flipping, 0, 0,
+ srcImage.w, srcImage.h, color, width, height);
+ }
+
+ if (width == -1) {
+ width = srcImage.w;
+ }
+ if (height == -1) {
+ height = srcImage.h;
+ }
+
+#ifdef SCALING_TESTING
+ // Hardcode scaling to 66% to test scaling
+ width = width * 2 / 3;
+ height = height * 2 / 3;
+#endif
+
+ Graphics::Surface *img = nullptr;
+ Graphics::Surface *imgScaled = nullptr;
+ byte *savedPixels = nullptr;
+ if ((width != srcImage.w) || (height != srcImage.h)) {
+ // Scale the image
+ img = imgScaled = srcImage.scale(width, height);
+ savedPixels = (byte *)img->getPixels();
+ } else {
+ img = &srcImage;
+ }
+
+ // Handle off-screen clipping
+ if (posY < clippingArea.top) {
+ img->h = MAX(0, (int)img->h - (clippingArea.top - posY));
+ img->setPixels((byte *)img->getBasePtr(0, clippingArea.top - posY));
+ posY = clippingArea.top;
+ }
+
+ if (posX < clippingArea.left) {
+ img->w = MAX(0, (int)img->w - (clippingArea.left - posX));
+ img->setPixels((byte *)img->getBasePtr(clippingArea.left - posX, 0));
+ posX = clippingArea.left;
+ }
+
+ img->w = CLIP((int)img->w, 0, (int)MAX((int)clippingArea.right - posX, 0));
+ img->h = CLIP((int)img->h, 0, (int)MAX((int)clippingArea.bottom - posY, 0));
+
+ if ((img->w > 0) && (img->h > 0)) {
+ int xp = 0, yp = 0;
+
+ int inStep = 4;
+ int inoStep = img->pitch;
+ if (flipping & FLIP_H) {
+ inStep = -inStep;
+ xp = img->w - 1;
+ }
+
+ if (flipping & FLIP_V) {
+ inoStep = -inoStep;
+ yp = img->h - 1;
+ }
+
+ byte *ino = (byte *)img->getBasePtr(xp, yp);
+ byte *outo = (byte *)target.getBasePtr(posX, posY);
+
+ if (color == 0xFFFFFFFF && blendMode == BLEND_NORMAL && _alphaMode == ALPHA_OPAQUE) {
+ doBlitOpaqueFast(ino, outo, img->w, img->h, target.pitch, inStep, inoStep);
+ } else if (color == 0xFFFFFFFF && blendMode == BLEND_NORMAL && _alphaMode == ALPHA_BINARY) {
+ doBlitBinaryFast(ino, outo, img->w, img->h, target.pitch, inStep, inoStep);
+ } else {
+ if (blendMode == BLEND_ADDITIVE) {
+ doBlitAdditiveBlend(ino, outo, img->w, img->h, target.pitch, inStep, inoStep, color);
+ } else if (blendMode == BLEND_SUBTRACTIVE) {
+ doBlitSubtractiveBlend(ino, outo, img->w, img->h, target.pitch, inStep, inoStep, color);
+ } else {
+ assert(blendMode == BLEND_NORMAL);
+ doBlitAlphaBlend(ino, outo, img->w, img->h, target.pitch, inStep, inoStep, color);
+ }
+ }
+
+ }
+
+ retSize.setWidth(img->w);
+ retSize.setHeight(img->h);
+
+ if (imgScaled) {
+ imgScaled->setPixels(savedPixels);
+ imgScaled->free();
+ delete imgScaled;
+ }
+
+ return retSize;
+}
+
/**
* Writes a color key to the alpha channel of the surface
* @param rKey the red component of the color key
diff --git a/graphics/transparent_surface.h b/graphics/transparent_surface.h
index 0cd7d5b2e9..c0d3d26e52 100644
--- a/graphics/transparent_surface.h
+++ b/graphics/transparent_surface.h
@@ -123,6 +123,14 @@ struct TransparentSurface : public Graphics::Surface {
uint color = TS_ARGB(255, 255, 255, 255),
int width = -1, int height = -1,
TSpriteBlendMode blend = BLEND_NORMAL);
+ Common::Rect blitClip(Graphics::Surface &target, Common::Rect clippingArea,
+ int posX = 0, int posY = 0,
+ int flipping = FLIP_NONE,
+ Common::Rect *pPartRect = nullptr,
+ uint color = TS_ARGB(255, 255, 255, 255),
+ int width = -1, int height = -1,
+ TSpriteBlendMode blend = BLEND_NORMAL);
+
void applyColorKey(uint8 r, uint8 g, uint8 b, bool overwriteAlpha = false);
/**
diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp
index 0ed020ebb8..c850a6a02e 100644
--- a/gui/ThemeEngine.cpp
+++ b/gui/ThemeEngine.cpp
@@ -121,6 +121,19 @@ protected:
const WidgetDrawData *_data;
};
+class ThemeItemDrawDataClip: public ThemeItem{
+public:
+ ThemeItemDrawDataClip(ThemeEngine *engine, const WidgetDrawData *data, const Common::Rect &area, const Common::Rect &clip, uint32 dynData) :
+ ThemeItem(engine, area), _dynamicData(dynData), _data(data), _clip(clip) {}
+
+ void drawSelf(bool draw, bool restore);
+
+protected:
+ uint32 _dynamicData;
+ const WidgetDrawData *_data;
+ const Common::Rect _clip;
+};
+
class ThemeItemTextData : public ThemeItem {
public:
ThemeItemTextData(ThemeEngine *engine, const TextDrawData *data, const TextColorData *color, const Common::Rect &area, const Common::Rect &textDrawableArea,
@@ -155,7 +168,18 @@ protected:
bool _alpha;
};
+class ThemeItemBitmapClip : public ThemeItem {
+public:
+ ThemeItemBitmapClip(ThemeEngine *engine, const Common::Rect &area, const Common::Rect &clip, const Graphics::Surface *bitmap, bool alpha) :
+ ThemeItem(engine, area), _bitmap(bitmap), _alpha(alpha), _clip(clip) {}
+ void drawSelf(bool draw, bool restore);
+
+protected:
+ const Graphics::Surface *_bitmap;
+ bool _alpha;
+ const Common::Rect _clip;
+};
/**********************************************************
* Data definitions for theme engine elements
@@ -242,16 +266,40 @@ void ThemeItemDrawData::drawSelf(bool draw, bool restore) {
_engine->addDirtyRect(extendedRect);
}
+void ThemeItemDrawDataClip::drawSelf(bool draw, bool restore) {
+
+ Common::Rect extendedRect = _area;
+ extendedRect.grow(_engine->kDirtyRectangleThreshold + _data->_backgroundOffset);
+
+ if (restore)
+ _engine->restoreBackground(extendedRect);
+
+ if (draw) {
+ Common::List<Graphics::DrawStep>::const_iterator step;
+ for (step = _data->_steps.begin(); step != _data->_steps.end(); ++step) {
+ _engine->renderer()->drawStepClip(_area, _clip, *step, _dynamicData);
+ }
+ }
+
+ extendedRect.clip(_clip);
+
+ _engine->addDirtyRect(extendedRect);
+}
+
void ThemeItemTextData::drawSelf(bool draw, bool restore) {
+ Common::Rect dirty = _textDrawableArea;
+ if (dirty.isEmpty()) dirty = _area;
+ else dirty.clip(_area);
+
if (_restoreBg || restore)
- _engine->restoreBackground(_area);
+ _engine->restoreBackground(dirty);
if (draw) {
_engine->renderer()->setFgColor(_color->r, _color->g, _color->b);
_engine->renderer()->drawString(_data->_fontPtr, _text, _area, _alignH, _alignV, _deltax, _ellipsis, _textDrawableArea);
}
- _engine->addDirtyRect(_area);
+ _engine->addDirtyRect(dirty);
}
void ThemeItemBitmap::drawSelf(bool draw, bool restore) {
@@ -268,7 +316,21 @@ void ThemeItemBitmap::drawSelf(bool draw, bool restore) {
_engine->addDirtyRect(_area);
}
+void ThemeItemBitmapClip::drawSelf(bool draw, bool restore) {
+ if (restore)
+ _engine->restoreBackground(_area);
+ if (draw) {
+ if (_alpha)
+ _engine->renderer()->blitAlphaBitmapClip(_bitmap, _area, _clip);
+ else
+ _engine->renderer()->blitSubSurfaceClip(_bitmap, _area, _clip);
+ }
+
+ Common::Rect dirtyRect = _area;
+ dirtyRect.clip(_clip);
+ _engine->addDirtyRect(dirtyRect);
+}
/**********************************************************
* ThemeEngine class
@@ -862,6 +924,30 @@ void ThemeEngine::queueDD(DrawData type, const Common::Rect &r, uint32 dynamic,
}
}
+void ThemeEngine::queueDDClip(DrawData type, const Common::Rect &r, const Common::Rect &clippingRect, uint32 dynamic, bool restore) {
+ if (_widgets[type] == 0)
+ return;
+
+ Common::Rect area = r;
+ area.clip(_screen.w, _screen.h);
+
+ ThemeItemDrawDataClip *q = new ThemeItemDrawDataClip(this, _widgets[type], area, clippingRect, dynamic);
+
+ if (_buffering) {
+ if (_widgets[type]->_buffer) {
+ _bufferQueue.push_back(q);
+ } else {
+ if (kDrawDataDefaults[type].parent != kDDNone && kDrawDataDefaults[type].parent != type)
+ queueDDClip(kDrawDataDefaults[type].parent, r, clippingRect);
+
+ _screenQueue.push_back(q);
+ }
+ } else {
+ q->drawSelf(!_widgets[type]->_buffer, restore || _widgets[type]->_buffer);
+ delete q;
+ }
+}
+
void ThemeEngine::queueDDText(TextData type, TextColor color, const Common::Rect &r, const Common::String &text, bool restoreBg,
bool ellipsis, Graphics::TextAlign alignH, TextAlignVertical alignV, int deltax, const Common::Rect &drawableTextArea) {
@@ -881,6 +967,28 @@ void ThemeEngine::queueDDText(TextData type, TextColor color, const Common::Rect
}
}
+void ThemeEngine::queueDDTextClip(TextData type, TextColor color, const Common::Rect &r, const Common::Rect &clippingArea, const Common::String &text, bool restoreBg,
+ bool ellipsis, Graphics::TextAlign alignH, TextAlignVertical alignV, int deltax, const Common::Rect &drawableTextArea) {
+
+ if (_texts[type] == 0)
+ return;
+
+ Common::Rect area = r;
+ area.clip(_screen.w, _screen.h);
+ Common::Rect textArea = drawableTextArea;
+ if (textArea.isEmpty()) textArea = clippingArea;
+ else textArea.clip(clippingArea);
+
+ ThemeItemTextData *q = new ThemeItemTextData(this, _texts[type], _textColors[color], area, textArea, text, alignH, alignV, ellipsis, restoreBg, deltax);
+
+ if (_buffering) {
+ _screenQueue.push_back(q);
+ } else {
+ q->drawSelf(true, false);
+ delete q;
+ }
+}
+
void ThemeEngine::queueBitmap(const Graphics::Surface *bitmap, const Common::Rect &r, bool alpha) {
Common::Rect area = r;
@@ -896,7 +1004,20 @@ void ThemeEngine::queueBitmap(const Graphics::Surface *bitmap, const Common::Rec
}
}
+void ThemeEngine::queueBitmapClip(const Graphics::Surface *bitmap, const Common::Rect &r, const Common::Rect &clip, bool alpha) {
+
+ Common::Rect area = r;
+ area.clip(_screen.w, _screen.h);
+ ThemeItemBitmapClip *q = new ThemeItemBitmapClip(this, area, clip, bitmap, alpha);
+
+ if (_buffering) {
+ _screenQueue.push_back(q);
+ } else {
+ q->drawSelf(true, false);
+ delete q;
+ }
+}
/**********************************************************
* Widget drawing functions
@@ -920,6 +1041,25 @@ void ThemeEngine::drawButton(const Common::Rect &r, const Common::String &str, W
queueDDText(getTextData(dd), getTextColor(dd), r, str, false, true, _widgets[dd]->_textAlignH, _widgets[dd]->_textAlignV);
}
+void ThemeEngine::drawButtonClip(const Common::Rect &r, const Common::Rect &clippingRect, const Common::String &str, WidgetStateInfo state, uint16 hints) {
+ if (!ready())
+ return;
+
+ DrawData dd = kDDButtonIdle;
+
+ if (state == kStateEnabled)
+ dd = kDDButtonIdle;
+ else if (state == kStateHighlight)
+ dd = kDDButtonHover;
+ else if (state == kStateDisabled)
+ dd = kDDButtonDisabled;
+ else if (state == kStatePressed)
+ dd = kDDButtonPressed;
+
+ queueDDClip(dd, r, clippingRect, 0, hints & WIDGET_CLEARBG);
+ queueDDTextClip(getTextData(dd), getTextColor(dd), r, clippingRect, str, false, true, _widgets[dd]->_textAlignH, _widgets[dd]->_textAlignV);
+}
+
void ThemeEngine::drawLineSeparator(const Common::Rect &r, WidgetStateInfo state) {
if (!ready())
return;
@@ -927,6 +1067,13 @@ void ThemeEngine::drawLineSeparator(const Common::Rect &r, WidgetStateInfo state
queueDD(kDDSeparator, r);
}
+void ThemeEngine::drawLineSeparatorClip(const Common::Rect &r, const Common::Rect &clippingRect, WidgetStateInfo state) {
+ if (!ready())
+ return;
+
+ queueDDClip(kDDSeparator, r, clippingRect);
+}
+
void ThemeEngine::drawCheckbox(const Common::Rect &r, const Common::String &str, bool checked, WidgetStateInfo state) {
if (!ready())
return;
@@ -953,6 +1100,32 @@ void ThemeEngine::drawCheckbox(const Common::Rect &r, const Common::String &str,
queueDDText(getTextData(dd), getTextColor(dd), r2, str, true, false, _widgets[kDDCheckboxDefault]->_textAlignH, _widgets[dd]->_textAlignV);
}
+void ThemeEngine::drawCheckboxClip(const Common::Rect &r, const Common::Rect &clip, const Common::String &str, bool checked, WidgetStateInfo state) {
+ if (!ready())
+ return;
+
+ Common::Rect r2 = r;
+ DrawData dd = kDDCheckboxDefault;
+
+ if (checked)
+ dd = kDDCheckboxSelected;
+
+ if (state == kStateDisabled)
+ dd = kDDCheckboxDisabled;
+
+ const int checkBoxSize = MIN((int)r.height(), getFontHeight());
+
+ r2.bottom = r2.top + checkBoxSize;
+ r2.right = r2.left + checkBoxSize;
+
+ queueDDClip(dd, r2, clip);
+
+ r2.left = r2.right + checkBoxSize;
+ r2.right = r.right;
+
+ queueDDTextClip(getTextData(dd), getTextColor(dd), r2, clip, str, true, false, _widgets[kDDCheckboxDefault]->_textAlignH, _widgets[dd]->_textAlignV);
+}
+
void ThemeEngine::drawRadiobutton(const Common::Rect &r, const Common::String &str, bool checked, WidgetStateInfo state) {
if (!ready())
return;
@@ -979,6 +1152,32 @@ void ThemeEngine::drawRadiobutton(const Common::Rect &r, const Common::String &s
queueDDText(getTextData(dd), getTextColor(dd), r2, str, true, false, _widgets[kDDRadiobuttonDefault]->_textAlignH, _widgets[dd]->_textAlignV);
}
+void ThemeEngine::drawRadiobuttonClip(const Common::Rect &r, const Common::Rect &clippingRect, const Common::String &str, bool checked, WidgetStateInfo state) {
+ if (!ready())
+ return;
+
+ Common::Rect r2 = r;
+ DrawData dd = kDDRadiobuttonDefault;
+
+ if (checked)
+ dd = kDDRadiobuttonSelected;
+
+ if (state == kStateDisabled)
+ dd = kDDRadiobuttonDisabled;
+
+ const int checkBoxSize = MIN((int)r.height(), getFontHeight());
+
+ r2.bottom = r2.top + checkBoxSize;
+ r2.right = r2.left + checkBoxSize;
+
+ queueDDClip(dd, r2, clippingRect);
+
+ r2.left = r2.right + checkBoxSize;
+ r2.right = r.right;
+
+ queueDDTextClip(getTextData(dd), getTextColor(dd), r2, clippingRect, str, true, false, _widgets[kDDRadiobuttonDefault]->_textAlignH, _widgets[dd]->_textAlignV);
+}
+
void ThemeEngine::drawSlider(const Common::Rect &r, int width, WidgetStateInfo state) {
if (!ready())
return;
@@ -999,6 +1198,26 @@ void ThemeEngine::drawSlider(const Common::Rect &r, int width, WidgetStateInfo s
queueDD(dd, r2);
}
+void ThemeEngine::drawSliderClip(const Common::Rect &r, const Common::Rect &clip, int width, WidgetStateInfo state) {
+ if (!ready())
+ return;
+
+ DrawData dd = kDDSliderFull;
+
+ if (state == kStateHighlight)
+ dd = kDDSliderHover;
+ else if (state == kStateDisabled)
+ dd = kDDSliderDisabled;
+
+ Common::Rect r2 = r;
+ r2.setWidth(MIN((int16)width, r.width()));
+ // r2.top++; r2.bottom--; r2.left++; r2.right--;
+
+ drawWidgetBackgroundClip(r, clip, 0, kWidgetBackgroundSlider, kStateEnabled);
+
+ queueDDClip(dd, r2, clip);
+}
+
void ThemeEngine::drawScrollbar(const Common::Rect &r, int sliderY, int sliderHeight, ScrollbarState scrollState, WidgetStateInfo state) {
if (!ready())
return;
@@ -1020,11 +1239,34 @@ void ThemeEngine::drawScrollbar(const Common::Rect &r, int sliderY, int sliderHe
r2.top += sliderY;
r2.bottom = r2.top + sliderHeight;
- r2.top += r.width() / 5;
- r2.bottom -= r.width() / 5;
+ //r2.top += r.width() / 5;
+ //r2.bottom -= r.width() / 5;
queueDD(scrollState == kScrollbarStateSlider ? kDDScrollbarHandleHover : kDDScrollbarHandleIdle, r2);
}
+void ThemeEngine::drawScrollbarClip(const Common::Rect &r, const Common::Rect &clippingRect, int sliderY, int sliderHeight, ScrollbarState scrollState, WidgetStateInfo state) {
+ if (!ready())
+ return;
+
+ queueDDClip(kDDScrollbarBase, r, clippingRect);
+
+ Common::Rect r2 = r;
+ const int buttonExtra = (r.width() * 120) / 100;
+
+ r2.bottom = r2.top + buttonExtra;
+ queueDDClip(scrollState == kScrollbarStateUp ? kDDScrollbarButtonHover : kDDScrollbarButtonIdle, r2, clippingRect, Graphics::VectorRenderer::kTriangleUp);
+
+ r2.translate(0, r.height() - r2.height());
+ queueDDClip(scrollState == kScrollbarStateDown ? kDDScrollbarButtonHover : kDDScrollbarButtonIdle, r2, clippingRect, Graphics::VectorRenderer::kTriangleDown);
+
+ r2 = r;
+ r2.left += 1;
+ r2.right -= 1;
+ r2.top += sliderY;
+ r2.bottom = r2.top + sliderHeight;
+ queueDDClip(scrollState == kScrollbarStateSlider ? kDDScrollbarHandleHover : kDDScrollbarHandleIdle, r2, clippingRect);
+}
+
void ThemeEngine::drawDialogBackground(const Common::Rect &r, DialogBackground bgtype, WidgetStateInfo state) {
if (!ready())
return;
@@ -1052,6 +1294,33 @@ void ThemeEngine::drawDialogBackground(const Common::Rect &r, DialogBackground b
}
}
+void ThemeEngine::drawDialogBackgroundClip(const Common::Rect &r, const Common::Rect &clip, DialogBackground bgtype, WidgetStateInfo state) {
+ if (!ready())
+ return;
+
+ switch (bgtype) {
+ case kDialogBackgroundMain:
+ queueDDClip(kDDMainDialogBackground, r, clip);
+ break;
+
+ case kDialogBackgroundSpecial:
+ queueDDClip(kDDSpecialColorBackground, r, clip);
+ break;
+
+ case kDialogBackgroundPlain:
+ queueDDClip(kDDPlainColorBackground, r, clip);
+ break;
+
+ case kDialogBackgroundTooltip:
+ queueDDClip(kDDTooltipBackground, r, clip);
+ break;
+
+ case kDialogBackgroundDefault:
+ queueDDClip(kDDDefaultBackground, r, clip);
+ break;
+ }
+}
+
void ThemeEngine::drawCaret(const Common::Rect &r, bool erase, WidgetStateInfo state) {
if (!ready())
return;
@@ -1063,6 +1332,17 @@ void ThemeEngine::drawCaret(const Common::Rect &r, bool erase, WidgetStateInfo s
queueDD(kDDCaret, r);
}
+void ThemeEngine::drawCaretClip(const Common::Rect &r, const Common::Rect &clip, bool erase, WidgetStateInfo state) {
+ if (!ready())
+ return;
+
+ if (erase) {
+ restoreBackground(r);
+ addDirtyRect(r);
+ } else
+ queueDDClip(kDDCaret, r, clip);
+}
+
void ThemeEngine::drawPopUpWidget(const Common::Rect &r, const Common::String &sel, int deltax, WidgetStateInfo state, Graphics::TextAlign align) {
if (!ready())
return;
@@ -1084,6 +1364,27 @@ void ThemeEngine::drawPopUpWidget(const Common::Rect &r, const Common::String &s
}
}
+void ThemeEngine::drawPopUpWidgetClip(const Common::Rect &r, const Common::Rect &clip, const Common::String &sel, int deltax, WidgetStateInfo state, Graphics::TextAlign align) {
+ if (!ready())
+ return;
+
+ DrawData dd = kDDPopUpIdle;
+
+ if (state == kStateEnabled)
+ dd = kDDPopUpIdle;
+ else if (state == kStateHighlight)
+ dd = kDDPopUpHover;
+ else if (state == kStateDisabled)
+ dd = kDDPopUpDisabled;
+
+ queueDDClip(dd, r, clip);
+
+ if (!sel.empty()) {
+ Common::Rect text(r.left + 3, r.top + 1, r.right - 10, r.bottom);
+ queueDDTextClip(getTextData(dd), getTextColor(dd), text, clip, sel, true, false, _widgets[dd]->_textAlignH, _widgets[dd]->_textAlignV, deltax);
+ }
+}
+
void ThemeEngine::drawSurface(const Common::Rect &r, const Graphics::Surface &surface, WidgetStateInfo state, int alpha, bool themeTrans) {
if (!ready())
return;
@@ -1091,6 +1392,13 @@ void ThemeEngine::drawSurface(const Common::Rect &r, const Graphics::Surface &su
queueBitmap(&surface, r, themeTrans);
}
+void ThemeEngine::drawSurfaceClip(const Common::Rect &r, const Common::Rect &clip, const Graphics::Surface &surface, WidgetStateInfo state, int alpha, bool themeTrans) {
+ if (!ready())
+ return;
+
+ queueBitmapClip(&surface, r, clip, themeTrans);
+}
+
void ThemeEngine::drawWidgetBackground(const Common::Rect &r, uint16 hints, WidgetBackground background, WidgetStateInfo state) {
if (!ready())
return;
@@ -1114,6 +1422,29 @@ void ThemeEngine::drawWidgetBackground(const Common::Rect &r, uint16 hints, Widg
}
}
+void ThemeEngine::drawWidgetBackgroundClip(const Common::Rect &r, const Common::Rect &clip, uint16 hints, WidgetBackground background, WidgetStateInfo state) {
+ if (!ready())
+ return;
+
+ switch (background) {
+ case kWidgetBackgroundBorderSmall:
+ queueDDClip(kDDWidgetBackgroundSmall, r, clip);
+ break;
+
+ case kWidgetBackgroundEditText:
+ queueDDClip(kDDWidgetBackgroundEditText, r, clip);
+ break;
+
+ case kWidgetBackgroundSlider:
+ queueDDClip(kDDWidgetBackgroundSlider, r, clip);
+ break;
+
+ default:
+ queueDDClip(kDDWidgetBackgroundDefault, r, clip);
+ break;
+ }
+}
+
void ThemeEngine::drawTab(const Common::Rect &r, int tabHeight, int tabWidth, const Common::Array<Common::String> &tabs, int active, uint16 hints, int titleVPad, WidgetStateInfo state) {
if (!ready())
return;
@@ -1142,6 +1473,34 @@ void ThemeEngine::drawTab(const Common::Rect &r, int tabHeight, int tabWidth, co
}
}
+void ThemeEngine::drawTabClip(const Common::Rect &r, const Common::Rect &clip, int tabHeight, int tabWidth, const Common::Array<Common::String> &tabs, int active, uint16 hints, int titleVPad, WidgetStateInfo state) {
+ if (!ready())
+ return;
+
+ queueDDClip(kDDTabBackground, Common::Rect(r.left, r.top, r.right, r.top + tabHeight), clip);
+
+ for (int i = 0; i < (int)tabs.size(); ++i) {
+ if (i == active)
+ continue;
+
+ if (r.left + i * tabWidth > r.right || r.left + (i + 1) * tabWidth > r.right)
+ continue;
+
+ Common::Rect tabRect(r.left + i * tabWidth, r.top, r.left + (i + 1) * tabWidth, r.top + tabHeight);
+ queueDDClip(kDDTabInactive, tabRect, clip);
+ queueDDTextClip(getTextData(kDDTabInactive), getTextColor(kDDTabInactive), tabRect, clip, tabs[i], false, false, _widgets[kDDTabInactive]->_textAlignH, _widgets[kDDTabInactive]->_textAlignV);
+ }
+
+ if (active >= 0 &&
+ (r.left + active * tabWidth < r.right) && (r.left + (active + 1) * tabWidth < r.right)) {
+ Common::Rect tabRect(r.left + active * tabWidth, r.top, r.left + (active + 1) * tabWidth, r.top + tabHeight);
+ const uint16 tabLeft = active * tabWidth;
+ const uint16 tabRight = MAX(r.right - tabRect.right, 0);
+ queueDDClip(kDDTabActive, tabRect, clip, (tabLeft << 16) | (tabRight & 0xFFFF));
+ queueDDTextClip(getTextData(kDDTabActive), getTextColor(kDDTabActive), tabRect, clip, tabs[active], false, false, _widgets[kDDTabActive]->_textAlignH, _widgets[kDDTabActive]->_textAlignV);
+ }
+}
+
void ThemeEngine::drawText(const Common::Rect &r, const Common::String &str, WidgetStateInfo state, Graphics::TextAlign align, TextInversionState inverted, int deltax, bool useEllipsis, FontStyle font, FontColor color, bool restore, const Common::Rect &drawableTextArea) {
if (!ready())
return;
@@ -1215,6 +1574,79 @@ void ThemeEngine::drawText(const Common::Rect &r, const Common::String &str, Wid
queueDDText(textId, colorId, r, str, restore, useEllipsis, align, kTextAlignVCenter, deltax, drawableTextArea);
}
+void ThemeEngine::drawTextClip(const Common::Rect &r, const Common::Rect &clippingArea, const Common::String &str, WidgetStateInfo state, Graphics::TextAlign align, TextInversionState inverted, int deltax, bool useEllipsis, FontStyle font, FontColor color, bool restore, const Common::Rect &drawableTextArea) {
+ if (!ready())
+ return;
+
+ TextColor colorId = kTextColorMAX;
+
+ switch (color) {
+ case kFontColorNormal:
+ if (inverted) {
+ colorId = kTextColorNormalInverted;
+ } else {
+ switch (state) {
+ case kStateDisabled:
+ colorId = kTextColorNormalDisabled;
+ break;
+
+ case kStateHighlight:
+ colorId = kTextColorNormalHover;
+ break;
+
+ case kStateEnabled:
+ case kStatePressed:
+ colorId = kTextColorNormal;
+ break;
+ }
+ }
+ break;
+
+ case kFontColorAlternate:
+ if (inverted) {
+ colorId = kTextColorAlternativeInverted;
+ } else {
+ switch (state) {
+ case kStateDisabled:
+ colorId = kTextColorAlternativeDisabled;
+ break;
+
+ case kStateHighlight:
+ colorId = kTextColorAlternativeHover;
+ break;
+
+ case kStateEnabled:
+ case kStatePressed:
+ colorId = kTextColorAlternative;
+ break;
+ }
+ }
+ break;
+
+ default:
+ return;
+ }
+
+ TextData textId = fontStyleToData(font);
+
+ switch (inverted) {
+ case kTextInversion:
+ queueDDClip(kDDTextSelectionBackground, r, clippingArea);
+ restore = false;
+ break;
+
+ case kTextInversionFocus:
+ queueDDClip(kDDTextSelectionFocusBackground, r, clippingArea);
+ restore = false;
+ break;
+
+ default:
+ break;
+ }
+
+ queueDDTextClip(textId, colorId, r, clippingArea, str, restore, useEllipsis, align, kTextAlignVCenter, deltax, drawableTextArea);
+}
+
void ThemeEngine::drawChar(const Common::Rect &r, byte ch, const Graphics::Font *font, WidgetStateInfo state, FontColor color) {
if (!ready())
return;
@@ -1229,6 +1661,21 @@ void ThemeEngine::drawChar(const Common::Rect &r, byte ch, const Graphics::Font
addDirtyRect(charArea);
}
+void ThemeEngine::drawCharClip(const Common::Rect &r, const Common::Rect &clip, byte ch, const Graphics::Font *font, WidgetStateInfo state, FontColor color) {
+ if (!ready())
+ return;
+
+ Common::Rect charArea = r;
+ charArea.clip(_screen.w, _screen.h);
+ if (!clip.isEmpty()) charArea.clip(clip);
+
+ uint32 rgbColor = _overlayFormat.RGBToColor(_textColors[color]->r, _textColors[color]->g, _textColors[color]->b);
+
+ restoreBackground(charArea);
+ font->drawChar(&_screen, ch, charArea.left, charArea.top, rgbColor);
+ addDirtyRect(charArea);
+}
+
void ThemeEngine::debugWidgetPosition(const char *name, const Common::Rect &r) {
_font->drawString(&_screen, name, r.left, r.top, r.width(), 0xFFFF, Graphics::kTextAlignRight, 0, true);
_screen.hLine(r.left, r.top, r.right, 0xFFFF);
diff --git a/gui/ThemeEngine.h b/gui/ThemeEngine.h
index a5ef49c78b..3c259b4f9d 100644
--- a/gui/ThemeEngine.h
+++ b/gui/ThemeEngine.h
@@ -340,42 +340,67 @@ public:
void drawWidgetBackground(const Common::Rect &r, uint16 hints,
WidgetBackground background = kWidgetBackgroundPlain, WidgetStateInfo state = kStateEnabled);
+ void drawWidgetBackgroundClip(const Common::Rect &r, const Common::Rect &clippingArea, uint16 hints,
+ WidgetBackground background = kWidgetBackgroundPlain, WidgetStateInfo state = kStateEnabled);
void drawButton(const Common::Rect &r, const Common::String &str,
WidgetStateInfo state = kStateEnabled, uint16 hints = 0);
+ void drawButtonClip(const Common::Rect &r, const Common::Rect &clippingRect, const Common::String &str,
+ WidgetStateInfo state = kStateEnabled, uint16 hints = 0);
void drawSurface(const Common::Rect &r, const Graphics::Surface &surface,
- WidgetStateInfo state = kStateEnabled, int alpha = 256, bool themeTrans = false);
+ WidgetStateInfo state = kStateEnabled, int alpha = 255, bool themeTrans = false);
+ void drawSurfaceClip(const Common::Rect &r, const Common::Rect &clippingRect, const Graphics::Surface &surface,
+ WidgetStateInfo state = kStateEnabled, int alpha = 255, bool themeTrans = false);
void drawSlider(const Common::Rect &r, int width,
WidgetStateInfo state = kStateEnabled);
+ void drawSliderClip(const Common::Rect &r, const Common::Rect &clippingRect, int width,
+ WidgetStateInfo state = kStateEnabled);
void drawCheckbox(const Common::Rect &r, const Common::String &str,
bool checked, WidgetStateInfo state = kStateEnabled);
+ void drawCheckboxClip(const Common::Rect &r, const Common::Rect &clippingRect, const Common::String &str,
+ bool checked, WidgetStateInfo state = kStateEnabled);
void drawRadiobutton(const Common::Rect &r, const Common::String &str,
bool checked, WidgetStateInfo state = kStateEnabled);
+ void drawRadiobuttonClip(const Common::Rect &r, const Common::Rect &clippingRect, const Common::String &str,
+ bool checked, WidgetStateInfo state = kStateEnabled);
void drawTab(const Common::Rect &r, int tabHeight, int tabWidth,
const Common::Array<Common::String> &tabs, int active, uint16 hints,
int titleVPad, WidgetStateInfo state = kStateEnabled);
+ void drawTabClip(const Common::Rect &r, const Common::Rect &clippingRect, int tabHeight, int tabWidth,
+ const Common::Array<Common::String> &tabs, int active, uint16 hints,
+ int titleVPad, WidgetStateInfo state = kStateEnabled);
void drawScrollbar(const Common::Rect &r, int sliderY, int sliderHeight,
ScrollbarState, WidgetStateInfo state = kStateEnabled);
+ void drawScrollbarClip(const Common::Rect &r, const Common::Rect &clippingRect, int sliderY, int sliderHeight,
+ ScrollbarState scrollState, WidgetStateInfo state = kStateEnabled);
void drawPopUpWidget(const Common::Rect &r, const Common::String &sel,
int deltax, WidgetStateInfo state = kStateEnabled, Graphics::TextAlign align = Graphics::kTextAlignLeft);
+ void drawPopUpWidgetClip(const Common::Rect &r, const Common::Rect &clippingArea, const Common::String &sel,
+ int deltax, WidgetStateInfo state = kStateEnabled, Graphics::TextAlign align = Graphics::kTextAlignLeft);
void drawCaret(const Common::Rect &r, bool erase,
WidgetStateInfo state = kStateEnabled);
+ void drawCaretClip(const Common::Rect &r, const Common::Rect &clip, bool erase,
+ WidgetStateInfo state = kStateEnabled);
void drawLineSeparator(const Common::Rect &r, WidgetStateInfo state = kStateEnabled);
+ void drawLineSeparatorClip(const Common::Rect &r, const Common::Rect &clippingArea, WidgetStateInfo state = kStateEnabled);
void drawDialogBackground(const Common::Rect &r, DialogBackground type, WidgetStateInfo state = kStateEnabled);
+ void drawDialogBackgroundClip(const Common::Rect &r, const Common::Rect &clip, DialogBackground type, WidgetStateInfo state = kStateEnabled);
void drawText(const Common::Rect &r, const Common::String &str, WidgetStateInfo state = kStateEnabled, Graphics::TextAlign align = Graphics::kTextAlignCenter, TextInversionState inverted = kTextInversionNone, int deltax = 0, bool useEllipsis = true, FontStyle font = kFontStyleBold, FontColor color = kFontColorNormal, bool restore = true, const Common::Rect &drawableTextArea = Common::Rect(0, 0, 0, 0));
+ void drawTextClip(const Common::Rect &r, const Common::Rect &clippingArea, const Common::String &str, WidgetStateInfo state = kStateEnabled, Graphics::TextAlign align = Graphics::kTextAlignCenter, TextInversionState inverted = kTextInversionNone, int deltax = 0, bool useEllipsis = true, FontStyle font = kFontStyleBold, FontColor color = kFontColorNormal, bool restore = true, const Common::Rect &drawableTextArea = Common::Rect(0, 0, 0, 0));
void drawChar(const Common::Rect &r, byte ch, const Graphics::Font *font, WidgetStateInfo state = kStateEnabled, FontColor color = kFontColorNormal);
+ void drawCharClip(const Common::Rect &r, const Common::Rect &clippingArea, byte ch, const Graphics::Font *font, WidgetStateInfo state = kStateEnabled, FontColor color = kFontColorNormal);
//@}
@@ -584,9 +609,13 @@ protected:
* This function is called from all the Widget Drawing methods.
*/
void queueDD(DrawData type, const Common::Rect &r, uint32 dynamic = 0, bool restore = false);
+ void queueDDClip(DrawData type, const Common::Rect &r, const Common::Rect &clippingRect, uint32 dynamic = 0, bool restore = false);
void queueDDText(TextData type, TextColor color, const Common::Rect &r, const Common::String &text, bool restoreBg,
bool elipsis, Graphics::TextAlign alignH = Graphics::kTextAlignLeft, TextAlignVertical alignV = kTextAlignVTop, int deltax = 0, const Common::Rect &drawableTextArea = Common::Rect(0, 0, 0, 0));
+ void queueDDTextClip(TextData type, TextColor color, const Common::Rect &r, const Common::Rect &clippingRect, const Common::String &text, bool restoreBg,
+ bool elipsis, Graphics::TextAlign alignH = Graphics::kTextAlignLeft, TextAlignVertical alignV = kTextAlignVTop, int deltax = 0, const Common::Rect &drawableTextArea = Common::Rect(0, 0, 0, 0));
void queueBitmap(const Graphics::Surface *bitmap, const Common::Rect &r, bool alpha);
+ void queueBitmapClip(const Graphics::Surface *bitmap, const Common::Rect &clippingRect, const Common::Rect &r, bool alpha);
/**
* DEBUG: Draws a white square and writes some text next to it.
diff --git a/gui/ThemeEval.cpp b/gui/ThemeEval.cpp
index 9d57d2408b..5255587089 100644
--- a/gui/ThemeEval.cpp
+++ b/gui/ThemeEval.cpp
@@ -91,10 +91,18 @@ void ThemeEval::addWidget(const Common::String &name, int w, int h, const Common
typeAlign = (Graphics::TextAlign)getVar("Globals." + type + ".Align", Graphics::kTextAlignInvalid);
}
- ThemeLayoutWidget *widget = new ThemeLayoutWidget(_curLayout.top(), name,
- typeW == -1 ? w : typeW,
- typeH == -1 ? h : typeH,
- typeAlign == Graphics::kTextAlignInvalid ? align : typeAlign);
+ ThemeLayoutWidget *widget;
+ if (type == "TabWidget")
+ widget = new ThemeLayoutTabWidget(_curLayout.top(), name,
+ typeW == -1 ? w : typeW,
+ typeH == -1 ? h : typeH,
+ typeAlign == Graphics::kTextAlignInvalid ? align : typeAlign,
+ getVar("Globals.TabWidget.Tab.Height", 0));
+ else
+ widget = new ThemeLayoutWidget(_curLayout.top(), name,
+ typeW == -1 ? w : typeW,
+ typeH == -1 ? h : typeH,
+ typeAlign == Graphics::kTextAlignInvalid ? align : typeAlign);
_curLayout.top()->addChild(widget);
setVar(_curDialog + "." + name + ".Enabled", enabled ? 1 : 0);
diff --git a/gui/ThemeLayout.h b/gui/ThemeLayout.h
index c4d7e672dd..e738002aa6 100644
--- a/gui/ThemeLayout.h
+++ b/gui/ThemeLayout.h
@@ -45,7 +45,8 @@ public:
kLayoutMain,
kLayoutVertical,
kLayoutHorizontal,
- kLayoutWidget
+ kLayoutWidget,
+ kLayoutTabWidget
};
ThemeLayout(ThemeLayout *p) :
@@ -223,6 +224,41 @@ protected:
Common::String _name;
};
+class ThemeLayoutTabWidget : public ThemeLayoutWidget {
+ int _tabHeight;
+
+public:
+ ThemeLayoutTabWidget(ThemeLayout *p, const Common::String &name, int16 w, int16 h, Graphics::TextAlign align, int tabHeight):
+ ThemeLayoutWidget(p, name, w, h, align) {
+ _tabHeight = tabHeight;
+ }
+
+ void reflowLayout() {
+ for (uint i = 0; i < _children.size(); ++i) {
+ _children[i]->resetLayout();
+ _children[i]->reflowLayout();
+ }
+ }
+
+ virtual bool getWidgetData(const Common::String &name, int16 &x, int16 &y, uint16 &w, uint16 &h) {
+ if (ThemeLayoutWidget::getWidgetData(name, x, y, w, h)) {
+ h -= _tabHeight;
+ return true;
+ }
+
+ return false;
+ }
+
+protected:
+ LayoutType getLayoutType() { return kLayoutTabWidget; }
+
+ ThemeLayout *makeClone(ThemeLayout *newParent) {
+ ThemeLayoutTabWidget *n = new ThemeLayoutTabWidget(*this);
+ n->_parent = newParent;
+ return n;
+ }
+};
+
class ThemeLayoutSpacing : public ThemeLayout {
public:
ThemeLayoutSpacing(ThemeLayout *p, int size) : ThemeLayout(p) {
diff --git a/gui/credits.h b/gui/credits.h
index 8a0cd18da7..c2c4c84ec6 100644
--- a/gui/credits.h
+++ b/gui/credits.h
@@ -128,6 +128,7 @@ static const char *credits[] = {
"C1""Drascula",
"C0""Filippos Karapetis",
"C0""Pawel Kolodziejski",
+"C0""Thierry Crozat",
"",
"C1""DreamWeb",
"A0""Torbjorn Andersson",
diff --git a/gui/dialog.cpp b/gui/dialog.cpp
index 50b7755bb3..523227a237 100644
--- a/gui/dialog.cpp
+++ b/gui/dialog.cpp
@@ -113,13 +113,13 @@ void Dialog::reflowLayout() {
// changed, so any cached image may be invalid. The subsequent redraw
// should be treated as the very first draw.
+ GuiObject::reflowLayout();
+
Widget *w = _firstWidget;
while (w) {
w->reflowLayout();
w = w->_next;
}
-
- GuiObject::reflowLayout();
}
void Dialog::lostFocus() {
diff --git a/gui/gui-manager.cpp b/gui/gui-manager.cpp
index 3ce8bee020..9acd9434ff 100644
--- a/gui/gui-manager.cpp
+++ b/gui/gui-manager.cpp
@@ -564,6 +564,12 @@ void GuiManager::processEvent(const Common::Event &event, Dialog *const activeDi
}
}
+void GuiManager::doFullRedraw() {
+ _redrawStatus = kRedrawFull;
+ redraw();
+ _system->updateScreen();
+}
+
void GuiManager::giveFocusToDialog(Dialog *dialog) {
int16 dialogX = _globalMousePosition.x - dialog->_x;
int16 dialogY = _globalMousePosition.y - dialog->_y;
diff --git a/gui/gui-manager.h b/gui/gui-manager.h
index 35779215b2..4dc9af95fb 100644
--- a/gui/gui-manager.h
+++ b/gui/gui-manager.h
@@ -73,6 +73,7 @@ public:
void runLoop();
void processEvent(const Common::Event &event, Dialog *const activeDialog);
+ void doFullRedraw();
bool isActive() const { return ! _dialogStack.empty(); }
diff --git a/gui/module.mk b/gui/module.mk
index 9e821e71a7..6cbc63d24d 100644
--- a/gui/module.mk
+++ b/gui/module.mk
@@ -30,6 +30,7 @@ MODULE_OBJS := \
widgets/list.o \
widgets/popup.o \
widgets/scrollbar.o \
+ widgets/scrollcontainer.o \
widgets/tab.o
# HACK: create_project's XCode generator relies on the following ifdef
diff --git a/gui/object.cpp b/gui/object.cpp
index ef2cc9d6e0..de66d95492 100644
--- a/gui/object.cpp
+++ b/gui/object.cpp
@@ -44,19 +44,6 @@ void GuiObject::reflowLayout() {
if (!g_gui.xmlEval()->getWidgetData(_name, _x, _y, _w, _h)) {
error("Could not load widget position for '%s'", _name.c_str());
}
-
- if (_x < 0)
- error("Widget <%s> has x < 0 (%d)", _name.c_str(), _x);
- if (_x >= g_gui.getWidth())
- error("Widget <%s> has x > %d (%d)", _name.c_str(), g_gui.getWidth(), _x);
- if (_x + _w > g_gui.getWidth())
- error("Widget <%s> has x + w > %d (%d)", _name.c_str(), g_gui.getWidth(), _x + _w);
- if (_y < 0)
- error("Widget <%s> has y < 0 (%d)", _name.c_str(), _y);
- if (_y >= g_gui.getHeight())
- error("Widget <%s> has y > %d (%d)", _name.c_str(), g_gui.getHeight(), _y);
- if (_y + _h > g_gui.getHeight())
- error("Widget <%s> has y + h > %d (%d)", _name.c_str(), g_gui.getHeight(), _y + _h);
}
}
diff --git a/gui/themes/default.inc b/gui/themes/default.inc
index a23e2f4c30..c0ea733de8 100644
--- a/gui/themes/default.inc
+++ b/gui/themes/default.inc
@@ -798,7 +798,7 @@ const char *defaultXML1 = "<?xml version = '1.0'?>"
"</dialog>"
"<dialog name='GlobalOptions' overlays='Dialog.Launcher.GameList' shading='dim'>"
"<layout type='vertical' padding='0,0,0,0'>"
-"<widget name='TabWidget'/>"
+"<widget name='TabWidget' type='TabWidget'/>"
"<layout type='horizontal' padding='16,16,16,16'>"
"<space/>"
"<widget name='Cancel' "
@@ -1118,7 +1118,7 @@ const char *defaultXML1 = "<?xml version = '1.0'?>"
"</dialog>"
"<dialog name='GameOptions' overlays='Dialog.Launcher.GameList' shading='dim'>"
"<layout type='vertical' padding='0,0,0,0' spacing='16'>"
-"<widget name='TabWidget'/>"
+"<widget name='TabWidget' type='TabWidget'/>"
"<layout type='horizontal' padding='16,16,16,4'>"
"<space/>"
"<widget name='Cancel' "
@@ -1405,7 +1405,7 @@ const char *defaultXML1 = "<?xml version = '1.0'?>"
"</dialog>"
"<dialog name='FluidSynthSettings' overlays='GlobalOptions' shading='dim'>"
"<layout type='vertical' padding='0,0,0,0'>"
-"<widget name='TabWidget'/>"
+"<widget name='TabWidget' type='TabWidget'/>"
"<layout type='horizontal' padding='16,16,16,16'>"
"<space/>"
"<widget name='ResetSettings' "
@@ -1975,7 +1975,7 @@ const char *defaultXML1 = "<?xml version = '1.0'?>"
"padding='0,0,2,0' "
"/>"
"<widget name='TabWidget.Body' "
-"padding='0,0,0,-8' "
+"padding='0,0,0,0' "
"/>"
"<widget name='TabWidget.NavButton' "
"size='32,18' "
@@ -2093,7 +2093,7 @@ const char *defaultXML1 = "<?xml version = '1.0'?>"
"</dialog>"
"<dialog name='GlobalOptions' overlays='screen' inset='16' shading='dim'>"
"<layout type='vertical' padding='0,0,0,0'>"
-"<widget name='TabWidget'/>"
+"<widget name='TabWidget' type='TabWidget'/>"
"<layout type='horizontal' padding='8,8,8,8'>"
"<space/>"
"<widget name='Cancel' "
@@ -2420,7 +2420,7 @@ const char *defaultXML1 = "<?xml version = '1.0'?>"
"</dialog>"
"<dialog name='GameOptions' overlays='screen' inset='16' shading='dim'>"
"<layout type='vertical' padding='0,0,0,0' spacing='16'>"
-"<widget name='TabWidget'/>"
+"<widget name='TabWidget' type='TabWidget'/>"
"<layout type='horizontal' padding='8,8,8,8'>"
"<space/>"
"<widget name='Cancel' "
@@ -2716,7 +2716,7 @@ const char *defaultXML1 = "<?xml version = '1.0'?>"
"</dialog>"
"<dialog name='FluidSynthSettings' overlays='GlobalOptions' shading='dim'>"
"<layout type='vertical' padding='0,0,0,0'>"
-"<widget name='TabWidget'/>"
+"<widget name='TabWidget' type='TabWidget'/>"
"<layout type='horizontal' padding='8,8,8,8'>"
"<space/>"
"<widget name='ResetSettings' "
diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip
index 43fcea12fd..561f2a5dd3 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 65724d9faf..5172326859 100644
--- a/gui/themes/scummclassic/classic_layout.stx
+++ b/gui/themes/scummclassic/classic_layout.stx
@@ -222,7 +222,7 @@
<dialog name = 'GlobalOptions' overlays = 'Dialog.Launcher.GameList' shading = 'dim'>
<layout type = 'vertical' padding = '0, 0, 0, 0'>
- <widget name = 'TabWidget'/>
+ <widget name = 'TabWidget' type = 'TabWidget'/>
<layout type = 'horizontal' padding = '16, 16, 16, 16'>
<space/>
<widget name = 'Cancel'
@@ -551,7 +551,7 @@
<dialog name = 'GameOptions' overlays = 'Dialog.Launcher.GameList' shading = 'dim'>
<layout type = 'vertical' padding = '0, 0, 0, 0' spacing = '16'>
- <widget name = 'TabWidget'/>
+ <widget name = 'TabWidget' type = 'TabWidget'/>
<layout type = 'horizontal' padding = '16, 16, 16, 4'>
<space/>
<widget name = 'Cancel'
@@ -850,7 +850,7 @@
<dialog name = 'FluidSynthSettings' overlays = 'GlobalOptions' shading = 'dim'>
<layout type = 'vertical' padding = '0, 0, 0, 0'>
- <widget name = 'TabWidget'/>
+ <widget name = 'TabWidget' type = 'TabWidget'/>
<layout type = 'horizontal' padding = '16, 16, 16, 16'>
<space/>
<widget name = 'ResetSettings'
diff --git a/gui/themes/scummclassic/classic_layout_lowres.stx b/gui/themes/scummclassic/classic_layout_lowres.stx
index f73f6e864b..0013b91ee2 100644
--- a/gui/themes/scummclassic/classic_layout_lowres.stx
+++ b/gui/themes/scummclassic/classic_layout_lowres.stx
@@ -97,7 +97,7 @@
padding = '0, 0, 2, 0'
/>
<widget name = 'TabWidget.Body'
- padding = '0, 0, 0, -8'
+ padding = '0, 0, 0, 0'
/>
<widget name = 'TabWidget.NavButton'
size = '32, 18'
@@ -219,7 +219,7 @@
<dialog name = 'GlobalOptions' overlays = 'screen' inset = '16' shading = 'dim'>
<layout type = 'vertical' padding = '0, 0, 0, 0'>
- <widget name = 'TabWidget'/>
+ <widget name = 'TabWidget' type = 'TabWidget'/>
<layout type = 'horizontal' padding = '8, 8, 8, 8'>
<space/>
<widget name = 'Cancel'
@@ -556,7 +556,7 @@
<dialog name = 'GameOptions' overlays = 'screen' inset = '16' shading = 'dim'>
<layout type = 'vertical' padding = '0, 0, 0, 0' spacing = '16'>
- <widget name = 'TabWidget'/>
+ <widget name = 'TabWidget' type = 'TabWidget'/>
<layout type = 'horizontal' padding = '8, 8, 8, 8'>
<space/>
<widget name = 'Cancel'
@@ -863,7 +863,7 @@
<dialog name = 'FluidSynthSettings' overlays = 'GlobalOptions' shading = 'dim'>
<layout type = 'vertical' padding = '0, 0, 0, 0'>
- <widget name = 'TabWidget'/>
+ <widget name = 'TabWidget' type = 'TabWidget'/>
<layout type = 'horizontal' padding = '8, 8, 8, 8'>
<space/>
<widget name = 'ResetSettings'
diff --git a/gui/themes/scummmodern.zip b/gui/themes/scummmodern.zip
index 70f7672c57..d80c481ffc 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 c73ffa1f08..026fa7bc64 100644
--- a/gui/themes/scummmodern/scummmodern_layout.stx
+++ b/gui/themes/scummmodern/scummmodern_layout.stx
@@ -236,7 +236,7 @@
<dialog name = 'GlobalOptions' overlays = 'Dialog.Launcher.GameList' shading = 'dim'>
<layout type = 'vertical' padding = '0, 0, 0, 0'>
- <widget name = 'TabWidget'/>
+ <widget name = 'TabWidget' type = 'TabWidget'/>
<layout type = 'horizontal' padding = '16, 16, 16, 16'>
<space/>
<widget name = 'Cancel'
@@ -565,7 +565,7 @@
<dialog name = 'GameOptions' overlays = 'Dialog.Launcher.GameList' shading = 'dim'>
<layout type = 'vertical' padding = '0, 0, 0, 0' spacing = '16'>
- <widget name = 'TabWidget'/>
+ <widget name = 'TabWidget' type = 'TabWidget'/>
<layout type = 'horizontal' padding = '16, 16, 16, 4'>
<space/>
<widget name = 'Cancel'
@@ -864,7 +864,7 @@
<dialog name = 'FluidSynthSettings' overlays = 'GlobalOptions' shading = 'dim'>
<layout type = 'vertical' padding = '0, 0, 0, 0'>
- <widget name = 'TabWidget'/>
+ <widget name = 'TabWidget' type = 'TabWidget'/>
<layout type = 'horizontal' padding = '16, 16, 16, 16'>
<space/>
<widget name = 'ResetSettings'
diff --git a/gui/themes/scummmodern/scummmodern_layout_lowres.stx b/gui/themes/scummmodern/scummmodern_layout_lowres.stx
index 43ec0cdee1..169e61a9bb 100644
--- a/gui/themes/scummmodern/scummmodern_layout_lowres.stx
+++ b/gui/themes/scummmodern/scummmodern_layout_lowres.stx
@@ -95,7 +95,7 @@
padding = '0, 0, 2, 0'
/>
<widget name = 'TabWidget.Body'
- padding = '0, 0, 0, -8'
+ padding = '0, 0, 0, 0'
/>
<widget name = 'TabWidget.NavButton'
size = '32, 18'
@@ -217,7 +217,7 @@
<dialog name = 'GlobalOptions' overlays = 'screen' inset = '16' shading = 'dim'>
<layout type = 'vertical' padding = '0, 0, 0, 0'>
- <widget name = 'TabWidget'/>
+ <widget name = 'TabWidget' type = 'TabWidget'/>
<layout type = 'horizontal' padding = '8, 8, 8, 8'>
<space/>
<widget name = 'Cancel'
@@ -554,7 +554,7 @@
<dialog name = 'GameOptions' overlays = 'screen' inset = '16' shading = 'dim'>
<layout type = 'vertical' padding = '0, 0, 0, 0'>
- <widget name = 'TabWidget'/>
+ <widget name = 'TabWidget' type = 'TabWidget'/>
<layout type = 'horizontal' padding = '8, 8, 8, 8'>
<space/>
<widget name = 'Cancel'
@@ -861,7 +861,7 @@
<dialog name = 'FluidSynthSettings' overlays = 'GlobalOptions' shading = 'dim'>
<layout type = 'vertical' padding = '0, 0, 0, 0'>
- <widget name = 'TabWidget'/>
+ <widget name = 'TabWidget' type = 'TabWidget'/>
<layout type = 'horizontal' padding = '8, 8, 8, 8'>
<space/>
<widget name = 'ResetSettings'
diff --git a/gui/themes/translations.dat b/gui/themes/translations.dat
index 617f7d4bac..7533d41454 100644
--- a/gui/themes/translations.dat
+++ b/gui/themes/translations.dat
Binary files differ
diff --git a/gui/widget.cpp b/gui/widget.cpp
index 73d055527c..f2a29c3100 100644
--- a/gui/widget.cpp
+++ b/gui/widget.cpp
@@ -53,6 +53,31 @@ void Widget::init() {
_boss->_firstWidget = this;
}
+Common::Rect Widget::getBossClipRect() const {
+ int bx = _boss->getAbsX();
+ int by = _boss->getAbsY();
+ Common::Rect result = Common::Rect(bx, by, bx + _boss->getWidth(), by + _boss->getHeight());
+ bool needsClipping = false;
+
+ //check whether clipping area is inside the screen
+ if (result.left < 0 && (needsClipping = true))
+ warning("Widget <%s> has clipping area x < 0 (%d)", _name.c_str(), result.left);
+ if (result.left >= g_gui.getWidth() && (needsClipping = true))
+ warning("Widget <%s> has clipping area x > %d (%d)", _name.c_str(), g_gui.getWidth(), result.left);
+ if (result.right > g_gui.getWidth() && (needsClipping = true))
+ warning("Widget <%s> has clipping area x + w > %d (%d)", _name.c_str(), g_gui.getWidth(), result.right);
+ if (result.top < 0 && (needsClipping = true))
+ warning("Widget <%s> has clipping area y < 0 (%d)", _name.c_str(), result.top);
+ if (result.top >= g_gui.getHeight() && (needsClipping = true))
+ warning("Widget <%s> has clipping area y > %d (%d)", _name.c_str(), g_gui.getHeight(), result.top);
+ if (result.bottom > g_gui.getHeight() && (needsClipping = true))
+ warning("Widget <%s> has clipping area y + h > %d (%d)", _name.c_str(), g_gui.getHeight(), result.bottom);
+
+ if (needsClipping)
+ result.clip(g_gui.getWidth(), g_gui.getHeight());
+ return result;
+}
+
Widget::~Widget() {
delete _next;
_next = 0;
@@ -99,7 +124,7 @@ void Widget::draw() {
// Draw border
if (_flags & WIDGET_BORDER) {
- g_gui.theme()->drawWidgetBackground(Common::Rect(_x, _y, _x+_w, _y+_h), 0, ThemeEngine::kWidgetBackgroundBorder);
+ g_gui.theme()->drawWidgetBackgroundClip(Common::Rect(_x, _y, _x+_w, _y+_h), getBossClipRect(), 0, ThemeEngine::kWidgetBackgroundBorder);
_x += 4;
_y += 4;
_w -= 8;
@@ -131,7 +156,7 @@ void Widget::draw() {
Widget *Widget::findWidgetInChain(Widget *w, int x, int y) {
while (w) {
// Stop as soon as we find a widget that contains the point (x,y)
- if (x >= w->_x && x < w->_x + w->_w && y >= w->_y && y < w->_y + w->_h)
+ if (x >= w->_x && x < w->_x + w->_w && y >= w->_y && y < w->_y + w->getHeight())
break;
w = w->_next;
}
@@ -280,7 +305,10 @@ void StaticTextWidget::setAlign(Graphics::TextAlign align) {
void StaticTextWidget::drawWidget() {
- g_gui.theme()->drawText(Common::Rect(_x, _y, _x+_w, _y+_h), _label, _state, _align, ThemeEngine::kTextInversionNone, 0, true, _font);
+ g_gui.theme()->drawTextClip(
+ Common::Rect(_x, _y, _x+_w, _y+_h), getBossClipRect(),
+ _label, _state, _align, ThemeEngine::kTextInversionNone, 0, true, _font
+ );
}
#pragma mark -
@@ -319,7 +347,10 @@ void ButtonWidget::handleMouseDown(int x, int y, int button, int clickCount) {
}
void ButtonWidget::drawWidget() {
- g_gui.theme()->drawButton(Common::Rect(_x, _y, _x+_w, _y+_h), _label, _state, getFlags());
+ g_gui.theme()->drawButtonClip(
+ Common::Rect(_x, _y, _x + _w, _y + _h), getBossClipRect(),
+ _label, _state, getFlags()
+ );
}
void ButtonWidget::setLabel(const Common::String &label) {
@@ -418,7 +449,7 @@ void PicButtonWidget::setGfx(int w, int h, int r, int g, int b) {
}
void PicButtonWidget::drawWidget() {
- g_gui.theme()->drawButton(Common::Rect(_x, _y, _x+_w, _y+_h), "", _state, getFlags());
+ g_gui.theme()->drawButtonClip(Common::Rect(_x, _y, _x + _w, _y + _h), getBossClipRect(), "", _state, getFlags());
if (_gfx.getPixels()) {
// Check whether the set up surface needs to be converted to the GUI
@@ -431,7 +462,7 @@ void PicButtonWidget::drawWidget() {
const int x = _x + (_w - _gfx.w) / 2;
const int y = _y + (_h - _gfx.h) / 2;
- g_gui.theme()->drawSurface(Common::Rect(x, y, x + _gfx.w, y + _gfx.h), _gfx, _state, _alpha, _transparency);
+ g_gui.theme()->drawSurfaceClip(Common::Rect(x, y, x + _gfx.w, y + _gfx.h), getBossClipRect(), _gfx, _state, _alpha, _transparency);
}
}
@@ -466,7 +497,7 @@ void CheckboxWidget::setState(bool state) {
}
void CheckboxWidget::drawWidget() {
- g_gui.theme()->drawCheckbox(Common::Rect(_x, _y, _x+_w, _y+_h), _label, _state, Widget::_state);
+ g_gui.theme()->drawCheckboxClip(Common::Rect(_x, _y, _x+_w, _y+_h), getBossClipRect(), _label, _state, Widget::_state);
}
#pragma mark -
@@ -535,7 +566,7 @@ void RadiobuttonWidget::setState(bool state, bool setGroup) {
}
void RadiobuttonWidget::drawWidget() {
- g_gui.theme()->drawRadiobutton(Common::Rect(_x, _y, _x+_w, _y+_h), _label, _state, Widget::_state);
+ g_gui.theme()->drawRadiobuttonClip(Common::Rect(_x, _y, _x+_w, _y+_h), getBossClipRect(), _label, _state, Widget::_state);
}
#pragma mark -
@@ -603,7 +634,7 @@ void SliderWidget::handleMouseWheel(int x, int y, int direction) {
}
void SliderWidget::drawWidget() {
- g_gui.theme()->drawSlider(Common::Rect(_x, _y, _x + _w, _y + _h), valueToBarWidth(_value), _state);
+ g_gui.theme()->drawSliderClip(Common::Rect(_x, _y, _x + _w, _y + _h), getBossClipRect(), valueToBarWidth(_value), _state);
}
int SliderWidget::valueToBarWidth(int value) {
@@ -680,7 +711,7 @@ void GraphicsWidget::drawWidget() {
const int x = _x + (_w - _gfx.w) / 2;
const int y = _y + (_h - _gfx.h) / 2;
- g_gui.theme()->drawSurface(Common::Rect(x, y, x + _gfx.w, y + _gfx.h), _gfx, _state, _alpha, _transparency);
+ g_gui.theme()->drawSurfaceClip(Common::Rect(x, y, x + _gfx.w, y + _gfx.h), getBossClipRect(), _gfx, _state, _alpha, _transparency);
}
}
@@ -717,7 +748,7 @@ void ContainerWidget::removeWidget(Widget *widget) {
}
void ContainerWidget::drawWidget() {
- g_gui.theme()->drawWidgetBackground(Common::Rect(_x, _y, _x + _w, _y + _h), 0, ThemeEngine::kWidgetBackgroundBorder);
+ g_gui.theme()->drawWidgetBackgroundClip(Common::Rect(_x, _y, _x + _w, _y + _h), getBossClipRect(), 0, ThemeEngine::kWidgetBackgroundBorder);
}
} // End of namespace GUI
diff --git a/gui/widget.h b/gui/widget.h
index 7f6f0c0533..0f4b300233 100644
--- a/gui/widget.h
+++ b/gui/widget.h
@@ -68,7 +68,8 @@ enum {
kPopUpWidget = 'POPU',
kTabWidget = 'TABW',
kGraphicsWidget = 'GFXW',
- kContainerWidget = 'CTNR'
+ kContainerWidget = 'CTNR',
+ kScrollContainerWidget = 'SCTR'
};
enum {
@@ -111,6 +112,7 @@ public:
virtual int16 getAbsX() const { return _x + _boss->getChildX(); }
virtual int16 getAbsY() const { return _y + _boss->getChildY(); }
+ virtual Common::Rect getBossClipRect() const;
virtual void setPos(int x, int y) { _x = x; _y = y; }
virtual void setSize(int w, int h) { _w = w; _h = h; }
diff --git a/gui/widgets/editable.cpp b/gui/widgets/editable.cpp
index 2d929113b1..4f7e584c14 100644
--- a/gui/widgets/editable.cpp
+++ b/gui/widgets/editable.cpp
@@ -274,7 +274,7 @@ void EditableWidget::drawCaret(bool erase) {
x += getAbsX();
y += getAbsY();
- g_gui.theme()->drawCaret(Common::Rect(x, y, x + 1, y + editRect.height()), erase);
+ g_gui.theme()->drawCaretClip(Common::Rect(x, y, x + 1, y + editRect.height()), getBossClipRect(), erase);
if (erase) {
GUI::EditableWidget::String character;
@@ -303,7 +303,7 @@ void EditableWidget::drawCaret(bool erase) {
// possible glitches due to different methods used.
width = MIN(editRect.width() - caretOffset, width);
if (width > 0) {
- g_gui.theme()->drawText(Common::Rect(x, y, x + width, y + editRect.height()), character, _state, Graphics::kTextAlignLeft, _inversion, 0, false, _font, ThemeEngine::kFontColorNormal, true, _textDrawableArea);
+ g_gui.theme()->drawTextClip(Common::Rect(x, y, x + width, y + editRect.height()), getBossClipRect(), character, _state, Graphics::kTextAlignLeft, _inversion, 0, false, _font, ThemeEngine::kFontColorNormal, true, _textDrawableArea);
}
}
diff --git a/gui/widgets/edittext.cpp b/gui/widgets/edittext.cpp
index bef90d4382..0a8725ac9e 100644
--- a/gui/widgets/edittext.cpp
+++ b/gui/widgets/edittext.cpp
@@ -97,7 +97,7 @@ void EditTextWidget::handleMouseDown(int x, int y, int button, int clickCount) {
}
void EditTextWidget::drawWidget() {
- g_gui.theme()->drawWidgetBackground(Common::Rect(_x, _y, _x+_w, _y+_h), 0, ThemeEngine::kWidgetBackgroundEditText);
+ g_gui.theme()->drawWidgetBackgroundClip(Common::Rect(_x, _y, _x+_w, _y+_h), getBossClipRect(), 0, ThemeEngine::kWidgetBackgroundEditText);
// Draw the text
adjustOffset();
@@ -105,7 +105,7 @@ void EditTextWidget::drawWidget() {
const Common::Rect &r = Common::Rect(_x + 2 + _leftPadding, _y + 2, _x + _leftPadding + getEditRect().width() + 8, _y + _h);
setTextDrawableArea(r);
- g_gui.theme()->drawText(Common::Rect(_x + 2 + _leftPadding, _y + 2, _x + _leftPadding + getEditRect().width() + 2, _y + _h), _editString, _state, Graphics::kTextAlignLeft, ThemeEngine::kTextInversionNone, -_editScrollOffset, false, _font, ThemeEngine::kFontColorNormal, true, _textDrawableArea);
+ g_gui.theme()->drawTextClip(Common::Rect(_x + 2 + _leftPadding, _y + 2, _x + _leftPadding + getEditRect().width() + 2, _y + _h), getBossClipRect(), _editString, _state, Graphics::kTextAlignLeft, ThemeEngine::kTextInversionNone, -_editScrollOffset, false, _font, ThemeEngine::kFontColorNormal, true, _textDrawableArea);
}
Common::Rect EditTextWidget::getEditRect() const {
diff --git a/gui/widgets/list.cpp b/gui/widgets/list.cpp
index 4b69202fdc..f6e5c67510 100644
--- a/gui/widgets/list.cpp
+++ b/gui/widgets/list.cpp
@@ -488,7 +488,7 @@ void ListWidget::drawWidget() {
Common::String buffer;
// Draw a thin frame around the list.
- g_gui.theme()->drawWidgetBackground(Common::Rect(_x, _y, _x + _w, _y + _h), 0, ThemeEngine::kWidgetBackgroundBorder);
+ g_gui.theme()->drawWidgetBackgroundClip(Common::Rect(_x, _y, _x + _w, _y + _h), getBossClipRect(), 0, ThemeEngine::kWidgetBackgroundBorder);
const int scrollbarW = (_scrollBar && _scrollBar->isVisible()) ? _scrollBarWidth : 0;
// Draw the list items
@@ -507,7 +507,7 @@ void ListWidget::drawWidget() {
// If in numbering mode, we first print a number prefix
if (_numberingMode != kListNumberingOff) {
buffer = Common::String::format("%2d. ", (pos + _numberingMode));
- g_gui.theme()->drawText(Common::Rect(_x, y, _x + r.left + _leftPadding, y + fontHeight - 2),
+ g_gui.theme()->drawTextClip(Common::Rect(_x, y, _x + r.left + _leftPadding, y + fontHeight - 2), getBossClipRect(),
buffer, _state, Graphics::kTextAlignLeft, inverted, _leftPadding, true);
pad = 0;
}
@@ -528,12 +528,12 @@ void ListWidget::drawWidget() {
color = _editColor;
adjustOffset();
width = _w - r.left - _hlRightPadding - _leftPadding - scrollbarW;
- g_gui.theme()->drawText(Common::Rect(_x + r.left, y, _x + r.left + width, y + fontHeight - 2), buffer, _state,
+ g_gui.theme()->drawTextClip(Common::Rect(_x + r.left, y, _x + r.left + width, y + fontHeight - 2), getBossClipRect(), buffer, _state,
Graphics::kTextAlignLeft, inverted, pad, true, ThemeEngine::kFontStyleBold, color);
} else {
buffer = _list[pos];
width = _w - r.left - scrollbarW;
- g_gui.theme()->drawText(Common::Rect(_x + r.left, y, _x + r.left + width, y + fontHeight - 2), buffer, _state,
+ g_gui.theme()->drawTextClip(Common::Rect(_x + r.left, y, _x + r.left + width, y + fontHeight - 2), getBossClipRect(), buffer, _state,
Graphics::kTextAlignLeft, inverted, pad, true, ThemeEngine::kFontStyleBold, color);
}
diff --git a/gui/widgets/popup.cpp b/gui/widgets/popup.cpp
index 0a1010f8fa..82f4112a97 100644
--- a/gui/widgets/popup.cpp
+++ b/gui/widgets/popup.cpp
@@ -71,6 +71,10 @@ PopUpDialog::PopUpDialog(PopUpWidget *boss, int clickX, int clickY)
: Dialog(0, 0, 16, 16),
_popUpBoss(boss) {
+ _openTime = 0;
+ _buffer = nullptr;
+ _entriesPerColumn = 1;
+
// Copy the selection index
_selection = _popUpBoss->_selectedItem;
@@ -142,10 +146,6 @@ PopUpDialog::PopUpDialog(PopUpWidget *boss, int clickX, int clickY)
// Remember original mouse position
_clickX = clickX - _x;
_clickY = clickY - _y;
-
- _openTime = 0;
- _buffer = nullptr;
- _entriesPerColumn = 1;
}
void PopUpDialog::drawDialog() {
@@ -364,8 +364,11 @@ void PopUpDialog::drawMenuEntry(int entry, bool hilite) {
// Draw a separator
g_gui.theme()->drawLineSeparator(Common::Rect(x, y, x+w, y+kLineHeight));
} else {
- g_gui.theme()->drawText(Common::Rect(x+1, y+2, x+w, y+2+kLineHeight), name, hilite ? ThemeEngine::kStateHighlight : ThemeEngine::kStateEnabled,
- Graphics::kTextAlignLeft, ThemeEngine::kTextInversionNone, _leftPadding);
+ g_gui.theme()->drawText(
+ Common::Rect(x+1, y+2, x+w, y+2+kLineHeight),
+ name, hilite ? ThemeEngine::kStateHighlight : ThemeEngine::kStateEnabled,
+ Graphics::kTextAlignLeft, ThemeEngine::kTextInversionNone, _leftPadding
+ );
}
}
@@ -470,7 +473,10 @@ void PopUpWidget::drawWidget() {
Common::String sel;
if (_selectedItem >= 0)
sel = _entries[_selectedItem].name;
- g_gui.theme()->drawPopUpWidget(Common::Rect(_x, _y, _x + _w, _y + _h), sel, _leftPadding, _state, Graphics::kTextAlignLeft);
+ g_gui.theme()->drawPopUpWidgetClip(
+ Common::Rect(_x, _y, _x + _w, _y + _h), getBossClipRect(),
+ sel, _leftPadding, _state, Graphics::kTextAlignLeft
+ );
}
} // End of namespace GUI
diff --git a/gui/widgets/scrollbar.cpp b/gui/widgets/scrollbar.cpp
index f1306b9c4a..d8bcb18336 100644
--- a/gui/widgets/scrollbar.cpp
+++ b/gui/widgets/scrollbar.cpp
@@ -26,6 +26,7 @@
#include "gui/widgets/scrollbar.h"
#include "gui/gui-manager.h"
#include "gui/ThemeEngine.h"
+#include "gui/widgets/scrollcontainer.h"
namespace GUI {
@@ -202,7 +203,11 @@ void ScrollBarWidget::drawWidget() {
state = ThemeEngine::kScrollbarStateSlider;
}
- g_gui.theme()->drawScrollbar(Common::Rect(_x, _y, _x+_w, _y+_h), _sliderPos, _sliderHeight, state, _state);
+ Common::Rect clipRect = getBossClipRect();
+ //scrollbar is not a usual child of ScrollContainerWidget, so it gets this special treatment
+ if (dynamic_cast<ScrollContainerWidget *>(_boss))
+ clipRect.right += _w;
+ g_gui.theme()->drawScrollbarClip(Common::Rect(_x, _y, _x+_w, _y+_h), clipRect, _sliderPos, _sliderHeight, state, _state);
}
} // End of namespace GUI
diff --git a/gui/widgets/scrollcontainer.cpp b/gui/widgets/scrollcontainer.cpp
new file mode 100644
index 0000000000..1b38478c11
--- /dev/null
+++ b/gui/widgets/scrollcontainer.cpp
@@ -0,0 +1,147 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/util.h"
+#include "gui/widgets/scrollcontainer.h"
+#include "gui/gui-manager.h"
+
+#include "gui/ThemeEval.h"
+
+namespace GUI {
+
+ScrollContainerWidget::ScrollContainerWidget(GuiObject *boss, int x, int y, int w, int h)
+ : Widget(boss, x, y, w, h) {
+ init();
+}
+
+ScrollContainerWidget::ScrollContainerWidget(GuiObject *boss, const Common::String &name)
+ : Widget(boss, name) {
+ init();
+}
+
+void ScrollContainerWidget::init() {
+ setFlags(WIDGET_ENABLED);
+ _type = kScrollContainerWidget;
+ _verticalScroll = new ScrollBarWidget(this, _w-16, 0, 16, _h);
+ _verticalScroll->setTarget(this);
+ _scrolledX = 0;
+ _scrolledY = 0;
+ _limitH = 140;
+ recalc();
+}
+
+void ScrollContainerWidget::recalc() {
+ int scrollbarWidth = g_gui.xmlEval()->getVar("Globals.Scrollbar.Width", 0);
+ _limitH = _h;
+
+ //calculate virtual height
+ const int spacing = g_gui.xmlEval()->getVar("Global.Font.Height", 16); //on the bottom
+ int h = 0;
+ int min = spacing, max = 0;
+ Widget *ptr = _firstWidget;
+ while (ptr) {
+ if (ptr != _verticalScroll) {
+ int y = ptr->getAbsY() - getChildY();
+ min = MIN(min, y - spacing);
+ max = MAX(max, y + ptr->getHeight() + spacing);
+ }
+ ptr = ptr->next();
+ }
+ h = max - min;
+
+ _verticalScroll->_numEntries = h;
+ _verticalScroll->_currentPos = _scrolledY;
+ _verticalScroll->_entriesPerPage = _limitH;
+ _verticalScroll->setPos(_w - scrollbarWidth, _scrolledY+1);
+ _verticalScroll->setSize(scrollbarWidth, _limitH -2);
+}
+
+
+ScrollContainerWidget::~ScrollContainerWidget() {}
+
+int16 ScrollContainerWidget::getChildX() const {
+ return getAbsX() - _scrolledX;
+}
+
+int16 ScrollContainerWidget::getChildY() const {
+ return getAbsY() - _scrolledY;
+}
+
+uint16 ScrollContainerWidget::getWidth() const {
+ return _w - (_verticalScroll->isVisible() ? _verticalScroll->getWidth() : 0);
+}
+
+uint16 ScrollContainerWidget::getHeight() const {
+ return _limitH;
+}
+
+void ScrollContainerWidget::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {
+ Widget::handleCommand(sender, cmd, data);
+ switch (cmd) {
+ case kSetPositionCmd:
+ _scrolledY = _verticalScroll->_currentPos;
+ reflowLayout();
+ draw();
+ g_gui.doFullRedraw();
+ break;
+ }
+}
+
+void ScrollContainerWidget::reflowLayout() {
+ Widget::reflowLayout();
+
+ //reflow layout of inner widgets
+ Widget *ptr = _firstWidget;
+ while (ptr) {
+ ptr->reflowLayout();
+ ptr = ptr->next();
+ }
+
+ //recalculate height
+ recalc();
+
+ //hide those widgets which are out of visible area
+ ptr = _firstWidget;
+ while (ptr) {
+ int y = ptr->getAbsY() - getChildY();
+ int h = ptr->getHeight();
+ bool visible = true;
+ if (y + h - _scrolledY < 0) visible = false;
+ if (y - _scrolledY > _limitH) visible = false;
+ ptr->setVisible(visible);
+ ptr = ptr->next();
+ }
+
+ _verticalScroll->setVisible(_verticalScroll->_numEntries > _limitH); //show when there is something to scroll
+}
+
+void ScrollContainerWidget::drawWidget() {
+ g_gui.theme()->drawDialogBackgroundClip(Common::Rect(_x, _y, _x + _w, _y + getHeight() - 1), getBossClipRect(), ThemeEngine::kDialogBackgroundDefault);
+}
+
+Widget *ScrollContainerWidget::findWidget(int x, int y) {
+ if (_verticalScroll->isVisible() && x >= _w - _verticalScroll->getWidth())
+ return _verticalScroll;
+ return Widget::findWidgetInChain(_firstWidget, x + _scrolledX, y + _scrolledY);
+}
+
+} // End of namespace GUI
diff --git a/gui/widgets/scrollcontainer.h b/gui/widgets/scrollcontainer.h
new file mode 100644
index 0000000000..692c7e3507
--- /dev/null
+++ b/gui/widgets/scrollcontainer.h
@@ -0,0 +1,63 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef GUI_WIDGETS_SCROLLCONTAINER_H
+#define GUI_WIDGETS_SCROLLCONTAINER_H
+
+#include "gui/widget.h"
+#include "common/str.h"
+#include "scrollbar.h"
+
+namespace GUI {
+
+class ScrollContainerWidget: public Widget {
+ ScrollBarWidget *_verticalScroll;
+ int16 _scrolledX, _scrolledY;
+ uint16 _limitH;
+
+ void recalc();
+
+public:
+ ScrollContainerWidget(GuiObject *boss, int x, int y, int w, int h);
+ ScrollContainerWidget(GuiObject *boss, const Common::String &name);
+ ~ScrollContainerWidget();
+
+ void init();
+ virtual void handleCommand(CommandSender *sender, uint32 cmd, uint32 data);
+ virtual void reflowLayout();
+
+protected:
+ // We overload getChildY to make sure child widgets are positioned correctly.
+ // Essentially this compensates for the space taken up by the tab title header.
+ virtual int16 getChildX() const;
+ virtual int16 getChildY() const;
+ virtual uint16 getWidth() const;
+ virtual uint16 getHeight() const;
+
+ virtual void drawWidget();
+
+ virtual Widget *findWidget(int x, int y);
+};
+
+} // End of namespace GUI
+
+#endif
diff --git a/gui/widgets/tab.cpp b/gui/widgets/tab.cpp
index 756781a04b..15e6a9d370 100644
--- a/gui/widgets/tab.cpp
+++ b/gui/widgets/tab.cpp
@@ -80,9 +80,19 @@ TabWidget::~TabWidget() {
}
int16 TabWidget::getChildY() const {
+ // NOTE: if you change that, make sure to do the same
+ // changes in the ThemeLayoutTabWidget (gui/ThemeLayout.cpp)
return getAbsY() + _tabHeight;
}
+uint16 TabWidget::getHeight() const {
+ // NOTE: if you change that, make sure to do the same
+ // changes in the ThemeLayoutTabWidget (gui/ThemeLayout.cpp)
+ // NOTE: this height is used for clipping, so it *includes*
+ // tabs, because it starts from getAbsY(), not getChildY()
+ return _h + _tabHeight;
+}
+
int TabWidget::addTab(const String &title) {
// Add a new tab page
Tab newTab;
@@ -258,6 +268,12 @@ void TabWidget::adjustTabs(int value) {
void TabWidget::reflowLayout() {
Widget::reflowLayout();
+ // NOTE: if you change that, make sure to do the same
+ // changes in the ThemeLayoutTabWidget (gui/ThemeLayout.cpp)
+ _tabHeight = g_gui.xmlEval()->getVar("Globals.TabWidget.Tab.Height");
+ _tabWidth = g_gui.xmlEval()->getVar("Globals.TabWidget.Tab.Width");
+ _titleVPad = g_gui.xmlEval()->getVar("Globals.TabWidget.Tab.Padding.Top");
+
for (uint i = 0; i < _tabs.size(); ++i) {
Widget *w = _tabs[i].firstWidget;
while (w) {
@@ -266,10 +282,6 @@ void TabWidget::reflowLayout() {
}
}
- _tabHeight = g_gui.xmlEval()->getVar("Globals.TabWidget.Tab.Height");
- _tabWidth = g_gui.xmlEval()->getVar("Globals.TabWidget.Tab.Width");
- _titleVPad = g_gui.xmlEval()->getVar("Globals.TabWidget.Tab.Padding.Top");
-
if (_tabWidth == 0) {
_tabWidth = 40;
#ifdef __DS__
@@ -304,9 +316,9 @@ void TabWidget::drawWidget() {
for (int i = _firstVisibleTab; i < (int)_tabs.size(); ++i) {
tabs.push_back(_tabs[i].title);
}
- g_gui.theme()->drawDialogBackground(Common::Rect(_x + _bodyLP, _y + _bodyTP, _x+_w-_bodyRP, _y+_h-_bodyBP), _bodyBackgroundType);
+ g_gui.theme()->drawDialogBackgroundClip(Common::Rect(_x + _bodyLP, _y + _bodyTP, _x+_w-_bodyRP, _y+_h-_bodyBP+_tabHeight), getBossClipRect(), _bodyBackgroundType);
- g_gui.theme()->drawTab(Common::Rect(_x, _y, _x+_w, _y+_h), _tabHeight, _tabWidth, tabs, _activeTab - _firstVisibleTab, 0, _titleVPad);
+ g_gui.theme()->drawTabClip(Common::Rect(_x, _y, _x+_w, _y+_h), getBossClipRect(), _tabHeight, _tabWidth, tabs, _activeTab - _firstVisibleTab, 0, _titleVPad);
}
void TabWidget::draw() {
diff --git a/gui/widgets/tab.h b/gui/widgets/tab.h
index 148f164fbb..17b85986b5 100644
--- a/gui/widgets/tab.h
+++ b/gui/widgets/tab.h
@@ -110,6 +110,7 @@ protected:
// We overload getChildY to make sure child widgets are positioned correctly.
// Essentially this compensates for the space taken up by the tab title header.
virtual int16 getChildY() const;
+ virtual uint16 getHeight() const;
virtual void drawWidget();
diff --git a/po/be_BY.po b/po/be_BY.po
index a9531c3fe1..68e7cd35bb 100644
--- a/po/be_BY.po
+++ b/po/be_BY.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: 2016-06-07 19:20+0200\n"
+"POT-Creation-Date: 2016-07-19 09:07+0200\n"
"PO-Revision-Date: 2016-05-22 17:05+0300\n"
"Last-Translator: Ivan Lukyanov <greencis@mail.ru>\n"
"Language-Team: Ivan Lukyanov <greencis@mail.ru>\n"
@@ -60,7 +60,7 @@ msgstr "Уверх"
#: gui/recorderdialog.cpp:155 gui/saveload-dialog.cpp:216
#: gui/saveload-dialog.cpp:276 gui/saveload-dialog.cpp:547
#: gui/saveload-dialog.cpp:931 gui/themebrowser.cpp:55
-#: gui/updates-dialog.cpp:113 engines/engine.cpp:546
+#: gui/updates-dialog.cpp:113 engines/engine.cpp:549
#: backends/events/default/default-events.cpp:196
#: backends/events/default/default-events.cpp:218
#: backends/platform/wii/options.cpp:48 engines/drascula/saveload.cpp:49
@@ -208,12 +208,12 @@ msgstr "Скінуць налады FluidSynth па змаўчанні."
#: gui/fluidsynth-dialog.cpp:153 gui/KeysDialog.cpp:42 gui/launcher.cpp:354
#: gui/launcher.cpp:1052 gui/launcher.cpp:1056 gui/massadd.cpp:92
-#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:465
-#: engines/engine.cpp:476 backends/platform/wii/options.cpp:47
+#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:468
+#: engines/engine.cpp:479 backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
#: engines/agos/animation.cpp:559 engines/drascula/saveload.cpp:49
#: engines/groovie/script.cpp:407 engines/parallaction/saveload.cpp:271
-#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1850
+#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1852
#: engines/scumm/players/player_v3m.cpp:130
#: engines/scumm/players/player_v5m.cpp:108 engines/sky/compact.cpp:131
#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:524
@@ -503,7 +503,7 @@ msgstr "Абярыце дырэкторыю для захаванняў"
msgid "This game ID is already taken. Please choose another one."
msgstr "Гэты ID гульні ўжо выкарыстоўваецца. Калі ласка, абярыце іншы."
-#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:115
+#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:98
msgid "~Q~uit"
msgstr "~В~ыхад"
@@ -591,7 +591,7 @@ msgid "Search:"
msgstr "Пошук:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
-#: engines/mohawk/dialogs.cpp:120 engines/mohawk/riven.cpp:729
+#: engines/mohawk/dialogs.cpp:103 engines/mohawk/riven.cpp:726
#: engines/pegasus/pegasus.cpp:353 engines/tsage/scenes.cpp:601
msgid "Load game:"
msgstr "Загрузіць гульню:"
@@ -599,8 +599,8 @@ msgstr "Загрузіць гульню:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
-#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:120
-#: engines/mohawk/riven.cpp:729 engines/parallaction/saveload.cpp:194
+#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/riven.cpp:726 engines/parallaction/saveload.cpp:194
#: engines/pegasus/pegasus.cpp:353 engines/scumm/dialogs.cpp:185
#: engines/tsage/scenes.cpp:601
msgid "Load"
@@ -764,7 +764,7 @@ msgid "Special dithering modes supported by some games"
msgstr "Спецыяльныя рэжымы рэндэрынгу, падтрымоўваныя некаторымі гульнямі"
#: gui/options.cpp:764
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2314
msgid "Fullscreen mode"
msgstr "Поўнаэкранны рэжым"
@@ -1232,28 +1232,28 @@ msgstr "Увядзіце апісанне слота %d:"
msgid "Select a Theme"
msgstr "Абярыце тэму"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgid "Disabled GFX"
msgstr "Без графікі"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Без графікі"
-#: gui/ThemeEngine.cpp:354
+#: gui/ThemeEngine.cpp:416
msgid "Standard Renderer"
msgstr "Стандартны растарызатар"
-#: gui/ThemeEngine.cpp:354 engines/scumm/dialogs.cpp:659
+#: gui/ThemeEngine.cpp:416 engines/scumm/dialogs.cpp:659
msgid "Standard"
msgstr "Стандартны"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased Renderer"
msgstr "Растарызатар са згладжваннем"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased"
msgstr "Са згладжваннем"
@@ -1281,7 +1281,7 @@ msgstr "Аўтаматычна правяраць абнаўленні"
msgid "Proceed"
msgstr "Працягнуць"
-#: gui/widget.cpp:335 gui/widget.cpp:337 gui/widget.cpp:343 gui/widget.cpp:345
+#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
msgstr "Ачысціць значэнне"
@@ -1442,11 +1442,11 @@ msgstr "гульні, якую вы спрабуеце дадаць, і азначце яе версію, мову і г.д."
msgid "~R~esume"
msgstr "Працяг~н~уць"
-#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:113
+#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:96
msgid "~L~oad"
msgstr "За~г~рузіць"
-#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:114
+#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:97
msgid "~S~ave"
msgstr "За~п~ісаць"
@@ -1475,11 +1475,11 @@ msgstr "Г~а~лоўнае меню"
#: engines/avalanche/parser.cpp:1900 engines/cge/events.cpp:72
#: engines/cge2/events.cpp:65 engines/cruise/menu.cpp:212
#: engines/drascula/saveload.cpp:364 engines/dreamweb/saveload.cpp:262
-#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:121
+#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sci/engine/kfile.cpp:713 engines/sherlock/scalpel/scalpel.cpp:1250
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save game:"
msgstr "Захаваць гульню:"
@@ -1492,12 +1492,12 @@ msgstr "Захаваць гульню:"
#: engines/cge/events.cpp:72 engines/cge2/events.cpp:65
#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:364
#: engines/dreamweb/saveload.cpp:262 engines/hugo/file.cpp:298
-#: engines/mohawk/dialogs.cpp:121 engines/neverhood/menumodule.cpp:880
+#: engines/mohawk/dialogs.cpp:104 engines/neverhood/menumodule.cpp:880
#: engines/parallaction/saveload.cpp:209 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/scumm/dialogs.cpp:184
+#: engines/sci/engine/kfile.cpp:713 engines/scumm/dialogs.cpp:184
#: engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save"
msgstr "Захаваць"
@@ -1521,13 +1521,13 @@ msgstr ""
"за базавай інфармацыяй, а таксама інструкцыямі пра тое, як атрымаць далейшую "
"дапамогу."
-#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:117
-#: engines/mohawk/dialogs.cpp:242 engines/tsage/dialogs.cpp:112
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
+#: engines/tsage/dialogs.cpp:112
msgid "~O~K"
msgstr "~О~К"
-#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:118
-#: engines/mohawk/dialogs.cpp:243 engines/tsage/dialogs.cpp:113
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:101
+#: engines/tsage/dialogs.cpp:113
msgid "~C~ancel"
msgstr "~А~дмена"
@@ -1535,23 +1535,23 @@ msgstr "~А~дмена"
msgid "~K~eys"
msgstr "~К~лавішы"
-#: engines/engine.cpp:339
+#: engines/engine.cpp:342
msgid "Could not initialize color format."
msgstr "Не магу ініцыялізаваць фармат колеру."
-#: engines/engine.cpp:347
+#: engines/engine.cpp:350
msgid "Could not switch to video mode: '"
msgstr "Не атрымалася пераключыць відэарэжым: '"
-#: engines/engine.cpp:356
+#: engines/engine.cpp:359
msgid "Could not apply aspect ratio setting."
msgstr "Не атрымалася выкарыстаць карэкцыю суадносін бакоў."
-#: engines/engine.cpp:361
+#: engines/engine.cpp:364
msgid "Could not apply fullscreen setting."
msgstr "Не магу ўжыць поўнаэкранны рэжым."
-#: engines/engine.cpp:461
+#: engines/engine.cpp:464
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1565,7 +1565,7 @@ msgstr ""
"на жорсткі дыск. Падрабязнасці можна знайсці ў\n"
"файле README."
-#: engines/engine.cpp:472
+#: engines/engine.cpp:475
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1580,7 +1580,7 @@ msgstr ""
"з'явіцца музыка. Падрабязнасці можна знайсці ў\n"
"файле README."
-#: engines/engine.cpp:530
+#: engines/engine.cpp:533
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1590,7 +1590,7 @@ msgstr ""
"README за базавай інфармацыяй, а таксама інструкцыямі пра тое, як атрымаць "
"далейшую дапамогу."
-#: engines/engine.cpp:543
+#: engines/engine.cpp:546
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
@@ -1600,7 +1600,7 @@ msgstr ""
"ScummVM цалкам. Яна, хутчэй за ўсё, не будзе працаваць стабільна, і "
"захаванні гульняў могуць не працаваць у будучых версіях ScummVM."
-#: engines/engine.cpp:546
+#: engines/engine.cpp:549
msgid "Start anyway"
msgstr "Усё адно запусціць"
@@ -1825,19 +1825,19 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Без павелічэння"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2215
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2213
msgid "Enabled aspect ratio correction"
msgstr "Карэкцыя суадносін бакоў уключана"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2221
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2219
msgid "Disabled aspect ratio correction"
msgstr "Карэкцыя суадносін бакоў выключана"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2276
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2274
msgid "Active graphics filter:"
msgstr "Актыўны графічны фільтр:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2318
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
msgid "Windowed mode"
msgstr "Аконны рэжым"
@@ -2386,14 +2386,14 @@ msgstr "Паказваць радок аб'ектаў"
#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
-#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:410
+#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:424
#: engines/toltecs/detection.cpp:200 engines/zvision/detection_tables.h:51
msgid "Use original save/load screens"
msgstr "Выкарыстоўваць арыгінальныя экраны запісу/чытання гульні"
#: engines/agi/detection.cpp:148 engines/cine/detection.cpp:71
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
-#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:411
+#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:425
#: engines/toltecs/detection.cpp:201
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
@@ -2449,9 +2449,9 @@ msgstr ""
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore game:"
msgstr "Узнавіць гульню:"
@@ -2459,13 +2459,13 @@ msgstr "Узнавіць гульню:"
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore"
msgstr "Узнавіць"
-#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2393
+#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2395
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -2476,7 +2476,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2386
+#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2388
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -2487,7 +2487,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2404
+#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2406
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -2733,37 +2733,37 @@ msgstr ""
"адкрыць адладачную кансоль ScummVM і ўвесці каманду 'import_savefile'.\n"
"\n"
-#: engines/mohawk/detection.cpp:168
+#: engines/mohawk/detection.cpp:169
msgid "Play the Myst fly by movie"
msgstr "Прайграваць ролік пралёту над Myst"
-#: engines/mohawk/detection.cpp:169
+#: engines/mohawk/detection.cpp:170
msgid "The Myst fly by movie was not played by the original engine."
msgstr "Ролік пралёту над Myst не прайграваўся арыгінальным рухавічком."
#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:96 engines/mohawk/dialogs.cpp:239
+#: engines/mohawk/dialogs.cpp:178 engines/mohawk/dialogs.cpp:264
msgid "~Z~ip Mode Activated"
msgstr "~Р~эжым хуткага пераходу актываваны"
-#: engines/mohawk/dialogs.cpp:97
+#: engines/mohawk/dialogs.cpp:179
msgid "~T~ransitions Enabled"
msgstr "~П~ераходы актываваны"
#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:99
+#: engines/mohawk/dialogs.cpp:181
msgid "~D~rop Page"
msgstr "~В~ыкінуць старонку"
-#: engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/dialogs.cpp:185
msgid "Show ~M~ap"
msgstr "Паказаць ~к~арту"
-#: engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:191
msgid "Main Men~u~"
msgstr "Галоўнае мен~ю~"
-#: engines/mohawk/dialogs.cpp:240
+#: engines/mohawk/dialogs.cpp:265
msgid "~W~ater Effect Enabled"
msgstr "~Э~фекты вады ўключаны"
@@ -2884,37 +2884,46 @@ msgstr "Альтэрнатыўны ўступ"
msgid "Use an alternative game intro (CD version only)"
msgstr "Выкарыстоўваць альтэрнатыўны ўступ (толькі для CD-версіі гульні)"
-#: engines/sci/detection.cpp:380
+#: engines/sci/detection.cpp:384
msgid "Skip EGA dithering pass (full color backgrounds)"
msgstr "Не рабіць апраксімацыю колераў EGA (поўнакаляровыя фоны)"
-#: engines/sci/detection.cpp:381
+#: engines/sci/detection.cpp:385
msgid "Skip dithering pass in EGA games, graphics are shown with full colors"
msgstr ""
"Прапускае праход апраксімацыі колераў EGA, графіка будзе паказана з усімі "
"колерамі"
-#: engines/sci/detection.cpp:390
+#: engines/sci/detection.cpp:394
msgid "Enable high resolution graphics"
msgstr "Уключыць адлюстраванне графікі высокага адрознення"
-#: engines/sci/detection.cpp:391
+#: engines/sci/detection.cpp:395
msgid "Enable high resolution graphics/content"
msgstr "Уключыць графіку і кантэнт высокага адрознення"
-#: engines/sci/detection.cpp:400
+#: engines/sci/detection.cpp:404
+#, fuzzy
+msgid "Enable black-lined video"
+msgstr "Уключыць рэжым Roland GS"
+
+#: engines/sci/detection.cpp:405
+msgid "Draw black lines over videos to increase their apparent sharpness"
+msgstr ""
+
+#: engines/sci/detection.cpp:414
msgid "Prefer digital sound effects"
msgstr "Аддаваць перавагу лічбавым гукавым эфектам"
-#: engines/sci/detection.cpp:401
+#: engines/sci/detection.cpp:415
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Аддаваць перавагу лічбавым гукавым эфектам замест сінтэзаваных"
-#: engines/sci/detection.cpp:420
+#: engines/sci/detection.cpp:434
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Выкарыстоўваць IMF/Yamaha FB-01 для вываду MIDI"
-#: engines/sci/detection.cpp:421
+#: engines/sci/detection.cpp:435
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -2922,32 +2931,32 @@ msgstr ""
"Выкарыстоўваць гукавую карту IBM Music Feature ці модуль сінтэзу Yamaha "
"FB-01 FM для MIDI"
-#: engines/sci/detection.cpp:431
+#: engines/sci/detection.cpp:445
msgid "Use CD audio"
msgstr "Выкарыстоўваць CD-аўдыё"
-#: engines/sci/detection.cpp:432
+#: engines/sci/detection.cpp:446
msgid "Use CD audio instead of in-game audio, if available"
msgstr ""
"Выкарыстоўваць гукавыя дарожкі з CD замест музыкі з файлаў гульні (калі "
"даступна)"
-#: engines/sci/detection.cpp:442
+#: engines/sci/detection.cpp:456
msgid "Use Windows cursors"
msgstr "Выкарыстоўваць курсоры Windows"
-#: engines/sci/detection.cpp:443
+#: engines/sci/detection.cpp:457
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"Выкарыстоўваць курсоры Windows (меншыя па памеры і аднакаляровыя) замест "
"курсораў DOS"
-#: engines/sci/detection.cpp:453
+#: engines/sci/detection.cpp:467
msgid "Use silver cursors"
msgstr "Выкарыстоўваць срэбныя курсоры"
-#: engines/sci/detection.cpp:454
+#: engines/sci/detection.cpp:468
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
@@ -3626,7 +3635,7 @@ msgstr "Гучн. музыкі: "
msgid "Subtitle speed: "
msgstr "Хуткасць тытраў: "
-#: engines/scumm/scumm.cpp:1848
+#: engines/scumm/scumm.cpp:1850
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -3635,7 +3644,7 @@ msgstr ""
"Рэжым \"роднага\" MIDI патрабуе абнаўленне Roland Upgrade ад\n"
"LucasArts, але не хапае %s. Пераключаюся на AdLib."
-#: engines/scumm/scumm.cpp:2664
+#: engines/scumm/scumm.cpp:2666
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 "
@@ -3939,9 +3948,6 @@ msgstr ""
#~ msgid "Active filter mode: Nearest"
#~ msgstr "Актыўны рэжым фільтра: Найблізкі"
-#~ msgid "Enable Roland GS Mode"
-#~ msgstr "Уключыць рэжым Roland GS"
-
#~ msgctxt "lowres"
#~ msgid "Add Game..."
#~ msgstr "Доб. игру"
diff --git a/po/ca_ES.po b/po/ca_ES.po
index 7ad491c396..9a1ba16a6b 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: 2016-06-07 19:20+0200\n"
+"POT-Creation-Date: 2016-07-19 09:07+0200\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"
@@ -57,7 +57,7 @@ msgstr "Amunt"
#: gui/recorderdialog.cpp:155 gui/saveload-dialog.cpp:216
#: gui/saveload-dialog.cpp:276 gui/saveload-dialog.cpp:547
#: gui/saveload-dialog.cpp:931 gui/themebrowser.cpp:55
-#: gui/updates-dialog.cpp:113 engines/engine.cpp:546
+#: gui/updates-dialog.cpp:113 engines/engine.cpp:549
#: backends/events/default/default-events.cpp:196
#: backends/events/default/default-events.cpp:218
#: backends/platform/wii/options.cpp:48 engines/drascula/saveload.cpp:49
@@ -206,12 +206,12 @@ msgstr "Retorna tots els ajustos de FluidSynth als seus valors per defecte."
#: gui/fluidsynth-dialog.cpp:153 gui/KeysDialog.cpp:42 gui/launcher.cpp:354
#: gui/launcher.cpp:1052 gui/launcher.cpp:1056 gui/massadd.cpp:92
-#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:465
-#: engines/engine.cpp:476 backends/platform/wii/options.cpp:47
+#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:468
+#: engines/engine.cpp:479 backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
#: engines/agos/animation.cpp:559 engines/drascula/saveload.cpp:49
#: engines/groovie/script.cpp:407 engines/parallaction/saveload.cpp:271
-#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1850
+#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1852
#: engines/scumm/players/player_v3m.cpp:130
#: engines/scumm/players/player_v5m.cpp:108 engines/sky/compact.cpp:131
#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:524
@@ -504,7 +504,7 @@ msgid "This game ID is already taken. Please choose another one."
msgstr ""
"Aquest identificador de joc ja estр en њs. Si us plau, trieu-ne un altre."
-#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:115
+#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:98
msgid "~Q~uit"
msgstr "~T~anca"
@@ -594,7 +594,7 @@ msgid "Search:"
msgstr "Cerca:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
-#: engines/mohawk/dialogs.cpp:120 engines/mohawk/riven.cpp:729
+#: engines/mohawk/dialogs.cpp:103 engines/mohawk/riven.cpp:726
#: engines/pegasus/pegasus.cpp:353 engines/tsage/scenes.cpp:601
msgid "Load game:"
msgstr "Carrega partida:"
@@ -602,8 +602,8 @@ msgstr "Carrega partida:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
-#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:120
-#: engines/mohawk/riven.cpp:729 engines/parallaction/saveload.cpp:194
+#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/riven.cpp:726 engines/parallaction/saveload.cpp:194
#: engines/pegasus/pegasus.cpp:353 engines/scumm/dialogs.cpp:185
#: engines/tsage/scenes.cpp:601
msgid "Load"
@@ -772,7 +772,7 @@ msgid "Special dithering modes supported by some games"
msgstr "Modes de tramat especials suportats per alguns jocs"
#: gui/options.cpp:764
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2314
msgid "Fullscreen mode"
msgstr "Mode pantalla completa"
@@ -1244,30 +1244,30 @@ msgstr "Entreu la descripciѓ per l'espai %d:"
msgid "Select a Theme"
msgstr "Seleccioneu un Tema"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgid "Disabled GFX"
msgstr "GFX desactivats"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "GFX desactivats"
-#: gui/ThemeEngine.cpp:354
+#: gui/ThemeEngine.cpp:416
#, fuzzy
msgid "Standard Renderer"
msgstr "Pintat estрndard (16bpp)"
-#: gui/ThemeEngine.cpp:354 engines/scumm/dialogs.cpp:659
+#: gui/ThemeEngine.cpp:416 engines/scumm/dialogs.cpp:659
msgid "Standard"
msgstr "Estрndard"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
#, fuzzy
msgid "Antialiased Renderer"
msgstr "Pintat amb antialias (16bpp)"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
#, fuzzy
msgid "Antialiased"
msgstr "Amb antialias (16bpp)"
@@ -1293,7 +1293,7 @@ msgstr "Comprova les actualitzacions..."
msgid "Proceed"
msgstr ""
-#: gui/widget.cpp:335 gui/widget.cpp:337 gui/widget.cpp:343 gui/widget.cpp:345
+#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
msgstr "Neteja el valor"
@@ -1455,11 +1455,11 @@ msgstr "nom del joc que heu provat d'afegir i la seva versiѓ/llengua/etc.:"
msgid "~R~esume"
msgstr "~C~ontinua"
-#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:113
+#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:96
msgid "~L~oad"
msgstr "C~a~rrega"
-#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:114
+#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:97
msgid "~S~ave"
msgstr "~D~esa"
@@ -1488,11 +1488,11 @@ msgstr "~R~etorna al Llanчador"
#: engines/avalanche/parser.cpp:1900 engines/cge/events.cpp:72
#: engines/cge2/events.cpp:65 engines/cruise/menu.cpp:212
#: engines/drascula/saveload.cpp:364 engines/dreamweb/saveload.cpp:262
-#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:121
+#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sci/engine/kfile.cpp:713 engines/sherlock/scalpel/scalpel.cpp:1250
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save game:"
msgstr "Desa la partida:"
@@ -1505,12 +1505,12 @@ msgstr "Desa la partida:"
#: engines/cge/events.cpp:72 engines/cge2/events.cpp:65
#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:364
#: engines/dreamweb/saveload.cpp:262 engines/hugo/file.cpp:298
-#: engines/mohawk/dialogs.cpp:121 engines/neverhood/menumodule.cpp:880
+#: engines/mohawk/dialogs.cpp:104 engines/neverhood/menumodule.cpp:880
#: engines/parallaction/saveload.cpp:209 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/scumm/dialogs.cpp:184
+#: engines/sci/engine/kfile.cpp:713 engines/scumm/dialogs.cpp:184
#: engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save"
msgstr "Desa"
@@ -1532,13 +1532,13 @@ msgstr ""
"No s'ha pogut desar la partida (%s)! Consulteu el fitxer README per a la "
"informaciѓ bрsica i les instruccions sobre com obtenir mщs assistшncia."
-#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:117
-#: engines/mohawk/dialogs.cpp:242 engines/tsage/dialogs.cpp:112
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
+#: engines/tsage/dialogs.cpp:112
msgid "~O~K"
msgstr "~D~'acord"
-#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:118
-#: engines/mohawk/dialogs.cpp:243 engines/tsage/dialogs.cpp:113
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:101
+#: engines/tsage/dialogs.cpp:113
msgid "~C~ancel"
msgstr "~C~ancelЗla"
@@ -1546,23 +1546,23 @@ msgstr "~C~ancelЗla"
msgid "~K~eys"
msgstr "~T~ecles"
-#: engines/engine.cpp:339
+#: engines/engine.cpp:342
msgid "Could not initialize color format."
msgstr "No s'ha pogut iniciar el format de color."
-#: engines/engine.cpp:347
+#: engines/engine.cpp:350
msgid "Could not switch to video mode: '"
msgstr "No s'ha pogut canviar al mode de vэdeo: '"
-#: engines/engine.cpp:356
+#: engines/engine.cpp:359
msgid "Could not apply aspect ratio setting."
msgstr "No s'ha pogut aplicar la configuraciѓ de la relaciѓ d'aspecte."
-#: engines/engine.cpp:361
+#: engines/engine.cpp:364
msgid "Could not apply fullscreen setting."
msgstr "No s'ha pogut aplicar l'ajust de pantalla completa."
-#: engines/engine.cpp:461
+#: engines/engine.cpp:464
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1576,7 +1576,7 @@ msgstr ""
"els fitxers de dades al disc dur.\n"
"Consulteu el fitxer README per a mщs detalls."
-#: engines/engine.cpp:472
+#: engines/engine.cpp:475
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1590,7 +1590,7 @@ msgstr ""
"tal de poder sentir la mњsica del joc.\n"
"Consulteu el fitxer README per a mщs detalls."
-#: engines/engine.cpp:530
+#: engines/engine.cpp:533
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1599,7 +1599,7 @@ msgstr ""
"No s'ha pogut carregar la partida (%s)! Consulteu el fitxer README per a la "
"informaciѓ bрsica i les instruccions sobre com obtenir mщs assistшncia."
-#: engines/engine.cpp:543
+#: engines/engine.cpp:546
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
@@ -1609,7 +1609,7 @@ msgstr ""
"pel ScummVM. Com a tal, probablement serр inestable, i pot ser que les "
"partides que deseu no funcionin en versions futures de ScummVM."
-#: engines/engine.cpp:546
+#: engines/engine.cpp:549
msgid "Start anyway"
msgstr "Inicia de totes maneres"
@@ -1837,19 +1837,19 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normal (no escalat)"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2215
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2213
msgid "Enabled aspect ratio correction"
msgstr "S'ha activat la correcciѓ de la relaciѓ d'aspecte"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2221
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2219
msgid "Disabled aspect ratio correction"
msgstr "S'ha desactivat la correcciѓ de la relaciѓ d'aspecte"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2276
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2274
msgid "Active graphics filter:"
msgstr "Filtre de grрfics actiu:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2318
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
msgid "Windowed mode"
msgstr "Mode de finestra"
@@ -2399,14 +2399,14 @@ msgstr "Mostra les etiquetes dels objectes"
#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
-#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:410
+#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:424
#: engines/toltecs/detection.cpp:200 engines/zvision/detection_tables.h:51
msgid "Use original save/load screens"
msgstr "Utilitza les pantalles originals de desat/cрrrega"
#: engines/agi/detection.cpp:148 engines/cine/detection.cpp:71
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
-#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:411
+#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:425
#: engines/toltecs/detection.cpp:201
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
@@ -2455,9 +2455,9 @@ msgstr ""
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore game:"
msgstr "Recupera la partida:"
@@ -2465,13 +2465,13 @@ msgstr "Recupera la partida:"
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore"
msgstr "Restaura"
-#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2393
+#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2395
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -2482,7 +2482,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2386
+#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2388
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -2493,7 +2493,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2404
+#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2406
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -2727,39 +2727,39 @@ msgid ""
"\n"
msgstr ""
-#: engines/mohawk/detection.cpp:168
+#: engines/mohawk/detection.cpp:169
msgid "Play the Myst fly by movie"
msgstr ""
-#: engines/mohawk/detection.cpp:169
+#: engines/mohawk/detection.cpp:170
msgid "The Myst fly by movie was not played by the original engine."
msgstr ""
#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:96 engines/mohawk/dialogs.cpp:239
+#: engines/mohawk/dialogs.cpp:178 engines/mohawk/dialogs.cpp:264
msgid "~Z~ip Mode Activated"
msgstr "Mode ~Z~ip activat"
-#: engines/mohawk/dialogs.cpp:97
+#: engines/mohawk/dialogs.cpp:179
msgid "~T~ransitions Enabled"
msgstr "~T~ransicions activades"
#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:99
+#: engines/mohawk/dialogs.cpp:181
msgid "~D~rop Page"
msgstr "~D~escarta la pрgina"
-#: engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/dialogs.cpp:185
#, fuzzy
msgid "Show ~M~ap"
msgstr "~M~ostra el mapa"
-#: engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:191
#, fuzzy
msgid "Main Men~u~"
msgstr "~M~enњ Principal"
-#: engines/mohawk/dialogs.cpp:240
+#: engines/mohawk/dialogs.cpp:265
msgid "~W~ater Effect Enabled"
msgstr "~E~fecte de l'aigua activat"
@@ -2883,37 +2883,46 @@ msgstr "Introducciѓ alternativa"
msgid "Use an alternative game intro (CD version only)"
msgstr "Utilitza una introducciѓ del joc alternativa (nomщs per la versiѓ CD)"
-#: engines/sci/detection.cpp:380
+#: engines/sci/detection.cpp:384
msgid "Skip EGA dithering pass (full color backgrounds)"
msgstr ""
-#: engines/sci/detection.cpp:381
+#: engines/sci/detection.cpp:385
msgid "Skip dithering pass in EGA games, graphics are shown with full colors"
msgstr ""
-#: engines/sci/detection.cpp:390
+#: engines/sci/detection.cpp:394
#, fuzzy
msgid "Enable high resolution graphics"
msgstr "Activa la barra grрfica dels punts d'impacte"
-#: engines/sci/detection.cpp:391
+#: engines/sci/detection.cpp:395
#, fuzzy
msgid "Enable high resolution graphics/content"
msgstr "Activa la barra grрfica dels punts d'impacte"
-#: engines/sci/detection.cpp:400
+#: engines/sci/detection.cpp:404
+#, fuzzy
+msgid "Enable black-lined video"
+msgstr "Activa el Mode Roland GS"
+
+#: engines/sci/detection.cpp:405
+msgid "Draw black lines over videos to increase their apparent sharpness"
+msgstr ""
+
+#: engines/sci/detection.cpp:414
msgid "Prefer digital sound effects"
msgstr "Prefereix efectes de so digitals"
-#: engines/sci/detection.cpp:401
+#: engines/sci/detection.cpp:415
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Prefereix els efectes de so digitals en lloc dels sintetitzats"
-#: engines/sci/detection.cpp:420
+#: engines/sci/detection.cpp:434
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Utilitza IMF/Yamaha FB-01 per la sortida MIDI"
-#: engines/sci/detection.cpp:421
+#: engines/sci/detection.cpp:435
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -2921,31 +2930,31 @@ msgstr ""
"Utilitza una tarja IBM Music Feature o un mђdul sintetitzador Yamaha FB-01 "
"FM per la sortida MIDI"
-#: engines/sci/detection.cpp:431
+#: engines/sci/detection.cpp:445
msgid "Use CD audio"
msgstr "Utilitza l'рudio del CD"
-#: engines/sci/detection.cpp:432
+#: engines/sci/detection.cpp:446
msgid "Use CD audio instead of in-game audio, if available"
msgstr ""
"Utilitza l'рudio del CD en lloc de l'рudio intern del joc, si estр disponible"
-#: engines/sci/detection.cpp:442
+#: engines/sci/detection.cpp:456
msgid "Use Windows cursors"
msgstr "Utilitza els cursors de Windows"
-#: engines/sci/detection.cpp:443
+#: engines/sci/detection.cpp:457
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"Utilitza els cursors de Windows (mщs petits i en blanc i negre) en lloc dels "
"de DOS"
-#: engines/sci/detection.cpp:453
+#: engines/sci/detection.cpp:467
msgid "Use silver cursors"
msgstr "Utilitza cursors platejats"
-#: engines/sci/detection.cpp:454
+#: engines/sci/detection.cpp:468
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
@@ -3632,7 +3641,7 @@ msgstr "Volum de mњsica:"
msgid "Subtitle speed: "
msgstr "Velocitat de subt.:"
-#: engines/scumm/scumm.cpp:1848
+#: engines/scumm/scumm.cpp:1850
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -3641,7 +3650,7 @@ msgstr ""
"El suport de MIDI natiu requereix l'actualitzaciѓ Roland de LucasArts,\n"
"perђ no s'ha trobat %s. S'utilitzarр AdLib."
-#: engines/scumm/scumm.cpp:2664
+#: engines/scumm/scumm.cpp:2666
#, fuzzy
msgid ""
"Usually, Maniac Mansion would start now. But for that to work, the game "
@@ -3942,6 +3951,3 @@ msgstr ""
#~ msgid "Active filter mode: Nearest"
#~ msgstr "Mode de filtre actiu: Prђxim"
-
-#~ msgid "Enable Roland GS Mode"
-#~ msgstr "Activa el Mode Roland GS"
diff --git a/po/cs_CZ.po b/po/cs_CZ.po
index 88a743e72a..ea8ca29b99 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: 2016-06-07 19:20+0200\n"
+"POT-Creation-Date: 2016-07-19 09:07+0200\n"
"PO-Revision-Date: 2016-02-03 22:59+0100\n"
"Last-Translator: Zbynьk Schwarz <zbynek.schwarz@gmail.com>\n"
"Language-Team: \n"
@@ -61,7 +61,7 @@ msgstr "Jэt nahoru"
#: gui/recorderdialog.cpp:155 gui/saveload-dialog.cpp:216
#: gui/saveload-dialog.cpp:276 gui/saveload-dialog.cpp:547
#: gui/saveload-dialog.cpp:931 gui/themebrowser.cpp:55
-#: gui/updates-dialog.cpp:113 engines/engine.cpp:546
+#: gui/updates-dialog.cpp:113 engines/engine.cpp:549
#: backends/events/default/default-events.cpp:196
#: backends/events/default/default-events.cpp:218
#: backends/platform/wii/options.cpp:48 engines/drascula/saveload.cpp:49
@@ -209,12 +209,12 @@ msgstr "Resetovat veЙkerс nastavenэ FludSynth n ajejich v§chozэ hodnoty."
#: gui/fluidsynth-dialog.cpp:153 gui/KeysDialog.cpp:42 gui/launcher.cpp:354
#: gui/launcher.cpp:1052 gui/launcher.cpp:1056 gui/massadd.cpp:92
-#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:465
-#: engines/engine.cpp:476 backends/platform/wii/options.cpp:47
+#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:468
+#: engines/engine.cpp:479 backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
#: engines/agos/animation.cpp:559 engines/drascula/saveload.cpp:49
#: engines/groovie/script.cpp:407 engines/parallaction/saveload.cpp:271
-#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1850
+#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1852
#: engines/scumm/players/player_v3m.cpp:130
#: engines/scumm/players/player_v5m.cpp:108 engines/sky/compact.cpp:131
#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:524
@@ -504,7 +504,7 @@ msgstr "Vyberte adresсј pro uloОenщ hry"
msgid "This game ID is already taken. Please choose another one."
msgstr "Toto ID hry je uО zabranщ. Vyberte si, prosэm, jinщ."
-#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:115
+#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:98
msgid "~Q~uit"
msgstr "~U~konшit"
@@ -592,7 +592,7 @@ msgid "Search:"
msgstr "Hledat:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
-#: engines/mohawk/dialogs.cpp:120 engines/mohawk/riven.cpp:729
+#: engines/mohawk/dialogs.cpp:103 engines/mohawk/riven.cpp:726
#: engines/pegasus/pegasus.cpp:353 engines/tsage/scenes.cpp:601
msgid "Load game:"
msgstr "Nahrсt hru:"
@@ -600,8 +600,8 @@ msgstr "Nahrсt hru:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
-#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:120
-#: engines/mohawk/riven.cpp:729 engines/parallaction/saveload.cpp:194
+#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/riven.cpp:726 engines/parallaction/saveload.cpp:194
#: engines/pegasus/pegasus.cpp:353 engines/scumm/dialogs.cpp:185
#: engines/tsage/scenes.cpp:601
msgid "Load"
@@ -765,7 +765,7 @@ msgid "Special dithering modes supported by some games"
msgstr "Speciсlnэ reОimy chvьnэ podporovanщ nьkter§mi hrami"
#: gui/options.cpp:764
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2314
msgid "Fullscreen mode"
msgstr "ReОim celщ obrazovky"
@@ -1229,28 +1229,28 @@ msgstr "Zadejte popis pro pozici %d:"
msgid "Select a Theme"
msgstr "Vyberte Vzhled"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgid "Disabled GFX"
msgstr "GFX zakсzсno"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "GFX zakсzсno"
-#: gui/ThemeEngine.cpp:354
+#: gui/ThemeEngine.cpp:416
msgid "Standard Renderer"
msgstr "Standardnэ Vykreslovaш"
-#: gui/ThemeEngine.cpp:354 engines/scumm/dialogs.cpp:659
+#: gui/ThemeEngine.cpp:416 engines/scumm/dialogs.cpp:659
msgid "Standard"
msgstr "Standardnэ"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased Renderer"
msgstr "Vykreslovaш s vyhlazen§mi hranami"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased"
msgstr "S vyhlazen§mi hranami"
@@ -1275,7 +1275,7 @@ msgstr "Zkontrolovat Aktualizace..."
msgid "Proceed"
msgstr ""
-#: gui/widget.cpp:335 gui/widget.cpp:337 gui/widget.cpp:343 gui/widget.cpp:345
+#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
msgstr "Vyшistit hodnotu"
@@ -1436,11 +1436,11 @@ msgstr "hry, kterou jste se pokusili pјidat a jejэ verzi/jazyk/atd.:"
msgid "~R~esume"
msgstr "~P~okraшovat"
-#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:113
+#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:96
msgid "~L~oad"
msgstr "~N~ahrсt"
-#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:114
+#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:97
msgid "~S~ave"
msgstr "~U~loОit"
@@ -1469,11 +1469,11 @@ msgstr "~N~сvrat do SpouЙtьшe"
#: engines/avalanche/parser.cpp:1900 engines/cge/events.cpp:72
#: engines/cge2/events.cpp:65 engines/cruise/menu.cpp:212
#: engines/drascula/saveload.cpp:364 engines/dreamweb/saveload.cpp:262
-#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:121
+#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sci/engine/kfile.cpp:713 engines/sherlock/scalpel/scalpel.cpp:1250
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save game:"
msgstr "UloОit hru:"
@@ -1486,12 +1486,12 @@ msgstr "UloОit hru:"
#: engines/cge/events.cpp:72 engines/cge2/events.cpp:65
#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:364
#: engines/dreamweb/saveload.cpp:262 engines/hugo/file.cpp:298
-#: engines/mohawk/dialogs.cpp:121 engines/neverhood/menumodule.cpp:880
+#: engines/mohawk/dialogs.cpp:104 engines/neverhood/menumodule.cpp:880
#: engines/parallaction/saveload.cpp:209 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/scumm/dialogs.cpp:184
+#: engines/sci/engine/kfile.cpp:713 engines/scumm/dialogs.cpp:184
#: engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save"
msgstr "UloОit"
@@ -1514,13 +1514,13 @@ msgstr ""
"UloОenэ stavu hry selhalo (%s)! Prosэm pјeшtьte si dokumentaci pro zсkladnэ "
"informace a pokyny k zэskсnэ dalЙэ podpory."
-#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:117
-#: engines/mohawk/dialogs.cpp:242 engines/tsage/dialogs.cpp:112
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
+#: engines/tsage/dialogs.cpp:112
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:118
-#: engines/mohawk/dialogs.cpp:243 engines/tsage/dialogs.cpp:113
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:101
+#: engines/tsage/dialogs.cpp:113
msgid "~C~ancel"
msgstr "~Z~ruЙit"
@@ -1528,23 +1528,23 @@ msgstr "~Z~ruЙit"
msgid "~K~eys"
msgstr "~K~lсvesy"
-#: engines/engine.cpp:339
+#: engines/engine.cpp:342
msgid "Could not initialize color format."
msgstr "Nelze zavщst barevn§ formсt."
-#: engines/engine.cpp:347
+#: engines/engine.cpp:350
msgid "Could not switch to video mode: '"
msgstr "Nelze pјepnout na reОim obrazu: '"
-#: engines/engine.cpp:356
+#: engines/engine.cpp:359
msgid "Could not apply aspect ratio setting."
msgstr "Nelze pouОэt nastavenэ pomьru stran."
-#: engines/engine.cpp:361
+#: engines/engine.cpp:364
msgid "Could not apply fullscreen setting."
msgstr "Nelze pouОэt nastavenэ celщ obrazovky."
-#: engines/engine.cpp:461
+#: engines/engine.cpp:464
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1558,7 +1558,7 @@ msgstr ""
"datovщ soubory na VсЙ pevn§ disk.\n"
"Pro podrobnosti si pјeшtьte README."
-#: engines/engine.cpp:472
+#: engines/engine.cpp:475
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1572,7 +1572,7 @@ msgstr ""
"abyste mohli poslouchat hudbu ve hјe.\n"
"Pro podrobnosti si pјeшtьte README."
-#: engines/engine.cpp:530
+#: engines/engine.cpp:533
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1581,7 +1581,7 @@ msgstr ""
"Naшtenэ stavu hry selhalo (%s)! Prosэm pјeшtьte si dokumentaci pro zсkladnэ "
"informace a pokyny k zэskсnэ dalЙэ podpory."
-#: engines/engine.cpp:543
+#: engines/engine.cpp:546
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
@@ -1591,7 +1591,7 @@ msgstr ""
"ScummVM. Proto je moОnщ, Оe bude nestabilnэ a jakщkoli uloОenщ hry nemusэ "
"fungovat v budoucэch verzэch ScummVM."
-#: engines/engine.cpp:546
+#: engines/engine.cpp:549
msgid "Start anyway"
msgstr "Pјesto spustit"
@@ -1816,19 +1816,19 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normсlnэ (bez zmьny velikosti)"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2215
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2213
msgid "Enabled aspect ratio correction"
msgstr "Povolena korekce pomьru stran"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2221
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2219
msgid "Disabled aspect ratio correction"
msgstr "Zakсzсna korekce pomьru stran"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2276
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2274
msgid "Active graphics filter:"
msgstr "Aktivnэ grafick§ filtr:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2318
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
msgid "Windowed mode"
msgstr "ReОim do okna"
@@ -2379,14 +2379,14 @@ msgstr "Zobrazit jmenovky objektљ"
#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
-#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:410
+#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:424
#: engines/toltecs/detection.cpp:200 engines/zvision/detection_tables.h:51
msgid "Use original save/load screens"
msgstr "PouОэt pљvodnэ obrazovky naшtenэ/uloОenэ"
#: engines/agi/detection.cpp:148 engines/cine/detection.cpp:71
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
-#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:411
+#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:425
#: engines/toltecs/detection.cpp:201
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr "PouОэt pљvodnэ obrazovky naшtenэ/uloОenэ mэsto ze ScummVM"
@@ -2437,9 +2437,9 @@ msgstr ""
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore game:"
msgstr "Obnovit hru"
@@ -2447,13 +2447,13 @@ msgstr "Obnovit hru"
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore"
msgstr "Obnovit"
-#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2393
+#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2395
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -2464,7 +2464,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2386
+#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2388
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -2475,7 +2475,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2404
+#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2406
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -2720,39 +2720,39 @@ msgstr ""
"ladэcэ konzoli ScummVM a pouОэt pјэkaz 'import_savefile'.\n"
"\n"
-#: engines/mohawk/detection.cpp:168
+#: engines/mohawk/detection.cpp:169
msgid "Play the Myst fly by movie"
msgstr ""
-#: engines/mohawk/detection.cpp:169
+#: engines/mohawk/detection.cpp:170
msgid "The Myst fly by movie was not played by the original engine."
msgstr ""
#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:96 engines/mohawk/dialogs.cpp:239
+#: engines/mohawk/dialogs.cpp:178 engines/mohawk/dialogs.cpp:264
msgid "~Z~ip Mode Activated"
msgstr "~R~eОim SviЙtьnэ Aktivovсn"
-#: engines/mohawk/dialogs.cpp:97
+#: engines/mohawk/dialogs.cpp:179
msgid "~T~ransitions Enabled"
msgstr "~P~јechody zapnuty"
#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:99
+#: engines/mohawk/dialogs.cpp:181
msgid "~D~rop Page"
msgstr "~Z~ahodit Strсnku"
-#: engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/dialogs.cpp:185
#, fuzzy
msgid "Show ~M~ap"
msgstr "~Z~obrazit Mapu"
-#: engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:191
#, fuzzy
msgid "Main Men~u~"
msgstr "~H~lavnэ Menu"
-#: engines/mohawk/dialogs.cpp:240
+#: engines/mohawk/dialogs.cpp:265
msgid "~W~ater Effect Enabled"
msgstr "~E~fekt Vody Zapnut"
@@ -2875,36 +2875,45 @@ msgstr "Alternativnэ њvod"
msgid "Use an alternative game intro (CD version only)"
msgstr "PouОэt jinou verzi њvodu (Pouze verze CD)"
-#: engines/sci/detection.cpp:380
+#: engines/sci/detection.cpp:384
msgid "Skip EGA dithering pass (full color backgrounds)"
msgstr "Pјekoшit prљchod rozkladu barev EGA (pozadэ v pln§ch barvсch)"
-#: engines/sci/detection.cpp:381
+#: engines/sci/detection.cpp:385
msgid "Skip dithering pass in EGA games, graphics are shown with full colors"
msgstr ""
"Pјeskoшit prљchod rozkladu barev EGA, obraze je zobrazen v pln§ch barvсch"
-#: engines/sci/detection.cpp:390
+#: engines/sci/detection.cpp:394
msgid "Enable high resolution graphics"
msgstr "Povolit grafiku ve vysokщm rozliЙenэ"
-#: engines/sci/detection.cpp:391
+#: engines/sci/detection.cpp:395
msgid "Enable high resolution graphics/content"
msgstr "Povolit grafiku/obsah ve vysokщm rozliЙenэ"
-#: engines/sci/detection.cpp:400
+#: engines/sci/detection.cpp:404
+#, fuzzy
+msgid "Enable black-lined video"
+msgstr "Zapnout reОim Roland GS"
+
+#: engines/sci/detection.cpp:405
+msgid "Draw black lines over videos to increase their apparent sharpness"
+msgstr ""
+
+#: engines/sci/detection.cpp:414
msgid "Prefer digital sound effects"
msgstr "Upјednostђovat digitсlnэ zvukovщ efekty"
-#: engines/sci/detection.cpp:401
+#: engines/sci/detection.cpp:415
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Upјednostђovat digitсlnэ zvukovщ efekty pјed syntetizovan§mi"
-#: engines/sci/detection.cpp:420
+#: engines/sci/detection.cpp:434
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "PouОэt IMF/Yamaha FB-01 pro v§stup MIDI"
-#: engines/sci/detection.cpp:421
+#: engines/sci/detection.cpp:435
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -2912,28 +2921,28 @@ msgstr ""
"PouОэt kartu IBM Music Feature nebo modul syntetizсtoru Yamaha FB-01 FM pro "
"v§stup MIDI"
-#: engines/sci/detection.cpp:431
+#: engines/sci/detection.cpp:445
msgid "Use CD audio"
msgstr "PouОэt zvuky na CD"
-#: engines/sci/detection.cpp:432
+#: engines/sci/detection.cpp:446
msgid "Use CD audio instead of in-game audio, if available"
msgstr "PouОэt zvuky na CD mэsto ve hјe, pokud je dostupnщ"
-#: engines/sci/detection.cpp:442
+#: engines/sci/detection.cpp:456
msgid "Use Windows cursors"
msgstr "PouОэt kurzory Windows"
-#: engines/sci/detection.cpp:443
+#: engines/sci/detection.cpp:457
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr "PouОэt kurzory Windows (menЙэ a шernobэlщ) mэsto kurzorљ z DOS"
-#: engines/sci/detection.cpp:453
+#: engines/sci/detection.cpp:467
msgid "Use silver cursors"
msgstr "PouОэt stјэbrnщ kurzory"
-#: engines/sci/detection.cpp:454
+#: engines/sci/detection.cpp:468
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr "PouОэt alternativnэ sadu stјэbrn§ch kurzorљ mэsto standardnэch zlat§ch"
@@ -3612,7 +3621,7 @@ msgstr "Hlasitost hudby:"
msgid "Subtitle speed: "
msgstr "Rychlost titulkљ:"
-#: engines/scumm/scumm.cpp:1848
+#: engines/scumm/scumm.cpp:1850
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -3621,7 +3630,7 @@ msgstr ""
"Pјirozenс podpora MIDI vyОaduje Aktualizaci Roland od LucasArts,\n"
"ale %s chybэ. Mэsto toho je pouОit AdLib."
-#: engines/scumm/scumm.cpp:2664
+#: engines/scumm/scumm.cpp:2666
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 "
@@ -3924,9 +3933,6 @@ msgstr ""
#~ msgid "Active filter mode: Nearest"
#~ msgstr "Aktivnэ reОim filtru: NejbliОЙэ"
-#~ msgid "Enable Roland GS Mode"
-#~ msgstr "Zapnout reОim Roland GS"
-
#~ msgctxt "lowres"
#~ msgid "Add Game..."
#~ msgstr "Pјidat Hru..."
diff --git a/po/da_DK.po b/po/da_DK.po
index 94f89f624d..38bbf29ada 100644
--- a/po/da_DK.po
+++ b/po/da_DK.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: 2016-06-07 19:20+0200\n"
+"POT-Creation-Date: 2016-07-19 09:07+0200\n"
"PO-Revision-Date: 2016-02-25 21:08+0100\n"
"Last-Translator: Steffen Nyeland <steffen@nyeland.dk>\n"
"Language-Team: Steffen Nyeland <steffen@nyeland.dk>\n"
@@ -59,7 +59,7 @@ msgstr "Gх op"
#: gui/recorderdialog.cpp:155 gui/saveload-dialog.cpp:216
#: gui/saveload-dialog.cpp:276 gui/saveload-dialog.cpp:547
#: gui/saveload-dialog.cpp:931 gui/themebrowser.cpp:55
-#: gui/updates-dialog.cpp:113 engines/engine.cpp:546
+#: gui/updates-dialog.cpp:113 engines/engine.cpp:549
#: backends/events/default/default-events.cpp:196
#: backends/events/default/default-events.cpp:218
#: backends/platform/wii/options.cpp:48 engines/drascula/saveload.cpp:49
@@ -207,12 +207,12 @@ msgstr "Nulstil alle FluidSynth indstillinger til deres standard vцrdier."
#: gui/fluidsynth-dialog.cpp:153 gui/KeysDialog.cpp:42 gui/launcher.cpp:354
#: gui/launcher.cpp:1052 gui/launcher.cpp:1056 gui/massadd.cpp:92
-#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:465
-#: engines/engine.cpp:476 backends/platform/wii/options.cpp:47
+#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:468
+#: engines/engine.cpp:479 backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
#: engines/agos/animation.cpp:559 engines/drascula/saveload.cpp:49
#: engines/groovie/script.cpp:407 engines/parallaction/saveload.cpp:271
-#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1850
+#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1852
#: engines/scumm/players/player_v3m.cpp:130
#: engines/scumm/players/player_v5m.cpp:108 engines/sky/compact.cpp:131
#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:524
@@ -504,7 +504,7 @@ msgstr "Vцlg bibliotek til spil gemmer"
msgid "This game ID is already taken. Please choose another one."
msgstr "Dette spil ID er allerede i brug. Vцlg venligst et andet."
-#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:115
+#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:98
msgid "~Q~uit"
msgstr "~A~fslut"
@@ -592,7 +592,7 @@ msgid "Search:"
msgstr "Sјg:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
-#: engines/mohawk/dialogs.cpp:120 engines/mohawk/riven.cpp:729
+#: engines/mohawk/dialogs.cpp:103 engines/mohawk/riven.cpp:726
#: engines/pegasus/pegasus.cpp:353 engines/tsage/scenes.cpp:601
msgid "Load game:"
msgstr "Indlцs spil:"
@@ -600,8 +600,8 @@ msgstr "Indlцs spil:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
-#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:120
-#: engines/mohawk/riven.cpp:729 engines/parallaction/saveload.cpp:194
+#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/riven.cpp:726 engines/parallaction/saveload.cpp:194
#: engines/pegasus/pegasus.cpp:353 engines/scumm/dialogs.cpp:185
#: engines/tsage/scenes.cpp:601
msgid "Load"
@@ -766,7 +766,7 @@ msgid "Special dithering modes supported by some games"
msgstr "Speciel farvereduceringstilstand understјttet a nogle spil"
#: gui/options.cpp:764
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2314
msgid "Fullscreen mode"
msgstr "Fuldskцrms tilstand"
@@ -1228,28 +1228,28 @@ msgstr "Indtast en beskrivelse af plads %d:"
msgid "Select a Theme"
msgstr "Vцlg et tema"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgid "Disabled GFX"
msgstr "Deaktiveret GFX"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Deaktiveret GFX"
-#: gui/ThemeEngine.cpp:354
+#: gui/ThemeEngine.cpp:416
msgid "Standard Renderer"
msgstr "Standard renderer"
-#: gui/ThemeEngine.cpp:354 engines/scumm/dialogs.cpp:659
+#: gui/ThemeEngine.cpp:416 engines/scumm/dialogs.cpp:659
msgid "Standard"
msgstr "Standard"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased Renderer"
msgstr "Antialias renderer"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased"
msgstr "Antialias"
@@ -1274,7 +1274,7 @@ msgstr "Sјg efter opdateringer..."
msgid "Proceed"
msgstr ""
-#: gui/widget.cpp:335 gui/widget.cpp:337 gui/widget.cpp:343 gui/widget.cpp:345
+#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
msgstr "Slet vцrdi"
@@ -1436,11 +1436,11 @@ msgstr "pх det spil, du forsјgte at tilfјje og dets version/sprog/ etc.:"
msgid "~R~esume"
msgstr "Gen~o~ptag"
-#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:113
+#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:96
msgid "~L~oad"
msgstr "~H~ent"
-#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:114
+#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:97
msgid "~S~ave"
msgstr "~G~em"
@@ -1469,11 +1469,11 @@ msgstr "~R~etur til oversigt"
#: engines/avalanche/parser.cpp:1900 engines/cge/events.cpp:72
#: engines/cge2/events.cpp:65 engines/cruise/menu.cpp:212
#: engines/drascula/saveload.cpp:364 engines/dreamweb/saveload.cpp:262
-#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:121
+#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sci/engine/kfile.cpp:713 engines/sherlock/scalpel/scalpel.cpp:1250
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save game:"
msgstr "Gemmer:"
@@ -1486,12 +1486,12 @@ msgstr "Gemmer:"
#: engines/cge/events.cpp:72 engines/cge2/events.cpp:65
#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:364
#: engines/dreamweb/saveload.cpp:262 engines/hugo/file.cpp:298
-#: engines/mohawk/dialogs.cpp:121 engines/neverhood/menumodule.cpp:880
+#: engines/mohawk/dialogs.cpp:104 engines/neverhood/menumodule.cpp:880
#: engines/parallaction/saveload.cpp:209 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/scumm/dialogs.cpp:184
+#: engines/sci/engine/kfile.cpp:713 engines/scumm/dialogs.cpp:184
#: engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save"
msgstr "Gem"
@@ -1514,13 +1514,13 @@ msgstr ""
"Gem af spiltilstand fejlede (%s)! Se venligst README for grundlцggende "
"oplysninger, og for at fх instruktioner om, hvordan man fхr yderligere hjцlp."
-#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:117
-#: engines/mohawk/dialogs.cpp:242 engines/tsage/dialogs.cpp:112
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
+#: engines/tsage/dialogs.cpp:112
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:118
-#: engines/mohawk/dialogs.cpp:243 engines/tsage/dialogs.cpp:113
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:101
+#: engines/tsage/dialogs.cpp:113
msgid "~C~ancel"
msgstr "~F~ortryd"
@@ -1528,23 +1528,23 @@ msgstr "~F~ortryd"
msgid "~K~eys"
msgstr "~T~aster"
-#: engines/engine.cpp:339
+#: engines/engine.cpp:342
msgid "Could not initialize color format."
msgstr "Kunne ikke initialisere farveformat."
-#: engines/engine.cpp:347
+#: engines/engine.cpp:350
msgid "Could not switch to video mode: '"
msgstr "Kunne ikke skifte til videotilstand: '"
-#: engines/engine.cpp:356
+#: engines/engine.cpp:359
msgid "Could not apply aspect ratio setting."
msgstr "Kunne ikke anvende billedformat korrektion indstilling."
-#: engines/engine.cpp:361
+#: engines/engine.cpp:364
msgid "Could not apply fullscreen setting."
msgstr "Kunne ikke anvende fuldskцrm indstilling."
-#: engines/engine.cpp:461
+#: engines/engine.cpp:464
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1558,7 +1558,7 @@ msgstr ""
"datafiler til din harddisk i stedet.\n"
"Se README fil for detaljer."
-#: engines/engine.cpp:472
+#: engines/engine.cpp:475
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1572,7 +1572,7 @@ msgstr ""
"for at lytte til spillets musik.\n"
"Se README fil for detaljer."
-#: engines/engine.cpp:530
+#: engines/engine.cpp:533
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1582,7 +1582,7 @@ msgstr ""
"grundlцggende oplysninger, og for at fх instruktioner om, hvordan man fхr "
"yderligere hjцlp."
-#: engines/engine.cpp:543
+#: engines/engine.cpp:546
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
@@ -1592,7 +1592,7 @@ msgstr ""
"ScummVM. Sхledes, er det sandsynligt, at det er ustabilt, og alle gemmer du "
"foretager fungerer muligvis ikke i fremtidige versioner af ScummVM."
-#: engines/engine.cpp:546
+#: engines/engine.cpp:549
msgid "Start anyway"
msgstr "Start alligevel"
@@ -1816,19 +1816,19 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normal (ingen skalering)"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2215
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2213
msgid "Enabled aspect ratio correction"
msgstr "Aktivщr billedformat korrektion"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2221
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2219
msgid "Disabled aspect ratio correction"
msgstr "Deaktivщr billedformat korrektion"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2276
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2274
msgid "Active graphics filter:"
msgstr "Aktive grafik filtre:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2318
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
msgid "Windowed mode"
msgstr "Vindue tilstand"
@@ -2378,14 +2378,14 @@ msgstr "Vis labels pх genstande"
#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
-#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:410
+#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:424
#: engines/toltecs/detection.cpp:200 engines/zvision/detection_tables.h:51
msgid "Use original save/load screens"
msgstr "Brug original gem/indlцs skцrme"
#: engines/agi/detection.cpp:148 engines/cine/detection.cpp:71
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
-#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:411
+#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:425
#: engines/toltecs/detection.cpp:201
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr "Brug de originale gem/indlцs skцrme, istedet for dem fra ScummVM"
@@ -2436,9 +2436,9 @@ msgstr ""
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore game:"
msgstr "Gendan spil:"
@@ -2446,13 +2446,13 @@ msgstr "Gendan spil:"
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore"
msgstr "Gendan"
-#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2393
+#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2395
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -2463,7 +2463,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2386
+#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2388
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -2474,7 +2474,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2404
+#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2406
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -2721,39 +2721,39 @@ msgstr ""
"'import_savefile'.\n"
"\n"
-#: engines/mohawk/detection.cpp:168
+#: engines/mohawk/detection.cpp:169
msgid "Play the Myst fly by movie"
msgstr ""
-#: engines/mohawk/detection.cpp:169
+#: engines/mohawk/detection.cpp:170
msgid "The Myst fly by movie was not played by the original engine."
msgstr ""
#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:96 engines/mohawk/dialogs.cpp:239
+#: engines/mohawk/dialogs.cpp:178 engines/mohawk/dialogs.cpp:264
msgid "~Z~ip Mode Activated"
msgstr "~Z~ip tilstand aktiveret"
-#: engines/mohawk/dialogs.cpp:97
+#: engines/mohawk/dialogs.cpp:179
msgid "~T~ransitions Enabled"
msgstr "~O~vergange aktiveret"
#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:99
+#: engines/mohawk/dialogs.cpp:181
msgid "~D~rop Page"
msgstr "Smi~d~ side"
-#: engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/dialogs.cpp:185
#, fuzzy
msgid "Show ~M~ap"
msgstr "Vi~s~ kort"
-#: engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:191
#, fuzzy
msgid "Main Men~u~"
msgstr "Hoved~m~enu"
-#: engines/mohawk/dialogs.cpp:240
+#: engines/mohawk/dialogs.cpp:265
msgid "~W~ater Effect Enabled"
msgstr "~V~andeffekter aktiveret"
@@ -2876,37 +2876,46 @@ msgstr "Alternativ intro"
msgid "Use an alternative game intro (CD version only)"
msgstr "Brug en alternativ spil intro (kun CD version)"
-#: engines/sci/detection.cpp:380
+#: engines/sci/detection.cpp:384
msgid "Skip EGA dithering pass (full color backgrounds)"
msgstr "Skip EGA farvereducering (fuldfarvet baggrunde)"
-#: engines/sci/detection.cpp:381
+#: engines/sci/detection.cpp:385
msgid "Skip dithering pass in EGA games, graphics are shown with full colors"
msgstr ""
"Spring farvereducering i EGA spil over, grafikken bliver vist med fulde "
"farver"
-#: engines/sci/detection.cpp:390
+#: engines/sci/detection.cpp:394
msgid "Enable high resolution graphics"
msgstr "Aktivщr grafik i hјj oplјsning"
-#: engines/sci/detection.cpp:391
+#: engines/sci/detection.cpp:395
msgid "Enable high resolution graphics/content"
msgstr "Aktivщr hјj oplјsnings grafik/indhold"
-#: engines/sci/detection.cpp:400
+#: engines/sci/detection.cpp:404
+#, fuzzy
+msgid "Enable black-lined video"
+msgstr "Aktivщr Roland GS tilstand"
+
+#: engines/sci/detection.cpp:405
+msgid "Draw black lines over videos to increase their apparent sharpness"
+msgstr ""
+
+#: engines/sci/detection.cpp:414
msgid "Prefer digital sound effects"
msgstr "Foretrцk digitale lydeffekter"
-#: engines/sci/detection.cpp:401
+#: engines/sci/detection.cpp:415
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Foretrцk digitale lydeffekter i stedet for syntetiserede"
-#: engines/sci/detection.cpp:420
+#: engines/sci/detection.cpp:434
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Brug IMF/Yamaha FB-01 til MIDI-udgang"
-#: engines/sci/detection.cpp:421
+#: engines/sci/detection.cpp:435
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -2914,28 +2923,28 @@ msgstr ""
"Bruge et IBM Musik Feature-kort eller et Yamaha FB-01 FM synth modul til "
"MIDI-udgang"
-#: engines/sci/detection.cpp:431
+#: engines/sci/detection.cpp:445
msgid "Use CD audio"
msgstr "Brug CD lyd"
-#: engines/sci/detection.cpp:432
+#: engines/sci/detection.cpp:446
msgid "Use CD audio instead of in-game audio, if available"
msgstr "Brug cd-lyd i stedet for lyd fra spillet, hvis tilgцngelige"
-#: engines/sci/detection.cpp:442
+#: engines/sci/detection.cpp:456
msgid "Use Windows cursors"
msgstr "Brug Windows markјr"
-#: engines/sci/detection.cpp:443
+#: engines/sci/detection.cpp:457
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr "Brug Windows-markјrer (mindre og monokrome) i stedet for dem fra DOS"
-#: engines/sci/detection.cpp:453
+#: engines/sci/detection.cpp:467
msgid "Use silver cursors"
msgstr "Brug sјlv markјr"
-#: engines/sci/detection.cpp:454
+#: engines/sci/detection.cpp:468
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
@@ -3615,7 +3624,7 @@ msgstr "Musik lydstyrke: "
msgid "Subtitle speed: "
msgstr "Tekst hastighed: "
-#: engines/scumm/scumm.cpp:1848
+#: engines/scumm/scumm.cpp:1850
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -3624,7 +3633,7 @@ msgstr ""
"Indbygget MIDI understјttelse krцver Roland opgradering fra LucasArts,\n"
"men %s mangler. Bruger AdLib i stedet."
-#: engines/scumm/scumm.cpp:2664
+#: engines/scumm/scumm.cpp:2666
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 "
@@ -3916,9 +3925,6 @@ msgstr "Brug MPEG-video fra DVD-versionen, i stedet for lavere oplјsning AVI"
#~ msgid "Active filter mode: Nearest"
#~ msgstr "Aktiv filter tilstand: Nцrmest"
-#~ msgid "Enable Roland GS Mode"
-#~ msgstr "Aktivщr Roland GS tilstand"
-
#~ msgctxt "lowres"
#~ msgid "Add Game..."
#~ msgstr "Tilfјj spil..."
diff --git a/po/de_DE.po b/po/de_DE.po
index 1f6660093d..227204e395 100644
--- a/po/de_DE.po
+++ b/po/de_DE.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.9.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2016-06-07 19:20+0200\n"
-"PO-Revision-Date: 2016-06-07 20:00+0200\n"
+"POT-Creation-Date: 2016-07-19 09:07+0200\n"
+"PO-Revision-Date: 2016-07-19 9:40:00+0200\n"
"Last-Translator: Lothar Serra Mari <rootfather@scummvm.org>\n"
"Language-Team: Simon Sawatzki <SimSaw@gmx.de>, Lothar Serra Mari "
"<rootfather@scummvm.org>\n"
@@ -60,7 +60,7 @@ msgstr "Pfad hoch"
#: gui/recorderdialog.cpp:155 gui/saveload-dialog.cpp:216
#: gui/saveload-dialog.cpp:276 gui/saveload-dialog.cpp:547
#: gui/saveload-dialog.cpp:931 gui/themebrowser.cpp:55
-#: gui/updates-dialog.cpp:113 engines/engine.cpp:546
+#: gui/updates-dialog.cpp:113 engines/engine.cpp:549
#: backends/events/default/default-events.cpp:196
#: backends/events/default/default-events.cpp:218
#: backends/platform/wii/options.cpp:48 engines/drascula/saveload.cpp:49
@@ -208,12 +208,12 @@ msgstr "Setzt alle FluidSynth-Einstellungen auf ihre Standard-Werte zurќck."
#: gui/fluidsynth-dialog.cpp:153 gui/KeysDialog.cpp:42 gui/launcher.cpp:354
#: gui/launcher.cpp:1052 gui/launcher.cpp:1056 gui/massadd.cpp:92
-#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:465
-#: engines/engine.cpp:476 backends/platform/wii/options.cpp:47
+#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:468
+#: engines/engine.cpp:479 backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
#: engines/agos/animation.cpp:559 engines/drascula/saveload.cpp:49
#: engines/groovie/script.cpp:407 engines/parallaction/saveload.cpp:271
-#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1850
+#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1852
#: engines/scumm/players/player_v3m.cpp:130
#: engines/scumm/players/player_v5m.cpp:108 engines/sky/compact.cpp:131
#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:524
@@ -505,7 +505,7 @@ msgstr "Verzeichnis fќr Spielstфnde auswфhlen"
msgid "This game ID is already taken. Please choose another one."
msgstr "Diese Spielkennung ist schon vergeben. Bitte eine andere wфhlen."
-#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:115
+#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:98
msgid "~Q~uit"
msgstr "~B~eenden"
@@ -595,7 +595,7 @@ msgid "Search:"
msgstr "Suchen:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
-#: engines/mohawk/dialogs.cpp:120 engines/mohawk/riven.cpp:729
+#: engines/mohawk/dialogs.cpp:103 engines/mohawk/riven.cpp:726
#: engines/pegasus/pegasus.cpp:353 engines/tsage/scenes.cpp:601
msgid "Load game:"
msgstr "Spiel laden:"
@@ -603,8 +603,8 @@ msgstr "Spiel laden:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
-#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:120
-#: engines/mohawk/riven.cpp:729 engines/parallaction/saveload.cpp:194
+#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/riven.cpp:726 engines/parallaction/saveload.cpp:194
#: engines/pegasus/pegasus.cpp:353 engines/scumm/dialogs.cpp:185
#: engines/tsage/scenes.cpp:601
msgid "Load"
@@ -771,7 +771,7 @@ msgstr ""
"Spezielle Farbmischungsmethoden werden von manchen Spielen unterstќtzt."
#: gui/options.cpp:764
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2314
msgid "Fullscreen mode"
msgstr "Vollbildmodus"
@@ -1244,28 +1244,28 @@ msgstr "Geben Sie eine Beschreibung fќr Speicherplatz %d ein:"
msgid "Select a Theme"
msgstr "Thema auswфhlen"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgid "Disabled GFX"
msgstr "GFX ausgeschaltet"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "GFX ausgeschaltet"
-#: gui/ThemeEngine.cpp:354
+#: gui/ThemeEngine.cpp:416
msgid "Standard Renderer"
msgstr "Standard-Renderer"
-#: gui/ThemeEngine.cpp:354 engines/scumm/dialogs.cpp:659
+#: gui/ThemeEngine.cpp:416 engines/scumm/dialogs.cpp:659
msgid "Standard"
msgstr "Standard"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased Renderer"
msgstr "Kantenglфttung"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased"
msgstr "Kantenglфttung"
@@ -1295,7 +1295,7 @@ msgstr "Automatisch nach Aktualisierungen suchen"
msgid "Proceed"
msgstr "Fortfahren"
-#: gui/widget.cpp:335 gui/widget.cpp:337 gui/widget.cpp:343 gui/widget.cpp:345
+#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
msgstr "Wert lіschen"
@@ -1459,11 +1459,11 @@ msgstr ""
msgid "~R~esume"
msgstr "~F~ortsetzen"
-#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:113
+#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:96
msgid "~L~oad"
msgstr "~L~aden"
-#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:114
+#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:97
msgid "~S~ave"
msgstr "~S~peichern"
@@ -1492,11 +1492,11 @@ msgstr "Zur Spiele~l~iste"
#: engines/avalanche/parser.cpp:1900 engines/cge/events.cpp:72
#: engines/cge2/events.cpp:65 engines/cruise/menu.cpp:212
#: engines/drascula/saveload.cpp:364 engines/dreamweb/saveload.cpp:262
-#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:121
+#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sci/engine/kfile.cpp:713 engines/sherlock/scalpel/scalpel.cpp:1250
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save game:"
msgstr "Speichern:"
@@ -1509,12 +1509,12 @@ msgstr "Speichern:"
#: engines/cge/events.cpp:72 engines/cge2/events.cpp:65
#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:364
#: engines/dreamweb/saveload.cpp:262 engines/hugo/file.cpp:298
-#: engines/mohawk/dialogs.cpp:121 engines/neverhood/menumodule.cpp:880
+#: engines/mohawk/dialogs.cpp:104 engines/neverhood/menumodule.cpp:880
#: engines/parallaction/saveload.cpp:209 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/scumm/dialogs.cpp:184
+#: engines/sci/engine/kfile.cpp:713 engines/scumm/dialogs.cpp:184
#: engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save"
msgstr "Speichern"
@@ -1536,13 +1536,13 @@ msgstr ""
"Speichern des Spielstands %s fehlgeschlagen! Bitte lesen Sie die Liesmich-"
"Datei fќr grundlegende Informationen und Anweisungen zu weiterer Hilfe."
-#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:117
-#: engines/mohawk/dialogs.cpp:242 engines/tsage/dialogs.cpp:112
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
+#: engines/tsage/dialogs.cpp:112
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:118
-#: engines/mohawk/dialogs.cpp:243 engines/tsage/dialogs.cpp:113
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:101
+#: engines/tsage/dialogs.cpp:113
msgid "~C~ancel"
msgstr "~A~bbrechen"
@@ -1550,23 +1550,23 @@ msgstr "~A~bbrechen"
msgid "~K~eys"
msgstr "~T~asten"
-#: engines/engine.cpp:339
+#: engines/engine.cpp:342
msgid "Could not initialize color format."
msgstr "Konnte Farbenformat nicht initialisieren."
-#: engines/engine.cpp:347
+#: engines/engine.cpp:350
msgid "Could not switch to video mode: '"
msgstr "Konnte nicht zu Grafikmodus wechseln: \""
-#: engines/engine.cpp:356
+#: engines/engine.cpp:359
msgid "Could not apply aspect ratio setting."
msgstr "Konnte Einstellung fќr Seitenverhфltniskorrektur nicht anwenden."
-#: engines/engine.cpp:361
+#: engines/engine.cpp:364
msgid "Could not apply fullscreen setting."
msgstr "Konnte Einstellung fќr Vollbildmodus nicht anwenden."
-#: engines/engine.cpp:461
+#: engines/engine.cpp:464
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1582,7 +1582,7 @@ msgstr ""
"Lesen Sie die Liesmich-Datei fќr\n"
"weitere Informationen."
-#: engines/engine.cpp:472
+#: engines/engine.cpp:475
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1597,7 +1597,7 @@ msgstr ""
"Spiel hіren zu kіnnen. Lesen Sie die\n"
"Liesmich-Datei fќr weitere Informationen."
-#: engines/engine.cpp:530
+#: engines/engine.cpp:533
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1606,7 +1606,7 @@ msgstr ""
"Laden des Spielstands %s fehlgeschlagen! Bitte lesen Sie die Liesmich-Datei "
"fќr grundlegende Informationen und Anweisungen zu weiterer Hilfe."
-#: engines/engine.cpp:543
+#: engines/engine.cpp:546
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
@@ -1617,7 +1617,7 @@ msgstr ""
"und jegliche Spielstфnde, die Sie erstellen, kіnnten in zukќnftigen "
"Versionen von ScummVM nicht mehr funktionieren."
-#: engines/engine.cpp:546
+#: engines/engine.cpp:549
msgid "Start anyway"
msgstr "Trotzdem starten"
@@ -1842,19 +1842,19 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normal ohn.Skalieren"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2215
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2213
msgid "Enabled aspect ratio correction"
msgstr "Seitenverhфltniskorrektur an"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2221
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2219
msgid "Disabled aspect ratio correction"
msgstr "Seitenverhфltniskorrektur aus"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2276
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2274
msgid "Active graphics filter:"
msgstr "Aktiver Grafikfilter:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2318
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
msgid "Windowed mode"
msgstr "Fenstermodus"
@@ -2403,14 +2403,14 @@ msgstr "Abtastzeilen (Scanlines) anzeigen"
#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
-#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:410
+#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:424
#: engines/toltecs/detection.cpp:200 engines/zvision/detection_tables.h:51
msgid "Use original save/load screens"
msgstr "Originale Spielstand-Menќs"
#: engines/agi/detection.cpp:148 engines/cine/detection.cpp:71
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
-#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:411
+#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:425
#: engines/toltecs/detection.cpp:201
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
@@ -2465,9 +2465,9 @@ msgstr ""
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore game:"
msgstr "Spiel laden:"
@@ -2475,13 +2475,13 @@ msgstr "Spiel laden:"
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore"
msgstr "Laden"
-#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2393
+#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2395
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -2492,7 +2492,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2386
+#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2388
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -2503,7 +2503,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2404
+#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2406
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -2754,39 +2754,39 @@ msgstr ""
"\"import_savefile\" verwenden.\n"
"\n"
-#: engines/mohawk/detection.cpp:168
+#: engines/mohawk/detection.cpp:169
msgid "Play the Myst fly by movie"
msgstr "Video vom Anflug auf Myst abspielen"
-#: engines/mohawk/detection.cpp:169
+#: engines/mohawk/detection.cpp:170
msgid "The Myst fly by movie was not played by the original engine."
msgstr ""
"Das Video, welches den Anflug auf Myst zeigt, wurde in der ursprќnglichen "
"Engine nicht abgespielt."
#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:96 engines/mohawk/dialogs.cpp:239
+#: engines/mohawk/dialogs.cpp:178 engines/mohawk/dialogs.cpp:264
msgid "~Z~ip Mode Activated"
msgstr "~Zip-Modus aktiviert"
-#: engines/mohawk/dialogs.cpp:97
+#: engines/mohawk/dialogs.cpp:179
msgid "~T~ransitions Enabled"
msgstr "мber~g~фnge aktiviert"
#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:99
+#: engines/mohawk/dialogs.cpp:181
msgid "~D~rop Page"
msgstr "Seite ~a~blegen"
-#: engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/dialogs.cpp:185
msgid "Show ~M~ap"
msgstr "~K~arte anzeigen"
-#: engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:191
msgid "Main Men~u~"
msgstr "Haupt~m~enќ"
-#: engines/mohawk/dialogs.cpp:240
+#: engines/mohawk/dialogs.cpp:265
msgid "~W~ater Effect Enabled"
msgstr "~W~assereffekt aktiviert"
@@ -2911,37 +2911,45 @@ msgstr "Alternativer Vorspann"
msgid "Use an alternative game intro (CD version only)"
msgstr "Verwendet einen alternativen Vorspann (nur bei CD-Version)."
-#: engines/sci/detection.cpp:380
+#: engines/sci/detection.cpp:384
msgid "Skip EGA dithering pass (full color backgrounds)"
msgstr "мberspringe EGA-Fehlerdiffusion (Vollfarbige Hintergrќnde)"
-#: engines/sci/detection.cpp:381
+#: engines/sci/detection.cpp:385
msgid "Skip dithering pass in EGA games, graphics are shown with full colors"
msgstr ""
"мberspringe Fehlerdiffusion in EGA-Spielen, Grafik wird mit allen Farben "
"gezeigt"
-#: engines/sci/detection.cpp:390
+#: engines/sci/detection.cpp:394
msgid "Enable high resolution graphics"
-msgstr "Aktiviere hochauflіsende Grafik."
+msgstr "Aktiviere hochauflіsende Grafik"
-#: engines/sci/detection.cpp:391
+#: engines/sci/detection.cpp:395
msgid "Enable high resolution graphics/content"
msgstr "Aktiviere hochauflіsende Grafik/Inhalte"
-#: engines/sci/detection.cpp:400
+#: engines/sci/detection.cpp:404
+msgid "Enable black-lined video"
+msgstr "Aktiviere schwarze Linien in Videos"
+
+#: engines/sci/detection.cpp:405
+msgid "Draw black lines over videos to increase their apparent sharpness"
+msgstr "Zeichne schwarze Linien ќber Videos, um die scheinbare Schфrfe zu erhіhen"
+
+#: engines/sci/detection.cpp:414
msgid "Prefer digital sound effects"
msgstr "Digitale Gerфusch-Effekte bevorzugen"
-#: engines/sci/detection.cpp:401
+#: engines/sci/detection.cpp:415
msgid "Prefer digital sound effects instead of synthesized ones"
-msgstr "Bevorzugt digitale Gerфusch-Effekte statt synthethisierter."
+msgstr "Bevorzugt digitale Gerфusch-Effekte statt synthethisierter"
-#: engines/sci/detection.cpp:420
+#: engines/sci/detection.cpp:434
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "IMF/Yamaha FB-01 fќr MIDI-Ausgabe verwenden"
-#: engines/sci/detection.cpp:421
+#: engines/sci/detection.cpp:435
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -2949,30 +2957,30 @@ msgstr ""
"Verwendet eine Music-Feature-Karte von IBM oder ein Yamaha-FB-01-FM-"
"Synthetisierungsmodul fќr die MIDI-Ausgabe."
-#: engines/sci/detection.cpp:431
+#: engines/sci/detection.cpp:445
msgid "Use CD audio"
msgstr "CD-Ton verwenden"
-#: engines/sci/detection.cpp:432
+#: engines/sci/detection.cpp:446
msgid "Use CD audio instead of in-game audio, if available"
msgstr "Verwendet CD-Ton anstatt des Tons im Spiel, sofern verfќgbar."
-#: engines/sci/detection.cpp:442
+#: engines/sci/detection.cpp:456
msgid "Use Windows cursors"
msgstr "Windows-Mauszeiger verwenden"
-#: engines/sci/detection.cpp:443
+#: engines/sci/detection.cpp:457
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"Verwendet die Windows-Mauszeiger (kleiner und schwarz-weiп) anstatt der von "
"DOS."
-#: engines/sci/detection.cpp:453
+#: engines/sci/detection.cpp:467
msgid "Use silver cursors"
msgstr "Silberne Mauszeiger verwenden"
-#: engines/sci/detection.cpp:454
+#: engines/sci/detection.cpp:468
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
@@ -3652,7 +3660,7 @@ msgstr "Musiklautstфrke:"
msgid "Subtitle speed: "
msgstr "Untertitel-Tempo:"
-#: engines/scumm/scumm.cpp:1848
+#: engines/scumm/scumm.cpp:1850
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -3662,7 +3670,7 @@ msgstr ""
"Roland-Upgrade von LucasArts, aber %s\n"
"fehlt. Stattdessen wird AdLib verwendet."
-#: engines/scumm/scumm.cpp:2664
+#: engines/scumm/scumm.cpp:2666
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 "
@@ -3972,9 +3980,6 @@ msgstr ""
#~ msgid "Active filter mode: Nearest"
#~ msgstr "Aktiver Filtermodus: nфchste Nachbarn"
-#~ msgid "Enable Roland GS Mode"
-#~ msgstr "Roland-GS-Modus"
-
#~ msgid ""
#~ "Your game version has been detected using filename matching as a variant "
#~ "of %s."
diff --git a/po/es_ES.po b/po/es_ES.po
index af10c6df4e..33e4783d32 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: 2016-06-07 19:20+0200\n"
+"POT-Creation-Date: 2016-07-19 09:07+0200\n"
"PO-Revision-Date: 2016-02-24 18:01+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -58,7 +58,7 @@ msgstr "Arriba"
#: gui/recorderdialog.cpp:155 gui/saveload-dialog.cpp:216
#: gui/saveload-dialog.cpp:276 gui/saveload-dialog.cpp:547
#: gui/saveload-dialog.cpp:931 gui/themebrowser.cpp:55
-#: gui/updates-dialog.cpp:113 engines/engine.cpp:546
+#: gui/updates-dialog.cpp:113 engines/engine.cpp:549
#: backends/events/default/default-events.cpp:196
#: backends/events/default/default-events.cpp:218
#: backends/platform/wii/options.cpp:48 engines/drascula/saveload.cpp:49
@@ -206,12 +206,12 @@ msgstr "Volver a los valores por defecto de las opciones de FluidSynth"
#: gui/fluidsynth-dialog.cpp:153 gui/KeysDialog.cpp:42 gui/launcher.cpp:354
#: gui/launcher.cpp:1052 gui/launcher.cpp:1056 gui/massadd.cpp:92
-#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:465
-#: engines/engine.cpp:476 backends/platform/wii/options.cpp:47
+#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:468
+#: engines/engine.cpp:479 backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
#: engines/agos/animation.cpp:559 engines/drascula/saveload.cpp:49
#: engines/groovie/script.cpp:407 engines/parallaction/saveload.cpp:271
-#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1850
+#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1852
#: engines/scumm/players/player_v3m.cpp:130
#: engines/scumm/players/player_v5m.cpp:108 engines/sky/compact.cpp:131
#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:524
@@ -503,7 +503,7 @@ msgstr "Selecciona el directorio para partidas guardadas"
msgid "This game ID is already taken. Please choose another one."
msgstr "Esta ID ya estс siendo usada. Por favor, elige otra."
-#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:115
+#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:98
msgid "~Q~uit"
msgstr "~S~alir"
@@ -591,7 +591,7 @@ msgid "Search:"
msgstr "Buscar:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
-#: engines/mohawk/dialogs.cpp:120 engines/mohawk/riven.cpp:729
+#: engines/mohawk/dialogs.cpp:103 engines/mohawk/riven.cpp:726
#: engines/pegasus/pegasus.cpp:353 engines/tsage/scenes.cpp:601
msgid "Load game:"
msgstr "Cargar juego:"
@@ -599,8 +599,8 @@ msgstr "Cargar juego:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
-#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:120
-#: engines/mohawk/riven.cpp:729 engines/parallaction/saveload.cpp:194
+#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/riven.cpp:726 engines/parallaction/saveload.cpp:194
#: engines/pegasus/pegasus.cpp:353 engines/scumm/dialogs.cpp:185
#: engines/tsage/scenes.cpp:601
msgid "Load"
@@ -765,7 +765,7 @@ msgid "Special dithering modes supported by some games"
msgstr "Modos especiales de difuminado compatibles con algunos juegos"
#: gui/options.cpp:764
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2314
msgid "Fullscreen mode"
msgstr "Pantalla completa"
@@ -1235,28 +1235,28 @@ msgstr "Introduce una descripciѓn para la ranura %d:"
msgid "Select a Theme"
msgstr "Selecciona un tema"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgid "Disabled GFX"
msgstr "Grсf. desactivados"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Grсf. desactivados"
-#: gui/ThemeEngine.cpp:354
+#: gui/ThemeEngine.cpp:416
msgid "Standard Renderer"
msgstr "Estсndar"
-#: gui/ThemeEngine.cpp:354 engines/scumm/dialogs.cpp:659
+#: gui/ThemeEngine.cpp:416 engines/scumm/dialogs.cpp:659
msgid "Standard"
msgstr "Estсndar"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased Renderer"
msgstr "Suavizado"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased"
msgstr "Suavizado"
@@ -1281,7 +1281,7 @@ msgstr "Buscar actualizaciones..."
msgid "Proceed"
msgstr ""
-#: gui/widget.cpp:335 gui/widget.cpp:337 gui/widget.cpp:343 gui/widget.cpp:345
+#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
msgstr "Eliminar valor"
@@ -1442,11 +1442,11 @@ msgstr "del juego que has intentado aёadir y su versiѓn/idioma/etc.:"
msgid "~R~esume"
msgstr "~R~eanudar"
-#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:113
+#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:96
msgid "~L~oad"
msgstr "~C~argar"
-#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:114
+#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:97
msgid "~S~ave"
msgstr "~G~uardar"
@@ -1475,11 +1475,11 @@ msgstr "~V~olver al lanzador"
#: engines/avalanche/parser.cpp:1900 engines/cge/events.cpp:72
#: engines/cge2/events.cpp:65 engines/cruise/menu.cpp:212
#: engines/drascula/saveload.cpp:364 engines/dreamweb/saveload.cpp:262
-#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:121
+#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sci/engine/kfile.cpp:713 engines/sherlock/scalpel/scalpel.cpp:1250
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save game:"
msgstr "Guardar partida"
@@ -1492,12 +1492,12 @@ msgstr "Guardar partida"
#: engines/cge/events.cpp:72 engines/cge2/events.cpp:65
#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:364
#: engines/dreamweb/saveload.cpp:262 engines/hugo/file.cpp:298
-#: engines/mohawk/dialogs.cpp:121 engines/neverhood/menumodule.cpp:880
+#: engines/mohawk/dialogs.cpp:104 engines/neverhood/menumodule.cpp:880
#: engines/parallaction/saveload.cpp:209 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/scumm/dialogs.cpp:184
+#: engines/sci/engine/kfile.cpp:713 engines/scumm/dialogs.cpp:184
#: engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save"
msgstr "Guardar"
@@ -1521,13 +1521,13 @@ msgstr ""
"archivo README para encontrar informaciѓn bсsica e instrucciones sobre cѓmo "
"obtener mсs ayuda."
-#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:117
-#: engines/mohawk/dialogs.cpp:242 engines/tsage/dialogs.cpp:112
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
+#: engines/tsage/dialogs.cpp:112
msgid "~O~K"
msgstr "~S~э"
-#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:118
-#: engines/mohawk/dialogs.cpp:243 engines/tsage/dialogs.cpp:113
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:101
+#: engines/tsage/dialogs.cpp:113
msgid "~C~ancel"
msgstr "~C~ancelar"
@@ -1535,23 +1535,23 @@ msgstr "~C~ancelar"
msgid "~K~eys"
msgstr "~T~eclas"
-#: engines/engine.cpp:339
+#: engines/engine.cpp:342
msgid "Could not initialize color format."
msgstr "No se ha podido iniciar el formato de color."
-#: engines/engine.cpp:347
+#: engines/engine.cpp:350
msgid "Could not switch to video mode: '"
msgstr "No se ha podido cambiar al modo de video: '"
-#: engines/engine.cpp:356
+#: engines/engine.cpp:359
msgid "Could not apply aspect ratio setting."
msgstr "No se ha podido aplicar el ajuste de correcciѓn de aspecto"
-#: engines/engine.cpp:361
+#: engines/engine.cpp:364
msgid "Could not apply fullscreen setting."
msgstr "No se ha podido aplicar el ajuste de pantalla completa."
-#: engines/engine.cpp:461
+#: engines/engine.cpp:464
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1565,7 +1565,7 @@ msgstr ""
"copiar los archivos del juego al disco duro.\n"
"Consulta el archivo README para mсs detalles."
-#: engines/engine.cpp:472
+#: engines/engine.cpp:475
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1579,7 +1579,7 @@ msgstr ""
"poder escuchar la mњsica del juego.\n"
"Consulta el archivo README para mсs detalles."
-#: engines/engine.cpp:530
+#: engines/engine.cpp:533
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1589,7 +1589,7 @@ msgstr ""
"README para encontrar informaciѓn bсsica e instrucciones sobre cѓmo obtener "
"mсs ayuda."
-#: engines/engine.cpp:543
+#: engines/engine.cpp:546
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
@@ -1599,7 +1599,7 @@ msgstr ""
"ScummVM. Por lo tanto, puede que sea inestable, y que las partidas que "
"guardes no funcionen en versiones futuras de ScummVM."
-#: engines/engine.cpp:546
+#: engines/engine.cpp:549
msgid "Start anyway"
msgstr "Jugar aun asэ"
@@ -1824,19 +1824,19 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normal"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2215
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2213
msgid "Enabled aspect ratio correction"
msgstr "Activar la correcciѓn de aspecto"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2221
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2219
msgid "Disabled aspect ratio correction"
msgstr "Desactivar la correcciѓn de aspecto"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2276
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2274
msgid "Active graphics filter:"
msgstr "Filtro de grсficos activo:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2318
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
msgid "Windowed mode"
msgstr "Modo ventana"
@@ -2386,14 +2386,14 @@ msgstr "Mostrar etiquetas de objetos"
#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
-#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:410
+#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:424
#: engines/toltecs/detection.cpp:200 engines/zvision/detection_tables.h:51
msgid "Use original save/load screens"
msgstr "Usar pantallas de guardar/cargar originales"
#: engines/agi/detection.cpp:148 engines/cine/detection.cpp:71
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
-#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:411
+#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:425
#: engines/toltecs/detection.cpp:201
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
@@ -2445,9 +2445,9 @@ msgstr ""
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore game:"
msgstr "Cargar partida:"
@@ -2455,13 +2455,13 @@ msgstr "Cargar partida:"
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore"
msgstr "Cargar"
-#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2393
+#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2395
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -2472,7 +2472,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2386
+#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2388
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -2483,7 +2483,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2404
+#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2406
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -2729,39 +2729,39 @@ msgstr ""
"'import_savefile'.\n"
"\n"
-#: engines/mohawk/detection.cpp:168
+#: engines/mohawk/detection.cpp:169
msgid "Play the Myst fly by movie"
msgstr ""
-#: engines/mohawk/detection.cpp:169
+#: engines/mohawk/detection.cpp:170
msgid "The Myst fly by movie was not played by the original engine."
msgstr ""
#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:96 engines/mohawk/dialogs.cpp:239
+#: engines/mohawk/dialogs.cpp:178 engines/mohawk/dialogs.cpp:264
msgid "~Z~ip Mode Activated"
msgstr "Modo ~Z~ip activado"
-#: engines/mohawk/dialogs.cpp:97
+#: engines/mohawk/dialogs.cpp:179
msgid "~T~ransitions Enabled"
msgstr "Tra~n~siciones activadas"
#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:99
+#: engines/mohawk/dialogs.cpp:181
msgid "~D~rop Page"
msgstr "~T~irar pсgina"
-#: engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/dialogs.cpp:185
#, fuzzy
msgid "Show ~M~ap"
msgstr "~M~ostrar el mapa"
-#: engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:191
#, fuzzy
msgid "Main Men~u~"
msgstr "~M~enњ principal"
-#: engines/mohawk/dialogs.cpp:240
+#: engines/mohawk/dialogs.cpp:265
msgid "~W~ater Effect Enabled"
msgstr "Efecto ag~u~a activado"
@@ -2885,37 +2885,46 @@ msgid "Use an alternative game intro (CD version only)"
msgstr ""
"Usa una introducciѓn alternativa para el juego (solo para la versiѓn CD)"
-#: engines/sci/detection.cpp:380
+#: engines/sci/detection.cpp:384
msgid "Skip EGA dithering pass (full color backgrounds)"
msgstr "Omitir difuminado EGA (colores completos)"
-#: engines/sci/detection.cpp:381
+#: engines/sci/detection.cpp:385
msgid "Skip dithering pass in EGA games, graphics are shown with full colors"
msgstr ""
"Omitir pasada de difuminado en los juegos EGA. Los grсficos se muestran con "
"los colores completos"
-#: engines/sci/detection.cpp:390
+#: engines/sci/detection.cpp:394
msgid "Enable high resolution graphics"
msgstr "Activar grсficos de alta resoluciѓn"
-#: engines/sci/detection.cpp:391
+#: engines/sci/detection.cpp:395
msgid "Enable high resolution graphics/content"
msgstr "Activar grсficos/contenido de alta resoluciѓn"
-#: engines/sci/detection.cpp:400
+#: engines/sci/detection.cpp:404
+#, fuzzy
+msgid "Enable black-lined video"
+msgstr "Activar modo Roland GS"
+
+#: engines/sci/detection.cpp:405
+msgid "Draw black lines over videos to increase their apparent sharpness"
+msgstr ""
+
+#: engines/sci/detection.cpp:414
msgid "Prefer digital sound effects"
msgstr "Preferir efectos de sonido digitales"
-#: engines/sci/detection.cpp:401
+#: engines/sci/detection.cpp:415
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Preferir efectos de sonido digitales en vez de los sintetizados"
-#: engines/sci/detection.cpp:420
+#: engines/sci/detection.cpp:434
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Usar IMF/Yamaha FB-01 para la salida MIDI"
-#: engines/sci/detection.cpp:421
+#: engines/sci/detection.cpp:435
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -2923,29 +2932,29 @@ msgstr ""
"Usar una tarjeta IBM Music o un mѓdulo sintetizador Yamaha FB-01 FM para la "
"salida MIDI"
-#: engines/sci/detection.cpp:431
+#: engines/sci/detection.cpp:445
msgid "Use CD audio"
msgstr "Usar CD audio"
-#: engines/sci/detection.cpp:432
+#: engines/sci/detection.cpp:446
msgid "Use CD audio instead of in-game audio, if available"
msgstr "Usar CD audio en vez del sonido interno del juego, si estс disponible"
-#: engines/sci/detection.cpp:442
+#: engines/sci/detection.cpp:456
msgid "Use Windows cursors"
msgstr "Usar cursores de Windows"
-#: engines/sci/detection.cpp:443
+#: engines/sci/detection.cpp:457
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"Usar los cursores de Windows (mсs pequeёos y monocromos) en vez de los de DOS"
-#: engines/sci/detection.cpp:453
+#: engines/sci/detection.cpp:467
msgid "Use silver cursors"
msgstr "Usar cursores plateados"
-#: engines/sci/detection.cpp:454
+#: engines/sci/detection.cpp:468
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
@@ -3625,7 +3634,7 @@ msgstr "Volumen de la mњsica:"
msgid "Subtitle speed: "
msgstr "Vel. de subtэtulos:"
-#: engines/scumm/scumm.cpp:1848
+#: engines/scumm/scumm.cpp:1850
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -3634,7 +3643,7 @@ msgstr ""
"El soporte MIDI nativo requiere la actualizaciѓn Roland de LucasArts,\n"
"pero %s no estс disponible. Se usarс AdLib."
-#: engines/scumm/scumm.cpp:2664
+#: engines/scumm/scumm.cpp:2666
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 "
@@ -3936,6 +3945,3 @@ msgstr ""
#~ msgid "Active filter mode: Nearest"
#~ msgstr "Modo de filtro activo: mсs cercano"
-
-#~ msgid "Enable Roland GS Mode"
-#~ msgstr "Activar modo Roland GS"
diff --git a/po/eu.po b/po/eu.po
index ac545fe102..e0100ed169 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: 2016-06-07 19:20+0200\n"
+"POT-Creation-Date: 2016-07-19 09:07+0200\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"
@@ -57,7 +57,7 @@ msgstr "Joan gora"
#: gui/recorderdialog.cpp:155 gui/saveload-dialog.cpp:216
#: gui/saveload-dialog.cpp:276 gui/saveload-dialog.cpp:547
#: gui/saveload-dialog.cpp:931 gui/themebrowser.cpp:55
-#: gui/updates-dialog.cpp:113 engines/engine.cpp:546
+#: gui/updates-dialog.cpp:113 engines/engine.cpp:549
#: backends/events/default/default-events.cpp:196
#: backends/events/default/default-events.cpp:218
#: backends/platform/wii/options.cpp:48 engines/drascula/saveload.cpp:49
@@ -205,12 +205,12 @@ msgstr "Berrazarri FluidSynth-en ezarpen guztiak bere balio lehenetsietara"
#: gui/fluidsynth-dialog.cpp:153 gui/KeysDialog.cpp:42 gui/launcher.cpp:354
#: gui/launcher.cpp:1052 gui/launcher.cpp:1056 gui/massadd.cpp:92
-#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:465
-#: engines/engine.cpp:476 backends/platform/wii/options.cpp:47
+#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:468
+#: engines/engine.cpp:479 backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
#: engines/agos/animation.cpp:559 engines/drascula/saveload.cpp:49
#: engines/groovie/script.cpp:407 engines/parallaction/saveload.cpp:271
-#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1850
+#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1852
#: engines/scumm/players/player_v3m.cpp:130
#: engines/scumm/players/player_v5m.cpp:108 engines/sky/compact.cpp:131
#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:524
@@ -499,7 +499,7 @@ msgstr "Partida gordeen direktorioa aukeratu"
msgid "This game ID is already taken. Please choose another one."
msgstr "ID hau jada erabilia izaten ari da. Mesedez, aukeratu beste bat."
-#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:115
+#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:98
msgid "~Q~uit"
msgstr "~I~rten"
@@ -587,7 +587,7 @@ msgid "Search:"
msgstr "Bilatu:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
-#: engines/mohawk/dialogs.cpp:120 engines/mohawk/riven.cpp:729
+#: engines/mohawk/dialogs.cpp:103 engines/mohawk/riven.cpp:726
#: engines/pegasus/pegasus.cpp:353 engines/tsage/scenes.cpp:601
msgid "Load game:"
msgstr "Jokoa kargatu:"
@@ -595,8 +595,8 @@ msgstr "Jokoa kargatu:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
-#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:120
-#: engines/mohawk/riven.cpp:729 engines/parallaction/saveload.cpp:194
+#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/riven.cpp:726 engines/parallaction/saveload.cpp:194
#: engines/pegasus/pegasus.cpp:353 engines/scumm/dialogs.cpp:185
#: engines/tsage/scenes.cpp:601
msgid "Load"
@@ -764,7 +764,7 @@ msgid "Special dithering modes supported by some games"
msgstr "Joko batzuk onarturiko lausotze-modu bereziak"
#: gui/options.cpp:764
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2314
msgid "Fullscreen mode"
msgstr "Pantaila osoa"
@@ -1231,28 +1231,28 @@ msgstr "Sartu deskribapena %d zirrikiturako: "
msgid "Select a Theme"
msgstr "Gaia aukeratu"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgid "Disabled GFX"
msgstr "GFX desgaituta"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "GFX desgaituta"
-#: gui/ThemeEngine.cpp:354
+#: gui/ThemeEngine.cpp:416
msgid "Standard Renderer"
msgstr "Errendatzaile estandarra"
-#: gui/ThemeEngine.cpp:354 engines/scumm/dialogs.cpp:659
+#: gui/ThemeEngine.cpp:416 engines/scumm/dialogs.cpp:659
msgid "Standard"
msgstr "Estandarra"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased Renderer"
msgstr "Errendatzaile lausotua"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased"
msgstr "Lausotua"
@@ -1277,7 +1277,7 @@ msgstr "Eguneraketak bilatzen..."
msgid "Proceed"
msgstr ""
-#: gui/widget.cpp:335 gui/widget.cpp:337 gui/widget.cpp:343 gui/widget.cpp:345
+#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
msgstr "Balioa kendu:"
@@ -1438,11 +1438,11 @@ msgstr "jokoaren izen, bertsio/hizkuntza/e.a.-ekin batera:"
msgid "~R~esume"
msgstr "~J~arraitu"
-#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:113
+#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:96
msgid "~L~oad"
msgstr "Ka~r~gatu"
-#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:114
+#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:97
msgid "~S~ave"
msgstr "~G~orde"
@@ -1471,11 +1471,11 @@ msgstr "It~z~uli abiarazlera"
#: engines/avalanche/parser.cpp:1900 engines/cge/events.cpp:72
#: engines/cge2/events.cpp:65 engines/cruise/menu.cpp:212
#: engines/drascula/saveload.cpp:364 engines/dreamweb/saveload.cpp:262
-#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:121
+#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sci/engine/kfile.cpp:713 engines/sherlock/scalpel/scalpel.cpp:1250
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save game:"
msgstr "Gorde jokoa:"
@@ -1488,12 +1488,12 @@ msgstr "Gorde jokoa:"
#: engines/cge/events.cpp:72 engines/cge2/events.cpp:65
#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:364
#: engines/dreamweb/saveload.cpp:262 engines/hugo/file.cpp:298
-#: engines/mohawk/dialogs.cpp:121 engines/neverhood/menumodule.cpp:880
+#: engines/mohawk/dialogs.cpp:104 engines/neverhood/menumodule.cpp:880
#: engines/parallaction/saveload.cpp:209 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/scumm/dialogs.cpp:184
+#: engines/sci/engine/kfile.cpp:713 engines/scumm/dialogs.cpp:184
#: engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save"
msgstr "Gorde"
@@ -1515,13 +1515,13 @@ msgstr ""
"Jokoaren egoera gordetzeak huts egin du (%s)! Jo ezazu README-ra oinarrizko "
"informaziorako eta laguntza gehiago nola jaso jakiteko."
-#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:117
-#: engines/mohawk/dialogs.cpp:242 engines/tsage/dialogs.cpp:112
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
+#: engines/tsage/dialogs.cpp:112
msgid "~O~K"
msgstr "~A~dos"
-#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:118
-#: engines/mohawk/dialogs.cpp:243 engines/tsage/dialogs.cpp:113
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:101
+#: engines/tsage/dialogs.cpp:113
msgid "~C~ancel"
msgstr "~U~tzi"
@@ -1529,23 +1529,23 @@ msgstr "~U~tzi"
msgid "~K~eys"
msgstr "~T~eklak"
-#: engines/engine.cpp:339
+#: engines/engine.cpp:342
msgid "Could not initialize color format."
msgstr "Kolore formatua ezin izan da hasieratu."
-#: engines/engine.cpp:347
+#: engines/engine.cpp:350
msgid "Could not switch to video mode: '"
msgstr "Ezin izan da aldatu bideo modura : '"
-#: engines/engine.cpp:356
+#: engines/engine.cpp:359
msgid "Could not apply aspect ratio setting."
msgstr "Ezin izan da formatu-ratio ezarpena aplikatu."
-#: engines/engine.cpp:361
+#: engines/engine.cpp:364
msgid "Could not apply fullscreen setting."
msgstr "Ezin izan da pantaila-osoa ezarpena aplikatu."
-#: engines/engine.cpp:461
+#: engines/engine.cpp:464
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1559,7 +1559,7 @@ msgstr ""
"fitxategiak disko gogorrera kopiatzea.\n"
"Jo README fitxategira xehetasunetarako."
-#: engines/engine.cpp:472
+#: engines/engine.cpp:475
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1573,7 +1573,7 @@ msgstr ""
"izateko. Jo README fitxategira\n"
"xehetasunetarako."
-#: engines/engine.cpp:530
+#: engines/engine.cpp:533
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1582,7 +1582,7 @@ msgstr ""
"Jokoaren egoera kargatzeak huts egin du (%s)! Jo ezazu README-ra oinarrizko "
"informaziorako eta laguntza gehiago nola jaso jakiteko."
-#: engines/engine.cpp:543
+#: engines/engine.cpp:546
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
@@ -1592,7 +1592,7 @@ msgstr ""
"Hori dela eta, ezegonkorra izan daiteke eta gerta daiteke gordeta izan "
"ditzakezun partidan ez ibiltzea ScummVM-ren etorkizuneko bertsioetan."
-#: engines/engine.cpp:546
+#: engines/engine.cpp:549
msgid "Start anyway"
msgstr "Jolastu berdin-berdin"
@@ -1817,19 +1817,19 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normala"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2215
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2213
msgid "Enabled aspect ratio correction"
msgstr "Formatu-ratio zuzenketa gaituta"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2221
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2219
msgid "Disabled aspect ratio correction"
msgstr "Formatu-ratio zuzenketa desgaituta"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2276
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2274
msgid "Active graphics filter:"
msgstr "Filtro grafiko aktiboa:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2318
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
msgid "Windowed mode"
msgstr "Leiho modua"
@@ -2379,14 +2379,14 @@ msgstr "Erakutsi objektuen etiketak"
#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
-#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:410
+#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:424
#: engines/toltecs/detection.cpp:200 engines/zvision/detection_tables.h:51
msgid "Use original save/load screens"
msgstr "Erabili jatorrizko gorde/kargatu pantailak"
#: engines/agi/detection.cpp:148 engines/cine/detection.cpp:71
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
-#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:411
+#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:425
#: engines/toltecs/detection.cpp:201
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
@@ -2438,9 +2438,9 @@ msgstr ""
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore game:"
msgstr "Jokoa kargatu:"
@@ -2448,13 +2448,13 @@ msgstr "Jokoa kargatu:"
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore"
msgstr "Kargatu"
-#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2393
+#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2395
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -2465,7 +2465,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2386
+#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2388
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -2476,7 +2476,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2404
+#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2406
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -2722,39 +2722,39 @@ msgstr ""
"nahi izanez gero ScummVM debug konsola ireki eta 'import_savefile'\n"
"agindau erabili.\n"
-#: engines/mohawk/detection.cpp:168
+#: engines/mohawk/detection.cpp:169
msgid "Play the Myst fly by movie"
msgstr ""
-#: engines/mohawk/detection.cpp:169
+#: engines/mohawk/detection.cpp:170
msgid "The Myst fly by movie was not played by the original engine."
msgstr ""
#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:96 engines/mohawk/dialogs.cpp:239
+#: engines/mohawk/dialogs.cpp:178 engines/mohawk/dialogs.cpp:264
msgid "~Z~ip Mode Activated"
msgstr "~Z~ip modua aktibaturik"
-#: engines/mohawk/dialogs.cpp:97
+#: engines/mohawk/dialogs.cpp:179
msgid "~T~ransitions Enabled"
msgstr "~T~rantsizioak gaituta"
#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:99
+#: engines/mohawk/dialogs.cpp:181
msgid "~D~rop Page"
msgstr "Orria ~b~ota"
-#: engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/dialogs.cpp:185
#, fuzzy
msgid "Show ~M~ap"
msgstr "~M~apa erakutsi"
-#: engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:191
#, fuzzy
msgid "Main Men~u~"
msgstr "Menu ~n~agusia"
-#: engines/mohawk/dialogs.cpp:240
+#: engines/mohawk/dialogs.cpp:265
msgid "~W~ater Effect Enabled"
msgstr "~U~r-efektua gaituta"
@@ -2877,36 +2877,45 @@ msgstr "Sarrera alternatiboa"
msgid "Use an alternative game intro (CD version only)"
msgstr "Erabili sarrera alternatiboa (CD bertsioa soilik)"
-#: engines/sci/detection.cpp:380
+#: engines/sci/detection.cpp:384
msgid "Skip EGA dithering pass (full color backgrounds)"
msgstr "Saihestu EGA leuntze pausua (koloretako hondoak)"
-#: engines/sci/detection.cpp:381
+#: engines/sci/detection.cpp:385
msgid "Skip dithering pass in EGA games, graphics are shown with full colors"
msgstr ""
"Saihestu leuntzea EGA jokoetan, grafikoak kolore guztiekin erakustendira"
-#: engines/sci/detection.cpp:390
+#: engines/sci/detection.cpp:394
msgid "Enable high resolution graphics"
msgstr "Gaitu erresoluzio altuko grafikoak"
-#: engines/sci/detection.cpp:391
+#: engines/sci/detection.cpp:395
msgid "Enable high resolution graphics/content"
msgstr "Gaitu erresoluzio altuko grafikoak/edukiak"
-#: engines/sci/detection.cpp:400
+#: engines/sci/detection.cpp:404
+#, fuzzy
+msgid "Enable black-lined video"
+msgstr "Roland GS modua gaitu"
+
+#: engines/sci/detection.cpp:405
+msgid "Draw black lines over videos to increase their apparent sharpness"
+msgstr ""
+
+#: engines/sci/detection.cpp:414
msgid "Prefer digital sound effects"
msgstr "Lehenetsi soinu efektu digitalak"
-#: engines/sci/detection.cpp:401
+#: engines/sci/detection.cpp:415
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Lehenetsi soinu efektu digitalak sintetizatuen ordez"
-#: engines/sci/detection.cpp:420
+#: engines/sci/detection.cpp:434
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Erabili IMF/Yamaha FB-01 MIDI irteerarako"
-#: engines/sci/detection.cpp:421
+#: engines/sci/detection.cpp:435
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -2914,30 +2923,30 @@ msgstr ""
"Erabili IBM Music Feature txartela edo Yamaha FB-01 FM "
"sintetizatzailemodulua MIDI irteerarako"
-#: engines/sci/detection.cpp:431
+#: engines/sci/detection.cpp:445
msgid "Use CD audio"
msgstr "Erabili audio CDa"
-#: engines/sci/detection.cpp:432
+#: engines/sci/detection.cpp:446
msgid "Use CD audio instead of in-game audio, if available"
msgstr "Erabili CD-ko audioa jokokoa beharrean, eskurarri badago"
-#: engines/sci/detection.cpp:442
+#: engines/sci/detection.cpp:456
msgid "Use Windows cursors"
msgstr "Erabili Windows-eko kurtsoreak"
-#: engines/sci/detection.cpp:443
+#: engines/sci/detection.cpp:457
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"Erabili Windows-eko kurtsoreak (txikiagoak eta monokromoak) DOS-ekoak "
"erabilibeharrean"
-#: engines/sci/detection.cpp:453
+#: engines/sci/detection.cpp:467
msgid "Use silver cursors"
msgstr "Erabili zilarrezko kurtsoreak"
-#: engines/sci/detection.cpp:454
+#: engines/sci/detection.cpp:468
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
@@ -3618,7 +3627,7 @@ msgstr "Musika: "
msgid "Subtitle speed: "
msgstr "Azpitit. abiadura:"
-#: engines/scumm/scumm.cpp:1848
+#: engines/scumm/scumm.cpp:1850
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -3627,7 +3636,7 @@ msgstr ""
"MIDI euskarri natiboak LucasArts-en Roland eguneraketa behar du,\n"
"baina %s ez dago eskuragarri. AdLib erabiliko da."
-#: engines/scumm/scumm.cpp:2664
+#: engines/scumm/scumm.cpp:2666
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 "
@@ -3924,6 +3933,3 @@ msgstr "Erabili DVD bertsioko MPEG bideoa, bereizmen baxuagoko AVI-a beharrean"
#~ msgid "Active filter mode: Nearest"
#~ msgstr "Filtro aktibo modua: hurbilena"
-
-#~ msgid "Enable Roland GS Mode"
-#~ msgstr "Roland GS modua gaitu"
diff --git a/po/fi_FI.po b/po/fi_FI.po
index c171819a6b..e073d23af6 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: 2016-06-07 19:20+0200\n"
+"POT-Creation-Date: 2016-07-19 09:07+0200\n"
"PO-Revision-Date: 2012-12-01 19:37+0200\n"
"Last-Translator: Toni Saarela <saarela@gmail.com>\n"
"Language-Team: Finnish\n"
@@ -59,7 +59,7 @@ msgstr "Siirry ylіs"
#: gui/recorderdialog.cpp:155 gui/saveload-dialog.cpp:216
#: gui/saveload-dialog.cpp:276 gui/saveload-dialog.cpp:547
#: gui/saveload-dialog.cpp:931 gui/themebrowser.cpp:55
-#: gui/updates-dialog.cpp:113 engines/engine.cpp:546
+#: gui/updates-dialog.cpp:113 engines/engine.cpp:549
#: backends/events/default/default-events.cpp:196
#: backends/events/default/default-events.cpp:218
#: backends/platform/wii/options.cpp:48 engines/drascula/saveload.cpp:49
@@ -211,12 +211,12 @@ msgstr ""
#: gui/fluidsynth-dialog.cpp:153 gui/KeysDialog.cpp:42 gui/launcher.cpp:354
#: gui/launcher.cpp:1052 gui/launcher.cpp:1056 gui/massadd.cpp:92
-#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:465
-#: engines/engine.cpp:476 backends/platform/wii/options.cpp:47
+#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:468
+#: engines/engine.cpp:479 backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
#: engines/agos/animation.cpp:559 engines/drascula/saveload.cpp:49
#: engines/groovie/script.cpp:407 engines/parallaction/saveload.cpp:271
-#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1850
+#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1852
#: engines/scumm/players/player_v3m.cpp:130
#: engines/scumm/players/player_v5m.cpp:108 engines/sky/compact.cpp:131
#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:524
@@ -507,7 +507,7 @@ msgstr "Valitse kansio pelitallennuksille"
msgid "This game ID is already taken. Please choose another one."
msgstr "Pelin tunnus on jo kфytіssф. Valitse jokin muu."
-#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:115
+#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:98
msgid "~Q~uit"
msgstr "~L~opeta"
@@ -595,7 +595,7 @@ msgid "Search:"
msgstr "Etsi:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
-#: engines/mohawk/dialogs.cpp:120 engines/mohawk/riven.cpp:729
+#: engines/mohawk/dialogs.cpp:103 engines/mohawk/riven.cpp:726
#: engines/pegasus/pegasus.cpp:353 engines/tsage/scenes.cpp:601
msgid "Load game:"
msgstr "Lataa peli:"
@@ -603,8 +603,8 @@ msgstr "Lataa peli:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
-#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:120
-#: engines/mohawk/riven.cpp:729 engines/parallaction/saveload.cpp:194
+#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/riven.cpp:726 engines/parallaction/saveload.cpp:194
#: engines/pegasus/pegasus.cpp:353 engines/scumm/dialogs.cpp:185
#: engines/tsage/scenes.cpp:601
msgid "Load"
@@ -775,7 +775,7 @@ msgid "Special dithering modes supported by some games"
msgstr "Erityiset dithering asetukset joita jotkut pelit tukevat"
#: gui/options.cpp:764
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2314
msgid "Fullscreen mode"
msgstr "Kokoruututila"
@@ -1245,30 +1245,30 @@ msgstr "Anna kuvaus tallennukselle numero %d:"
msgid "Select a Theme"
msgstr "Valitse teema"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgid "Disabled GFX"
msgstr "Disabloitu GFX"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Disabloitu GFX"
-#: gui/ThemeEngine.cpp:354
+#: gui/ThemeEngine.cpp:416
#, fuzzy
msgid "Standard Renderer"
msgstr "Standardirenderіijф (16 bpp)"
-#: gui/ThemeEngine.cpp:354 engines/scumm/dialogs.cpp:659
+#: gui/ThemeEngine.cpp:416 engines/scumm/dialogs.cpp:659
msgid "Standard"
msgstr "Standardi"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
#, fuzzy
msgid "Antialiased Renderer"
msgstr "Antialiasoitu renderіijф (16 bpp)"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
#, fuzzy
msgid "Antialiased"
msgstr "Antialiasoitu (16 bpp)"
@@ -1294,7 +1294,7 @@ msgstr "Tarkista pфivitykset..."
msgid "Proceed"
msgstr ""
-#: gui/widget.cpp:335 gui/widget.cpp:337 gui/widget.cpp:343 gui/widget.cpp:345
+#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
msgstr "Tyhjennф arvo"
@@ -1457,11 +1457,11 @@ msgstr ""
msgid "~R~esume"
msgstr "~J~atka"
-#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:113
+#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:96
msgid "~L~oad"
msgstr "~L~ataa"
-#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:114
+#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:97
msgid "~S~ave"
msgstr "~T~allenna"
@@ -1490,11 +1490,11 @@ msgstr "Palaa p~e~livalitsimeen"
#: engines/avalanche/parser.cpp:1900 engines/cge/events.cpp:72
#: engines/cge2/events.cpp:65 engines/cruise/menu.cpp:212
#: engines/drascula/saveload.cpp:364 engines/dreamweb/saveload.cpp:262
-#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:121
+#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sci/engine/kfile.cpp:713 engines/sherlock/scalpel/scalpel.cpp:1250
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save game:"
msgstr "Tallenna peli:"
@@ -1507,12 +1507,12 @@ msgstr "Tallenna peli:"
#: engines/cge/events.cpp:72 engines/cge2/events.cpp:65
#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:364
#: engines/dreamweb/saveload.cpp:262 engines/hugo/file.cpp:298
-#: engines/mohawk/dialogs.cpp:121 engines/neverhood/menumodule.cpp:880
+#: engines/mohawk/dialogs.cpp:104 engines/neverhood/menumodule.cpp:880
#: engines/parallaction/saveload.cpp:209 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/scumm/dialogs.cpp:184
+#: engines/sci/engine/kfile.cpp:713 engines/scumm/dialogs.cpp:184
#: engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save"
msgstr "Tallenna"
@@ -1534,13 +1534,13 @@ msgstr ""
"Pelitilan tallennus epфonnistui (%s)! Avaa LUEMINUT tiedosto saadaksesi "
"lisфtietoa."
-#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:117
-#: engines/mohawk/dialogs.cpp:242 engines/tsage/dialogs.cpp:112
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
+#: engines/tsage/dialogs.cpp:112
msgid "~O~K"
msgstr "~H~yvфksy"
-#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:118
-#: engines/mohawk/dialogs.cpp:243 engines/tsage/dialogs.cpp:113
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:101
+#: engines/tsage/dialogs.cpp:113
msgid "~C~ancel"
msgstr "~P~eruuta"
@@ -1548,23 +1548,23 @@ msgstr "~P~eruuta"
msgid "~K~eys"
msgstr "~N~фppфimet"
-#: engines/engine.cpp:339
+#: engines/engine.cpp:342
msgid "Could not initialize color format."
msgstr "Vфriformaattia ei voitu alustaa"
-#: engines/engine.cpp:347
+#: engines/engine.cpp:350
msgid "Could not switch to video mode: '"
msgstr "Videotilan vaihto ei onnistunut:'"
-#: engines/engine.cpp:356
+#: engines/engine.cpp:359
msgid "Could not apply aspect ratio setting."
msgstr "Kuvasuhdeasetusta ei voitu asettaa."
-#: engines/engine.cpp:361
+#: engines/engine.cpp:364
msgid "Could not apply fullscreen setting."
msgstr "Kokoruututila-asetusta ei voi asettaa."
-#: engines/engine.cpp:461
+#: engines/engine.cpp:464
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1577,7 +1577,7 @@ msgstr ""
"pelin tiedostot kovalevyllesi. Avaa LUEMINUT\n"
"tiedosto ohjeita varten."
-#: engines/engine.cpp:472
+#: engines/engine.cpp:475
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1590,7 +1590,7 @@ msgstr ""
"ohjelmistoa kфyttфen, jotta musiikit\n"
"kuuluvat. Lue ohjeet LUEMINUT tiedostosta."
-#: engines/engine.cpp:530
+#: engines/engine.cpp:533
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1599,7 +1599,7 @@ msgstr ""
"Pelitilan lataus epфonnistui (%s)! Avaa LUEMINUT tiedosto saadaksesi "
"lisфtietoa."
-#: engines/engine.cpp:543
+#: engines/engine.cpp:546
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
@@ -1609,7 +1609,7 @@ msgstr ""
"epфvakaa, eivфtkф pelitallennukset vфlttфmфttф toimi tulevissa ScummVM:n "
"versioissa."
-#: engines/engine.cpp:546
+#: engines/engine.cpp:549
msgid "Start anyway"
msgstr "Pelaa silti"
@@ -1838,19 +1838,19 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normaali (ei skaalausta)"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2215
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2213
msgid "Enabled aspect ratio correction"
msgstr "Kuvasuhteen korjaus pффllф"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2221
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2219
msgid "Disabled aspect ratio correction"
msgstr "Kuvasuhteen korjaus pois pффltф"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2276
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2274
msgid "Active graphics filter:"
msgstr "Valittu grafiikkafiltteri:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2318
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
msgid "Windowed mode"
msgstr "Ikkunoitu tila"
@@ -2404,14 +2404,14 @@ msgstr "Nфytф esineiden tiedot"
#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
-#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:410
+#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:424
#: engines/toltecs/detection.cpp:200 engines/zvision/detection_tables.h:51
msgid "Use original save/load screens"
msgstr "Kфytф alkuperфisiф tallenna/lataa valikkoja"
#: engines/agi/detection.cpp:148 engines/cine/detection.cpp:71
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
-#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:411
+#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:425
#: engines/toltecs/detection.cpp:201
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr "Kфytф alkuperфisiф tallenna/lataa valikkoja, ScummVM valikoiden sijaan"
@@ -2459,9 +2459,9 @@ msgstr ""
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore game:"
msgstr "Lataa pelitallenne:"
@@ -2469,13 +2469,13 @@ msgstr "Lataa pelitallenne:"
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore"
msgstr "Lataa tallenne"
-#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2393
+#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2395
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -2486,7 +2486,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2386
+#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2388
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -2497,7 +2497,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2404
+#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2406
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -2729,39 +2729,39 @@ msgid ""
"\n"
msgstr ""
-#: engines/mohawk/detection.cpp:168
+#: engines/mohawk/detection.cpp:169
msgid "Play the Myst fly by movie"
msgstr ""
-#: engines/mohawk/detection.cpp:169
+#: engines/mohawk/detection.cpp:170
msgid "The Myst fly by movie was not played by the original engine."
msgstr ""
#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:96 engines/mohawk/dialogs.cpp:239
+#: engines/mohawk/dialogs.cpp:178 engines/mohawk/dialogs.cpp:264
msgid "~Z~ip Mode Activated"
msgstr "~Z~ip moodi valittu"
-#: engines/mohawk/dialogs.cpp:97
+#: engines/mohawk/dialogs.cpp:179
msgid "~T~ransitions Enabled"
msgstr "Siirtymфt pффllф"
#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:99
+#: engines/mohawk/dialogs.cpp:181
msgid "~D~rop Page"
msgstr "Pudota sivu"
-#: engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/dialogs.cpp:185
#, fuzzy
msgid "Show ~M~ap"
msgstr "Nфytф kartta"
-#: engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:191
#, fuzzy
msgid "Main Men~u~"
msgstr "Pффvalikko"
-#: engines/mohawk/dialogs.cpp:240
+#: engines/mohawk/dialogs.cpp:265
msgid "~W~ater Effect Enabled"
msgstr "Vesiefekti pффllф"
@@ -2884,67 +2884,76 @@ msgstr "Vaihtoehtoinen intro"
msgid "Use an alternative game intro (CD version only)"
msgstr "Kфytф vaihtoehtoista pelin introa (vain CD versiossa)"
-#: engines/sci/detection.cpp:380
+#: engines/sci/detection.cpp:384
msgid "Skip EGA dithering pass (full color backgrounds)"
msgstr ""
-#: engines/sci/detection.cpp:381
+#: engines/sci/detection.cpp:385
msgid "Skip dithering pass in EGA games, graphics are shown with full colors"
msgstr ""
-#: engines/sci/detection.cpp:390
+#: engines/sci/detection.cpp:394
#, fuzzy
msgid "Enable high resolution graphics"
msgstr "Kфytф kestopisteissф vфrillisiф grafiikkapalkkeja numeroiden sijaan"
-#: engines/sci/detection.cpp:391
+#: engines/sci/detection.cpp:395
#, fuzzy
msgid "Enable high resolution graphics/content"
msgstr "Kфytф kestopisteissф vфrillisiф grafiikkapalkkeja numeroiden sijaan"
-#: engines/sci/detection.cpp:400
+#: engines/sci/detection.cpp:404
+#, fuzzy
+msgid "Enable black-lined video"
+msgstr "Kфytф Roland GS moodia"
+
+#: engines/sci/detection.cpp:405
+msgid "Draw black lines over videos to increase their apparent sharpness"
+msgstr ""
+
+#: engines/sci/detection.cpp:414
msgid "Prefer digital sound effects"
msgstr "Kфytф mieluiten digitaalisia ффnitehosteita."
-#: engines/sci/detection.cpp:401
+#: engines/sci/detection.cpp:415
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr ""
"Kфytф mieluiten digitaalisia ффnitehosteita synteettisten tehosteiden sijaan."
-#: engines/sci/detection.cpp:420
+#: engines/sci/detection.cpp:434
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Kфytф IMF/Yamaha FB-01:stф MIDI-musiikille"
-#: engines/sci/detection.cpp:421
+#: engines/sci/detection.cpp:435
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
msgstr ""
"Kфytф IBM:n Music Feature korttia, tai Yamaha FB-01 FM moduulia MIDIlle"
-#: engines/sci/detection.cpp:431
+#: engines/sci/detection.cpp:445
msgid "Use CD audio"
msgstr "Kфytф CD:n ффntф"
-#: engines/sci/detection.cpp:432
+#: engines/sci/detection.cpp:446
msgid "Use CD audio instead of in-game audio, if available"
msgstr "Kфytф CD:n audiota pelin audion sijaan, jos mahdollista."
-#: engines/sci/detection.cpp:442
+#: engines/sci/detection.cpp:456
msgid "Use Windows cursors"
msgstr "Kфytф Windowsin kursoreita"
-#: engines/sci/detection.cpp:443
+#: engines/sci/detection.cpp:457
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"Kфytф Windowsin kursoreita (pienempiф ja harmaasфvyisiф) DOS kursorien sijaan"
-#: engines/sci/detection.cpp:453
+#: engines/sci/detection.cpp:467
msgid "Use silver cursors"
msgstr "Kфytф hopeisia kursoreita"
-#: engines/sci/detection.cpp:454
+#: engines/sci/detection.cpp:468
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr "Kфytф vaihtoehtoisia hopeisia kursoreita normaalien kultaisten sijaan"
@@ -3628,7 +3637,7 @@ msgstr "Musiikki:"
msgid "Subtitle speed: "
msgstr "Tekstin nopeus:"
-#: engines/scumm/scumm.cpp:1848
+#: engines/scumm/scumm.cpp:1850
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -3637,7 +3646,7 @@ msgstr ""
"Suora MIDI tuki vaatii Roland pфivityksen LucasArtsilta, mutta\n"
"%s puuttuu. Kфytetффn AdLibia sen sijaan."
-#: engines/scumm/scumm.cpp:2664
+#: engines/scumm/scumm.cpp:2666
#, fuzzy
msgid ""
"Usually, Maniac Mansion would start now. But for that to work, the game "
@@ -3926,6 +3935,3 @@ msgstr "Kфytф vaihtoehtoisia hopeisia kursoreita normaalien kultaisten sijaan"
#~ msgid "Active filter mode: Nearest"
#~ msgstr "Valittu filtteritila: Nearest"
-
-#~ msgid "Enable Roland GS Mode"
-#~ msgstr "Kфytф Roland GS moodia"
diff --git a/po/fr_FR.po b/po/fr_FR.po
index fc31863c61..a6f3a1f35f 100644
--- a/po/fr_FR.po
+++ b/po/fr_FR.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: 2016-06-07 19:20+0200\n"
+"POT-Creation-Date: 2016-07-19 09:07+0200\n"
"PO-Revision-Date: 2016-02-20 23:17+0000\n"
"Last-Translator: Thierry Crozat <criezy@scummvm.org>\n"
"Language-Team: French <scummvm-devel@lists.sf.net>\n"
@@ -59,7 +59,7 @@ msgstr "Remonter"
#: gui/recorderdialog.cpp:155 gui/saveload-dialog.cpp:216
#: gui/saveload-dialog.cpp:276 gui/saveload-dialog.cpp:547
#: gui/saveload-dialog.cpp:931 gui/themebrowser.cpp:55
-#: gui/updates-dialog.cpp:113 engines/engine.cpp:546
+#: gui/updates-dialog.cpp:113 engines/engine.cpp:549
#: backends/events/default/default-events.cpp:196
#: backends/events/default/default-events.cpp:218
#: backends/platform/wii/options.cpp:48 engines/drascula/saveload.cpp:49
@@ -207,12 +207,12 @@ msgstr "Remet tous les rщglages р leurs valeurs par dщfaut."
#: gui/fluidsynth-dialog.cpp:153 gui/KeysDialog.cpp:42 gui/launcher.cpp:354
#: gui/launcher.cpp:1052 gui/launcher.cpp:1056 gui/massadd.cpp:92
-#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:465
-#: engines/engine.cpp:476 backends/platform/wii/options.cpp:47
+#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:468
+#: engines/engine.cpp:479 backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
#: engines/agos/animation.cpp:559 engines/drascula/saveload.cpp:49
#: engines/groovie/script.cpp:407 engines/parallaction/saveload.cpp:271
-#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1850
+#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1852
#: engines/scumm/players/player_v3m.cpp:130
#: engines/scumm/players/player_v5m.cpp:108 engines/sky/compact.cpp:131
#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:524
@@ -503,7 +503,7 @@ msgstr "Sщlectionner le rщpertoire pour les sauvegardes"
msgid "This game ID is already taken. Please choose another one."
msgstr "Cet ID est dщjр utilisщ par un autre jeu. Choisissez en un autre svp."
-#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:115
+#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:98
msgid "~Q~uit"
msgstr "~Q~uitter"
@@ -592,7 +592,7 @@ msgid "Search:"
msgstr "Filtre :"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
-#: engines/mohawk/dialogs.cpp:120 engines/mohawk/riven.cpp:729
+#: engines/mohawk/dialogs.cpp:103 engines/mohawk/riven.cpp:726
#: engines/pegasus/pegasus.cpp:353 engines/tsage/scenes.cpp:601
msgid "Load game:"
msgstr "Charger le jeu :"
@@ -600,8 +600,8 @@ msgstr "Charger le jeu :"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
-#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:120
-#: engines/mohawk/riven.cpp:729 engines/parallaction/saveload.cpp:194
+#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/riven.cpp:726 engines/parallaction/saveload.cpp:194
#: engines/pegasus/pegasus.cpp:353 engines/scumm/dialogs.cpp:185
#: engines/tsage/scenes.cpp:601
msgid "Load"
@@ -767,7 +767,7 @@ msgid "Special dithering modes supported by some games"
msgstr "Mode spщcial de tramage supportщ par certains jeux"
#: gui/options.cpp:764
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2314
msgid "Fullscreen mode"
msgstr "Plein щcran"
@@ -1240,28 +1240,28 @@ msgstr "Entrez une description pour l'emplacement %d:"
msgid "Select a Theme"
msgstr "Sщlectionnez un Thшme"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgid "Disabled GFX"
msgstr "GFX dщsactivщ"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "GFX dщsactivщ"
-#: gui/ThemeEngine.cpp:354
+#: gui/ThemeEngine.cpp:416
msgid "Standard Renderer"
msgstr "Rendu Standard"
-#: gui/ThemeEngine.cpp:354 engines/scumm/dialogs.cpp:659
+#: gui/ThemeEngine.cpp:416 engines/scumm/dialogs.cpp:659
msgid "Standard"
msgstr "Normal"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased Renderer"
msgstr "Rendu Anti-crщnelщ"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased"
msgstr "Anti-crщnelщ"
@@ -1291,7 +1291,7 @@ msgstr "Vщrifier les mises р jour automatiquement"
msgid "Proceed"
msgstr "Appliquer"
-#: gui/widget.cpp:335 gui/widget.cpp:337 gui/widget.cpp:343 gui/widget.cpp:345
+#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
msgstr "Effacer la valeur"
@@ -1453,11 +1453,11 @@ msgstr "du jeu que vous avez essayщ d'ajouter, sa version, le langage, etc..."
msgid "~R~esume"
msgstr "~R~eprendre"
-#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:113
+#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:96
msgid "~L~oad"
msgstr "~C~harger"
-#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:114
+#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:97
msgid "~S~ave"
msgstr "~S~auver"
@@ -1486,11 +1486,11 @@ msgstr "Retour au ~L~anceur"
#: engines/avalanche/parser.cpp:1900 engines/cge/events.cpp:72
#: engines/cge2/events.cpp:65 engines/cruise/menu.cpp:212
#: engines/drascula/saveload.cpp:364 engines/dreamweb/saveload.cpp:262
-#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:121
+#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sci/engine/kfile.cpp:713 engines/sherlock/scalpel/scalpel.cpp:1250
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save game:"
msgstr "Sauvegarde :"
@@ -1503,12 +1503,12 @@ msgstr "Sauvegarde :"
#: engines/cge/events.cpp:72 engines/cge2/events.cpp:65
#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:364
#: engines/dreamweb/saveload.cpp:262 engines/hugo/file.cpp:298
-#: engines/mohawk/dialogs.cpp:121 engines/neverhood/menumodule.cpp:880
+#: engines/mohawk/dialogs.cpp:104 engines/neverhood/menumodule.cpp:880
#: engines/parallaction/saveload.cpp:209 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/scumm/dialogs.cpp:184
+#: engines/sci/engine/kfile.cpp:713 engines/scumm/dialogs.cpp:184
#: engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save"
msgstr "Sauver"
@@ -1531,13 +1531,13 @@ msgstr ""
"Echec de la sauvegarde (%s)! Lisez le fichier README pour les informations "
"de base et les instructions pour obtenir de l'aide supplщmentaire."
-#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:117
-#: engines/mohawk/dialogs.cpp:242 engines/tsage/dialogs.cpp:112
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
+#: engines/tsage/dialogs.cpp:112
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:118
-#: engines/mohawk/dialogs.cpp:243 engines/tsage/dialogs.cpp:113
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:101
+#: engines/tsage/dialogs.cpp:113
msgid "~C~ancel"
msgstr "~A~nnuler"
@@ -1545,23 +1545,23 @@ msgstr "~A~nnuler"
msgid "~K~eys"
msgstr "~T~ouches"
-#: engines/engine.cpp:339
+#: engines/engine.cpp:342
msgid "Could not initialize color format."
msgstr "Impossible d'initialiser le format des couleurs."
-#: engines/engine.cpp:347
+#: engines/engine.cpp:350
msgid "Could not switch to video mode: '"
msgstr "Impossible de changer le mode vidщo р: '"
-#: engines/engine.cpp:356
+#: engines/engine.cpp:359
msgid "Could not apply aspect ratio setting."
msgstr "Impossible d'appliquer la correction du rapport d'aspect."
-#: engines/engine.cpp:361
+#: engines/engine.cpp:364
msgid "Could not apply fullscreen setting."
msgstr "Impossible d'appliquer l'option plein щcran."
-#: engines/engine.cpp:461
+#: engines/engine.cpp:464
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1575,7 +1575,7 @@ msgstr ""
"donnщes du jeu sur votre disque dur.\n"
"Lisez le fichier README pour plus de dщtails."
-#: engines/engine.cpp:472
+#: engines/engine.cpp:475
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1589,7 +1589,7 @@ msgstr ""
"logiciel appropriщ.\n"
"Lisez le fichier README pour plus de dщtails."
-#: engines/engine.cpp:530
+#: engines/engine.cpp:533
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1598,7 +1598,7 @@ msgstr ""
"Echec du chargement (%s) ! Lisez le fichier README pour les informations de "
"base et les instructions pour obtenir de l'aide supplщmentaire."
-#: engines/engine.cpp:543
+#: engines/engine.cpp:546
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
@@ -1608,7 +1608,7 @@ msgstr ""
"complшtement supportщ par ScummVM. Il est donc instable et les sauvegardes "
"peuvent ne pas marcher avec une future version de ScummVM."
-#: engines/engine.cpp:546
+#: engines/engine.cpp:549
msgid "Start anyway"
msgstr "Jouer quand mъme"
@@ -1833,19 +1833,19 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normal"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2215
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2213
msgid "Enabled aspect ratio correction"
msgstr "Activer la correction du rapport d'aspect"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2221
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2219
msgid "Disabled aspect ratio correction"
msgstr "Dщsactiver la correction du rapport d'aspect"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2276
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2274
msgid "Active graphics filter:"
msgstr "Mode graphique actif:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2318
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
msgid "Windowed mode"
msgstr "Mode Fenъtre"
@@ -2394,14 +2394,14 @@ msgstr "Afficher le tracщ par ligne"
#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
-#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:410
+#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:424
#: engines/toltecs/detection.cpp:200 engines/zvision/detection_tables.h:51
msgid "Use original save/load screens"
msgstr "Dialogues sauvegarde/chargement d'origine"
#: engines/agi/detection.cpp:148 engines/cine/detection.cpp:71
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
-#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:411
+#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:425
#: engines/toltecs/detection.cpp:201
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
@@ -2456,9 +2456,9 @@ msgstr ""
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore game:"
msgstr "Charger le jeu :"
@@ -2466,13 +2466,13 @@ msgstr "Charger le jeu :"
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore"
msgstr "Charger"
-#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2393
+#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2395
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -2483,7 +2483,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2386
+#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2388
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -2494,7 +2494,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2404
+#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2406
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -2741,37 +2741,37 @@ msgstr ""
"\n"
" \n"
-#: engines/mohawk/detection.cpp:168
+#: engines/mohawk/detection.cpp:169
msgid "Play the Myst fly by movie"
msgstr "Jouer la vidщo du survol de Myst"
-#: engines/mohawk/detection.cpp:169
+#: engines/mohawk/detection.cpp:170
msgid "The Myst fly by movie was not played by the original engine."
msgstr "La vidщo du survol de Myst n'щtait pas jouщe par le moteur originel."
#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:96 engines/mohawk/dialogs.cpp:239
+#: engines/mohawk/dialogs.cpp:178 engines/mohawk/dialogs.cpp:264
msgid "~Z~ip Mode Activated"
msgstr "Mode ~Z~ip Activщ"
-#: engines/mohawk/dialogs.cpp:97
+#: engines/mohawk/dialogs.cpp:179
msgid "~T~ransitions Enabled"
msgstr "T~r~ansitions activщes"
#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:99
+#: engines/mohawk/dialogs.cpp:181
msgid "~D~rop Page"
msgstr "~L~acher la Page"
-#: engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/dialogs.cpp:185
msgid "Show ~M~ap"
msgstr "Afficher la ~C~arte"
-#: engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:191
msgid "Main Men~u~"
msgstr "~M~enu Principal"
-#: engines/mohawk/dialogs.cpp:240
+#: engines/mohawk/dialogs.cpp:265
msgid "~W~ater Effect Enabled"
msgstr "~E~ffets de l'Eau Activщs"
@@ -2894,37 +2894,46 @@ msgstr "Intro alternative"
msgid "Use an alternative game intro (CD version only)"
msgstr "Utiliser une intro alternative (version CD uniquement)"
-#: engines/sci/detection.cpp:380
+#: engines/sci/detection.cpp:384
msgid "Skip EGA dithering pass (full color backgrounds)"
msgstr "Passer l'щtape de tramage EGA (fonds de couleurs pleines)"
-#: engines/sci/detection.cpp:381
+#: engines/sci/detection.cpp:385
msgid "Skip dithering pass in EGA games, graphics are shown with full colors"
msgstr ""
"Passer l'щtape de tramage dans les jeux EGA ; les images utilisent des "
"couleurs pleines"
-#: engines/sci/detection.cpp:390
+#: engines/sci/detection.cpp:394
msgid "Enable high resolution graphics"
msgstr "Utiliser les graphiques haute rщsolution"
-#: engines/sci/detection.cpp:391
+#: engines/sci/detection.cpp:395
msgid "Enable high resolution graphics/content"
msgstr "Utiliser les graphiques haute rщsolution"
-#: engines/sci/detection.cpp:400
+#: engines/sci/detection.cpp:404
+#, fuzzy
+msgid "Enable black-lined video"
+msgstr "Activer le mode Roland GS"
+
+#: engines/sci/detection.cpp:405
+msgid "Draw black lines over videos to increase their apparent sharpness"
+msgstr ""
+
+#: engines/sci/detection.cpp:414
msgid "Prefer digital sound effects"
msgstr "Prщfщrer les effets sonores digitaux"
-#: engines/sci/detection.cpp:401
+#: engines/sci/detection.cpp:415
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Prщfщrer les effets sonores digitaux plutєt que ceux synthщtisщs"
-#: engines/sci/detection.cpp:420
+#: engines/sci/detection.cpp:434
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Utiliser IMF/Yamaha FB-01 pour la sortie MIDI"
-#: engines/sci/detection.cpp:421
+#: engines/sci/detection.cpp:435
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -2932,32 +2941,32 @@ msgstr ""
"Utiliser une carte IBM Music Feature ou un module Yamaha FB-01 FM pour la "
"sortie MIDI"
-#: engines/sci/detection.cpp:431
+#: engines/sci/detection.cpp:445
msgid "Use CD audio"
msgstr "Utiliser la musique du CD"
-#: engines/sci/detection.cpp:432
+#: engines/sci/detection.cpp:446
msgid "Use CD audio instead of in-game audio, if available"
msgstr ""
"Utiliser la musique du CD quand elle est disponible au lieu de la musique du "
"jeu"
-#: engines/sci/detection.cpp:442
+#: engines/sci/detection.cpp:456
msgid "Use Windows cursors"
msgstr "Utiliser les curseurs Windows"
-#: engines/sci/detection.cpp:443
+#: engines/sci/detection.cpp:457
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"Utiliser les curseurs Windows (plus petits et monochromes) au lieu des "
"curseurs DOS"
-#: engines/sci/detection.cpp:453
+#: engines/sci/detection.cpp:467
msgid "Use silver cursors"
msgstr "Utiliser les curseurs argentщs"
-#: engines/sci/detection.cpp:454
+#: engines/sci/detection.cpp:468
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr "Utiliser les curseurs argentщs au lieu des curseurs normaux dorщs"
@@ -3635,7 +3644,7 @@ msgstr "Volume Musique :"
msgid "Subtitle speed: "
msgstr "Vitesse des ST :"
-#: engines/scumm/scumm.cpp:1848
+#: engines/scumm/scumm.cpp:1850
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -3644,7 +3653,7 @@ msgstr ""
"Support MIDI natif requiшre la mise р jour Roland de LucasArt,\n"
"mais %s manque. Utilise AdLib р la place."
-#: engines/scumm/scumm.cpp:2664
+#: engines/scumm/scumm.cpp:2666
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 "
@@ -3954,9 +3963,6 @@ msgstr ""
#~ msgid "Active filter mode: Nearest"
#~ msgstr "Filtre actif: Plus proche"
-#~ msgid "Enable Roland GS Mode"
-#~ msgstr "Activer le mode Roland GS"
-
#~ msgctxt "lowres"
#~ msgid "Add Game..."
#~ msgstr "Ajouter..."
diff --git a/po/gl_ES.po b/po/gl_ES.po
index 6ae36cebd1..c4a4dfb198 100644
--- a/po/gl_ES.po
+++ b/po/gl_ES.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: 2016-06-07 19:20+0200\n"
+"POT-Creation-Date: 2016-07-19 09:07+0200\n"
"PO-Revision-Date: 2016-02-21 00:43+0100\n"
"Last-Translator: Santiago G. Sanz <s.sanz@uvigo.es>\n"
"Language-Team: Santiago G. Sanz <s.sanz@uvigo.es>\n"
@@ -58,7 +58,7 @@ msgstr "Arriba"
#: gui/recorderdialog.cpp:155 gui/saveload-dialog.cpp:216
#: gui/saveload-dialog.cpp:276 gui/saveload-dialog.cpp:547
#: gui/saveload-dialog.cpp:931 gui/themebrowser.cpp:55
-#: gui/updates-dialog.cpp:113 engines/engine.cpp:546
+#: gui/updates-dialog.cpp:113 engines/engine.cpp:549
#: backends/events/default/default-events.cpp:196
#: backends/events/default/default-events.cpp:218
#: backends/platform/wii/options.cpp:48 engines/drascula/saveload.cpp:49
@@ -207,12 +207,12 @@ msgstr ""
#: gui/fluidsynth-dialog.cpp:153 gui/KeysDialog.cpp:42 gui/launcher.cpp:354
#: gui/launcher.cpp:1052 gui/launcher.cpp:1056 gui/massadd.cpp:92
-#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:465
-#: engines/engine.cpp:476 backends/platform/wii/options.cpp:47
+#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:468
+#: engines/engine.cpp:479 backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
#: engines/agos/animation.cpp:559 engines/drascula/saveload.cpp:49
#: engines/groovie/script.cpp:407 engines/parallaction/saveload.cpp:271
-#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1850
+#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1852
#: engines/scumm/players/player_v3m.cpp:130
#: engines/scumm/players/player_v5m.cpp:108 engines/sky/compact.cpp:131
#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:524
@@ -502,7 +502,7 @@ msgstr "Selecciona un directorio para ficheiros de gardado"
msgid "This game ID is already taken. Please choose another one."
msgstr "Este ID de xogo xa estс en uso. Selecciona outro."
-#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:115
+#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:98
msgid "~Q~uit"
msgstr "~S~aэr"
@@ -590,7 +590,7 @@ msgid "Search:"
msgstr "Buscar:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
-#: engines/mohawk/dialogs.cpp:120 engines/mohawk/riven.cpp:729
+#: engines/mohawk/dialogs.cpp:103 engines/mohawk/riven.cpp:726
#: engines/pegasus/pegasus.cpp:353 engines/tsage/scenes.cpp:601
msgid "Load game:"
msgstr "Cargar partida:"
@@ -598,8 +598,8 @@ msgstr "Cargar partida:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
-#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:120
-#: engines/mohawk/riven.cpp:729 engines/parallaction/saveload.cpp:194
+#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/riven.cpp:726 engines/parallaction/saveload.cpp:194
#: engines/pegasus/pegasus.cpp:353 engines/scumm/dialogs.cpp:185
#: engines/tsage/scenes.cpp:601
msgid "Load"
@@ -763,7 +763,7 @@ msgid "Special dithering modes supported by some games"
msgstr "Modos de interpolaciѓn de cores compatibles con algњns xogos"
#: gui/options.cpp:764
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2314
msgid "Fullscreen mode"
msgstr "Pantalla completa"
@@ -1229,28 +1229,28 @@ msgstr "Introduce unha descriciѓn para o espazo %d:"
msgid "Select a Theme"
msgstr "Seleccionar tema"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgid "Disabled GFX"
msgstr "Efectos grсficos desactivados"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Efectos desactivados"
-#: gui/ThemeEngine.cpp:354
+#: gui/ThemeEngine.cpp:416
msgid "Standard Renderer"
msgstr "Procesamento estсndar"
-#: gui/ThemeEngine.cpp:354 engines/scumm/dialogs.cpp:659
+#: gui/ThemeEngine.cpp:416 engines/scumm/dialogs.cpp:659
msgid "Standard"
msgstr "Estсndar"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased Renderer"
msgstr "Procesamento antidistorsiѓn"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased"
msgstr "Antidistorsiѓn"
@@ -1275,7 +1275,7 @@ msgstr "Buscar actualizaciѓns..."
msgid "Proceed"
msgstr ""
-#: gui/widget.cpp:335 gui/widget.cpp:337 gui/widget.cpp:343 gui/widget.cpp:345
+#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
msgstr "Limpar valor"
@@ -1436,11 +1436,11 @@ msgstr "do xogo que tentaches engadir, xunto coa versiѓn, lingua, etc.:"
msgid "~R~esume"
msgstr "~R~etomar"
-#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:113
+#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:96
msgid "~L~oad"
msgstr "~C~argar"
-#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:114
+#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:97
msgid "~S~ave"
msgstr "~G~ardar"
@@ -1469,11 +1469,11 @@ msgstr "~V~olver ao Iniciador"
#: engines/avalanche/parser.cpp:1900 engines/cge/events.cpp:72
#: engines/cge2/events.cpp:65 engines/cruise/menu.cpp:212
#: engines/drascula/saveload.cpp:364 engines/dreamweb/saveload.cpp:262
-#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:121
+#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sci/engine/kfile.cpp:713 engines/sherlock/scalpel/scalpel.cpp:1250
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save game:"
msgstr "Gardar partida:"
@@ -1486,12 +1486,12 @@ msgstr "Gardar partida:"
#: engines/cge/events.cpp:72 engines/cge2/events.cpp:65
#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:364
#: engines/dreamweb/saveload.cpp:262 engines/hugo/file.cpp:298
-#: engines/mohawk/dialogs.cpp:121 engines/neverhood/menumodule.cpp:880
+#: engines/mohawk/dialogs.cpp:104 engines/neverhood/menumodule.cpp:880
#: engines/parallaction/saveload.cpp:209 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/scumm/dialogs.cpp:184
+#: engines/sci/engine/kfile.cpp:713 engines/scumm/dialogs.cpp:184
#: engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save"
msgstr "Gardar"
@@ -1514,13 +1514,13 @@ msgstr ""
"Erro ao gardar (%s)! Consulta o ficheiro README para obter informaciѓn "
"bсsica e mсis instruciѓns para acadar asistencia adicional."
-#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:117
-#: engines/mohawk/dialogs.cpp:242 engines/tsage/dialogs.cpp:112
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
+#: engines/tsage/dialogs.cpp:112
msgid "~O~K"
msgstr "~A~ceptar"
-#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:118
-#: engines/mohawk/dialogs.cpp:243 engines/tsage/dialogs.cpp:113
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:101
+#: engines/tsage/dialogs.cpp:113
msgid "~C~ancel"
msgstr "~C~ancelar"
@@ -1528,23 +1528,23 @@ msgstr "~C~ancelar"
msgid "~K~eys"
msgstr "~T~eclas"
-#: engines/engine.cpp:339
+#: engines/engine.cpp:342
msgid "Could not initialize color format."
msgstr "Non se puido iniciar o formato de cor."
-#: engines/engine.cpp:347
+#: engines/engine.cpp:350
msgid "Could not switch to video mode: '"
msgstr "Non se puido cambiar ao modo de vэdeo: '"
-#: engines/engine.cpp:356
+#: engines/engine.cpp:359
msgid "Could not apply aspect ratio setting."
msgstr "Non se puido aplicar a configuraciѓn de proporciѓn."
-#: engines/engine.cpp:361
+#: engines/engine.cpp:364
msgid "Could not apply fullscreen setting."
msgstr "Non se puido aplicar a configuraciѓn de pantalla completa."
-#: engines/engine.cpp:461
+#: engines/engine.cpp:464
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1558,7 +1558,7 @@ msgstr ""
"os ficheiros de datos ao disco duro. Consulta\n"
"o ficheiro README para obter mсis informaciѓn."
-#: engines/engine.cpp:472
+#: engines/engine.cpp:475
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1572,7 +1572,7 @@ msgstr ""
"do xogo. Consulta o ficheiro README\n"
"para obter mсis informaciѓn."
-#: engines/engine.cpp:530
+#: engines/engine.cpp:533
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1581,7 +1581,7 @@ msgstr ""
"Erro ao cargar (%s)! Consulta o ficheiro README para obter informaciѓn "
"bсsica e mсis instruciѓns para acadar asistencia adicional."
-#: engines/engine.cpp:543
+#: engines/engine.cpp:546
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
@@ -1591,7 +1591,7 @@ msgstr ""
"Por iso, talvez sexa inestable e os ficheiros de gardado talvez non "
"funcionen en futuras versiѓns de ScummVM."
-#: engines/engine.cpp:546
+#: engines/engine.cpp:549
msgid "Start anyway"
msgstr "Iniciar de todos os xeitos"
@@ -1816,19 +1816,19 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normal (sen escala)"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2215
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2213
msgid "Enabled aspect ratio correction"
msgstr "Correcciѓn de proporciѓn activada"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2221
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2219
msgid "Disabled aspect ratio correction"
msgstr "Correcciѓn de proporciѓn desactivada"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2276
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2274
msgid "Active graphics filter:"
msgstr "Filtro de grсficos activo:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2318
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
msgid "Windowed mode"
msgstr "Modo en ventс"
@@ -2377,14 +2377,14 @@ msgstr "Mostrar etiquetas"
#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
-#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:410
+#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:424
#: engines/toltecs/detection.cpp:200 engines/zvision/detection_tables.h:51
msgid "Use original save/load screens"
msgstr "Empregar pantallas orixinais de gardado e carga"
#: engines/agi/detection.cpp:148 engines/cine/detection.cpp:71
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
-#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:411
+#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:425
#: engines/toltecs/detection.cpp:201
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
@@ -2436,9 +2436,9 @@ msgstr ""
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore game:"
msgstr "Restaurar xogo:"
@@ -2446,13 +2446,13 @@ msgstr "Restaurar xogo:"
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore"
msgstr "Restaurar"
-#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2393
+#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2395
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -2463,7 +2463,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2386
+#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2388
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -2474,7 +2474,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2404
+#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2406
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -2721,39 +2721,39 @@ msgstr ""
"\".\n"
"\n"
-#: engines/mohawk/detection.cpp:168
+#: engines/mohawk/detection.cpp:169
msgid "Play the Myst fly by movie"
msgstr ""
-#: engines/mohawk/detection.cpp:169
+#: engines/mohawk/detection.cpp:170
msgid "The Myst fly by movie was not played by the original engine."
msgstr ""
#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:96 engines/mohawk/dialogs.cpp:239
+#: engines/mohawk/dialogs.cpp:178 engines/mohawk/dialogs.cpp:264
msgid "~Z~ip Mode Activated"
msgstr "Modo ~C~omprimido activado"
-#: engines/mohawk/dialogs.cpp:97
+#: engines/mohawk/dialogs.cpp:179
msgid "~T~ransitions Enabled"
msgstr "~T~ransiciѓns activadas"
#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:99
+#: engines/mohawk/dialogs.cpp:181
msgid "~D~rop Page"
msgstr "~D~eixar folla"
-#: engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/dialogs.cpp:185
#, fuzzy
msgid "Show ~M~ap"
msgstr "Mo~s~trar mapa"
-#: engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:191
#, fuzzy
msgid "Main Men~u~"
msgstr "~M~enњ principal"
-#: engines/mohawk/dialogs.cpp:240
+#: engines/mohawk/dialogs.cpp:265
msgid "~W~ater Effect Enabled"
msgstr "Efecto de ~a~uga activado"
@@ -2875,37 +2875,46 @@ msgstr "Intro alternativa"
msgid "Use an alternative game intro (CD version only)"
msgstr "Emprega unha introduciѓn alternativa para o xogo (sѓ versiѓn en CD)."
-#: engines/sci/detection.cpp:380
+#: engines/sci/detection.cpp:384
msgid "Skip EGA dithering pass (full color backgrounds)"
msgstr "Omitir interpolaciѓn de cores EGA (fondos de cor completa)"
-#: engines/sci/detection.cpp:381
+#: engines/sci/detection.cpp:385
msgid "Skip dithering pass in EGA games, graphics are shown with full colors"
msgstr ""
"Omite a interpolaciѓn de cores EGA. Os grсficos mѓstranse con cores "
"completas."
-#: engines/sci/detection.cpp:390
+#: engines/sci/detection.cpp:394
msgid "Enable high resolution graphics"
msgstr "Activar grсficos de alta resoluciѓn"
-#: engines/sci/detection.cpp:391
+#: engines/sci/detection.cpp:395
msgid "Enable high resolution graphics/content"
msgstr "Activa os grсficos ou o contido de alta resoluciѓn."
-#: engines/sci/detection.cpp:400
+#: engines/sci/detection.cpp:404
+#, fuzzy
+msgid "Enable black-lined video"
+msgstr "Activar modo Roland GS"
+
+#: engines/sci/detection.cpp:405
+msgid "Draw black lines over videos to increase their apparent sharpness"
+msgstr ""
+
+#: engines/sci/detection.cpp:414
msgid "Prefer digital sound effects"
msgstr "Preferir efectos de son dixitais"
-#: engines/sci/detection.cpp:401
+#: engines/sci/detection.cpp:415
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Dс preferencia aos efectos de son dixitais no canto dos sintщticos."
-#: engines/sci/detection.cpp:420
+#: engines/sci/detection.cpp:434
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Empregar IMF/Yamaha FB-01 para a saэda de MIDI"
-#: engines/sci/detection.cpp:421
+#: engines/sci/detection.cpp:435
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -2913,30 +2922,30 @@ msgstr ""
"Emprega unha tarxeta IBM Music Feature ou un mѓdulo de sintetizador Yamaha "
"FB-01 FM para a saэda de MIDI."
-#: engines/sci/detection.cpp:431
+#: engines/sci/detection.cpp:445
msgid "Use CD audio"
msgstr "Empregar son de CD"
-#: engines/sci/detection.cpp:432
+#: engines/sci/detection.cpp:446
msgid "Use CD audio instead of in-game audio, if available"
msgstr "Emprega son de CD no canto do do xogo, de ser o caso."
-#: engines/sci/detection.cpp:442
+#: engines/sci/detection.cpp:456
msgid "Use Windows cursors"
msgstr "Empregar cursores de Windows"
-#: engines/sci/detection.cpp:443
+#: engines/sci/detection.cpp:457
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"Emprega os cursores de Windows (mсis pequenos e monocromos) no canto dos de "
"DOS."
-#: engines/sci/detection.cpp:453
+#: engines/sci/detection.cpp:467
msgid "Use silver cursors"
msgstr "Empregar cursores prateados"
-#: engines/sci/detection.cpp:454
+#: engines/sci/detection.cpp:468
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
@@ -3617,7 +3626,7 @@ msgstr "Volume de mњsica:"
msgid "Subtitle speed: "
msgstr "Velocidade dos subtэtulos:"
-#: engines/scumm/scumm.cpp:1848
+#: engines/scumm/scumm.cpp:1850
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -3626,7 +3635,7 @@ msgstr ""
"A compatibilidade nativa con MIDI precisa a actualizaciѓn de Roland\n"
"de LucasArts, mais falla %s. Empregarase AdLib."
-#: engines/scumm/scumm.cpp:2664
+#: engines/scumm/scumm.cpp:2666
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 "
@@ -3922,6 +3931,3 @@ msgstr ""
#~ msgid "Active filter mode: Nearest"
#~ msgstr "Modo de filtro activo: mсis prѓximo"
-
-#~ msgid "Enable Roland GS Mode"
-#~ msgstr "Activar modo Roland GS"
diff --git a/po/hu_HU.po b/po/hu_HU.po
index 500482b08a..69fc239a21 100755
--- a/po/hu_HU.po
+++ b/po/hu_HU.po
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2016-06-07 19:20+0200\n"
-"PO-Revision-Date: 2016-06-08 06:22+0200\n"
+"POT-Creation-Date: 2016-07-19 09:07+0200\n"
+"PO-Revision-Date: 2016-07-20 05:59+0200\n"
"Last-Translator: George Kormendi <grubycza@hotmail.com>\n"
"Language-Team: Hungarian\n"
"Language: Magyar\n"
@@ -59,7 +59,7 @@ msgstr "Feljebb"
#: gui/recorderdialog.cpp:155 gui/saveload-dialog.cpp:216
#: gui/saveload-dialog.cpp:276 gui/saveload-dialog.cpp:547
#: gui/saveload-dialog.cpp:931 gui/themebrowser.cpp:55
-#: gui/updates-dialog.cpp:113 engines/engine.cpp:546
+#: gui/updates-dialog.cpp:113 engines/engine.cpp:549
#: backends/events/default/default-events.cpp:196
#: backends/events/default/default-events.cpp:218
#: backends/platform/wii/options.cpp:48 engines/drascula/saveload.cpp:49
@@ -207,12 +207,12 @@ msgstr "Minden FluidSynth beсllэtсs alapщrtelmezett щrtщkre."
#: gui/fluidsynth-dialog.cpp:153 gui/KeysDialog.cpp:42 gui/launcher.cpp:354
#: gui/launcher.cpp:1052 gui/launcher.cpp:1056 gui/massadd.cpp:92
-#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:465
-#: engines/engine.cpp:476 backends/platform/wii/options.cpp:47
+#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:468
+#: engines/engine.cpp:479 backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
#: engines/agos/animation.cpp:559 engines/drascula/saveload.cpp:49
#: engines/groovie/script.cpp:407 engines/parallaction/saveload.cpp:271
-#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1850
+#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1852
#: engines/scumm/players/player_v3m.cpp:130
#: engines/scumm/players/player_v5m.cpp:108 engines/sky/compact.cpp:131
#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:524
@@ -501,7 +501,7 @@ msgstr "Vсlaszz jсtщkmentщseknek mappсt"
msgid "This game ID is already taken. Please choose another one."
msgstr "Ez a jсtщkazonosэtѓ ID mсr foglalt, Vсlassz egy mсsikat."
-#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:115
+#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:98
msgid "~Q~uit"
msgstr "Kilщpщs"
@@ -589,7 +589,7 @@ msgid "Search:"
msgstr "Keresщs:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
-#: engines/mohawk/dialogs.cpp:120 engines/mohawk/riven.cpp:729
+#: engines/mohawk/dialogs.cpp:103 engines/mohawk/riven.cpp:726
#: engines/pegasus/pegasus.cpp:353 engines/tsage/scenes.cpp:601
msgid "Load game:"
msgstr "Jсtщk betіltщse:"
@@ -597,8 +597,8 @@ msgstr "Jсtщk betіltщse:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
-#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:120
-#: engines/mohawk/riven.cpp:729 engines/parallaction/saveload.cpp:194
+#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/riven.cpp:726 engines/parallaction/saveload.cpp:194
#: engines/pegasus/pegasus.cpp:353 engines/scumm/dialogs.cpp:185
#: engines/tsage/scenes.cpp:601
msgid "Load"
@@ -763,7 +763,7 @@ msgid "Special dithering modes supported by some games"
msgstr "Nщhсny jсtщk tсmogatja a speciсlis сrnyalсsi mѓdokat"
#: gui/options.cpp:764
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2314
msgid "Fullscreen mode"
msgstr "Teljeskщpernyѕs mѓd:"
@@ -1225,28 +1225,28 @@ msgstr "Adj meg egy leэrсst a %d slothoz:"
msgid "Select a Theme"
msgstr "Vсlassz tщmсt"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgid "Disabled GFX"
msgstr "GFX letiltva"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "GFX letiltva"
-#: gui/ThemeEngine.cpp:354
+#: gui/ThemeEngine.cpp:416
msgid "Standard Renderer"
msgstr "Standard lekщpezѕ"
-#: gui/ThemeEngine.cpp:354 engines/scumm/dialogs.cpp:659
+#: gui/ThemeEngine.cpp:416 engines/scumm/dialogs.cpp:659
msgid "Standard"
msgstr "Сtlagos"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased Renderer"
msgstr "Щlsimэtсsos lekщpezѕ"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased"
msgstr "Щlsimэtott"
@@ -1274,7 +1274,7 @@ msgstr "Frissэtщsek automatikus keresщse"
msgid "Proceed"
msgstr "Folyamatban"
-#: gui/widget.cpp:335 gui/widget.cpp:337 gui/widget.cpp:343 gui/widget.cpp:345
+#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
msgstr "Щrtщk tіrlщse"
@@ -1434,11 +1434,11 @@ msgstr "cэmщvel щs megbэzhatѓ adataival jсtщkverziѓ/nyelv(ek)/stb.:"
msgid "~R~esume"
msgstr "Folytatсs"
-#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:113
+#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:96
msgid "~L~oad"
msgstr "~B~etіltщs"
-#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:114
+#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:97
msgid "~S~ave"
msgstr "Mentщs"
@@ -1467,11 +1467,11 @@ msgstr "Visszatщrщs az indэtѓba"
#: engines/avalanche/parser.cpp:1900 engines/cge/events.cpp:72
#: engines/cge2/events.cpp:65 engines/cruise/menu.cpp:212
#: engines/drascula/saveload.cpp:364 engines/dreamweb/saveload.cpp:262
-#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:121
+#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sci/engine/kfile.cpp:713 engines/sherlock/scalpel/scalpel.cpp:1250
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save game:"
msgstr "Jсtщk mentщse:"
@@ -1484,12 +1484,12 @@ msgstr "Jсtщk mentщse:"
#: engines/cge/events.cpp:72 engines/cge2/events.cpp:65
#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:364
#: engines/dreamweb/saveload.cpp:262 engines/hugo/file.cpp:298
-#: engines/mohawk/dialogs.cpp:121 engines/neverhood/menumodule.cpp:880
+#: engines/mohawk/dialogs.cpp:104 engines/neverhood/menumodule.cpp:880
#: engines/parallaction/saveload.cpp:209 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/scumm/dialogs.cpp:184
+#: engines/sci/engine/kfile.cpp:713 engines/scumm/dialogs.cpp:184
#: engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save"
msgstr "Mentщs"
@@ -1511,13 +1511,13 @@ msgstr ""
"(%s) jсtщkmentщs nem sikerќlt!. Olvassd el a README-t az alap "
"informсciѓkrѓl, щs hogy hogyan segэthetsz a kщsѕbbiekben."
-#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:117
-#: engines/mohawk/dialogs.cpp:242 engines/tsage/dialogs.cpp:112
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
+#: engines/tsage/dialogs.cpp:112
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:118
-#: engines/mohawk/dialogs.cpp:243 engines/tsage/dialogs.cpp:113
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:101
+#: engines/tsage/dialogs.cpp:113
msgid "~C~ancel"
msgstr "~M~щgse"
@@ -1525,23 +1525,23 @@ msgstr "~M~щgse"
msgid "~K~eys"
msgstr "Billentyќk"
-#: engines/engine.cpp:339
+#: engines/engine.cpp:342
msgid "Could not initialize color format."
msgstr "Szэn formсtum nincs alkalmazva"
-#: engines/engine.cpp:347
+#: engines/engine.cpp:350
msgid "Could not switch to video mode: '"
msgstr "Videѓmѓd nincs сtсllэtva: ' "
-#: engines/engine.cpp:356
+#: engines/engine.cpp:359
msgid "Could not apply aspect ratio setting."
msgstr "Mщretarсny korrekciѓ nem vсltozott."
-#: engines/engine.cpp:361
+#: engines/engine.cpp:364
msgid "Could not apply fullscreen setting."
msgstr "Teljeskщpernyѕs beсllэtсs nincs alkalmazva"
-#: engines/engine.cpp:461
+#: engines/engine.cpp:464
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1555,7 +1555,7 @@ msgstr ""
"adatfсjljait a merevlemezedre.\n"
"Nщzd meg a README fсjlt a rщszletekщrt."
-#: engines/engine.cpp:472
+#: engines/engine.cpp:475
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1569,7 +1569,7 @@ msgstr ""
"hogy a jсtщk zenщje hallhatѓ legyen.\n"
"Nщzd meg a README fсjlt a rщszletekщrt."
-#: engines/engine.cpp:530
+#: engines/engine.cpp:533
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1578,7 +1578,7 @@ msgstr ""
"(%s) jсtщkсllсs betіltщse nem sikerќlt!. Olvassd el a README-t az alap "
"informсciѓkrѓl, щs hogy hogyan segэthetsz a kщsѕbbiekben."
-#: engines/engine.cpp:543
+#: engines/engine.cpp:546
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
@@ -1588,7 +1588,7 @@ msgstr ""
"ScummVM. Szсmэts rс hogy nem stabilan fut, щs a mentщsek nem mћkіdnek a "
"jіvѕbeni ScummVM verziѓkkal."
-#: engines/engine.cpp:546
+#: engines/engine.cpp:549
msgid "Start anyway"
msgstr "Indэtсs эgy is"
@@ -1811,19 +1811,19 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normсl (nincs сtmщretezщs)"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2215
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2213
msgid "Enabled aspect ratio correction"
msgstr "Mщretarсny korrekciѓ engedщlyezve"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2221
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2219
msgid "Disabled aspect ratio correction"
msgstr "Mщretarсny korrekciѓ letiltva"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2276
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2274
msgid "Active graphics filter:"
msgstr "Aktэv grafikus szћrѕk:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2318
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
msgid "Windowed mode"
msgstr "Ablakos mѓd"
@@ -2368,14 +2368,14 @@ msgstr "Pсszta megjelenэtщs"
#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
-#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:410
+#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:424
#: engines/toltecs/detection.cpp:200 engines/zvision/detection_tables.h:51
msgid "Use original save/load screens"
msgstr "Eredeti ment/tіlt kщpernyѕk hasznсlata"
#: engines/agi/detection.cpp:148 engines/cine/detection.cpp:71
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
-#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:411
+#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:425
#: engines/toltecs/detection.cpp:201
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"
@@ -2427,9 +2427,9 @@ msgstr ""
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore game:"
msgstr "Jсtщkmenet visszaсllэtсsa:"
@@ -2437,13 +2437,13 @@ msgstr "Jсtщkmenet visszaсllэtсsa:"
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore"
msgstr "Visszaсllэtсs"
-#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2393
+#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2395
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -2454,7 +2454,7 @@ msgstr ""
"\n"
"%s fсjlbѓl nem sikerќlt"
-#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2386
+#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2388
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -2465,7 +2465,7 @@ msgstr ""
"\n"
"%s fсjlba nem sikerќlt"
-#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2404
+#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2406
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -2710,37 +2710,37 @@ msgstr ""
"utasэtсst.\n"
"\n"
-#: engines/mohawk/detection.cpp:168
+#: engines/mohawk/detection.cpp:169
msgid "Play the Myst fly by movie"
msgstr "Myst bevezetѕ film lejсtszсsa"
-#: engines/mohawk/detection.cpp:169
+#: engines/mohawk/detection.cpp:170
msgid "The Myst fly by movie was not played by the original engine."
msgstr "A Myst bevezetѕ filmet nem jсtszotta le az eredeti motor."
#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:96 engines/mohawk/dialogs.cpp:239
+#: engines/mohawk/dialogs.cpp:178 engines/mohawk/dialogs.cpp:264
msgid "~Z~ip Mode Activated"
msgstr "~Z~ip Mѓd aktivсlva"
-#: engines/mohawk/dialogs.cpp:97
+#: engines/mohawk/dialogs.cpp:179
msgid "~T~ransitions Enabled"
msgstr "~С~tmenetek engedщlyezve"
#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:99
+#: engines/mohawk/dialogs.cpp:181
msgid "~D~rop Page"
msgstr "Oldal~D~obсs"
-#: engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/dialogs.cpp:185
msgid "Show ~M~ap"
msgstr "~M~ Tщrkщp nщzet"
-#: engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:191
msgid "Main Men~u~"
msgstr "Fѕ Menќ ~u~"
-#: engines/mohawk/dialogs.cpp:240
+#: engines/mohawk/dialogs.cpp:265
msgid "~W~ater Effect Enabled"
msgstr "Vэzeffektus engedщlyezve"
@@ -2862,36 +2862,44 @@ msgstr "Alternatэv intro"
msgid "Use an alternative game intro (CD version only)"
msgstr "Alternatэv jсtщkintro hasznсlata (csak CD verziѓnсl)"
-#: engines/sci/detection.cpp:380
+#: engines/sci/detection.cpp:384
msgid "Skip EGA dithering pass (full color backgrounds)"
msgstr "EGA szэnmodulсciѓ сtugrсsa (Szэnes hсttereknщl)"
-#: engines/sci/detection.cpp:381
+#: engines/sci/detection.cpp:385
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:390
+#: engines/sci/detection.cpp:394
msgid "Enable high resolution graphics"
msgstr "Nagy felbontсsњ grafika engedщlyezщse"
-#: engines/sci/detection.cpp:391
+#: engines/sci/detection.cpp:395
msgid "Enable high resolution graphics/content"
msgstr "Nagy felbontсsњ grafika/tartalom engedщlyezщse"
-#: engines/sci/detection.cpp:400
+#: engines/sci/detection.cpp:404
+msgid "Enable black-lined video"
+msgstr "Feketevonalas videѓ engedщlyezve"
+
+#: engines/sci/detection.cpp:405
+msgid "Draw black lines over videos to increase their apparent sharpness"
+msgstr "Fekete vonalat rajzol a videѓ fіlщ, hogy nіvelje a kщp щlessщgщt"
+
+#: engines/sci/detection.cpp:414
msgid "Prefer digital sound effects"
msgstr "Digitсlis hangeffektusok elѕnyben"
-#: engines/sci/detection.cpp:401
+#: engines/sci/detection.cpp:415
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Digitсlis hanghatсsok elѕnyben a szintetizсltakkal szemben"
-#: engines/sci/detection.cpp:420
+#: engines/sci/detection.cpp:434
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "IMF/Yamaha FB-01 hasznсlata MIDI kimentre"
-#: engines/sci/detection.cpp:421
+#: engines/sci/detection.cpp:435
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -2899,28 +2907,28 @@ msgstr ""
"IBM Music Feature kсrtya vagy Yamaha FB-01 FM szintetizсtor modul hasznсlata "
"MIDI kimenetre"
-#: engines/sci/detection.cpp:431
+#: engines/sci/detection.cpp:445
msgid "Use CD audio"
msgstr "CD audiѓ hasznсlata"
-#: engines/sci/detection.cpp:432
+#: engines/sci/detection.cpp:446
msgid "Use CD audio instead of in-game audio, if available"
msgstr "CD audiѓ hasznсlata a jсtщkban lщvѕvel szemben, ha elщrhetѕ"
-#: engines/sci/detection.cpp:442
+#: engines/sci/detection.cpp:456
msgid "Use Windows cursors"
msgstr "Windows kurzorok hasznсlata"
-#: engines/sci/detection.cpp:443
+#: engines/sci/detection.cpp:457
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr "Windows kurzorok hasznсlata (kisebb щs monokrѓm) a DOS-osok helyett "
-#: engines/sci/detection.cpp:453
+#: engines/sci/detection.cpp:467
msgid "Use silver cursors"
msgstr "Ezќst kurzor hasznсlata"
-#: engines/sci/detection.cpp:454
+#: engines/sci/detection.cpp:468
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr "Alternatэv ezќst kurzorszett hasznсlata, a normсl arany helyett"
@@ -3598,7 +3606,7 @@ msgstr "Zene hangereje:"
msgid "Subtitle speed: "
msgstr "Felirat sebessщg:"
-#: engines/scumm/scumm.cpp:1848
+#: engines/scumm/scumm.cpp:1850
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -3607,7 +3615,7 @@ msgstr ""
"Native MIDI tсmogatсshoz kell a Roland Upgrade a LucasArts-tѓl,\n"
"a %s hiсnyzik. AdLib-ot hasznсlok helyette."
-#: engines/scumm/scumm.cpp:2664
+#: engines/scumm/scumm.cpp:2666
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 "
@@ -3902,9 +3910,6 @@ msgstr "MPEG videѓt hasznсl DVD verziѓnсl, a kisebb felbontсsњ AVI helyett"
#~ msgid "Active filter mode: Nearest"
#~ msgstr "Aktэv filter mѓd: Kіzelэtѕ"
-#~ msgid "Enable Roland GS Mode"
-#~ msgstr "Roland GS Mѓd engedщlyezve"
-
#~ msgctxt "lowres"
#~ msgid "Add Game..."
#~ msgstr "Jсtщk hozzсadсs"
diff --git a/po/it_IT.po b/po/it_IT.po
index f01142dbad..1313610398 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: 2016-06-07 19:20+0200\n"
+"POT-Creation-Date: 2016-07-19 09:07+0200\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"
@@ -57,7 +57,7 @@ msgstr "Su"
#: gui/recorderdialog.cpp:155 gui/saveload-dialog.cpp:216
#: gui/saveload-dialog.cpp:276 gui/saveload-dialog.cpp:547
#: gui/saveload-dialog.cpp:931 gui/themebrowser.cpp:55
-#: gui/updates-dialog.cpp:113 engines/engine.cpp:546
+#: gui/updates-dialog.cpp:113 engines/engine.cpp:549
#: backends/events/default/default-events.cpp:196
#: backends/events/default/default-events.cpp:218
#: backends/platform/wii/options.cpp:48 engines/drascula/saveload.cpp:49
@@ -207,12 +207,12 @@ msgstr ""
#: gui/fluidsynth-dialog.cpp:153 gui/KeysDialog.cpp:42 gui/launcher.cpp:354
#: gui/launcher.cpp:1052 gui/launcher.cpp:1056 gui/massadd.cpp:92
-#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:465
-#: engines/engine.cpp:476 backends/platform/wii/options.cpp:47
+#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:468
+#: engines/engine.cpp:479 backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
#: engines/agos/animation.cpp:559 engines/drascula/saveload.cpp:49
#: engines/groovie/script.cpp:407 engines/parallaction/saveload.cpp:271
-#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1850
+#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1852
#: engines/scumm/players/player_v3m.cpp:130
#: engines/scumm/players/player_v5m.cpp:108 engines/sky/compact.cpp:131
#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:524
@@ -503,7 +503,7 @@ msgstr "Seleziona la cartella dei salvataggi"
msgid "This game ID is already taken. Please choose another one."
msgstr "Questo ID di gioco ш giр in uso. Si prega di sceglierne un'altro."
-#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:115
+#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:98
msgid "~Q~uit"
msgstr "C~h~iudi"
@@ -591,7 +591,7 @@ msgid "Search:"
msgstr "Cerca:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
-#: engines/mohawk/dialogs.cpp:120 engines/mohawk/riven.cpp:729
+#: engines/mohawk/dialogs.cpp:103 engines/mohawk/riven.cpp:726
#: engines/pegasus/pegasus.cpp:353 engines/tsage/scenes.cpp:601
msgid "Load game:"
msgstr "Carica gioco:"
@@ -599,8 +599,8 @@ msgstr "Carica gioco:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
-#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:120
-#: engines/mohawk/riven.cpp:729 engines/parallaction/saveload.cpp:194
+#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/riven.cpp:726 engines/parallaction/saveload.cpp:194
#: engines/pegasus/pegasus.cpp:353 engines/scumm/dialogs.cpp:185
#: engines/tsage/scenes.cpp:601
msgid "Load"
@@ -770,7 +770,7 @@ msgid "Special dithering modes supported by some games"
msgstr "Modalitр di resa grafica speciali supportate da alcuni giochi"
#: gui/options.cpp:764
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2314
msgid "Fullscreen mode"
msgstr "Modalitр a schermo intero"
@@ -1240,28 +1240,28 @@ msgstr "Inserisci una descrizione per la posizione %d:"
msgid "Select a Theme"
msgstr "Seleziona un tema"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgid "Disabled GFX"
msgstr "Grafica disattivata"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Grafica disattivata"
-#: gui/ThemeEngine.cpp:354
+#: gui/ThemeEngine.cpp:416
msgid "Standard Renderer"
msgstr "Renderer standard"
-#: gui/ThemeEngine.cpp:354 engines/scumm/dialogs.cpp:659
+#: gui/ThemeEngine.cpp:416 engines/scumm/dialogs.cpp:659
msgid "Standard"
msgstr "Medio"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased Renderer"
msgstr "Renderer con antialiasing"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased"
msgstr "Con antialiasing"
@@ -1286,7 +1286,7 @@ msgstr "Cerca aggiornamenti..."
msgid "Proceed"
msgstr ""
-#: gui/widget.cpp:335 gui/widget.cpp:337 gui/widget.cpp:343 gui/widget.cpp:345
+#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
msgstr "Cancella"
@@ -1448,11 +1448,11 @@ msgstr "del gioco che hai provato ad aggiungere e la sua versione/lingua/ecc.:"
msgid "~R~esume"
msgstr "~R~ipristina"
-#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:113
+#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:96
msgid "~L~oad"
msgstr "~C~arica"
-#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:114
+#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:97
msgid "~S~ave"
msgstr "~S~alva"
@@ -1481,11 +1481,11 @@ msgstr "~V~ai a elenco giochi"
#: engines/avalanche/parser.cpp:1900 engines/cge/events.cpp:72
#: engines/cge2/events.cpp:65 engines/cruise/menu.cpp:212
#: engines/drascula/saveload.cpp:364 engines/dreamweb/saveload.cpp:262
-#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:121
+#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sci/engine/kfile.cpp:713 engines/sherlock/scalpel/scalpel.cpp:1250
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save game:"
msgstr "Salva gioco:"
@@ -1498,12 +1498,12 @@ msgstr "Salva gioco:"
#: engines/cge/events.cpp:72 engines/cge2/events.cpp:65
#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:364
#: engines/dreamweb/saveload.cpp:262 engines/hugo/file.cpp:298
-#: engines/mohawk/dialogs.cpp:121 engines/neverhood/menumodule.cpp:880
+#: engines/mohawk/dialogs.cpp:104 engines/neverhood/menumodule.cpp:880
#: engines/parallaction/saveload.cpp:209 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/scumm/dialogs.cpp:184
+#: engines/sci/engine/kfile.cpp:713 engines/scumm/dialogs.cpp:184
#: engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save"
msgstr "Salva"
@@ -1527,13 +1527,13 @@ msgstr ""
"informazioni di base e per le istruzioni su come ottenere ulteriore "
"assistenza."
-#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:117
-#: engines/mohawk/dialogs.cpp:242 engines/tsage/dialogs.cpp:112
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
+#: engines/tsage/dialogs.cpp:112
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:118
-#: engines/mohawk/dialogs.cpp:243 engines/tsage/dialogs.cpp:113
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:101
+#: engines/tsage/dialogs.cpp:113
msgid "~C~ancel"
msgstr "~A~nnulla"
@@ -1541,23 +1541,23 @@ msgstr "~A~nnulla"
msgid "~K~eys"
msgstr "~T~asti"
-#: engines/engine.cpp:339
+#: engines/engine.cpp:342
msgid "Could not initialize color format."
msgstr "Impossibile inizializzare il formato colore."
-#: engines/engine.cpp:347
+#: engines/engine.cpp:350
msgid "Could not switch to video mode: '"
msgstr "Impossibile cambiare la modalitр video: '"
-#: engines/engine.cpp:356
+#: engines/engine.cpp:359
msgid "Could not apply aspect ratio setting."
msgstr "Impossibile applicare l'impostazione proporzioni"
-#: engines/engine.cpp:361
+#: engines/engine.cpp:364
msgid "Could not apply fullscreen setting."
msgstr "Impossibile applicare l'impostazione schermo intero."
-#: engines/engine.cpp:461
+#: engines/engine.cpp:464
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1571,7 +1571,7 @@ msgstr ""
"sull'hard disk.\n"
"Vedi il file README per i dettagli."
-#: engines/engine.cpp:472
+#: engines/engine.cpp:475
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1585,7 +1585,7 @@ msgstr ""
"la musica del gioco.\n"
"Vedi il file README per i dettagli."
-#: engines/engine.cpp:530
+#: engines/engine.cpp:533
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1595,7 +1595,7 @@ msgstr ""
"per le informazioni di base e per le istruzioni su come ottenere ulteriore "
"assistenza."
-#: engines/engine.cpp:543
+#: engines/engine.cpp:546
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
@@ -1605,7 +1605,7 @@ msgstr ""
"ScummVM. Ш quindi possibile che sia instabile, e i salvataggi potrebbero non "
"funzionare con future versioni di ScummVM."
-#: engines/engine.cpp:546
+#: engines/engine.cpp:549
msgid "Start anyway"
msgstr "Avvia comunque"
@@ -1833,19 +1833,19 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normale (no ridim.)"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2215
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2213
msgid "Enabled aspect ratio correction"
msgstr "Correzione proporzioni attivata"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2221
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2219
msgid "Disabled aspect ratio correction"
msgstr "Correzione proporzioni disattivata"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2276
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2274
msgid "Active graphics filter:"
msgstr "Filtro grafico attivo:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2318
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
msgid "Windowed mode"
msgstr "Modalitр finestra"
@@ -2395,14 +2395,14 @@ msgstr "Mostra etichette oggetti"
#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
-#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:410
+#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:424
#: engines/toltecs/detection.cpp:200 engines/zvision/detection_tables.h:51
msgid "Use original save/load screens"
msgstr "Usa schermate di salvataggio originali"
#: engines/agi/detection.cpp:148 engines/cine/detection.cpp:71
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
-#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:411
+#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:425
#: engines/toltecs/detection.cpp:201
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
@@ -2453,9 +2453,9 @@ msgstr ""
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore game:"
msgstr "Ripristina gioco:"
@@ -2463,13 +2463,13 @@ msgstr "Ripristina gioco:"
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore"
msgstr "Ripristina"
-#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2393
+#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2395
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -2480,7 +2480,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2386
+#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2388
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -2491,7 +2491,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2404
+#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2406
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -2725,39 +2725,39 @@ msgid ""
"\n"
msgstr ""
-#: engines/mohawk/detection.cpp:168
+#: engines/mohawk/detection.cpp:169
msgid "Play the Myst fly by movie"
msgstr ""
-#: engines/mohawk/detection.cpp:169
+#: engines/mohawk/detection.cpp:170
msgid "The Myst fly by movie was not played by the original engine."
msgstr ""
#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:96 engines/mohawk/dialogs.cpp:239
+#: engines/mohawk/dialogs.cpp:178 engines/mohawk/dialogs.cpp:264
msgid "~Z~ip Mode Activated"
msgstr "Modalitр ~Z~ip attivata"
-#: engines/mohawk/dialogs.cpp:97
+#: engines/mohawk/dialogs.cpp:179
msgid "~T~ransitions Enabled"
msgstr "~T~ransizioni attive"
#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:99
+#: engines/mohawk/dialogs.cpp:181
msgid "~D~rop Page"
msgstr "~L~ascia pagina"
-#: engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/dialogs.cpp:185
#, fuzzy
msgid "Show ~M~ap"
msgstr "~M~ostra mappa"
-#: engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:191
#, fuzzy
msgid "Main Men~u~"
msgstr "~M~enu principale"
-#: engines/mohawk/dialogs.cpp:240
+#: engines/mohawk/dialogs.cpp:265
msgid "~W~ater Effect Enabled"
msgstr "~E~ffetto acqua attivo"
@@ -2881,37 +2881,46 @@ msgstr "Intro alternativa"
msgid "Use an alternative game intro (CD version only)"
msgstr "Usa un'intro del gioco alternativa (solo versione CD)"
-#: engines/sci/detection.cpp:380
+#: engines/sci/detection.cpp:384
msgid "Skip EGA dithering pass (full color backgrounds)"
msgstr ""
-#: engines/sci/detection.cpp:381
+#: engines/sci/detection.cpp:385
msgid "Skip dithering pass in EGA games, graphics are shown with full colors"
msgstr ""
-#: engines/sci/detection.cpp:390
+#: engines/sci/detection.cpp:394
#, fuzzy
msgid "Enable high resolution graphics"
msgstr "Attiva le barre di Hit Point"
-#: engines/sci/detection.cpp:391
+#: engines/sci/detection.cpp:395
#, fuzzy
msgid "Enable high resolution graphics/content"
msgstr "Attiva le barre di Hit Point"
-#: engines/sci/detection.cpp:400
+#: engines/sci/detection.cpp:404
+#, fuzzy
+msgid "Enable black-lined video"
+msgstr "Attiva la modalitр Roland GS"
+
+#: engines/sci/detection.cpp:405
+msgid "Draw black lines over videos to increase their apparent sharpness"
+msgstr ""
+
+#: engines/sci/detection.cpp:414
msgid "Prefer digital sound effects"
msgstr "Scegli effetti sonori digitali"
-#: engines/sci/detection.cpp:401
+#: engines/sci/detection.cpp:415
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Scegli gli effetti sonori digitali al posto di quelli sintetizzati"
-#: engines/sci/detection.cpp:420
+#: engines/sci/detection.cpp:434
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Usa IMF/Yamaha FB-01 per output MIDI"
-#: engines/sci/detection.cpp:421
+#: engines/sci/detection.cpp:435
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -2919,30 +2928,30 @@ msgstr ""
"Usa una scheda IBM Music Feature o un modulo synth Yamaha FB-01 FM per "
"l'output MIDI"
-#: engines/sci/detection.cpp:431
+#: engines/sci/detection.cpp:445
msgid "Use CD audio"
msgstr "Usa audio da CD"
-#: engines/sci/detection.cpp:432
+#: engines/sci/detection.cpp:446
msgid "Use CD audio instead of in-game audio, if available"
msgstr ""
"Usa l'audio da CD al posto di quello incorporato nel gioco, se disponibile"
-#: engines/sci/detection.cpp:442
+#: engines/sci/detection.cpp:456
msgid "Use Windows cursors"
msgstr "Usa cursori di Windows"
-#: engines/sci/detection.cpp:443
+#: engines/sci/detection.cpp:457
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"Usa i cursori di Windows (piљ piccoli e monocromatici) al posto di quelli DOS"
-#: engines/sci/detection.cpp:453
+#: engines/sci/detection.cpp:467
msgid "Use silver cursors"
msgstr "Usa cursori d'argento"
-#: engines/sci/detection.cpp:454
+#: engines/sci/detection.cpp:468
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
@@ -3628,7 +3637,7 @@ msgstr "Volume musica:"
msgid "Subtitle speed: "
msgstr "Velocitр testo:"
-#: engines/scumm/scumm.cpp:1848
+#: engines/scumm/scumm.cpp:1850
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -3637,7 +3646,7 @@ msgstr ""
"Il supporto nativo MIDI richiede il Roland Upgrade della LucasArts,\n"
"ma %s non ш presente. Verrр usato AdLib."
-#: engines/scumm/scumm.cpp:2664
+#: engines/scumm/scumm.cpp:2666
#, fuzzy
msgid ""
"Usually, Maniac Mansion would start now. But for that to work, the game "
@@ -3938,9 +3947,6 @@ msgstr ""
#~ msgid "Active filter mode: Nearest"
#~ msgstr "Modalitр filtro attiva: Piљ vicino"
-#~ msgid "Enable Roland GS Mode"
-#~ msgstr "Attiva la modalitр Roland GS"
-
#~ msgctxt "lowres"
#~ msgid "Add Game..."
#~ msgstr "Agg. gioco..."
diff --git a/po/nb_NO.po b/po/nb_NO.po
index 94d071c8dd..f683f85535 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: 2016-06-07 19:20+0200\n"
+"POT-Creation-Date: 2016-07-19 09:07+0200\n"
"PO-Revision-Date: 2016-02-25 23:42+0100\n"
"Last-Translator: Einar Johan Trјan Sјmхen <einarjohants@gmail.com>\n"
"Language-Team: somaen <einarjohants@gmail.com>\n"
@@ -60,7 +60,7 @@ msgstr "Oppover"
#: gui/recorderdialog.cpp:155 gui/saveload-dialog.cpp:216
#: gui/saveload-dialog.cpp:276 gui/saveload-dialog.cpp:547
#: gui/saveload-dialog.cpp:931 gui/themebrowser.cpp:55
-#: gui/updates-dialog.cpp:113 engines/engine.cpp:546
+#: gui/updates-dialog.cpp:113 engines/engine.cpp:549
#: backends/events/default/default-events.cpp:196
#: backends/events/default/default-events.cpp:218
#: backends/platform/wii/options.cpp:48 engines/drascula/saveload.cpp:49
@@ -208,12 +208,12 @@ msgstr "Nullstill alle FluidSynth-instillinger til standardverdier"
#: gui/fluidsynth-dialog.cpp:153 gui/KeysDialog.cpp:42 gui/launcher.cpp:354
#: gui/launcher.cpp:1052 gui/launcher.cpp:1056 gui/massadd.cpp:92
-#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:465
-#: engines/engine.cpp:476 backends/platform/wii/options.cpp:47
+#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:468
+#: engines/engine.cpp:479 backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
#: engines/agos/animation.cpp:559 engines/drascula/saveload.cpp:49
#: engines/groovie/script.cpp:407 engines/parallaction/saveload.cpp:271
-#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1850
+#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1852
#: engines/scumm/players/player_v3m.cpp:130
#: engines/scumm/players/player_v5m.cpp:108 engines/sky/compact.cpp:131
#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:524
@@ -504,7 +504,7 @@ msgstr "Velg mappe for lagrede spill"
msgid "This game ID is already taken. Please choose another one."
msgstr "Denne spill-IDen er allerede i bruk. Vennligst velg en annen."
-#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:115
+#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:98
msgid "~Q~uit"
msgstr "~A~vslutt"
@@ -592,7 +592,7 @@ msgid "Search:"
msgstr "Sјk:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
-#: engines/mohawk/dialogs.cpp:120 engines/mohawk/riven.cpp:729
+#: engines/mohawk/dialogs.cpp:103 engines/mohawk/riven.cpp:726
#: engines/pegasus/pegasus.cpp:353 engines/tsage/scenes.cpp:601
msgid "Load game:"
msgstr "Хpne spill:"
@@ -600,8 +600,8 @@ msgstr "Хpne spill:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
-#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:120
-#: engines/mohawk/riven.cpp:729 engines/parallaction/saveload.cpp:194
+#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/riven.cpp:726 engines/parallaction/saveload.cpp:194
#: engines/pegasus/pegasus.cpp:353 engines/scumm/dialogs.cpp:185
#: engines/tsage/scenes.cpp:601
msgid "Load"
@@ -768,7 +768,7 @@ msgid "Special dithering modes supported by some games"
msgstr "Spesiel dithering-modus stјttet av enkelte spill"
#: gui/options.cpp:764
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2314
msgid "Fullscreen mode"
msgstr "Fullskjermsmodus"
@@ -1230,28 +1230,28 @@ msgstr "Gi en beskrivelse for posisjon %d:"
msgid "Select a Theme"
msgstr "Velg et tema"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgid "Disabled GFX"
msgstr "Deaktivert GFX"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Deaktivert GFX"
-#: gui/ThemeEngine.cpp:354
+#: gui/ThemeEngine.cpp:416
msgid "Standard Renderer"
msgstr "Standard tegner"
-#: gui/ThemeEngine.cpp:354 engines/scumm/dialogs.cpp:659
+#: gui/ThemeEngine.cpp:416 engines/scumm/dialogs.cpp:659
msgid "Standard"
msgstr "Standard"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased Renderer"
msgstr "Kantutjevnet tegner"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased"
msgstr "Kantutjevnet"
@@ -1276,7 +1276,7 @@ msgstr "Sjekk for oppdateringer..."
msgid "Proceed"
msgstr ""
-#: gui/widget.cpp:335 gui/widget.cpp:337 gui/widget.cpp:343 gui/widget.cpp:345
+#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
msgstr "Tјm verdi"
@@ -1438,11 +1438,11 @@ msgstr "pх spillet du forsјkte х legge til, og dets versjon/sprхk/etc.:"
msgid "~R~esume"
msgstr "~F~ortsett"
-#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:113
+#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:96
msgid "~L~oad"
msgstr "~Х~pne"
-#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:114
+#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:97
msgid "~S~ave"
msgstr "~L~agre"
@@ -1471,11 +1471,11 @@ msgstr "~T~ilbake til oppstarter"
#: engines/avalanche/parser.cpp:1900 engines/cge/events.cpp:72
#: engines/cge2/events.cpp:65 engines/cruise/menu.cpp:212
#: engines/drascula/saveload.cpp:364 engines/dreamweb/saveload.cpp:262
-#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:121
+#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sci/engine/kfile.cpp:713 engines/sherlock/scalpel/scalpel.cpp:1250
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save game:"
msgstr "Lagret spill:"
@@ -1488,12 +1488,12 @@ msgstr "Lagret spill:"
#: engines/cge/events.cpp:72 engines/cge2/events.cpp:65
#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:364
#: engines/dreamweb/saveload.cpp:262 engines/hugo/file.cpp:298
-#: engines/mohawk/dialogs.cpp:121 engines/neverhood/menumodule.cpp:880
+#: engines/mohawk/dialogs.cpp:104 engines/neverhood/menumodule.cpp:880
#: engines/parallaction/saveload.cpp:209 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/scumm/dialogs.cpp:184
+#: engines/sci/engine/kfile.cpp:713 engines/scumm/dialogs.cpp:184
#: engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save"
msgstr "Lagre"
@@ -1516,13 +1516,13 @@ msgstr ""
"Lagring av spilltilstand feilet (%s)! Vennligst konsulter README-filen for "
"grunnleggende informasjon og instruksjon om hvordan du fхr ytterligere hjelp."
-#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:117
-#: engines/mohawk/dialogs.cpp:242 engines/tsage/dialogs.cpp:112
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
+#: engines/tsage/dialogs.cpp:112
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:118
-#: engines/mohawk/dialogs.cpp:243 engines/tsage/dialogs.cpp:113
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:101
+#: engines/tsage/dialogs.cpp:113
msgid "~C~ancel"
msgstr "~A~vbryt"
@@ -1530,23 +1530,23 @@ msgstr "~A~vbryt"
msgid "~K~eys"
msgstr "~T~aster"
-#: engines/engine.cpp:339
+#: engines/engine.cpp:342
msgid "Could not initialize color format."
msgstr "Kunne ikke initalisere fargeformat."
-#: engines/engine.cpp:347
+#: engines/engine.cpp:350
msgid "Could not switch to video mode: '"
msgstr "Kunne ikke veksle til videomodus: '"
-#: engines/engine.cpp:356
+#: engines/engine.cpp:359
msgid "Could not apply aspect ratio setting."
msgstr "Kunne ikke aktivere aspektrate-innstilling."
-#: engines/engine.cpp:361
+#: engines/engine.cpp:364
msgid "Could not apply fullscreen setting."
msgstr "Kunne ikke aktivere fullskjermsinnstilling."
-#: engines/engine.cpp:461
+#: engines/engine.cpp:464
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1560,7 +1560,7 @@ msgstr ""
"datafilene til harddisken din istedet.\n"
"Se README-filen for detaljer."
-#: engines/engine.cpp:472
+#: engines/engine.cpp:475
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1574,7 +1574,7 @@ msgstr ""
"kunne hјre pх spillets musikk.\n"
"Se README-filen for detaljer."
-#: engines/engine.cpp:530
+#: engines/engine.cpp:533
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1583,7 +1583,7 @@ msgstr ""
"Klarte ikke laste spill (%s)! Vennligst se i README-fila for grunnleggende "
"informasjon og instruksjoner om hvordan du kan fх mer hjelp."
-#: engines/engine.cpp:543
+#: engines/engine.cpp:546
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
@@ -1593,7 +1593,7 @@ msgstr ""
"Derfor er det sannsynlig at det vil vцre ustabilt, og det er ikke sikkert at "
"lagrede spill vil fortsette х fungere i fremtidige versjoner av ScummVM."
-#: engines/engine.cpp:546
+#: engines/engine.cpp:549
msgid "Start anyway"
msgstr "Start allikevel"
@@ -1818,19 +1818,19 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normal (ingen skalering)"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2215
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2213
msgid "Enabled aspect ratio correction"
msgstr "Aspekt-rate korrigering aktivert"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2221
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2219
msgid "Disabled aspect ratio correction"
msgstr "Aspekt-rate korrigering deaktivert"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2276
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2274
msgid "Active graphics filter:"
msgstr "Aktivt grafikkfilter:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2318
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
msgid "Windowed mode"
msgstr "Vindusmodus"
@@ -2380,14 +2380,14 @@ msgstr "Vis objektmerkelapper"
#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
-#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:410
+#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:424
#: engines/toltecs/detection.cpp:200 engines/zvision/detection_tables.h:51
msgid "Use original save/load screens"
msgstr "Bruk originale lagre/laste-skjermer"
#: engines/agi/detection.cpp:148 engines/cine/detection.cpp:71
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
-#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:411
+#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:425
#: engines/toltecs/detection.cpp:201
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr "Bruk de originale lagre/laste-skjermene, istedenfor ScummVM-variantene"
@@ -2437,9 +2437,9 @@ msgstr ""
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore game:"
msgstr "Gjennopprett spill:"
@@ -2447,13 +2447,13 @@ msgstr "Gjennopprett spill:"
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore"
msgstr "Gjenopprett"
-#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2393
+#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2395
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -2464,7 +2464,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2386
+#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2388
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -2475,7 +2475,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2404
+#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2406
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -2720,39 +2720,39 @@ msgstr ""
"ScummVM debugkonsollen og bruke kommandoen Ћimport_savefileЛ\n"
"\n"
-#: engines/mohawk/detection.cpp:168
+#: engines/mohawk/detection.cpp:169
msgid "Play the Myst fly by movie"
msgstr ""
-#: engines/mohawk/detection.cpp:169
+#: engines/mohawk/detection.cpp:170
msgid "The Myst fly by movie was not played by the original engine."
msgstr ""
#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:96 engines/mohawk/dialogs.cpp:239
+#: engines/mohawk/dialogs.cpp:178 engines/mohawk/dialogs.cpp:264
msgid "~Z~ip Mode Activated"
msgstr "~Z~ipmodus aktivert"
-#: engines/mohawk/dialogs.cpp:97
+#: engines/mohawk/dialogs.cpp:179
msgid "~T~ransitions Enabled"
msgstr "~O~verganger aktivert"
#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:99
+#: engines/mohawk/dialogs.cpp:181
msgid "~D~rop Page"
msgstr "~D~ropp Side"
-#: engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/dialogs.cpp:185
#, fuzzy
msgid "Show ~M~ap"
msgstr "Vi~s~ Kart"
-#: engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:191
#, fuzzy
msgid "Main Men~u~"
msgstr "Hoved~m~eny"
-#: engines/mohawk/dialogs.cpp:240
+#: engines/mohawk/dialogs.cpp:265
msgid "~W~ater Effect Enabled"
msgstr "~V~anneffekt aktivert"
@@ -2874,35 +2874,44 @@ msgstr "Alternativ intro"
msgid "Use an alternative game intro (CD version only)"
msgstr "Bruk en alternativ intro (Kun for CD-versjon)"
-#: engines/sci/detection.cpp:380
+#: engines/sci/detection.cpp:384
msgid "Skip EGA dithering pass (full color backgrounds)"
msgstr "Hopp over EGA dithering (fullfarge bakgrunner)"
-#: engines/sci/detection.cpp:381
+#: engines/sci/detection.cpp:385
msgid "Skip dithering pass in EGA games, graphics are shown with full colors"
msgstr ""
-#: engines/sci/detection.cpp:390
+#: engines/sci/detection.cpp:394
msgid "Enable high resolution graphics"
msgstr "Aktiver hјyopplјselig grafikk"
-#: engines/sci/detection.cpp:391
+#: engines/sci/detection.cpp:395
msgid "Enable high resolution graphics/content"
msgstr "Aktiver hјyopplјselig grafikk/innhold"
-#: engines/sci/detection.cpp:400
+#: engines/sci/detection.cpp:404
+#, fuzzy
+msgid "Enable black-lined video"
+msgstr "Aktiver Roland GS-modus"
+
+#: engines/sci/detection.cpp:405
+msgid "Draw black lines over videos to increase their apparent sharpness"
+msgstr ""
+
+#: engines/sci/detection.cpp:414
msgid "Prefer digital sound effects"
msgstr "Foretrekk digitale lydeffekter"
-#: engines/sci/detection.cpp:401
+#: engines/sci/detection.cpp:415
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Foretrekk digitale lydeffekter fremfor syntetiske"
-#: engines/sci/detection.cpp:420
+#: engines/sci/detection.cpp:434
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Bruk IMF/Yamaha-FB-01 for MIDI-output"
-#: engines/sci/detection.cpp:421
+#: engines/sci/detection.cpp:435
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -2910,28 +2919,28 @@ msgstr ""
"Bruk et IBM Music Feature-kort eller en Yamaha FB-01 FM-synthmodul til MIDI "
"output"
-#: engines/sci/detection.cpp:431
+#: engines/sci/detection.cpp:445
msgid "Use CD audio"
msgstr "Bruk CD-lyd"
-#: engines/sci/detection.cpp:432
+#: engines/sci/detection.cpp:446
msgid "Use CD audio instead of in-game audio, if available"
msgstr "Bruk CD-lyd istedenfor spillets lyd, hvis tilgjengelig"
-#: engines/sci/detection.cpp:442
+#: engines/sci/detection.cpp:456
msgid "Use Windows cursors"
msgstr "Bruk Windows-muspekere"
-#: engines/sci/detection.cpp:443
+#: engines/sci/detection.cpp:457
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr "Bruk Windows-muspekerene (mindre, og monokrome) isteden"
-#: engines/sci/detection.cpp:453
+#: engines/sci/detection.cpp:467
msgid "Use silver cursors"
msgstr "Bruk sјlvmuspekere"
-#: engines/sci/detection.cpp:454
+#: engines/sci/detection.cpp:468
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
@@ -3611,7 +3620,7 @@ msgstr "Musikkvolum: "
msgid "Subtitle speed: "
msgstr "Teksthastighet: "
-#: engines/scumm/scumm.cpp:1848
+#: engines/scumm/scumm.cpp:1850
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -3620,7 +3629,7 @@ msgstr ""
"Ekte MIDI-stјtte krever ЋRoland UpgradeЛ fra LucasArts,\n"
"men %s mangler. Bruker AdLib istedet."
-#: engines/scumm/scumm.cpp:2664
+#: engines/scumm/scumm.cpp:2666
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 "
@@ -3912,9 +3921,6 @@ msgstr ""
#~ msgid "Active filter mode: Nearest"
#~ msgstr "Aktiv filtermodus: Nцrmeste"
-#~ msgid "Enable Roland GS Mode"
-#~ msgstr "Aktiver Roland GS-modus"
-
#~ msgctxt "lowres"
#~ msgid "Add Game..."
#~ msgstr "Legg til spill..."
diff --git a/po/nl_NL.po b/po/nl_NL.po
index 065ce2439a..b5e70af11f 100644
--- a/po/nl_NL.po
+++ b/po/nl_NL.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.9.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2016-06-07 19:20+0200\n"
+"POT-Creation-Date: 2016-07-19 09:07+0200\n"
"PO-Revision-Date: 2016-07-05 10:07+0200\n"
"Last-Translator: Ben Castricum <scummvm@bencastricum.nl>\n"
"Language-Team: Ben Castricum <scummvm@bencastricum.nl>\n"
@@ -60,7 +60,7 @@ msgstr "Ga omhoog"
#: gui/recorderdialog.cpp:155 gui/saveload-dialog.cpp:216
#: gui/saveload-dialog.cpp:276 gui/saveload-dialog.cpp:547
#: gui/saveload-dialog.cpp:931 gui/themebrowser.cpp:55
-#: gui/updates-dialog.cpp:113 engines/engine.cpp:546
+#: gui/updates-dialog.cpp:113 engines/engine.cpp:549
#: backends/events/default/default-events.cpp:196
#: backends/events/default/default-events.cpp:218
#: backends/platform/wii/options.cpp:48 engines/drascula/saveload.cpp:49
@@ -208,12 +208,12 @@ msgstr "Alle FluidSynth instellingen terugzetten naar de standaard waarden."
#: gui/fluidsynth-dialog.cpp:153 gui/KeysDialog.cpp:42 gui/launcher.cpp:354
#: gui/launcher.cpp:1052 gui/launcher.cpp:1056 gui/massadd.cpp:92
-#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:465
-#: engines/engine.cpp:476 backends/platform/wii/options.cpp:47
+#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:468
+#: engines/engine.cpp:479 backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
#: engines/agos/animation.cpp:559 engines/drascula/saveload.cpp:49
#: engines/groovie/script.cpp:407 engines/parallaction/saveload.cpp:271
-#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1850
+#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1852
#: engines/scumm/players/player_v3m.cpp:130
#: engines/scumm/players/player_v5m.cpp:108 engines/sky/compact.cpp:131
#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:524
@@ -505,7 +505,7 @@ msgstr "Selecteer map voor opgeslagen spellen"
msgid "This game ID is already taken. Please choose another one."
msgstr "Dit spel-ID is al in gebruik. Kies a.u.b. een andere."
-#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:115
+#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:98
msgid "~Q~uit"
msgstr "~S~toppen"
@@ -595,7 +595,7 @@ msgid "Search:"
msgstr "Zoeken:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
-#: engines/mohawk/dialogs.cpp:120 engines/mohawk/riven.cpp:729
+#: engines/mohawk/dialogs.cpp:103 engines/mohawk/riven.cpp:726
#: engines/pegasus/pegasus.cpp:353 engines/tsage/scenes.cpp:601
msgid "Load game:"
msgstr "Laad spel:"
@@ -603,8 +603,8 @@ msgstr "Laad spel:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
-#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:120
-#: engines/mohawk/riven.cpp:729 engines/parallaction/saveload.cpp:194
+#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/riven.cpp:726 engines/parallaction/saveload.cpp:194
#: engines/pegasus/pegasus.cpp:353 engines/scumm/dialogs.cpp:185
#: engines/tsage/scenes.cpp:601
msgid "Load"
@@ -774,7 +774,7 @@ msgid "Special dithering modes supported by some games"
msgstr "Speciale ditheringmodi die door sommige games ondersteund worden."
#: gui/options.cpp:764
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2314
msgid "Fullscreen mode"
msgstr "Volledig-scherm modus"
@@ -1241,28 +1241,28 @@ msgstr "Geef een omschrijving voor slot %d:"
msgid "Select a Theme"
msgstr "Selecteer een thema"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgid "Disabled GFX"
msgstr "GFX uitgeschakeld"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "GFX uitgeschakeld"
-#: gui/ThemeEngine.cpp:354
+#: gui/ThemeEngine.cpp:416
msgid "Standard Renderer"
msgstr "Standaard Renderer"
-#: gui/ThemeEngine.cpp:354 engines/scumm/dialogs.cpp:659
+#: gui/ThemeEngine.cpp:416 engines/scumm/dialogs.cpp:659
msgid "Standard"
msgstr "Standaard"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased Renderer"
msgstr "Antialiased Renderer"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased"
msgstr "Antialiased"
@@ -1290,7 +1290,7 @@ msgstr "Automatisch controleren op updates"
msgid "Proceed"
msgstr "Ga verder"
-#: gui/widget.cpp:335 gui/widget.cpp:337 gui/widget.cpp:343 gui/widget.cpp:345
+#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
msgstr "Veld leegmaken"
@@ -1452,11 +1452,11 @@ msgstr "van het spel die u probeerde toe te voegen, en haar versie/taal/etc.:"
msgid "~R~esume"
msgstr "~H~ervatten"
-#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:113
+#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:96
msgid "~L~oad"
msgstr "~L~aden"
-#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:114
+#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:97
msgid "~S~ave"
msgstr "Op~s~laan"
@@ -1485,11 +1485,11 @@ msgstr "S~t~artmenu"
#: engines/avalanche/parser.cpp:1900 engines/cge/events.cpp:72
#: engines/cge2/events.cpp:65 engines/cruise/menu.cpp:212
#: engines/drascula/saveload.cpp:364 engines/dreamweb/saveload.cpp:262
-#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:121
+#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sci/engine/kfile.cpp:713 engines/sherlock/scalpel/scalpel.cpp:1250
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save game:"
msgstr "Spel opslaan:"
@@ -1502,12 +1502,12 @@ msgstr "Spel opslaan:"
#: engines/cge/events.cpp:72 engines/cge2/events.cpp:65
#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:364
#: engines/dreamweb/saveload.cpp:262 engines/hugo/file.cpp:298
-#: engines/mohawk/dialogs.cpp:121 engines/neverhood/menumodule.cpp:880
+#: engines/mohawk/dialogs.cpp:104 engines/neverhood/menumodule.cpp:880
#: engines/parallaction/saveload.cpp:209 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/scumm/dialogs.cpp:184
+#: engines/sci/engine/kfile.cpp:713 engines/scumm/dialogs.cpp:184
#: engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save"
msgstr "Opslaan"
@@ -1531,13 +1531,13 @@ msgstr ""
"basisinformatie, en voor instructies voor het verkrijgen van verdere "
"assistentie."
-#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:117
-#: engines/mohawk/dialogs.cpp:242 engines/tsage/dialogs.cpp:112
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
+#: engines/tsage/dialogs.cpp:112
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:118
-#: engines/mohawk/dialogs.cpp:243 engines/tsage/dialogs.cpp:113
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:101
+#: engines/tsage/dialogs.cpp:113
msgid "~C~ancel"
msgstr "~A~nnuleer"
@@ -1545,24 +1545,24 @@ msgstr "~A~nnuleer"
msgid "~K~eys"
msgstr "~T~oetsen"
-#: engines/engine.cpp:339
+#: engines/engine.cpp:342
msgid "Could not initialize color format."
msgstr "Kon kleurformaat niet initialiseren."
# can this be changed into "Could not switch to video mode '%s'"?
-#: engines/engine.cpp:347
+#: engines/engine.cpp:350
msgid "Could not switch to video mode: '"
msgstr "Kon niet schakelen naar videomodus: '"
-#: engines/engine.cpp:356
+#: engines/engine.cpp:359
msgid "Could not apply aspect ratio setting."
msgstr "Pixelverhoudinginstelling kon niet toegepast worden."
-#: engines/engine.cpp:361
+#: engines/engine.cpp:364
msgid "Could not apply fullscreen setting."
msgstr "Kon volledig-scherminstelling niet toepassen."
-#: engines/engine.cpp:461
+#: engines/engine.cpp:464
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1576,7 +1576,7 @@ msgstr ""
"bestanden naar uw harddisk te kopieren.\n"
"Voor details kijk in de README."
-#: engines/engine.cpp:472
+#: engines/engine.cpp:475
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1589,7 +1589,7 @@ msgstr ""
"CD rip programma om te kunnen luisteren naar\n"
"het spelmuziek. Voor details kijk in de README."
-#: engines/engine.cpp:530
+#: engines/engine.cpp:533
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1599,7 +1599,7 @@ msgstr ""
"voor basisinformatie, en voor instructies voor het verkrijgen van verdere "
"assistentie."
-#: engines/engine.cpp:543
+#: engines/engine.cpp:546
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
@@ -1610,7 +1610,7 @@ msgstr ""
"instabiel is, en opgeslagen spellen zullen mogelijk niet werken in "
"toekomstige versies van ScummVM."
-#: engines/engine.cpp:546
+#: engines/engine.cpp:549
msgid "Start anyway"
msgstr "Evengoed starten"
@@ -1835,19 +1835,19 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normaal (niet schalen)"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2215
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2213
msgid "Enabled aspect ratio correction"
msgstr "Pixelverhoudingcorrectie ingeschakeld"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2221
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2219
msgid "Disabled aspect ratio correction"
msgstr "Pixelverhoudingcorrectie uitgeschakeld"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2276
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2274
msgid "Active graphics filter:"
msgstr "Actieve grafische filter:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2318
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
msgid "Windowed mode"
msgstr "Venstermodus"
@@ -2396,14 +2396,14 @@ msgstr "Toon scanlines"
#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
-#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:410
+#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:424
#: engines/toltecs/detection.cpp:200 engines/zvision/detection_tables.h:51
msgid "Use original save/load screens"
msgstr "Gebruik originele opslaan/laad schermen"
#: engines/agi/detection.cpp:148 engines/cine/detection.cpp:71
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
-#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:411
+#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:425
#: engines/toltecs/detection.cpp:201
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
@@ -2458,9 +2458,9 @@ msgstr ""
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore game:"
msgstr "Laad opgeslagen spel:"
@@ -2468,13 +2468,13 @@ msgstr "Laad opgeslagen spel:"
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore"
msgstr "Laad"
-#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2393
+#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2395
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -2485,7 +2485,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2386
+#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2388
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -2496,7 +2496,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2404
+#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2406
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -2742,37 +2742,37 @@ msgstr ""
"gebruiken.\n"
"\n"
-#: engines/mohawk/detection.cpp:168
+#: engines/mohawk/detection.cpp:169
msgid "Play the Myst fly by movie"
msgstr "Speel de Myst fly by film"
-#: engines/mohawk/detection.cpp:169
+#: engines/mohawk/detection.cpp:170
msgid "The Myst fly by movie was not played by the original engine."
msgstr "De Myst fly by file werd niet door de originele engine afgespeeld."
#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:96 engines/mohawk/dialogs.cpp:239
+#: engines/mohawk/dialogs.cpp:178 engines/mohawk/dialogs.cpp:264
msgid "~Z~ip Mode Activated"
msgstr "~Z~ip Modus Aangezet"
-#: engines/mohawk/dialogs.cpp:97
+#: engines/mohawk/dialogs.cpp:179
msgid "~T~ransitions Enabled"
msgstr "~O~vergangen Aangezet"
#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:99
+#: engines/mohawk/dialogs.cpp:181
msgid "~D~rop Page"
msgstr "Laat Pagina ~V~allen"
-#: engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/dialogs.cpp:185
msgid "Show ~M~ap"
msgstr "~T~oon Map"
-#: engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:191
msgid "Main Men~u~"
msgstr "~H~oofdmenu"
-#: engines/mohawk/dialogs.cpp:240
+#: engines/mohawk/dialogs.cpp:265
msgid "~W~ater Effect Enabled"
msgstr "~W~ater Effect Aangezet"
@@ -2897,37 +2897,45 @@ msgid "Use an alternative game intro (CD version only)"
msgstr ""
"Gebruik een alternatieve versie van de intro (alleen voor de CD versie)"
-#: engines/sci/detection.cpp:380
+#: engines/sci/detection.cpp:384
msgid "Skip EGA dithering pass (full color backgrounds)"
msgstr "Sla EGA dithering stap over (volledige kleuren achtergronden)"
-#: engines/sci/detection.cpp:381
+#: engines/sci/detection.cpp:385
msgid "Skip dithering pass in EGA games, graphics are shown with full colors"
msgstr ""
"Sla dithering stap in EGA spellen over, beelden worden getoond met volledige "
"kleuren"
-#: engines/sci/detection.cpp:390
+#: engines/sci/detection.cpp:394
msgid "Enable high resolution graphics"
msgstr "Gebruik hoge resolutie beelden"
-#: engines/sci/detection.cpp:391
+#: engines/sci/detection.cpp:395
msgid "Enable high resolution graphics/content"
msgstr "Gebruik hoge resolutie beelden"
-#: engines/sci/detection.cpp:400
+#: engines/sci/detection.cpp:404
+msgid "Enable black-lined video"
+msgstr ""
+
+#: engines/sci/detection.cpp:405
+msgid "Draw black lines over videos to increase their apparent sharpness"
+msgstr ""
+
+#: engines/sci/detection.cpp:414
msgid "Prefer digital sound effects"
msgstr "Geef de voorkeur aan digitale geluidseffecten"
-#: engines/sci/detection.cpp:401
+#: engines/sci/detection.cpp:415
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Geef de voorkeur aan digitale geluidseffecten boven gesynthetiseerde"
-#: engines/sci/detection.cpp:420
+#: engines/sci/detection.cpp:434
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Gebruik IMF/Yamaha FB-01 voor MIDI"
-#: engines/sci/detection.cpp:421
+#: engines/sci/detection.cpp:435
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -2935,30 +2943,30 @@ msgstr ""
"Gebruik een IBM Music Feature kaart of eem Yamaha FB-01 FM synth module voor "
"MIDI"
-#: engines/sci/detection.cpp:431
+#: engines/sci/detection.cpp:445
msgid "Use CD audio"
msgstr "Gebruik CD audio"
-#: engines/sci/detection.cpp:432
+#: engines/sci/detection.cpp:446
msgid "Use CD audio instead of in-game audio, if available"
msgstr "Gebruik CD audio in plaats van in-game audio, als dat beschikbaar is."
-#: engines/sci/detection.cpp:442
+#: engines/sci/detection.cpp:456
msgid "Use Windows cursors"
msgstr "Gebruik Windows muisaanwijzers"
-#: engines/sci/detection.cpp:443
+#: engines/sci/detection.cpp:457
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"Gebruik Windows muisaanwijzers (kleiner en monochrome) in plaats van de DOS "
"muisaanwijzers"
-#: engines/sci/detection.cpp:453
+#: engines/sci/detection.cpp:467
msgid "Use silver cursors"
msgstr "Gebruik zilveren muisaanwijzers"
-#: engines/sci/detection.cpp:454
+#: engines/sci/detection.cpp:468
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
@@ -3638,7 +3646,7 @@ msgstr "Muziek volume:"
msgid "Subtitle speed: "
msgstr "Snelheid ondertitels:"
-#: engines/scumm/scumm.cpp:1848
+#: engines/scumm/scumm.cpp:1850
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -3647,7 +3655,7 @@ msgstr ""
"Voor MIDI support is de Roland Upgrade van Lucasarts vereist,\n"
"maar %s ontbreekt. Er wordt nu AdLib gebruikt."
-#: engines/scumm/scumm.cpp:2664
+#: engines/scumm/scumm.cpp:2666
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 "
diff --git a/po/nn_NO.po b/po/nn_NO.po
index d1adfc0318..d52ab96aaf 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: 2016-06-07 19:20+0200\n"
+"POT-Creation-Date: 2016-07-19 09:07+0200\n"
"PO-Revision-Date: 2016-02-26 00:37+0100\n"
"Last-Translator: Einar Johan TrУИan SУИmУЅen <einarjohants@gmail.com>\n"
"Language-Team: somaen <einarjohants@gmail.com>\n"
@@ -60,7 +60,7 @@ msgstr "Oppover"
#: gui/recorderdialog.cpp:155 gui/saveload-dialog.cpp:216
#: gui/saveload-dialog.cpp:276 gui/saveload-dialog.cpp:547
#: gui/saveload-dialog.cpp:931 gui/themebrowser.cpp:55
-#: gui/updates-dialog.cpp:113 engines/engine.cpp:546
+#: gui/updates-dialog.cpp:113 engines/engine.cpp:549
#: backends/events/default/default-events.cpp:196
#: backends/events/default/default-events.cpp:218
#: backends/platform/wii/options.cpp:48 engines/drascula/saveload.cpp:49
@@ -208,12 +208,12 @@ msgstr "Nullstill alle FluidSynth-instillingar til standardverdiar"
#: gui/fluidsynth-dialog.cpp:153 gui/KeysDialog.cpp:42 gui/launcher.cpp:354
#: gui/launcher.cpp:1052 gui/launcher.cpp:1056 gui/massadd.cpp:92
-#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:465
-#: engines/engine.cpp:476 backends/platform/wii/options.cpp:47
+#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:468
+#: engines/engine.cpp:479 backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
#: engines/agos/animation.cpp:559 engines/drascula/saveload.cpp:49
#: engines/groovie/script.cpp:407 engines/parallaction/saveload.cpp:271
-#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1850
+#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1852
#: engines/scumm/players/player_v3m.cpp:130
#: engines/scumm/players/player_v5m.cpp:108 engines/sky/compact.cpp:131
#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:524
@@ -504,7 +504,7 @@ msgstr "Vel mappe for lagra spel"
msgid "This game ID is already taken. Please choose another one."
msgstr "Denne spel-IDen er allerede teken. Vцr vennleg og vel ein anna."
-#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:115
+#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:98
msgid "~Q~uit"
msgstr "~A~vslutt"
@@ -592,7 +592,7 @@ msgid "Search:"
msgstr "Sјk:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
-#: engines/mohawk/dialogs.cpp:120 engines/mohawk/riven.cpp:729
+#: engines/mohawk/dialogs.cpp:103 engines/mohawk/riven.cpp:726
#: engines/pegasus/pegasus.cpp:353 engines/tsage/scenes.cpp:601
msgid "Load game:"
msgstr "Хpne spel:"
@@ -600,8 +600,8 @@ msgstr "Хpne spel:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
-#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:120
-#: engines/mohawk/riven.cpp:729 engines/parallaction/saveload.cpp:194
+#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/riven.cpp:726 engines/parallaction/saveload.cpp:194
#: engines/pegasus/pegasus.cpp:353 engines/scumm/dialogs.cpp:185
#: engines/tsage/scenes.cpp:601
msgid "Load"
@@ -766,7 +766,7 @@ msgid "Special dithering modes supported by some games"
msgstr "Spesielle dithering-modus som stјttast av nokre spel"
#: gui/options.cpp:764
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2314
msgid "Fullscreen mode"
msgstr "Fullskjermsmodus"
@@ -1226,28 +1226,28 @@ msgstr ""
msgid "Select a Theme"
msgstr "Vel eit tema"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgid "Disabled GFX"
msgstr "Deaktivert GFX"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Deaktivert GFX"
-#: gui/ThemeEngine.cpp:354
+#: gui/ThemeEngine.cpp:416
msgid "Standard Renderer"
msgstr "Standardteiknar"
-#: gui/ThemeEngine.cpp:354 engines/scumm/dialogs.cpp:659
+#: gui/ThemeEngine.cpp:416 engines/scumm/dialogs.cpp:659
msgid "Standard"
msgstr "Standard"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased Renderer"
msgstr "Kantutjevna teiknar"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased"
msgstr "Kantutjevna"
@@ -1272,7 +1272,7 @@ msgstr "SJх etter oppdateringar..."
msgid "Proceed"
msgstr ""
-#: gui/widget.cpp:335 gui/widget.cpp:337 gui/widget.cpp:343 gui/widget.cpp:345
+#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
msgstr "Tјm verdi"
@@ -1434,11 +1434,11 @@ msgstr "pх spelet du prјvde х leggje til, samt versjon/sprхk/etc.:"
msgid "~R~esume"
msgstr "~F~ortsett"
-#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:113
+#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:96
msgid "~L~oad"
msgstr "~Х~pne"
-#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:114
+#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:97
msgid "~S~ave"
msgstr "~L~agre"
@@ -1467,11 +1467,11 @@ msgstr "Tilbake til Oppsta~r~tar"
#: engines/avalanche/parser.cpp:1900 engines/cge/events.cpp:72
#: engines/cge2/events.cpp:65 engines/cruise/menu.cpp:212
#: engines/drascula/saveload.cpp:364 engines/dreamweb/saveload.cpp:262
-#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:121
+#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sci/engine/kfile.cpp:713 engines/sherlock/scalpel/scalpel.cpp:1250
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save game:"
msgstr "Lagra spel:"
@@ -1484,12 +1484,12 @@ msgstr "Lagra spel:"
#: engines/cge/events.cpp:72 engines/cge2/events.cpp:65
#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:364
#: engines/dreamweb/saveload.cpp:262 engines/hugo/file.cpp:298
-#: engines/mohawk/dialogs.cpp:121 engines/neverhood/menumodule.cpp:880
+#: engines/mohawk/dialogs.cpp:104 engines/neverhood/menumodule.cpp:880
#: engines/parallaction/saveload.cpp:209 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/scumm/dialogs.cpp:184
+#: engines/sci/engine/kfile.cpp:713 engines/scumm/dialogs.cpp:184
#: engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save"
msgstr "Lagre"
@@ -1513,13 +1513,13 @@ msgstr ""
"grunnlegjande informasjon, og for instruskjonar om korleis du kan fх "
"ytterlegare hjelp."
-#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:117
-#: engines/mohawk/dialogs.cpp:242 engines/tsage/dialogs.cpp:112
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
+#: engines/tsage/dialogs.cpp:112
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:118
-#: engines/mohawk/dialogs.cpp:243 engines/tsage/dialogs.cpp:113
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:101
+#: engines/tsage/dialogs.cpp:113
msgid "~C~ancel"
msgstr "~A~vbryt"
@@ -1527,23 +1527,23 @@ msgstr "~A~vbryt"
msgid "~K~eys"
msgstr "~T~astar"
-#: engines/engine.cpp:339
+#: engines/engine.cpp:342
msgid "Could not initialize color format."
msgstr "Hјgkvalitetslyd (treigare) (omstart)"
-#: engines/engine.cpp:347
+#: engines/engine.cpp:350
msgid "Could not switch to video mode: '"
msgstr "Kunne ikkje veksle til videomodus: '"
-#: engines/engine.cpp:356
+#: engines/engine.cpp:359
msgid "Could not apply aspect ratio setting."
msgstr "Kunne ikkje slх pх aspekt-korrigering"
-#: engines/engine.cpp:361
+#: engines/engine.cpp:364
msgid "Could not apply fullscreen setting."
msgstr "Kunne ikkje aktiver fullskjermsinnstilling."
-#: engines/engine.cpp:461
+#: engines/engine.cpp:464
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1557,7 +1557,7 @@ msgstr ""
"datafilane til harddisken din istaden. \n"
"Sjх README-fila for detaljar."
-#: engines/engine.cpp:472
+#: engines/engine.cpp:475
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1566,7 +1566,7 @@ msgid ""
"See the README file for details."
msgstr ""
-#: engines/engine.cpp:530
+#: engines/engine.cpp:533
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1576,7 +1576,7 @@ msgstr ""
"grunnlegjande informasjon, og for instruskjonar om korleis du kan fх "
"ytterlegare hjelp."
-#: engines/engine.cpp:543
+#: engines/engine.cpp:546
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
@@ -1586,7 +1586,7 @@ msgstr ""
"ennх. Derfor er det sannsynleg at det er ustabilt, og det er mogleg at lagra "
"spel ikkje vil fungere med fremtidige versjonar av ScummVM."
-#: engines/engine.cpp:546
+#: engines/engine.cpp:549
msgid "Start anyway"
msgstr "Start allikevel"
@@ -1811,19 +1811,19 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normal (ikkje skaler)"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2215
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2213
msgid "Enabled aspect ratio correction"
msgstr "Aspekt-korrigering aktivert"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2221
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2219
msgid "Disabled aspect ratio correction"
msgstr "Aspekt-korrigering ikkje aktivert"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2276
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2274
msgid "Active graphics filter:"
msgstr "Aktivt grafikkfilter:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2318
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
msgid "Windowed mode"
msgstr "Vindusmodus"
@@ -2371,14 +2371,14 @@ msgstr "Syn objektmerkelappar"
#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
-#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:410
+#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:424
#: engines/toltecs/detection.cpp:200 engines/zvision/detection_tables.h:51
msgid "Use original save/load screens"
msgstr "Nytt opprinnelege skjermar for lagring/lasting"
#: engines/agi/detection.cpp:148 engines/cine/detection.cpp:71
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
-#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:411
+#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:425
#: engines/toltecs/detection.cpp:201
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
@@ -2425,9 +2425,9 @@ msgstr ""
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore game:"
msgstr "Gjenopprett spel:"
@@ -2435,13 +2435,13 @@ msgstr "Gjenopprett spel:"
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore"
msgstr "Gjenopprett"
-#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2393
+#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2395
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -2449,7 +2449,7 @@ msgid ""
"%s"
msgstr ""
-#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2386
+#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2388
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -2457,7 +2457,7 @@ msgid ""
"%s"
msgstr ""
-#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2404
+#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2406
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -2682,39 +2682,39 @@ msgid ""
"\n"
msgstr ""
-#: engines/mohawk/detection.cpp:168
+#: engines/mohawk/detection.cpp:169
msgid "Play the Myst fly by movie"
msgstr ""
-#: engines/mohawk/detection.cpp:169
+#: engines/mohawk/detection.cpp:170
msgid "The Myst fly by movie was not played by the original engine."
msgstr ""
#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:96 engines/mohawk/dialogs.cpp:239
+#: engines/mohawk/dialogs.cpp:178 engines/mohawk/dialogs.cpp:264
msgid "~Z~ip Mode Activated"
msgstr "~Z~ipmodus aktivert"
-#: engines/mohawk/dialogs.cpp:97
+#: engines/mohawk/dialogs.cpp:179
msgid "~T~ransitions Enabled"
msgstr "~O~vergangar aktivert"
#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:99
+#: engines/mohawk/dialogs.cpp:181
msgid "~D~rop Page"
msgstr ""
-#: engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/dialogs.cpp:185
#, fuzzy
msgid "Show ~M~ap"
msgstr "~S~yn Kart"
-#: engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:191
#, fuzzy
msgid "Main Men~u~"
msgstr "Hoved~m~eny"
-#: engines/mohawk/dialogs.cpp:240
+#: engines/mohawk/dialogs.cpp:265
msgid "~W~ater Effect Enabled"
msgstr "~V~anneffekt aktivert"
@@ -2825,35 +2825,44 @@ msgstr "Alternativ intro"
msgid "Use an alternative game intro (CD version only)"
msgstr "Nytt alternativ spillхpning (Kun CD-versjon)"
-#: engines/sci/detection.cpp:380
+#: engines/sci/detection.cpp:384
msgid "Skip EGA dithering pass (full color backgrounds)"
msgstr ""
-#: engines/sci/detection.cpp:381
+#: engines/sci/detection.cpp:385
msgid "Skip dithering pass in EGA games, graphics are shown with full colors"
msgstr ""
-#: engines/sci/detection.cpp:390
+#: engines/sci/detection.cpp:394
msgid "Enable high resolution graphics"
msgstr "Nytt hјgopplјyseleg grafikk"
-#: engines/sci/detection.cpp:391
+#: engines/sci/detection.cpp:395
msgid "Enable high resolution graphics/content"
msgstr "Nytt hјgopplјyseleg grafikk/innhald"
-#: engines/sci/detection.cpp:400
+#: engines/sci/detection.cpp:404
+#, fuzzy
+msgid "Enable black-lined video"
+msgstr "Aktiver Roland GS-modus"
+
+#: engines/sci/detection.cpp:405
+msgid "Draw black lines over videos to increase their apparent sharpness"
+msgstr ""
+
+#: engines/sci/detection.cpp:414
msgid "Prefer digital sound effects"
msgstr "Foretrekk digitale lydeffekter"
-#: engines/sci/detection.cpp:401
+#: engines/sci/detection.cpp:415
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr ""
-#: engines/sci/detection.cpp:420
+#: engines/sci/detection.cpp:434
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Nytt IMF/Yamaha FB-01 til MIDI-output"
-#: engines/sci/detection.cpp:421
+#: engines/sci/detection.cpp:435
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -2861,28 +2870,28 @@ msgstr ""
"Nytt eit IBM Music Feature-kort eller ein Yamaha FB-01 FM synth modul for "
"MIDI avspeling"
-#: engines/sci/detection.cpp:431
+#: engines/sci/detection.cpp:445
msgid "Use CD audio"
msgstr "Nytt CD-lyd"
-#: engines/sci/detection.cpp:432
+#: engines/sci/detection.cpp:446
msgid "Use CD audio instead of in-game audio, if available"
msgstr "Nytt CD-lyd istaden for spellyd, om den er tilgjengeleg"
-#: engines/sci/detection.cpp:442
+#: engines/sci/detection.cpp:456
msgid "Use Windows cursors"
msgstr "Nytt Windospeikarar"
-#: engines/sci/detection.cpp:443
+#: engines/sci/detection.cpp:457
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr "Nytt windowspeikarane (mindre og monokrome) istaden for DOS-peikarane"
-#: engines/sci/detection.cpp:453
+#: engines/sci/detection.cpp:467
msgid "Use silver cursors"
msgstr "Nytt sјlvpeikarar"
-#: engines/sci/detection.cpp:454
+#: engines/sci/detection.cpp:468
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr "Nytt det alternative settet med sјlvpeikarar, istaden for dei gylne"
@@ -3561,14 +3570,14 @@ msgstr "Musikkvolum:"
msgid "Subtitle speed: "
msgstr "Subtitle speed: "
-#: engines/scumm/scumm.cpp:1848
+#: engines/scumm/scumm.cpp:1850
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
"but %s is missing. Using AdLib instead."
msgstr ""
-#: engines/scumm/scumm.cpp:2664
+#: engines/scumm/scumm.cpp:2666
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 "
@@ -3835,9 +3844,6 @@ msgstr ""
#~ msgid "Current display mode"
#~ msgstr "Gjeldende videomodus:"
-#~ msgid "Enable Roland GS Mode"
-#~ msgstr "Aktiver Roland GS-modus"
-
#~ msgctxt "lowres"
#~ msgid "Add Game..."
#~ msgstr "Legg til spill..."
diff --git a/po/pl_PL.po b/po/pl_PL.po
index 8566e6f09e..7e1ab14800 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: 2016-06-07 19:20+0200\n"
+"POT-Creation-Date: 2016-07-19 09:07+0200\n"
"PO-Revision-Date: 2016-02-20 23:43+0100\n"
"Last-Translator: MichaГ ZiБbkowski <mziab@o2.pl>\n"
"Language-Team: Grajpopolsku.pl <grajpopolsku@gmail.com>\n"
@@ -63,7 +63,7 @@ msgstr "W gѓrъ"
#: gui/recorderdialog.cpp:155 gui/saveload-dialog.cpp:216
#: gui/saveload-dialog.cpp:276 gui/saveload-dialog.cpp:547
#: gui/saveload-dialog.cpp:931 gui/themebrowser.cpp:55
-#: gui/updates-dialog.cpp:113 engines/engine.cpp:546
+#: gui/updates-dialog.cpp:113 engines/engine.cpp:549
#: backends/events/default/default-events.cpp:196
#: backends/events/default/default-events.cpp:218
#: backends/platform/wii/options.cpp:48 engines/drascula/saveload.cpp:49
@@ -211,12 +211,12 @@ msgstr "Przywrѓц domyЖlne wartoЖci wszystkich ustawieё FluidSynth."
#: gui/fluidsynth-dialog.cpp:153 gui/KeysDialog.cpp:42 gui/launcher.cpp:354
#: gui/launcher.cpp:1052 gui/launcher.cpp:1056 gui/massadd.cpp:92
-#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:465
-#: engines/engine.cpp:476 backends/platform/wii/options.cpp:47
+#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:468
+#: engines/engine.cpp:479 backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
#: engines/agos/animation.cpp:559 engines/drascula/saveload.cpp:49
#: engines/groovie/script.cpp:407 engines/parallaction/saveload.cpp:271
-#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1850
+#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1852
#: engines/scumm/players/player_v3m.cpp:130
#: engines/scumm/players/player_v5m.cpp:108 engines/sky/compact.cpp:131
#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:524
@@ -505,7 +505,7 @@ msgstr "Wybierz katalog dla zapisѓw"
msgid "This game ID is already taken. Please choose another one."
msgstr "Identyfikator jest juП zajъty. Wybierz inny."
-#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:115
+#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:98
msgid "~Q~uit"
msgstr "~Z~akoёcz"
@@ -593,7 +593,7 @@ msgid "Search:"
msgstr "Szukaj"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
-#: engines/mohawk/dialogs.cpp:120 engines/mohawk/riven.cpp:729
+#: engines/mohawk/dialogs.cpp:103 engines/mohawk/riven.cpp:726
#: engines/pegasus/pegasus.cpp:353 engines/tsage/scenes.cpp:601
msgid "Load game:"
msgstr "Wczytaj grъ:"
@@ -601,8 +601,8 @@ msgstr "Wczytaj grъ:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
-#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:120
-#: engines/mohawk/riven.cpp:729 engines/parallaction/saveload.cpp:194
+#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/riven.cpp:726 engines/parallaction/saveload.cpp:194
#: engines/pegasus/pegasus.cpp:353 engines/scumm/dialogs.cpp:185
#: engines/tsage/scenes.cpp:601
msgid "Load"
@@ -765,7 +765,7 @@ msgid "Special dithering modes supported by some games"
msgstr "Specjalne tryby ditheringu wspierane przez niektѓre gry"
#: gui/options.cpp:764
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2314
msgid "Fullscreen mode"
msgstr "PeГny ekran"
@@ -1230,28 +1230,28 @@ msgstr "Podaj opis dla slotu %d:"
msgid "Select a Theme"
msgstr "Wybierz styl"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgid "Disabled GFX"
msgstr "WyГБczona grafika"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "WyГБczona grafika"
-#: gui/ThemeEngine.cpp:354
+#: gui/ThemeEngine.cpp:416
msgid "Standard Renderer"
msgstr "Standardowy renderer"
-#: gui/ThemeEngine.cpp:354 engines/scumm/dialogs.cpp:659
+#: gui/ThemeEngine.cpp:416 engines/scumm/dialogs.cpp:659
msgid "Standard"
msgstr "Standardowy"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased Renderer"
msgstr "WygГadzany renderer"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased"
msgstr "WygГadzany"
@@ -1276,7 +1276,7 @@ msgstr "SprawdМ aktualizacjъ..."
msgid "Proceed"
msgstr ""
-#: gui/widget.cpp:335 gui/widget.cpp:337 gui/widget.cpp:343 gui/widget.cpp:345
+#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
msgstr "WyczyЖц"
@@ -1437,11 +1437,11 @@ msgstr "gry, ktѓrБ prѓbowaГeЖ dodaц oraz jej wersjБ, jъzykiem itd.:"
msgid "~R~esume"
msgstr "~W~znѓw"
-#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:113
+#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:96
msgid "~L~oad"
msgstr "~W~czytaj"
-#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:114
+#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:97
msgid "~S~ave"
msgstr "~Z~apisz"
@@ -1470,11 +1470,11 @@ msgstr "~P~owrѓt do launchera"
#: engines/avalanche/parser.cpp:1900 engines/cge/events.cpp:72
#: engines/cge2/events.cpp:65 engines/cruise/menu.cpp:212
#: engines/drascula/saveload.cpp:364 engines/dreamweb/saveload.cpp:262
-#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:121
+#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sci/engine/kfile.cpp:713 engines/sherlock/scalpel/scalpel.cpp:1250
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save game:"
msgstr "Zapis:"
@@ -1487,12 +1487,12 @@ msgstr "Zapis:"
#: engines/cge/events.cpp:72 engines/cge2/events.cpp:65
#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:364
#: engines/dreamweb/saveload.cpp:262 engines/hugo/file.cpp:298
-#: engines/mohawk/dialogs.cpp:121 engines/neverhood/menumodule.cpp:880
+#: engines/mohawk/dialogs.cpp:104 engines/neverhood/menumodule.cpp:880
#: engines/parallaction/saveload.cpp:209 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/scumm/dialogs.cpp:184
+#: engines/sci/engine/kfile.cpp:713 engines/scumm/dialogs.cpp:184
#: engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save"
msgstr "Zapisz"
@@ -1515,13 +1515,13 @@ msgstr ""
"Zapis stanu gry nie powiѓdГ siъ (%s)! Aby uzyskaц podstawowe informacje oraz "
"dowiedzieц jak szukaц dalszej pomocy, sprawdМ plik README."
-#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:117
-#: engines/mohawk/dialogs.cpp:242 engines/tsage/dialogs.cpp:112
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
+#: engines/tsage/dialogs.cpp:112
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:118
-#: engines/mohawk/dialogs.cpp:243 engines/tsage/dialogs.cpp:113
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:101
+#: engines/tsage/dialogs.cpp:113
msgid "~C~ancel"
msgstr "~A~nuluj"
@@ -1529,23 +1529,23 @@ msgstr "~A~nuluj"
msgid "~K~eys"
msgstr "~K~lawisze"
-#: engines/engine.cpp:339
+#: engines/engine.cpp:342
msgid "Could not initialize color format."
msgstr "Nie udaГo siъ zainicjalizowaц formatu kolorѓw."
-#: engines/engine.cpp:347
+#: engines/engine.cpp:350
msgid "Could not switch to video mode: '"
msgstr "Nie udaГo siъ przeГБczyц w tryb wideo: '"
-#: engines/engine.cpp:356
+#: engines/engine.cpp:359
msgid "Could not apply aspect ratio setting."
msgstr "Nie udaГo siъ zastosowaц ustawienia formatu obrazu."
-#: engines/engine.cpp:361
+#: engines/engine.cpp:364
msgid "Could not apply fullscreen setting."
msgstr "Nie udaГo siъ zastosowaц ustawienia peГnego ekranu."
-#: engines/engine.cpp:461
+#: engines/engine.cpp:464
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1557,7 +1557,7 @@ msgstr ""
"znane problemѓw. StБd zalecane jest skopiowanie plikѓw gry na twardy dysk.\n"
"Dalsze informacje sБ dostъpne w pliku README."
-#: engines/engine.cpp:472
+#: engines/engine.cpp:475
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1569,7 +1569,7 @@ msgstr ""
"skopiowaц na dysk za pomocБ odpowiedniego rippera CD audio.\n"
"Dalsze informacje sБ dostъpne w pliku README."
-#: engines/engine.cpp:530
+#: engines/engine.cpp:533
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1578,7 +1578,7 @@ msgstr ""
"Odczyt stanu gry nie powiѓdГ siъ (%s)! Aby uzyskaц podstawowe informacje "
"oraz dowiedzieц jak szukaц dalszej pomocy, sprawdМ plik README."
-#: engines/engine.cpp:543
+#: engines/engine.cpp:546
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
@@ -1588,7 +1588,7 @@ msgstr ""
"ScummVM. W zwiБzku z tym moПe byц ona niestabilna, a wszelkie zapisy, "
"ktѓrych dokonasz, mogБ byц nieobsГugiwane w przyszГych wersjach ScummVM."
-#: engines/engine.cpp:546
+#: engines/engine.cpp:549
msgid "Start anyway"
msgstr "WГБcz mimo tego"
@@ -1813,19 +1813,19 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "ZwykГy (bez skalowania)"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2215
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2213
msgid "Enabled aspect ratio correction"
msgstr "WГБczono korekcjъ formatu obrazu"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2221
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2219
msgid "Disabled aspect ratio correction"
msgstr "WyГБczono korekcjъ formatu obrazu"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2276
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2274
msgid "Active graphics filter:"
msgstr "Aktywny filtr graficzny:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2318
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
msgid "Windowed mode"
msgstr "Okno"
@@ -2372,14 +2372,14 @@ msgstr "PokaП etykiety obiektѓw"
#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
-#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:410
+#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:424
#: engines/toltecs/detection.cpp:200 engines/zvision/detection_tables.h:51
msgid "Use original save/load screens"
msgstr "UПyj oryginalnych ekranѓw odczytu/zapisu"
#: engines/agi/detection.cpp:148 engines/cine/detection.cpp:71
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
-#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:411
+#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:425
#: engines/toltecs/detection.cpp:201
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr "UПyj oryginalnych ekranѓw odczytu/zapisu zamiast tych ze ScummVM"
@@ -2430,9 +2430,9 @@ msgstr ""
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore game:"
msgstr "Wznѓw grъ:"
@@ -2440,13 +2440,13 @@ msgstr "Wznѓw grъ:"
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore"
msgstr "Wznѓw"
-#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2393
+#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2395
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -2457,7 +2457,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2386
+#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2388
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -2468,7 +2468,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2404
+#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2406
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -2711,39 +2711,39 @@ msgstr ""
"debugowania ScummVM i uПyц komendy 'import_savefile'.\n"
"\n"
-#: engines/mohawk/detection.cpp:168
+#: engines/mohawk/detection.cpp:169
msgid "Play the Myst fly by movie"
msgstr ""
-#: engines/mohawk/detection.cpp:169
+#: engines/mohawk/detection.cpp:170
msgid "The Myst fly by movie was not played by the original engine."
msgstr ""
#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:96 engines/mohawk/dialogs.cpp:239
+#: engines/mohawk/dialogs.cpp:178 engines/mohawk/dialogs.cpp:264
msgid "~Z~ip Mode Activated"
msgstr "~T~ryb turbo aktywny"
-#: engines/mohawk/dialogs.cpp:97
+#: engines/mohawk/dialogs.cpp:179
msgid "~T~ransitions Enabled"
msgstr "~P~rzejЖcia wГБczone"
#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:99
+#: engines/mohawk/dialogs.cpp:181
msgid "~D~rop Page"
msgstr "~O~puЖц stronъ"
-#: engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/dialogs.cpp:185
#, fuzzy
msgid "Show ~M~ap"
msgstr "~P~okaП mapъ"
-#: engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:191
#, fuzzy
msgid "Main Men~u~"
msgstr "~M~enu gГѓwne"
-#: engines/mohawk/dialogs.cpp:240
+#: engines/mohawk/dialogs.cpp:265
msgid "~W~ater Effect Enabled"
msgstr "~E~fekty wody wГБczone"
@@ -2864,36 +2864,45 @@ msgstr "Alternatywne intro"
msgid "Use an alternative game intro (CD version only)"
msgstr "UПyj alternatywnego intra (tylko dla wersji CD)"
-#: engines/sci/detection.cpp:380
+#: engines/sci/detection.cpp:384
msgid "Skip EGA dithering pass (full color backgrounds)"
msgstr "Pomiё dithering EGA (tГa w peГnym kolorze)"
-#: engines/sci/detection.cpp:381
+#: engines/sci/detection.cpp:385
msgid "Skip dithering pass in EGA games, graphics are shown with full colors"
msgstr ""
"Pomiё dithering w grach EGA, grafika bъdzie wyЖwietlana w peГnym kolorze"
-#: engines/sci/detection.cpp:390
+#: engines/sci/detection.cpp:394
msgid "Enable high resolution graphics"
msgstr "WГБcz grafikъ wysokiej rozdzielczoЖci"
-#: engines/sci/detection.cpp:391
+#: engines/sci/detection.cpp:395
msgid "Enable high resolution graphics/content"
msgstr "WГБcz grafikъ/zawartoЖц wysokiej rozdzielczoЖci"
-#: engines/sci/detection.cpp:400
+#: engines/sci/detection.cpp:404
+#, fuzzy
+msgid "Enable black-lined video"
+msgstr "WГБcz tryb Roland GS"
+
+#: engines/sci/detection.cpp:405
+msgid "Draw black lines over videos to increase their apparent sharpness"
+msgstr ""
+
+#: engines/sci/detection.cpp:414
msgid "Prefer digital sound effects"
msgstr "Preferuj cyfrowe efekty dМwiъkowe"
-#: engines/sci/detection.cpp:401
+#: engines/sci/detection.cpp:415
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Preferuj cyfrowe efekty dМwiъkowe zamiast syntezowanych"
-#: engines/sci/detection.cpp:420
+#: engines/sci/detection.cpp:434
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "UПyj IMF/Yamaha FB-01 dla wyjЖcia MIDI"
-#: engines/sci/detection.cpp:421
+#: engines/sci/detection.cpp:435
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -2901,29 +2910,29 @@ msgstr ""
"UПyj karty IBM Music Feature lub moduГu syntezy FM Yamaha FB-01 dla wyjЖcia "
"MIDI"
-#: engines/sci/detection.cpp:431
+#: engines/sci/detection.cpp:445
msgid "Use CD audio"
msgstr "UПyj CD audio"
-#: engines/sci/detection.cpp:432
+#: engines/sci/detection.cpp:446
msgid "Use CD audio instead of in-game audio, if available"
msgstr "UПyj CD audio zamiast muzyki w grze, jeЖli jest dostъpne"
-#: engines/sci/detection.cpp:442
+#: engines/sci/detection.cpp:456
msgid "Use Windows cursors"
msgstr "UПyj windowsowych kursorѓw"
-#: engines/sci/detection.cpp:443
+#: engines/sci/detection.cpp:457
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"UПyj windowsowych kursorѓw (mniejsze i monochromatyczne) zamiast DOS-owych"
-#: engines/sci/detection.cpp:453
+#: engines/sci/detection.cpp:467
msgid "Use silver cursors"
msgstr "UПyj srebrnych kursorѓw"
-#: engines/sci/detection.cpp:454
+#: engines/sci/detection.cpp:468
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
@@ -3603,7 +3612,7 @@ msgstr "GГoЖnoЖц muzyki: "
msgid "Subtitle speed: "
msgstr "Prъd. napisѓw: "
-#: engines/scumm/scumm.cpp:1848
+#: engines/scumm/scumm.cpp:1850
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -3612,7 +3621,7 @@ msgstr ""
"Natywne wsparcie MIDI wymaga aktualizacji Rolanda od LucasArts,\n"
"ale brakuje %s. PrzeГБczam na tryb AdLib."
-#: engines/scumm/scumm.cpp:2664
+#: engines/scumm/scumm.cpp:2666
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 "
@@ -3910,9 +3919,6 @@ msgstr "UПyj wideo MPEG z wersji DVD zamiast AVI niПszej rozdzielczoЖci"
#~ msgid "Active filter mode: Nearest"
#~ msgstr "Aktywny tryb filtru: najbliПszy sБsiad"
-#~ msgid "Enable Roland GS Mode"
-#~ msgstr "WГБcz tryb Roland GS"
-
#~ msgctxt "lowres"
#~ msgid "Add Game..."
#~ msgstr "Dodaj grъ..."
diff --git a/po/pt_BR.po b/po/pt_BR.po
index d3e495d1f9..41a8ad15c7 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: 2016-06-07 19:20+0200\n"
+"POT-Creation-Date: 2016-07-19 09:07+0200\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"
@@ -62,7 +62,7 @@ msgstr "Acima"
#: gui/recorderdialog.cpp:155 gui/saveload-dialog.cpp:216
#: gui/saveload-dialog.cpp:276 gui/saveload-dialog.cpp:547
#: gui/saveload-dialog.cpp:931 gui/themebrowser.cpp:55
-#: gui/updates-dialog.cpp:113 engines/engine.cpp:546
+#: gui/updates-dialog.cpp:113 engines/engine.cpp:549
#: backends/events/default/default-events.cpp:196
#: backends/events/default/default-events.cpp:218
#: backends/platform/wii/options.cpp:48 engines/drascula/saveload.cpp:49
@@ -214,12 +214,12 @@ msgstr ""
#: gui/fluidsynth-dialog.cpp:153 gui/KeysDialog.cpp:42 gui/launcher.cpp:354
#: gui/launcher.cpp:1052 gui/launcher.cpp:1056 gui/massadd.cpp:92
-#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:465
-#: engines/engine.cpp:476 backends/platform/wii/options.cpp:47
+#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:468
+#: engines/engine.cpp:479 backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
#: engines/agos/animation.cpp:559 engines/drascula/saveload.cpp:49
#: engines/groovie/script.cpp:407 engines/parallaction/saveload.cpp:271
-#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1850
+#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1852
#: engines/scumm/players/player_v3m.cpp:130
#: engines/scumm/players/player_v5m.cpp:108 engines/sky/compact.cpp:131
#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:524
@@ -510,7 +510,7 @@ msgstr "Selecione a pasta para os jogos salvos"
msgid "This game ID is already taken. Please choose another one."
msgstr "Este cѓdigo jс esta sendo utilizado. Por favor, escolha outro."
-#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:115
+#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:98
msgid "~Q~uit"
msgstr "~S~air"
@@ -599,7 +599,7 @@ msgid "Search:"
msgstr "Pesquisar:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
-#: engines/mohawk/dialogs.cpp:120 engines/mohawk/riven.cpp:729
+#: engines/mohawk/dialogs.cpp:103 engines/mohawk/riven.cpp:726
#: engines/pegasus/pegasus.cpp:353 engines/tsage/scenes.cpp:601
msgid "Load game:"
msgstr "Carregar jogo:"
@@ -607,8 +607,8 @@ msgstr "Carregar jogo:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
-#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:120
-#: engines/mohawk/riven.cpp:729 engines/parallaction/saveload.cpp:194
+#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/riven.cpp:726 engines/parallaction/saveload.cpp:194
#: engines/pegasus/pegasus.cpp:353 engines/scumm/dialogs.cpp:185
#: engines/tsage/scenes.cpp:601
msgid "Load"
@@ -781,7 +781,7 @@ msgid "Special dithering modes supported by some games"
msgstr "Modos especiais de dithering suportados por alguns jogos"
#: gui/options.cpp:764
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2314
msgid "Fullscreen mode"
msgstr "Modo Tela Cheia"
@@ -1253,31 +1253,31 @@ msgstr ""
msgid "Select a Theme"
msgstr "Selecione um Tema"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgid "Disabled GFX"
msgstr "GFX desabilitado"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "GFX desabilitado"
-#: gui/ThemeEngine.cpp:354
+#: gui/ThemeEngine.cpp:416
#, fuzzy
msgid "Standard Renderer"
msgstr "Renderizador padrуo (16bpp)"
-#: gui/ThemeEngine.cpp:354 engines/scumm/dialogs.cpp:659
+#: gui/ThemeEngine.cpp:416 engines/scumm/dialogs.cpp:659
#, fuzzy
msgid "Standard"
msgstr "Padrуo (16bpp)"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
#, fuzzy
msgid "Antialiased Renderer"
msgstr "Renderizador Anti-Serrilhamento (16bpp)"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
#, fuzzy
msgid "Antialiased"
msgstr "Anti-Serrilhamento (16bpp)"
@@ -1303,7 +1303,7 @@ msgstr "Procurar por Atualizaчѕes..."
msgid "Proceed"
msgstr ""
-#: gui/widget.cpp:335 gui/widget.cpp:337 gui/widget.cpp:343 gui/widget.cpp:345
+#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
msgstr "Limpar valor"
@@ -1467,11 +1467,11 @@ msgstr "do jogo que vocъ tentou adicionar e sua versуo/idioma/etc.:"
msgid "~R~esume"
msgstr "~V~oltar ao jogo"
-#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:113
+#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:96
msgid "~L~oad"
msgstr "~C~arregar"
-#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:114
+#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:97
msgid "~S~ave"
msgstr "~S~alvar"
@@ -1500,11 +1500,11 @@ msgstr "~V~oltar ao menu"
#: engines/avalanche/parser.cpp:1900 engines/cge/events.cpp:72
#: engines/cge2/events.cpp:65 engines/cruise/menu.cpp:212
#: engines/drascula/saveload.cpp:364 engines/dreamweb/saveload.cpp:262
-#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:121
+#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sci/engine/kfile.cpp:713 engines/sherlock/scalpel/scalpel.cpp:1250
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save game:"
msgstr "Salvar jogo:"
@@ -1517,12 +1517,12 @@ msgstr "Salvar jogo:"
#: engines/cge/events.cpp:72 engines/cge2/events.cpp:65
#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:364
#: engines/dreamweb/saveload.cpp:262 engines/hugo/file.cpp:298
-#: engines/mohawk/dialogs.cpp:121 engines/neverhood/menumodule.cpp:880
+#: engines/mohawk/dialogs.cpp:104 engines/neverhood/menumodule.cpp:880
#: engines/parallaction/saveload.cpp:209 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/scumm/dialogs.cpp:184
+#: engines/sci/engine/kfile.cpp:713 engines/scumm/dialogs.cpp:184
#: engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save"
msgstr "Salvar"
@@ -1546,13 +1546,13 @@ msgstr ""
"Por favor, consulte o README para obter informaчѕes bсsicas, e para obter "
"instruчѕes sobre como obter assistъncia adicional."
-#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:117
-#: engines/mohawk/dialogs.cpp:242 engines/tsage/dialogs.cpp:112
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
+#: engines/tsage/dialogs.cpp:112
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:118
-#: engines/mohawk/dialogs.cpp:243 engines/tsage/dialogs.cpp:113
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:101
+#: engines/tsage/dialogs.cpp:113
msgid "~C~ancel"
msgstr "~C~ancelar"
@@ -1560,23 +1560,23 @@ msgstr "~C~ancelar"
msgid "~K~eys"
msgstr "~T~eclas"
-#: engines/engine.cpp:339
+#: engines/engine.cpp:342
msgid "Could not initialize color format."
msgstr "Nуo foi possэvel inicializar o formato de cor."
-#: engines/engine.cpp:347
+#: engines/engine.cpp:350
msgid "Could not switch to video mode: '"
msgstr "Nуo foi possэvel alternar o modo de vэdeo atual:"
-#: engines/engine.cpp:356
+#: engines/engine.cpp:359
msgid "Could not apply aspect ratio setting."
msgstr "Nуo foi possэvel aplicar a correчуo de proporчуo"
-#: engines/engine.cpp:361
+#: engines/engine.cpp:364
msgid "Could not apply fullscreen setting."
msgstr "Nуo foi possэvel aplicar a configuraчуo de tela cheia."
-#: engines/engine.cpp:461
+#: engines/engine.cpp:464
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1590,7 +1590,7 @@ msgstr ""
"os arquivos de dados para o disco rэgido.\n"
"Consulte o arquivo README para mais detalhes."
-#: engines/engine.cpp:472
+#: engines/engine.cpp:475
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1604,7 +1604,7 @@ msgstr ""
"para ouvir a mњsica do jogo.\n"
"Consulte o arquivo README para mais detalhes."
-#: engines/engine.cpp:530
+#: engines/engine.cpp:533
#, fuzzy, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1614,7 +1614,7 @@ msgstr ""
"Por favor, consulte o README para obter informaчѕes bсsicas, e para obter "
"instruчѕes sobre como obter assistъncia adicional."
-#: engines/engine.cpp:543
+#: engines/engine.cpp:546
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
@@ -1624,7 +1624,7 @@ msgstr ""
"suportado pelo ScummVM. Como tal, щ provсvel que seja instсvel, e qualquer "
"jogo salvo que vocъ fizer pode nуo funcionar em futuras versѕes do ScummVM."
-#: engines/engine.cpp:546
+#: engines/engine.cpp:549
msgid "Start anyway"
msgstr "Iniciar de qualquer maneira"
@@ -1854,19 +1854,19 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normal (sem escala)"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2215
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2213
msgid "Enabled aspect ratio correction"
msgstr "Correчуo de proporчуo habilitada"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2221
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2219
msgid "Disabled aspect ratio correction"
msgstr "Correчуo de proporчуo desabilitada"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2276
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2274
msgid "Active graphics filter:"
msgstr "Ativa os filtros grсficos"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2318
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
msgid "Windowed mode"
msgstr "Modo janela"
@@ -2417,14 +2417,14 @@ msgstr ""
#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
-#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:410
+#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:424
#: engines/toltecs/detection.cpp:200 engines/zvision/detection_tables.h:51
msgid "Use original save/load screens"
msgstr ""
#: engines/agi/detection.cpp:148 engines/cine/detection.cpp:71
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
-#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:411
+#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:425
#: engines/toltecs/detection.cpp:201
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
@@ -2471,9 +2471,9 @@ msgstr ""
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore game:"
msgstr "Restaurar jogo:"
@@ -2481,13 +2481,13 @@ msgstr "Restaurar jogo:"
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore"
msgstr "Restaurar"
-#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2393
+#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2395
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -2498,7 +2498,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2386
+#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2388
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -2509,7 +2509,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2404
+#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2406
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -2760,39 +2760,39 @@ msgid ""
"\n"
msgstr ""
-#: engines/mohawk/detection.cpp:168
+#: engines/mohawk/detection.cpp:169
msgid "Play the Myst fly by movie"
msgstr ""
-#: engines/mohawk/detection.cpp:169
+#: engines/mohawk/detection.cpp:170
msgid "The Myst fly by movie was not played by the original engine."
msgstr ""
#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:96 engines/mohawk/dialogs.cpp:239
+#: engines/mohawk/dialogs.cpp:178 engines/mohawk/dialogs.cpp:264
msgid "~Z~ip Mode Activated"
msgstr "Modo ~Z~ip ativado"
-#: engines/mohawk/dialogs.cpp:97
+#: engines/mohawk/dialogs.cpp:179
msgid "~T~ransitions Enabled"
msgstr "Modo ~T~ransiчѕes ativado"
#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:99
+#: engines/mohawk/dialogs.cpp:181
msgid "~D~rop Page"
msgstr "~S~oltar Pсgina"
-#: engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/dialogs.cpp:185
#, fuzzy
msgid "Show ~M~ap"
msgstr "~E~xibir Mapa"
-#: engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:191
#, fuzzy
msgid "Main Men~u~"
msgstr "~M~enu Principal ScummVM"
-#: engines/mohawk/dialogs.cpp:240
+#: engines/mohawk/dialogs.cpp:265
msgid "~W~ater Effect Enabled"
msgstr "Modo ~E~feitos de сgua ativado"
@@ -2917,64 +2917,73 @@ msgstr ""
msgid "Use an alternative game intro (CD version only)"
msgstr ""
-#: engines/sci/detection.cpp:380
+#: engines/sci/detection.cpp:384
msgid "Skip EGA dithering pass (full color backgrounds)"
msgstr ""
-#: engines/sci/detection.cpp:381
+#: engines/sci/detection.cpp:385
msgid "Skip dithering pass in EGA games, graphics are shown with full colors"
msgstr ""
-#: engines/sci/detection.cpp:390
+#: engines/sci/detection.cpp:394
msgid "Enable high resolution graphics"
msgstr ""
-#: engines/sci/detection.cpp:391
+#: engines/sci/detection.cpp:395
msgid "Enable high resolution graphics/content"
msgstr ""
-#: engines/sci/detection.cpp:400
+#: engines/sci/detection.cpp:404
+#, fuzzy
+msgid "Enable black-lined video"
+msgstr "Ligar modo Roland GS"
+
+#: engines/sci/detection.cpp:405
+msgid "Draw black lines over videos to increase their apparent sharpness"
+msgstr ""
+
+#: engines/sci/detection.cpp:414
#, fuzzy
msgid "Prefer digital sound effects"
msgstr "Volume dos efeitos sonoros especiais"
-#: engines/sci/detection.cpp:401
+#: engines/sci/detection.cpp:415
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr ""
-#: engines/sci/detection.cpp:420
+#: engines/sci/detection.cpp:434
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr ""
-#: engines/sci/detection.cpp:421
+#: engines/sci/detection.cpp:435
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
msgstr ""
-#: engines/sci/detection.cpp:431
+#: engines/sci/detection.cpp:445
msgid "Use CD audio"
msgstr ""
-#: engines/sci/detection.cpp:432
+#: engines/sci/detection.cpp:446
msgid "Use CD audio instead of in-game audio, if available"
msgstr ""
-#: engines/sci/detection.cpp:442
+#: engines/sci/detection.cpp:456
msgid "Use Windows cursors"
msgstr ""
-#: engines/sci/detection.cpp:443
+#: engines/sci/detection.cpp:457
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
-#: engines/sci/detection.cpp:453
+#: engines/sci/detection.cpp:467
#, fuzzy
msgid "Use silver cursors"
msgstr "Cursor normal"
-#: engines/sci/detection.cpp:454
+#: engines/sci/detection.cpp:468
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
@@ -3657,7 +3666,7 @@ msgstr "Volume da Mњsica:"
msgid "Subtitle speed: "
msgstr "Rapidez legendas:"
-#: engines/scumm/scumm.cpp:1848
+#: engines/scumm/scumm.cpp:1850
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -3667,7 +3676,7 @@ msgstr ""
"LucasArts,\n"
"mas %s estс faltando. Utilizando AdLib ao invщs."
-#: engines/scumm/scumm.cpp:2664
+#: engines/scumm/scumm.cpp:2666
#, fuzzy
msgid ""
"Usually, Maniac Mansion would start now. But for that to work, the game "
@@ -3963,9 +3972,6 @@ msgstr ""
#~ msgid "Active filter mode: Nearest"
#~ msgstr "Filtro de imagem ativo: Nearest"
-#~ msgid "Enable Roland GS Mode"
-#~ msgstr "Ligar modo Roland GS"
-
#~ msgctxt "lowres"
#~ msgid "Add Game..."
#~ msgstr "Adicionar Jogo..."
diff --git a/po/ru_RU.po b/po/ru_RU.po
index 17a021c372..4979c5a072 100644
--- a/po/ru_RU.po
+++ b/po/ru_RU.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.8.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2016-06-07 19:20+0200\n"
+"POT-Creation-Date: 2016-07-19 09:07+0200\n"
"PO-Revision-Date: 2016-05-22 17:04+0300\n"
"Last-Translator: Eugene Sandulenko <sev@scummvm.org>\n"
"Language-Team: Russian\n"
@@ -60,7 +60,7 @@ msgstr "Вверх"
#: gui/recorderdialog.cpp:155 gui/saveload-dialog.cpp:216
#: gui/saveload-dialog.cpp:276 gui/saveload-dialog.cpp:547
#: gui/saveload-dialog.cpp:931 gui/themebrowser.cpp:55
-#: gui/updates-dialog.cpp:113 engines/engine.cpp:546
+#: gui/updates-dialog.cpp:113 engines/engine.cpp:549
#: backends/events/default/default-events.cpp:196
#: backends/events/default/default-events.cpp:218
#: backends/platform/wii/options.cpp:48 engines/drascula/saveload.cpp:49
@@ -208,12 +208,12 @@ msgstr "Сбросить все установки FluidSynth в значения по умолчанию."
#: gui/fluidsynth-dialog.cpp:153 gui/KeysDialog.cpp:42 gui/launcher.cpp:354
#: gui/launcher.cpp:1052 gui/launcher.cpp:1056 gui/massadd.cpp:92
-#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:465
-#: engines/engine.cpp:476 backends/platform/wii/options.cpp:47
+#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:468
+#: engines/engine.cpp:479 backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
#: engines/agos/animation.cpp:559 engines/drascula/saveload.cpp:49
#: engines/groovie/script.cpp:407 engines/parallaction/saveload.cpp:271
-#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1850
+#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1852
#: engines/scumm/players/player_v3m.cpp:130
#: engines/scumm/players/player_v5m.cpp:108 engines/sky/compact.cpp:131
#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:524
@@ -504,7 +504,7 @@ msgstr "Выберите директорию для сохранений"
msgid "This game ID is already taken. Please choose another one."
msgstr "Этот ID игры уже используется. Пожалуйста, выберите другой."
-#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:115
+#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:98
msgid "~Q~uit"
msgstr "~В~ыход"
@@ -592,7 +592,7 @@ msgid "Search:"
msgstr "Поиск:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
-#: engines/mohawk/dialogs.cpp:120 engines/mohawk/riven.cpp:729
+#: engines/mohawk/dialogs.cpp:103 engines/mohawk/riven.cpp:726
#: engines/pegasus/pegasus.cpp:353 engines/tsage/scenes.cpp:601
msgid "Load game:"
msgstr "Загрузить игру:"
@@ -600,8 +600,8 @@ msgstr "Загрузить игру:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
-#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:120
-#: engines/mohawk/riven.cpp:729 engines/parallaction/saveload.cpp:194
+#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/riven.cpp:726 engines/parallaction/saveload.cpp:194
#: engines/pegasus/pegasus.cpp:353 engines/scumm/dialogs.cpp:185
#: engines/tsage/scenes.cpp:601
msgid "Load"
@@ -765,7 +765,7 @@ msgid "Special dithering modes supported by some games"
msgstr "Специальные режимы рендеринга, поддерживаемые некоторыми играми"
#: gui/options.cpp:764
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2314
msgid "Fullscreen mode"
msgstr "Полноэкранный режим"
@@ -1234,28 +1234,28 @@ msgstr "Введите описание слота %d:"
msgid "Select a Theme"
msgstr "Выберите тему"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgid "Disabled GFX"
msgstr "Без графики"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Без графики"
-#: gui/ThemeEngine.cpp:354
+#: gui/ThemeEngine.cpp:416
msgid "Standard Renderer"
msgstr "Стандартный растеризатор"
-#: gui/ThemeEngine.cpp:354 engines/scumm/dialogs.cpp:659
+#: gui/ThemeEngine.cpp:416 engines/scumm/dialogs.cpp:659
msgid "Standard"
msgstr "Стандартный"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased Renderer"
msgstr "Растеризатор со сглаживанием"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased"
msgstr "Со сглаживанием"
@@ -1283,7 +1283,7 @@ msgstr "Автоматически проверять обновления"
msgid "Proceed"
msgstr "Продолжить"
-#: gui/widget.cpp:335 gui/widget.cpp:337 gui/widget.cpp:343 gui/widget.cpp:345
+#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
msgstr "Очистить значение"
@@ -1444,11 +1444,11 @@ msgstr "игры, которую вы пытаетесь добавить, и укажите её версию, язык и т.д."
msgid "~R~esume"
msgstr "Продол~ж~ить"
-#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:113
+#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:96
msgid "~L~oad"
msgstr "~З~агрузить"
-#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:114
+#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:97
msgid "~S~ave"
msgstr "~З~аписать"
@@ -1477,11 +1477,11 @@ msgstr "~В~ главное меню"
#: engines/avalanche/parser.cpp:1900 engines/cge/events.cpp:72
#: engines/cge2/events.cpp:65 engines/cruise/menu.cpp:212
#: engines/drascula/saveload.cpp:364 engines/dreamweb/saveload.cpp:262
-#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:121
+#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sci/engine/kfile.cpp:713 engines/sherlock/scalpel/scalpel.cpp:1250
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save game:"
msgstr "Сохранить игру:"
@@ -1494,12 +1494,12 @@ msgstr "Сохранить игру:"
#: engines/cge/events.cpp:72 engines/cge2/events.cpp:65
#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:364
#: engines/dreamweb/saveload.cpp:262 engines/hugo/file.cpp:298
-#: engines/mohawk/dialogs.cpp:121 engines/neverhood/menumodule.cpp:880
+#: engines/mohawk/dialogs.cpp:104 engines/neverhood/menumodule.cpp:880
#: engines/parallaction/saveload.cpp:209 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/scumm/dialogs.cpp:184
+#: engines/sci/engine/kfile.cpp:713 engines/scumm/dialogs.cpp:184
#: engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save"
msgstr "Сохранить"
@@ -1523,13 +1523,13 @@ msgstr ""
"базовой информацией, а также инструкциями о том, как получить дальнейшую "
"помощь."
-#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:117
-#: engines/mohawk/dialogs.cpp:242 engines/tsage/dialogs.cpp:112
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
+#: engines/tsage/dialogs.cpp:112
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:118
-#: engines/mohawk/dialogs.cpp:243 engines/tsage/dialogs.cpp:113
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:101
+#: engines/tsage/dialogs.cpp:113
msgid "~C~ancel"
msgstr "О~т~мена"
@@ -1537,23 +1537,23 @@ msgstr "О~т~мена"
msgid "~K~eys"
msgstr "~К~лавиши"
-#: engines/engine.cpp:339
+#: engines/engine.cpp:342
msgid "Could not initialize color format."
msgstr "Не могу инициализировать формат цвета."
-#: engines/engine.cpp:347
+#: engines/engine.cpp:350
msgid "Could not switch to video mode: '"
msgstr "Не удалось переключить видеорежим: '"
-#: engines/engine.cpp:356
+#: engines/engine.cpp:359
msgid "Could not apply aspect ratio setting."
msgstr "Не удалось использовать коррекцию соотношения сторон."
-#: engines/engine.cpp:361
+#: engines/engine.cpp:364
msgid "Could not apply fullscreen setting."
msgstr "Не могу применить полноэкранный режим."
-#: engines/engine.cpp:461
+#: engines/engine.cpp:464
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1567,7 +1567,7 @@ msgstr ""
"на жёсткий диск. Подробности можно найти в\n"
"файле README."
-#: engines/engine.cpp:472
+#: engines/engine.cpp:475
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1582,7 +1582,7 @@ msgstr ""
"появится музыка. Подробности можно найти в\n"
"файле README."
-#: engines/engine.cpp:530
+#: engines/engine.cpp:533
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1592,7 +1592,7 @@ msgstr ""
"README за базовой информацией, а также инструкциями о том, как получить "
"дальнейшую помощь."
-#: engines/engine.cpp:543
+#: engines/engine.cpp:546
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
@@ -1602,7 +1602,7 @@ msgstr ""
"поддерживается ScummVM полностью. Она, скорее всего, не будет работать "
"стабильно, и сохранения игр могут не работать в будущих версиях ScummVM."
-#: engines/engine.cpp:546
+#: engines/engine.cpp:549
msgid "Start anyway"
msgstr "Всё равно запустить"
@@ -1827,19 +1827,19 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Без увеличения"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2215
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2213
msgid "Enabled aspect ratio correction"
msgstr "Коррекция соотношения сторон включена"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2221
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2219
msgid "Disabled aspect ratio correction"
msgstr "Коррекция соотношения сторон выключена"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2276
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2274
msgid "Active graphics filter:"
msgstr "Активный графический фильтр:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2318
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
msgid "Windowed mode"
msgstr "Оконный режим"
@@ -2386,14 +2386,14 @@ msgstr "Показывать строку объектов"
#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
-#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:410
+#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:424
#: engines/toltecs/detection.cpp:200 engines/zvision/detection_tables.h:51
msgid "Use original save/load screens"
msgstr "Использовать оригинальные экраны записи/чтения игры"
#: engines/agi/detection.cpp:148 engines/cine/detection.cpp:71
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
-#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:411
+#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:425
#: engines/toltecs/detection.cpp:201
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
@@ -2448,9 +2448,9 @@ msgstr ""
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore game:"
msgstr "Восстановить игру:"
@@ -2458,13 +2458,13 @@ msgstr "Восстановить игру:"
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore"
msgstr "Восстановить"
-#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2393
+#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2395
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -2475,7 +2475,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2386
+#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2388
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -2486,7 +2486,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2404
+#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2406
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -2733,37 +2733,37 @@ msgstr ""
"открыть отладочную консоль ScummVM и ввести команду 'import_savefile'.\n"
"\n"
-#: engines/mohawk/detection.cpp:168
+#: engines/mohawk/detection.cpp:169
msgid "Play the Myst fly by movie"
msgstr "Проигрывать ролик пролёта над Myst"
-#: engines/mohawk/detection.cpp:169
+#: engines/mohawk/detection.cpp:170
msgid "The Myst fly by movie was not played by the original engine."
msgstr "Ролик пролёта над Myst не проигрывался оригинальным движком."
#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:96 engines/mohawk/dialogs.cpp:239
+#: engines/mohawk/dialogs.cpp:178 engines/mohawk/dialogs.cpp:264
msgid "~Z~ip Mode Activated"
msgstr "~Р~ежим быстрого перехода активирован"
-#: engines/mohawk/dialogs.cpp:97
+#: engines/mohawk/dialogs.cpp:179
msgid "~T~ransitions Enabled"
msgstr "~П~ереходы активированы"
#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:99
+#: engines/mohawk/dialogs.cpp:181
msgid "~D~rop Page"
msgstr "~В~ыбросить страницу"
-#: engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/dialogs.cpp:185
msgid "Show ~M~ap"
msgstr "Показать ~к~арту"
-#: engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:191
msgid "Main Men~u~"
msgstr "Главное мен~ю~"
-#: engines/mohawk/dialogs.cpp:240
+#: engines/mohawk/dialogs.cpp:265
msgid "~W~ater Effect Enabled"
msgstr "~Э~ффекты воды включены"
@@ -2885,38 +2885,46 @@ msgstr "Альтернативное вступление"
msgid "Use an alternative game intro (CD version only)"
msgstr "Использовать альтернативное вступление (только для CD-версии игры)"
-#: engines/sci/detection.cpp:380
+#: engines/sci/detection.cpp:384
msgid "Skip EGA dithering pass (full color backgrounds)"
msgstr "Не делать аппроксимацию цветов EGA (полноцветные фоны)"
-#: engines/sci/detection.cpp:381
+#: engines/sci/detection.cpp:385
msgid "Skip dithering pass in EGA games, graphics are shown with full colors"
msgstr ""
"Пропускает проход аппроксимации цветов EGA, графика будет показана со всеми "
"цветами"
-#: engines/sci/detection.cpp:390
+#: engines/sci/detection.cpp:394
msgid "Enable high resolution graphics"
msgstr "Включить отображение графики высокого разрешения"
-#: engines/sci/detection.cpp:391
+#: engines/sci/detection.cpp:395
msgid "Enable high resolution graphics/content"
msgstr "Включить графику и контент высокого рарешения"
-#: engines/sci/detection.cpp:400
+#: engines/sci/detection.cpp:404
+msgid "Enable black-lined video"
+msgstr ""
+
+#: engines/sci/detection.cpp:405
+msgid "Draw black lines over videos to increase their apparent sharpness"
+msgstr ""
+
+#: engines/sci/detection.cpp:414
msgid "Prefer digital sound effects"
msgstr "Предпочитать цифровые звуковые эффекты"
-#: engines/sci/detection.cpp:401
+#: engines/sci/detection.cpp:415
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr ""
"Отдавать предпочтение цифровым звуковым эффектам вместо синтезированных"
-#: engines/sci/detection.cpp:420
+#: engines/sci/detection.cpp:434
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Использовать IMF/Yamaha FB-01 для вывода MIDI"
-#: engines/sci/detection.cpp:421
+#: engines/sci/detection.cpp:435
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -2924,32 +2932,32 @@ msgstr ""
"Использовать звуковую карту IBM Music Feature или модуль синтеза Yamaha "
"FB-01 FM для MIDI"
-#: engines/sci/detection.cpp:431
+#: engines/sci/detection.cpp:445
msgid "Use CD audio"
msgstr "Использовать CD-аудио"
-#: engines/sci/detection.cpp:432
+#: engines/sci/detection.cpp:446
msgid "Use CD audio instead of in-game audio, if available"
msgstr ""
"Использовать звуковые дорожки с CD вместо музыки из файлов игры (если "
"доступно)"
-#: engines/sci/detection.cpp:442
+#: engines/sci/detection.cpp:456
msgid "Use Windows cursors"
msgstr "Использовать курсоры Windows"
-#: engines/sci/detection.cpp:443
+#: engines/sci/detection.cpp:457
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"Использовать курсоры Windows (меньшие по размеру и одноцветные) вместо "
"курсоров DOS"
-#: engines/sci/detection.cpp:453
+#: engines/sci/detection.cpp:467
msgid "Use silver cursors"
msgstr "Использовать серебряные курсоры"
-#: engines/sci/detection.cpp:454
+#: engines/sci/detection.cpp:468
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
@@ -3628,7 +3636,7 @@ msgstr "Громк. музыки: "
msgid "Subtitle speed: "
msgstr "Скорость титров: "
-#: engines/scumm/scumm.cpp:1848
+#: engines/scumm/scumm.cpp:1850
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -3637,7 +3645,7 @@ msgstr ""
"Режим \"родного\" MIDI требует обновление Roland Upgrade от\n"
"LucasArts, но не хватает %s. Переключаюсь на AdLib."
-#: engines/scumm/scumm.cpp:2664
+#: engines/scumm/scumm.cpp:2666
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 "
diff --git a/po/scummvm.pot b/po/scummvm.pot
index 8a2431dc59..3a52afdde7 100644
--- a/po/scummvm.pot
+++ b/po/scummvm.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.9.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2016-06-07 19:20+0200\n"
+"POT-Creation-Date: 2016-07-19 09:07+0200\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"
@@ -58,7 +58,7 @@ msgstr ""
#: gui/recorderdialog.cpp:155 gui/saveload-dialog.cpp:216
#: gui/saveload-dialog.cpp:276 gui/saveload-dialog.cpp:547
#: gui/saveload-dialog.cpp:931 gui/themebrowser.cpp:55
-#: gui/updates-dialog.cpp:113 engines/engine.cpp:546
+#: gui/updates-dialog.cpp:113 engines/engine.cpp:549
#: backends/events/default/default-events.cpp:196
#: backends/events/default/default-events.cpp:218
#: backends/platform/wii/options.cpp:48 engines/drascula/saveload.cpp:49
@@ -206,12 +206,12 @@ msgstr ""
#: gui/fluidsynth-dialog.cpp:153 gui/KeysDialog.cpp:42 gui/launcher.cpp:354
#: gui/launcher.cpp:1052 gui/launcher.cpp:1056 gui/massadd.cpp:92
-#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:465
-#: engines/engine.cpp:476 backends/platform/wii/options.cpp:47
+#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:468
+#: engines/engine.cpp:479 backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
#: engines/agos/animation.cpp:559 engines/drascula/saveload.cpp:49
#: engines/groovie/script.cpp:407 engines/parallaction/saveload.cpp:271
-#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1850
+#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1852
#: engines/scumm/players/player_v3m.cpp:130
#: engines/scumm/players/player_v5m.cpp:108 engines/sky/compact.cpp:131
#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:524
@@ -497,7 +497,7 @@ msgstr ""
msgid "This game ID is already taken. Please choose another one."
msgstr ""
-#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:115
+#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:98
msgid "~Q~uit"
msgstr ""
@@ -585,7 +585,7 @@ msgid "Search:"
msgstr ""
#: gui/launcher.cpp:687 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
-#: engines/mohawk/dialogs.cpp:120 engines/mohawk/riven.cpp:729
+#: engines/mohawk/dialogs.cpp:103 engines/mohawk/riven.cpp:726
#: engines/pegasus/pegasus.cpp:353 engines/tsage/scenes.cpp:601
msgid "Load game:"
msgstr ""
@@ -593,8 +593,8 @@ msgstr ""
#: gui/launcher.cpp:687 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
-#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:120
-#: engines/mohawk/riven.cpp:729 engines/parallaction/saveload.cpp:194
+#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/riven.cpp:726 engines/parallaction/saveload.cpp:194
#: engines/pegasus/pegasus.cpp:353 engines/scumm/dialogs.cpp:185
#: engines/tsage/scenes.cpp:601
msgid "Load"
@@ -756,7 +756,7 @@ msgid "Special dithering modes supported by some games"
msgstr ""
#: gui/options.cpp:764
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2314
msgid "Fullscreen mode"
msgstr ""
@@ -1210,28 +1210,28 @@ msgstr ""
msgid "Select a Theme"
msgstr ""
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgid "Disabled GFX"
msgstr ""
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgctxt "lowres"
msgid "Disabled GFX"
msgstr ""
-#: gui/ThemeEngine.cpp:354
+#: gui/ThemeEngine.cpp:416
msgid "Standard Renderer"
msgstr ""
-#: gui/ThemeEngine.cpp:354 engines/scumm/dialogs.cpp:659
+#: gui/ThemeEngine.cpp:416 engines/scumm/dialogs.cpp:659
msgid "Standard"
msgstr ""
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased Renderer"
msgstr ""
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased"
msgstr ""
@@ -1255,7 +1255,7 @@ msgstr ""
msgid "Proceed"
msgstr ""
-#: gui/widget.cpp:335 gui/widget.cpp:337 gui/widget.cpp:343 gui/widget.cpp:345
+#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
msgstr ""
@@ -1415,11 +1415,11 @@ msgstr ""
msgid "~R~esume"
msgstr ""
-#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:113
+#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:96
msgid "~L~oad"
msgstr ""
-#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:114
+#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:97
msgid "~S~ave"
msgstr ""
@@ -1448,11 +1448,11 @@ msgstr ""
#: engines/avalanche/parser.cpp:1900 engines/cge/events.cpp:72
#: engines/cge2/events.cpp:65 engines/cruise/menu.cpp:212
#: engines/drascula/saveload.cpp:364 engines/dreamweb/saveload.cpp:262
-#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:121
+#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sci/engine/kfile.cpp:713 engines/sherlock/scalpel/scalpel.cpp:1250
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save game:"
msgstr ""
@@ -1465,12 +1465,12 @@ msgstr ""
#: engines/cge/events.cpp:72 engines/cge2/events.cpp:65
#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:364
#: engines/dreamweb/saveload.cpp:262 engines/hugo/file.cpp:298
-#: engines/mohawk/dialogs.cpp:121 engines/neverhood/menumodule.cpp:880
+#: engines/mohawk/dialogs.cpp:104 engines/neverhood/menumodule.cpp:880
#: engines/parallaction/saveload.cpp:209 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/scumm/dialogs.cpp:184
+#: engines/sci/engine/kfile.cpp:713 engines/scumm/dialogs.cpp:184
#: engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save"
msgstr ""
@@ -1488,13 +1488,13 @@ msgid ""
"and for instructions on how to obtain further assistance."
msgstr ""
-#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:117
-#: engines/mohawk/dialogs.cpp:242 engines/tsage/dialogs.cpp:112
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
+#: engines/tsage/dialogs.cpp:112
msgid "~O~K"
msgstr ""
-#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:118
-#: engines/mohawk/dialogs.cpp:243 engines/tsage/dialogs.cpp:113
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:101
+#: engines/tsage/dialogs.cpp:113
msgid "~C~ancel"
msgstr ""
@@ -1502,23 +1502,23 @@ msgstr ""
msgid "~K~eys"
msgstr ""
-#: engines/engine.cpp:339
+#: engines/engine.cpp:342
msgid "Could not initialize color format."
msgstr ""
-#: engines/engine.cpp:347
+#: engines/engine.cpp:350
msgid "Could not switch to video mode: '"
msgstr ""
-#: engines/engine.cpp:356
+#: engines/engine.cpp:359
msgid "Could not apply aspect ratio setting."
msgstr ""
-#: engines/engine.cpp:361
+#: engines/engine.cpp:364
msgid "Could not apply fullscreen setting."
msgstr ""
-#: engines/engine.cpp:461
+#: engines/engine.cpp:464
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1527,7 +1527,7 @@ msgid ""
"See the README file for details."
msgstr ""
-#: engines/engine.cpp:472
+#: engines/engine.cpp:475
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1536,21 +1536,21 @@ msgid ""
"See the README file for details."
msgstr ""
-#: engines/engine.cpp:530
+#: engines/engine.cpp:533
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
"and for instructions on how to obtain further assistance."
msgstr ""
-#: engines/engine.cpp:543
+#: engines/engine.cpp:546
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
"not work in future versions of ScummVM."
msgstr ""
-#: engines/engine.cpp:546
+#: engines/engine.cpp:549
msgid "Start anyway"
msgstr ""
@@ -1767,19 +1767,19 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr ""
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2215
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2213
msgid "Enabled aspect ratio correction"
msgstr ""
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2221
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2219
msgid "Disabled aspect ratio correction"
msgstr ""
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2276
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2274
msgid "Active graphics filter:"
msgstr ""
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2318
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
msgid "Windowed mode"
msgstr ""
@@ -2322,14 +2322,14 @@ msgstr ""
#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
-#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:410
+#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:424
#: engines/toltecs/detection.cpp:200 engines/zvision/detection_tables.h:51
msgid "Use original save/load screens"
msgstr ""
#: engines/agi/detection.cpp:148 engines/cine/detection.cpp:71
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
-#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:411
+#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:425
#: engines/toltecs/detection.cpp:201
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
@@ -2375,9 +2375,9 @@ msgstr ""
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore game:"
msgstr ""
@@ -2385,13 +2385,13 @@ msgstr ""
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore"
msgstr ""
-#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2393
+#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2395
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -2399,7 +2399,7 @@ msgid ""
"%s"
msgstr ""
-#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2386
+#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2388
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -2407,7 +2407,7 @@ msgid ""
"%s"
msgstr ""
-#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2404
+#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2406
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -2625,37 +2625,37 @@ msgid ""
"\n"
msgstr ""
-#: engines/mohawk/detection.cpp:168
+#: engines/mohawk/detection.cpp:169
msgid "Play the Myst fly by movie"
msgstr ""
-#: engines/mohawk/detection.cpp:169
+#: engines/mohawk/detection.cpp:170
msgid "The Myst fly by movie was not played by the original engine."
msgstr ""
#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:96 engines/mohawk/dialogs.cpp:239
+#: engines/mohawk/dialogs.cpp:178 engines/mohawk/dialogs.cpp:264
msgid "~Z~ip Mode Activated"
msgstr ""
-#: engines/mohawk/dialogs.cpp:97
+#: engines/mohawk/dialogs.cpp:179
msgid "~T~ransitions Enabled"
msgstr ""
#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:99
+#: engines/mohawk/dialogs.cpp:181
msgid "~D~rop Page"
msgstr ""
-#: engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/dialogs.cpp:185
msgid "Show ~M~ap"
msgstr ""
-#: engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:191
msgid "Main Men~u~"
msgstr ""
-#: engines/mohawk/dialogs.cpp:240
+#: engines/mohawk/dialogs.cpp:265
msgid "~W~ater Effect Enabled"
msgstr ""
@@ -2764,62 +2764,70 @@ msgstr ""
msgid "Use an alternative game intro (CD version only)"
msgstr ""
-#: engines/sci/detection.cpp:380
+#: engines/sci/detection.cpp:384
msgid "Skip EGA dithering pass (full color backgrounds)"
msgstr ""
-#: engines/sci/detection.cpp:381
+#: engines/sci/detection.cpp:385
msgid "Skip dithering pass in EGA games, graphics are shown with full colors"
msgstr ""
-#: engines/sci/detection.cpp:390
+#: engines/sci/detection.cpp:394
msgid "Enable high resolution graphics"
msgstr ""
-#: engines/sci/detection.cpp:391
+#: engines/sci/detection.cpp:395
msgid "Enable high resolution graphics/content"
msgstr ""
-#: engines/sci/detection.cpp:400
+#: engines/sci/detection.cpp:404
+msgid "Enable black-lined video"
+msgstr ""
+
+#: engines/sci/detection.cpp:405
+msgid "Draw black lines over videos to increase their apparent sharpness"
+msgstr ""
+
+#: engines/sci/detection.cpp:414
msgid "Prefer digital sound effects"
msgstr ""
-#: engines/sci/detection.cpp:401
+#: engines/sci/detection.cpp:415
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr ""
-#: engines/sci/detection.cpp:420
+#: engines/sci/detection.cpp:434
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr ""
-#: engines/sci/detection.cpp:421
+#: engines/sci/detection.cpp:435
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
msgstr ""
-#: engines/sci/detection.cpp:431
+#: engines/sci/detection.cpp:445
msgid "Use CD audio"
msgstr ""
-#: engines/sci/detection.cpp:432
+#: engines/sci/detection.cpp:446
msgid "Use CD audio instead of in-game audio, if available"
msgstr ""
-#: engines/sci/detection.cpp:442
+#: engines/sci/detection.cpp:456
msgid "Use Windows cursors"
msgstr ""
-#: engines/sci/detection.cpp:443
+#: engines/sci/detection.cpp:457
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
-#: engines/sci/detection.cpp:453
+#: engines/sci/detection.cpp:467
msgid "Use silver cursors"
msgstr ""
-#: engines/sci/detection.cpp:454
+#: engines/sci/detection.cpp:468
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
@@ -3497,14 +3505,14 @@ msgstr ""
msgid "Subtitle speed: "
msgstr ""
-#: engines/scumm/scumm.cpp:1848
+#: engines/scumm/scumm.cpp:1850
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
"but %s is missing. Using AdLib instead."
msgstr ""
-#: engines/scumm/scumm.cpp:2664
+#: engines/scumm/scumm.cpp:2666
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 "
diff --git a/po/sv_SE.po b/po/sv_SE.po
index 0a7de9c2bb..8137176bc3 100644
--- a/po/sv_SE.po
+++ b/po/sv_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: 2016-06-07 19:20+0200\n"
+"POT-Creation-Date: 2016-07-19 09:07+0200\n"
"PO-Revision-Date: 2016-02-25 23:06+0100\n"
"Last-Translator: Hampus Flink <hampus.flink@gmail.com>\n"
"Language-Team: \n"
@@ -60,7 +60,7 @@ msgstr "Uppхt"
#: gui/recorderdialog.cpp:155 gui/saveload-dialog.cpp:216
#: gui/saveload-dialog.cpp:276 gui/saveload-dialog.cpp:547
#: gui/saveload-dialog.cpp:931 gui/themebrowser.cpp:55
-#: gui/updates-dialog.cpp:113 engines/engine.cpp:546
+#: gui/updates-dialog.cpp:113 engines/engine.cpp:549
#: backends/events/default/default-events.cpp:196
#: backends/events/default/default-events.cpp:218
#: backends/platform/wii/options.cpp:48 engines/drascula/saveload.cpp:49
@@ -209,12 +209,12 @@ msgstr ""
#: gui/fluidsynth-dialog.cpp:153 gui/KeysDialog.cpp:42 gui/launcher.cpp:354
#: gui/launcher.cpp:1052 gui/launcher.cpp:1056 gui/massadd.cpp:92
-#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:465
-#: engines/engine.cpp:476 backends/platform/wii/options.cpp:47
+#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:468
+#: engines/engine.cpp:479 backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
#: engines/agos/animation.cpp:559 engines/drascula/saveload.cpp:49
#: engines/groovie/script.cpp:407 engines/parallaction/saveload.cpp:271
-#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1850
+#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1852
#: engines/scumm/players/player_v3m.cpp:130
#: engines/scumm/players/player_v5m.cpp:108 engines/sky/compact.cpp:131
#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:524
@@ -506,7 +506,7 @@ msgstr "Vфlj katalog fіr spardata"
msgid "This game ID is already taken. Please choose another one."
msgstr "Detta ID-namn фr upptaget. Var god vфlj ett annat."
-#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:115
+#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:98
msgid "~Q~uit"
msgstr "~A~vsluta"
@@ -594,7 +594,7 @@ msgid "Search:"
msgstr "Sіk:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
-#: engines/mohawk/dialogs.cpp:120 engines/mohawk/riven.cpp:729
+#: engines/mohawk/dialogs.cpp:103 engines/mohawk/riven.cpp:726
#: engines/pegasus/pegasus.cpp:353 engines/tsage/scenes.cpp:601
msgid "Load game:"
msgstr "Ladda spel:"
@@ -602,8 +602,8 @@ msgstr "Ladda spel:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
-#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:120
-#: engines/mohawk/riven.cpp:729 engines/parallaction/saveload.cpp:194
+#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/riven.cpp:726 engines/parallaction/saveload.cpp:194
#: engines/pegasus/pegasus.cpp:353 engines/scumm/dialogs.cpp:185
#: engines/tsage/scenes.cpp:601
msgid "Load"
@@ -768,7 +768,7 @@ msgid "Special dithering modes supported by some games"
msgstr "Speciella gitterlфgen stіdda av vissa spel"
#: gui/options.cpp:764
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2314
msgid "Fullscreen mode"
msgstr "Fullskфrmslфge"
@@ -1233,28 +1233,28 @@ msgstr "Ange en beskrivning fіr position %d:"
msgid "Select a Theme"
msgstr "Vфlj ett tema"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgid "Disabled GFX"
msgstr "Inaktiverad GFX"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Inaktiverad GFX"
-#: gui/ThemeEngine.cpp:354
+#: gui/ThemeEngine.cpp:416
msgid "Standard Renderer"
msgstr "Standard rendering"
-#: gui/ThemeEngine.cpp:354 engines/scumm/dialogs.cpp:659
+#: gui/ThemeEngine.cpp:416 engines/scumm/dialogs.cpp:659
msgid "Standard"
msgstr "Standard"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased Renderer"
msgstr "Antialiserad rendering"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased"
msgstr "Antialiserad"
@@ -1279,7 +1279,7 @@ msgstr "Sіk efter uppdateringar..."
msgid "Proceed"
msgstr ""
-#: gui/widget.cpp:335 gui/widget.cpp:337 gui/widget.cpp:343 gui/widget.cpp:345
+#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
msgstr "Tіm sіkfфltet"
@@ -1441,11 +1441,11 @@ msgstr "pх spelet du fіrsіkte lфgga till och dess version/sprхk/etc.:"
msgid "~R~esume"
msgstr "~F~ortsфtt"
-#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:113
+#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:96
msgid "~L~oad"
msgstr "~L~adda"
-#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:114
+#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:97
msgid "~S~ave"
msgstr "~S~para"
@@ -1474,11 +1474,11 @@ msgstr "Хte~r~vфnd till launcher"
#: engines/avalanche/parser.cpp:1900 engines/cge/events.cpp:72
#: engines/cge2/events.cpp:65 engines/cruise/menu.cpp:212
#: engines/drascula/saveload.cpp:364 engines/dreamweb/saveload.cpp:262
-#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:121
+#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sci/engine/kfile.cpp:713 engines/sherlock/scalpel/scalpel.cpp:1250
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save game:"
msgstr "Spara spelet:"
@@ -1491,12 +1491,12 @@ msgstr "Spara spelet:"
#: engines/cge/events.cpp:72 engines/cge2/events.cpp:65
#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:364
#: engines/dreamweb/saveload.cpp:262 engines/hugo/file.cpp:298
-#: engines/mohawk/dialogs.cpp:121 engines/neverhood/menumodule.cpp:880
+#: engines/mohawk/dialogs.cpp:104 engines/neverhood/menumodule.cpp:880
#: engines/parallaction/saveload.cpp:209 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/scumm/dialogs.cpp:184
+#: engines/sci/engine/kfile.cpp:713 engines/scumm/dialogs.cpp:184
#: engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save"
msgstr "Spara"
@@ -1519,13 +1519,13 @@ msgstr ""
"Kunde inte spara data (%s)! Var god lфs README-filen fіr grundlфggande "
"information och instruktioner fіr hur du kan fх mer hjфlp."
-#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:117
-#: engines/mohawk/dialogs.cpp:242 engines/tsage/dialogs.cpp:112
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
+#: engines/tsage/dialogs.cpp:112
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:118
-#: engines/mohawk/dialogs.cpp:243 engines/tsage/dialogs.cpp:113
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:101
+#: engines/tsage/dialogs.cpp:113
msgid "~C~ancel"
msgstr "A~v~bryt"
@@ -1533,23 +1533,23 @@ msgstr "A~v~bryt"
msgid "~K~eys"
msgstr "~T~angenter"
-#: engines/engine.cpp:339
+#: engines/engine.cpp:342
msgid "Could not initialize color format."
msgstr "Kunde inte initialisera fфrgformat."
-#: engines/engine.cpp:347
+#: engines/engine.cpp:350
msgid "Could not switch to video mode: '"
msgstr "Kunde inte byta till videolфget: '"
-#: engines/engine.cpp:356
+#: engines/engine.cpp:359
msgid "Could not apply aspect ratio setting."
msgstr "Kunde inte фndra instфllningen fіr bildfіrhхllanden."
-#: engines/engine.cpp:361
+#: engines/engine.cpp:364
msgid "Could not apply fullscreen setting."
msgstr "Kunde inte applicera fullskфrmsinstфllning."
-#: engines/engine.cpp:461
+#: engines/engine.cpp:464
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1563,7 +1563,7 @@ msgstr ""
"datafilerna till din hхrddisk istфllet.\n"
"Se README-filen fіr detaljer."
-#: engines/engine.cpp:472
+#: engines/engine.cpp:475
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1577,7 +1577,7 @@ msgstr ""
"fіr att kunna lyssna pх spelets musik.\n"
"Se README-filen fіr detaljer."
-#: engines/engine.cpp:530
+#: engines/engine.cpp:533
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1586,7 +1586,7 @@ msgstr ""
"Kunde inte ladda spardata (%s)! Hфnvisa till README-filen fіr grundlфggande "
"information och instruktioner fіr ytterligare assistans."
-#: engines/engine.cpp:543
+#: engines/engine.cpp:546
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
@@ -1596,7 +1596,7 @@ msgstr ""
"ScummVM. Dфrfіr фr det troligtvis instabilt och om du skapar spardata kan de "
"mіjligtvis vara inkompatibla med framtida versioner av ScummVM."
-#: engines/engine.cpp:546
+#: engines/engine.cpp:549
msgid "Start anyway"
msgstr "Starta фndх"
@@ -1821,19 +1821,19 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Normalt (ingen skalning)"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2215
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2213
msgid "Enabled aspect ratio correction"
msgstr "Korrektion av bildfіrhхllande pх"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2221
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2219
msgid "Disabled aspect ratio correction"
msgstr "Korrektion av bildfіrhхllande av"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2276
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2274
msgid "Active graphics filter:"
msgstr "Aktivt grafikfilter:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2318
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
msgid "Windowed mode"
msgstr "Fіnsterlфge"
@@ -2383,14 +2383,14 @@ msgstr "Visa etiketter"
#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
-#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:410
+#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:424
#: engines/toltecs/detection.cpp:200 engines/zvision/detection_tables.h:51
msgid "Use original save/load screens"
msgstr "Anvфnd originalskфrmar fіr spara/ladda"
#: engines/agi/detection.cpp:148 engines/cine/detection.cpp:71
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
-#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:411
+#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:425
#: engines/toltecs/detection.cpp:201
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr "Anvфnder originalskфrmarna fіr spara/ladda istфllet fіr ScummVM:s"
@@ -2441,9 +2441,9 @@ msgstr ""
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore game:"
msgstr "Хterstфll spel:"
@@ -2451,13 +2451,13 @@ msgstr "Хterstфll spel:"
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore"
msgstr "Хterstфll"
-#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2393
+#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2395
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -2468,7 +2468,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2386
+#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2388
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -2479,7 +2479,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2404
+#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2406
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -2726,39 +2726,39 @@ msgstr ""
"och anvфnda kommandot 'import_savefile'.\n"
"\n"
-#: engines/mohawk/detection.cpp:168
+#: engines/mohawk/detection.cpp:169
msgid "Play the Myst fly by movie"
msgstr ""
-#: engines/mohawk/detection.cpp:169
+#: engines/mohawk/detection.cpp:170
msgid "The Myst fly by movie was not played by the original engine."
msgstr ""
#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:96 engines/mohawk/dialogs.cpp:239
+#: engines/mohawk/dialogs.cpp:178 engines/mohawk/dialogs.cpp:264
msgid "~Z~ip Mode Activated"
msgstr "~Z~iplфge aktiverat"
-#: engines/mohawk/dialogs.cpp:97
+#: engines/mohawk/dialogs.cpp:179
msgid "~T~ransitions Enabled"
msgstr "жv~e~rgхngar aktiverade"
#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:99
+#: engines/mohawk/dialogs.cpp:181
msgid "~D~rop Page"
msgstr "Slфpp si~d~a"
-#: engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/dialogs.cpp:185
#, fuzzy
msgid "Show ~M~ap"
msgstr "~V~isa karta"
-#: engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:191
#, fuzzy
msgid "Main Men~u~"
msgstr "Huvud~m~eny"
-#: engines/mohawk/dialogs.cpp:240
+#: engines/mohawk/dialogs.cpp:265
msgid "~W~ater Effect Enabled"
msgstr "~V~atteneffekt aktiverad"
@@ -2882,35 +2882,44 @@ msgstr "Alternativt intro"
msgid "Use an alternative game intro (CD version only)"
msgstr "Anvфnd alternativt spelintro (endast CD-version)"
-#: engines/sci/detection.cpp:380
+#: engines/sci/detection.cpp:384
msgid "Skip EGA dithering pass (full color backgrounds)"
msgstr "Skippa EGA-gitterpass (bakgrunder i full fфrg)"
-#: engines/sci/detection.cpp:381
+#: engines/sci/detection.cpp:385
msgid "Skip dithering pass in EGA games, graphics are shown with full colors"
msgstr "Skippa gitterpass i EGA-spel. Grafik visas i full fфrg."
-#: engines/sci/detection.cpp:390
+#: engines/sci/detection.cpp:394
msgid "Enable high resolution graphics"
msgstr "Aktivera hіgupplіst grafik"
-#: engines/sci/detection.cpp:391
+#: engines/sci/detection.cpp:395
msgid "Enable high resolution graphics/content"
msgstr "Aktivera hіgupplіst grafik/innehхll"
-#: engines/sci/detection.cpp:400
+#: engines/sci/detection.cpp:404
+#, fuzzy
+msgid "Enable black-lined video"
+msgstr "Aktivera Roland GS-lфge"
+
+#: engines/sci/detection.cpp:405
+msgid "Draw black lines over videos to increase their apparent sharpness"
+msgstr ""
+
+#: engines/sci/detection.cpp:414
msgid "Prefer digital sound effects"
msgstr "Fіredra digitala ljudeffekter"
-#: engines/sci/detection.cpp:401
+#: engines/sci/detection.cpp:415
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Fіredra digitala ljudeffekter istфllet fіr syntetiserade"
-#: engines/sci/detection.cpp:420
+#: engines/sci/detection.cpp:434
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Anvфnd IMF/Yamaha FB-01 fіr MIDI-uppspelning"
-#: engines/sci/detection.cpp:421
+#: engines/sci/detection.cpp:435
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -2918,29 +2927,29 @@ msgstr ""
"Anvфnd ett IMB Music Feature-kort eller en Yamaha FB-01 FM synthmodul fіr "
"MIDI-uppspelning"
-#: engines/sci/detection.cpp:431
+#: engines/sci/detection.cpp:445
msgid "Use CD audio"
msgstr "Anvфnd CD-ljud"
-#: engines/sci/detection.cpp:432
+#: engines/sci/detection.cpp:446
msgid "Use CD audio instead of in-game audio, if available"
msgstr "Anvфnd CD-ljud istфllet fіr spelets ljud, om tillgфngligt"
-#: engines/sci/detection.cpp:442
+#: engines/sci/detection.cpp:456
msgid "Use Windows cursors"
msgstr "Anvфnd Windows muspekare"
-#: engines/sci/detection.cpp:443
+#: engines/sci/detection.cpp:457
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"Anvфnd Windows muspekare (mindre och svartvit) istфllet fіr DOS-pekaren"
-#: engines/sci/detection.cpp:453
+#: engines/sci/detection.cpp:467
msgid "Use silver cursors"
msgstr "Anvфnd silverpekare"
-#: engines/sci/detection.cpp:454
+#: engines/sci/detection.cpp:468
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
@@ -3620,7 +3629,7 @@ msgstr "Musikvolym: "
msgid "Subtitle speed: "
msgstr "Texthastighet: "
-#: engines/scumm/scumm.cpp:1848
+#: engines/scumm/scumm.cpp:1850
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -3629,7 +3638,7 @@ msgstr ""
"Stіd fіr Native MIDI krфver Roland-uppdateringen frхn LucasArts,\n"
"men %s saknas. Anvфnder AdLib istфllet."
-#: engines/scumm/scumm.cpp:2664
+#: engines/scumm/scumm.cpp:2666
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 "
@@ -3921,9 +3930,6 @@ msgstr ""
#~ msgid "Active filter mode: Nearest"
#~ msgstr "Aktivt filterlфge: Nфrmast"
-#~ msgid "Enable Roland GS Mode"
-#~ msgstr "Aktivera Roland GS-lфge"
-
#~ msgctxt "lowres"
#~ msgid "Add Game..."
#~ msgstr "Lфgg till spel..."
diff --git a/po/uk_UA.po b/po/uk_UA.po
index f35cd4ce62..232138e930 100644
--- a/po/uk_UA.po
+++ b/po/uk_UA.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2016-06-07 19:20+0200\n"
+"POT-Creation-Date: 2016-07-19 09:07+0200\n"
"PO-Revision-Date: 2015-11-06 10:07+0300\n"
"Last-Translator: Eugene Sandulenko <sev@scummvm.org>\n"
"Language-Team: Ukrainian\n"
@@ -60,7 +60,7 @@ msgstr "Вгору"
#: gui/recorderdialog.cpp:155 gui/saveload-dialog.cpp:216
#: gui/saveload-dialog.cpp:276 gui/saveload-dialog.cpp:547
#: gui/saveload-dialog.cpp:931 gui/themebrowser.cpp:55
-#: gui/updates-dialog.cpp:113 engines/engine.cpp:546
+#: gui/updates-dialog.cpp:113 engines/engine.cpp:549
#: backends/events/default/default-events.cpp:196
#: backends/events/default/default-events.cpp:218
#: backends/platform/wii/options.cpp:48 engines/drascula/saveload.cpp:49
@@ -208,12 +208,12 @@ msgstr "Скинути всі налаштування FluidSynth до їх значень за замовченням"
#: gui/fluidsynth-dialog.cpp:153 gui/KeysDialog.cpp:42 gui/launcher.cpp:354
#: gui/launcher.cpp:1052 gui/launcher.cpp:1056 gui/massadd.cpp:92
-#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:465
-#: engines/engine.cpp:476 backends/platform/wii/options.cpp:47
+#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:468
+#: engines/engine.cpp:479 backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
#: engines/agos/animation.cpp:559 engines/drascula/saveload.cpp:49
#: engines/groovie/script.cpp:407 engines/parallaction/saveload.cpp:271
-#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1850
+#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1852
#: engines/scumm/players/player_v3m.cpp:130
#: engines/scumm/players/player_v5m.cpp:108 engines/sky/compact.cpp:131
#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:524
@@ -505,7 +505,7 @@ msgstr "Виберіть папку для збережень"
msgid "This game ID is already taken. Please choose another one."
msgstr "Цей ID гри вже використовується. Будь ласка, виберіть інший."
-#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:115
+#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:98
msgid "~Q~uit"
msgstr "~В~ихід"
@@ -593,7 +593,7 @@ msgid "Search:"
msgstr "Пошук:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
-#: engines/mohawk/dialogs.cpp:120 engines/mohawk/riven.cpp:729
+#: engines/mohawk/dialogs.cpp:103 engines/mohawk/riven.cpp:726
#: engines/pegasus/pegasus.cpp:353 engines/tsage/scenes.cpp:601
msgid "Load game:"
msgstr "Завантажити гру:"
@@ -601,8 +601,8 @@ msgstr "Завантажити гру:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
-#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:120
-#: engines/mohawk/riven.cpp:729 engines/parallaction/saveload.cpp:194
+#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/riven.cpp:726 engines/parallaction/saveload.cpp:194
#: engines/pegasus/pegasus.cpp:353 engines/scumm/dialogs.cpp:185
#: engines/tsage/scenes.cpp:601
msgid "Load"
@@ -766,7 +766,7 @@ msgid "Special dithering modes supported by some games"
msgstr "Спеціальні режими растрування, які підтримують деякі ігри"
#: gui/options.cpp:764
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2314
msgid "Fullscreen mode"
msgstr "Повноекранний режим"
@@ -1233,28 +1233,28 @@ msgstr "Введіть опис для слоту %d:"
msgid "Select a Theme"
msgstr "Виберіть тему"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgid "Disabled GFX"
msgstr "Без графіки"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Без графіки"
-#: gui/ThemeEngine.cpp:354
+#: gui/ThemeEngine.cpp:416
msgid "Standard Renderer"
msgstr "Стандартний растеризатор"
-#: gui/ThemeEngine.cpp:354 engines/scumm/dialogs.cpp:659
+#: gui/ThemeEngine.cpp:416 engines/scumm/dialogs.cpp:659
msgid "Standard"
msgstr "Стандартний"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased Renderer"
msgstr "Растеризатор зі згладжуванням"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased"
msgstr "Зі згладжуванням"
@@ -1282,7 +1282,7 @@ msgstr "Автоматычно перевіряти оновлення"
msgid "Proceed"
msgstr "Продовжити"
-#: gui/widget.cpp:335 gui/widget.cpp:337 gui/widget.cpp:343 gui/widget.cpp:345
+#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
msgstr "Очистити значення"
@@ -1442,11 +1442,11 @@ msgstr "назвою гри, яку ви намагаєтесь додати, а також її версію/мову/та інше:"
msgid "~R~esume"
msgstr "Продов~ж~ити"
-#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:113
+#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:96
msgid "~L~oad"
msgstr "~З~авантажити"
-#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:114
+#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:97
msgid "~S~ave"
msgstr "~З~аписати"
@@ -1475,11 +1475,11 @@ msgstr "~П~овер.в головне меню"
#: engines/avalanche/parser.cpp:1900 engines/cge/events.cpp:72
#: engines/cge2/events.cpp:65 engines/cruise/menu.cpp:212
#: engines/drascula/saveload.cpp:364 engines/dreamweb/saveload.cpp:262
-#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:121
+#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sci/engine/kfile.cpp:713 engines/sherlock/scalpel/scalpel.cpp:1250
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save game:"
msgstr "Зберегти гру: "
@@ -1492,12 +1492,12 @@ msgstr "Зберегти гру: "
#: engines/cge/events.cpp:72 engines/cge2/events.cpp:65
#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:364
#: engines/dreamweb/saveload.cpp:262 engines/hugo/file.cpp:298
-#: engines/mohawk/dialogs.cpp:121 engines/neverhood/menumodule.cpp:880
+#: engines/mohawk/dialogs.cpp:104 engines/neverhood/menumodule.cpp:880
#: engines/parallaction/saveload.cpp:209 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/scumm/dialogs.cpp:184
+#: engines/sci/engine/kfile.cpp:713 engines/scumm/dialogs.cpp:184
#: engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save"
msgstr "Записати"
@@ -1520,13 +1520,13 @@ msgstr ""
"Збереження стану гри не вдалося (%s)!. Будь-ласка, дивіться файл README для "
"основної інормації, а також інструкцій, як отримати подальшу допомогу."
-#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:117
-#: engines/mohawk/dialogs.cpp:242 engines/tsage/dialogs.cpp:112
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
+#: engines/tsage/dialogs.cpp:112
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:118
-#: engines/mohawk/dialogs.cpp:243 engines/tsage/dialogs.cpp:113
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:101
+#: engines/tsage/dialogs.cpp:113
msgid "~C~ancel"
msgstr "Ві~д~міна"
@@ -1534,23 +1534,23 @@ msgstr "Ві~д~міна"
msgid "~K~eys"
msgstr "~К~лавіші"
-#: engines/engine.cpp:339
+#: engines/engine.cpp:342
msgid "Could not initialize color format."
msgstr "Не можу налаштувати формат кольору."
-#: engines/engine.cpp:347
+#: engines/engine.cpp:350
msgid "Could not switch to video mode: '"
msgstr "Не вдалося переключити відеорежим: '"
-#: engines/engine.cpp:356
+#: engines/engine.cpp:359
msgid "Could not apply aspect ratio setting."
msgstr "Не вдалося застосувати корекцію співвідношення сторін."
-#: engines/engine.cpp:361
+#: engines/engine.cpp:364
msgid "Could not apply fullscreen setting."
msgstr "Не вдалося застосувати повноекранний режим."
-#: engines/engine.cpp:461
+#: engines/engine.cpp:464
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1564,7 +1564,7 @@ msgstr ""
"гри на жорсткий диск.\n"
"Дивіться файл README для подальших інструкцій."
-#: engines/engine.cpp:472
+#: engines/engine.cpp:475
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1578,7 +1578,7 @@ msgstr ""
"того, щоб можна було слухати музику у грі.\n"
"Дивіться файл README для подальших інструкцій."
-#: engines/engine.cpp:530
+#: engines/engine.cpp:533
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1587,7 +1587,7 @@ msgstr ""
"Завантаження стану гри не вдалося (%s)! . Будь-ласка, дивіться файл README "
"для основної інормації, а також інструкцій, як отримати подальшу допомогу."
-#: engines/engine.cpp:543
+#: engines/engine.cpp:546
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
@@ -1597,7 +1597,7 @@ msgstr ""
"ScummVM. Скорше за все вона не буде працювати стабільно, і збереження ігор, "
"які ви зробите, можуть не працювати у подальших версіях ScummVM."
-#: engines/engine.cpp:546
+#: engines/engine.cpp:549
msgid "Start anyway"
msgstr "Все одно запустити"
@@ -1822,19 +1822,19 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Без збільшення"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2215
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2213
msgid "Enabled aspect ratio correction"
msgstr "Корекцію співвідношення сторін увімкнено"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2221
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2219
msgid "Disabled aspect ratio correction"
msgstr "Корекцію співвідношення сторін вимкнено"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2276
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2274
msgid "Active graphics filter:"
msgstr "Поточний графічний фільтр:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2318
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
msgid "Windowed mode"
msgstr "Віконний режим"
@@ -2383,14 +2383,14 @@ msgstr "Показувати лінії об'єктів"
#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
-#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:410
+#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:424
#: engines/toltecs/detection.cpp:200 engines/zvision/detection_tables.h:51
msgid "Use original save/load screens"
msgstr "Використовувати ориг. збереження/завантаження екрани"
#: engines/agi/detection.cpp:148 engines/cine/detection.cpp:71
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
-#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:411
+#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:425
#: engines/toltecs/detection.cpp:201
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
@@ -2445,9 +2445,9 @@ msgstr ""
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore game:"
msgstr "Відновити гру:"
@@ -2455,13 +2455,13 @@ msgstr "Відновити гру:"
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore"
msgstr "Відновити"
-#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2393
+#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2395
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -2472,7 +2472,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2386
+#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2388
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -2483,7 +2483,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2404
+#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2406
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -2728,37 +2728,37 @@ msgstr ""
"відкрити консоль відладчика і ввести команду 'import_savefile'.\n"
"\n"
-#: engines/mohawk/detection.cpp:168
+#: engines/mohawk/detection.cpp:169
msgid "Play the Myst fly by movie"
msgstr "Показувати ролік польоту над Myst"
-#: engines/mohawk/detection.cpp:169
+#: engines/mohawk/detection.cpp:170
msgid "The Myst fly by movie was not played by the original engine."
msgstr "Ролік польоту над Myst не показувався оригінальним движком"
#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:96 engines/mohawk/dialogs.cpp:239
+#: engines/mohawk/dialogs.cpp:178 engines/mohawk/dialogs.cpp:264
msgid "~Z~ip Mode Activated"
msgstr "Режим швидкого переходу активовано"
-#: engines/mohawk/dialogs.cpp:97
+#: engines/mohawk/dialogs.cpp:179
msgid "~T~ransitions Enabled"
msgstr "Переходи активовано"
#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:99
+#: engines/mohawk/dialogs.cpp:181
msgid "~D~rop Page"
msgstr "Викинути сторінку"
-#: engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/dialogs.cpp:185
msgid "Show ~M~ap"
msgstr "Показати мапу"
-#: engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:191
msgid "Main Men~u~"
msgstr "Головне меню"
-#: engines/mohawk/dialogs.cpp:240
+#: engines/mohawk/dialogs.cpp:265
msgid "~W~ater Effect Enabled"
msgstr "Ефекти води увімкнено"
@@ -2879,37 +2879,45 @@ msgstr "Алтернативний вступ"
msgid "Use an alternative game intro (CD version only)"
msgstr "Використовувати альтернативний вступ гри (тільки CD версія)"
-#: engines/sci/detection.cpp:380
+#: engines/sci/detection.cpp:384
msgid "Skip EGA dithering pass (full color backgrounds)"
msgstr "Не робити растрування EGA (фони у повному кольорі)"
-#: engines/sci/detection.cpp:381
+#: engines/sci/detection.cpp:385
msgid "Skip dithering pass in EGA games, graphics are shown with full colors"
msgstr ""
"Не робити крок растрування у іграх EGA, графіку буде показано у повному "
"кольорі"
-#: engines/sci/detection.cpp:390
+#: engines/sci/detection.cpp:394
msgid "Enable high resolution graphics"
msgstr "Увімкнути графіку високого розгалуження"
-#: engines/sci/detection.cpp:391
+#: engines/sci/detection.cpp:395
msgid "Enable high resolution graphics/content"
msgstr "Увімкнути графіку та контент у високому розгалуженні"
-#: engines/sci/detection.cpp:400
+#: engines/sci/detection.cpp:404
+msgid "Enable black-lined video"
+msgstr ""
+
+#: engines/sci/detection.cpp:405
+msgid "Draw black lines over videos to increase their apparent sharpness"
+msgstr ""
+
+#: engines/sci/detection.cpp:414
msgid "Prefer digital sound effects"
msgstr "Надавати перевагу цифровим звуковим ефектам"
-#: engines/sci/detection.cpp:401
+#: engines/sci/detection.cpp:415
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Віддавати перевагу цифровим звуковим ефектам, а не синтезованим"
-#: engines/sci/detection.cpp:420
+#: engines/sci/detection.cpp:434
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Використовувати IMF/Yahama FB-01 для MIDI виходу"
-#: engines/sci/detection.cpp:421
+#: engines/sci/detection.cpp:435
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -2917,28 +2925,28 @@ msgstr ""
"Використовувати дляв виводу MIDI режим карти IBM Feature або FM сінтез "
"Yamaha FB-01"
-#: engines/sci/detection.cpp:431
+#: engines/sci/detection.cpp:445
msgid "Use CD audio"
msgstr "Використовувати CD аудіо"
-#: engines/sci/detection.cpp:432
+#: engines/sci/detection.cpp:446
msgid "Use CD audio instead of in-game audio, if available"
msgstr "Використовувати CD аудіо замість у-грі аудіо, якщо такі є"
-#: engines/sci/detection.cpp:442
+#: engines/sci/detection.cpp:456
msgid "Use Windows cursors"
msgstr "Використовувати Windows курсори"
-#: engines/sci/detection.cpp:443
+#: engines/sci/detection.cpp:457
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr "Використовувати Windows курсори (менших і монохромних), замість DOS"
-#: engines/sci/detection.cpp:453
+#: engines/sci/detection.cpp:467
msgid "Use silver cursors"
msgstr "Використовувати срібні курсори"
-#: engines/sci/detection.cpp:454
+#: engines/sci/detection.cpp:468
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
@@ -3618,7 +3626,7 @@ msgstr "Гучність музики: "
msgid "Subtitle speed: "
msgstr "Швид. субтитрів: "
-#: engines/scumm/scumm.cpp:1848
+#: engines/scumm/scumm.cpp:1850
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -3627,7 +3635,7 @@ msgstr ""
"Режим \"рідного\" MIDI потребує поновлення Roland Upgrade від\n"
"LucasArts, проте %s відсутній. Перемикаюсь на AdLib."
-#: engines/scumm/scumm.cpp:2664
+#: engines/scumm/scumm.cpp:2666
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 "
diff --git a/po/zh-Latn_CN.po b/po/zh-Latn_CN.po
index a44f6d5b2c..f8f3bb1d42 100644
--- a/po/zh-Latn_CN.po
+++ b/po/zh-Latn_CN.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.9.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2016-06-07 19:20+0200\n"
+"POT-Creation-Date: 2016-07-19 09:07+0200\n"
"PO-Revision-Date: 2016-03-15 04:09-0700\n"
"Last-Translator: Chenbo Li <lichenbo1949@gmail.com>\n"
"Language-Team: Chenbo Li <lichenbo1949@gmail.com>\n"
@@ -58,7 +58,7 @@ msgstr "ShangYiJi"
#: gui/recorderdialog.cpp:155 gui/saveload-dialog.cpp:216
#: gui/saveload-dialog.cpp:276 gui/saveload-dialog.cpp:547
#: gui/saveload-dialog.cpp:931 gui/themebrowser.cpp:55
-#: gui/updates-dialog.cpp:113 engines/engine.cpp:546
+#: gui/updates-dialog.cpp:113 engines/engine.cpp:549
#: backends/events/default/default-events.cpp:196
#: backends/events/default/default-events.cpp:218
#: backends/platform/wii/options.cpp:48 engines/drascula/saveload.cpp:49
@@ -206,12 +206,12 @@ msgstr "Chongzhi Suoyou de FluidSynth Shezhi"
#: gui/fluidsynth-dialog.cpp:153 gui/KeysDialog.cpp:42 gui/launcher.cpp:354
#: gui/launcher.cpp:1052 gui/launcher.cpp:1056 gui/massadd.cpp:92
-#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:465
-#: engines/engine.cpp:476 backends/platform/wii/options.cpp:47
+#: gui/options.cpp:1260 gui/saveload-dialog.cpp:932 engines/engine.cpp:468
+#: engines/engine.cpp:479 backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
#: engines/agos/animation.cpp:559 engines/drascula/saveload.cpp:49
#: engines/groovie/script.cpp:407 engines/parallaction/saveload.cpp:271
-#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1850
+#: engines/scumm/dialogs.cpp:189 engines/scumm/scumm.cpp:1852
#: engines/scumm/players/player_v3m.cpp:130
#: engines/scumm/players/player_v5m.cpp:108 engines/sky/compact.cpp:131
#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:524
@@ -500,7 +500,7 @@ msgstr "Xuanze Youxi Baocun Mulu"
msgid "This game ID is already taken. Please choose another one."
msgstr "Ci Youxi ID Yi Bei Zhanyong. Qing Xuanze Qita Mingcheng"
-#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:115
+#: gui/launcher.cpp:628 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:98
msgid "~Q~uit"
msgstr "~Q~Tuichu"
@@ -588,7 +588,7 @@ msgid "Search:"
msgstr "Sousuo:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
-#: engines/mohawk/dialogs.cpp:120 engines/mohawk/riven.cpp:729
+#: engines/mohawk/dialogs.cpp:103 engines/mohawk/riven.cpp:726
#: engines/pegasus/pegasus.cpp:353 engines/tsage/scenes.cpp:601
msgid "Load game:"
msgstr "Jiazai Youxi:"
@@ -596,8 +596,8 @@ msgstr "Jiazai Youxi:"
#: gui/launcher.cpp:687 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
-#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:120
-#: engines/mohawk/riven.cpp:729 engines/parallaction/saveload.cpp:194
+#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/riven.cpp:726 engines/parallaction/saveload.cpp:194
#: engines/pegasus/pegasus.cpp:353 engines/scumm/dialogs.cpp:185
#: engines/tsage/scenes.cpp:601
msgid "Load"
@@ -761,7 +761,7 @@ msgid "Special dithering modes supported by some games"
msgstr "Youxi Zhichi Teshu de Doudong Moshi"
#: gui/options.cpp:764
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2314
msgid "Fullscreen mode"
msgstr "Quanping Moshi"
@@ -1225,28 +1225,28 @@ msgstr "Shuru dui %d Dangwei de Miaoshu"
msgid "Select a Theme"
msgstr "Xuanze Zhuti"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgid "Disabled GFX"
msgstr "Jinyong GFX"
-#: gui/ThemeEngine.cpp:353
+#: gui/ThemeEngine.cpp:415
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Jinyong GFX"
-#: gui/ThemeEngine.cpp:354
+#: gui/ThemeEngine.cpp:416
msgid "Standard Renderer"
msgstr "Biaozhun Xuanranqi"
-#: gui/ThemeEngine.cpp:354 engines/scumm/dialogs.cpp:659
+#: gui/ThemeEngine.cpp:416 engines/scumm/dialogs.cpp:659
msgid "Standard"
msgstr "Biaozhun"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased Renderer"
msgstr "Fanjuchi Xuanranqi"
-#: gui/ThemeEngine.cpp:356
+#: gui/ThemeEngine.cpp:418
msgid "Antialiased"
msgstr "Fanjuchi"
@@ -1271,7 +1271,7 @@ msgstr "Jiancha Gengxin..."
msgid "Proceed"
msgstr ""
-#: gui/widget.cpp:335 gui/widget.cpp:337 gui/widget.cpp:343 gui/widget.cpp:345
+#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
msgstr "Qingchu Zhi"
@@ -1432,11 +1432,11 @@ msgstr "BingQie Fushang Shitu Tianjia de Youximing Yiji Banben/Yuyan Deng"
msgid "~R~esume"
msgstr "~R~Jixu"
-#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:113
+#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:96
msgid "~L~oad"
msgstr "~L~Zairu"
-#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:114
+#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:97
msgid "~S~ave"
msgstr "~S~Baocun"
@@ -1465,11 +1465,11 @@ msgstr "~R~Fanhui Qidongqi"
#: engines/avalanche/parser.cpp:1900 engines/cge/events.cpp:72
#: engines/cge2/events.cpp:65 engines/cruise/menu.cpp:212
#: engines/drascula/saveload.cpp:364 engines/dreamweb/saveload.cpp:262
-#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:121
+#: engines/hugo/file.cpp:298 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sci/engine/kfile.cpp:713 engines/sherlock/scalpel/scalpel.cpp:1250
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save game:"
msgstr "Baocun Youxi:"
@@ -1482,12 +1482,12 @@ msgstr "Baocun Youxi:"
#: engines/cge/events.cpp:72 engines/cge2/events.cpp:65
#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:364
#: engines/dreamweb/saveload.cpp:262 engines/hugo/file.cpp:298
-#: engines/mohawk/dialogs.cpp:121 engines/neverhood/menumodule.cpp:880
+#: engines/mohawk/dialogs.cpp:104 engines/neverhood/menumodule.cpp:880
#: engines/parallaction/saveload.cpp:209 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:778 engines/scumm/dialogs.cpp:184
+#: engines/sci/engine/kfile.cpp:713 engines/scumm/dialogs.cpp:184
#: engines/sherlock/scalpel/scalpel.cpp:1250
-#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:281
-#: engines/toon/toon.cpp:3339 engines/tsage/scenes.cpp:599
+#: engines/sherlock/tattoo/widget_files.cpp:75 engines/toltecs/menu.cpp:291
+#: engines/toon/toon.cpp:3340 engines/tsage/scenes.cpp:599
msgid "Save"
msgstr "Baocun"
@@ -1509,13 +1509,13 @@ msgstr ""
"Cundang Baocun Shibai (%s)! Qing Chayue README Huode Jiben Xinxi, Yiji "
"Gengduo Xinxi"
-#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:117
-#: engines/mohawk/dialogs.cpp:242 engines/tsage/dialogs.cpp:112
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
+#: engines/tsage/dialogs.cpp:112
msgid "~O~K"
msgstr "~O~Queding"
-#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:118
-#: engines/mohawk/dialogs.cpp:243 engines/tsage/dialogs.cpp:113
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:101
+#: engines/tsage/dialogs.cpp:113
msgid "~C~ancel"
msgstr "~C~Quxiao"
@@ -1523,23 +1523,23 @@ msgstr "~C~Quxiao"
msgid "~K~eys"
msgstr "~K~Guanjianzi"
-#: engines/engine.cpp:339
+#: engines/engine.cpp:342
msgid "Could not initialize color format."
msgstr "Wufa Chushihua Secai Geshi."
-#: engines/engine.cpp:347
+#: engines/engine.cpp:350
msgid "Could not switch to video mode: '"
msgstr "Wufa Qiehuandao Shipin Moshi: '"
-#: engines/engine.cpp:356
+#: engines/engine.cpp:359
msgid "Could not apply aspect ratio setting."
msgstr "Wufa Shezhi Bili Xuanxiang"
-#: engines/engine.cpp:361
+#: engines/engine.cpp:364
msgid "Could not apply fullscreen setting."
msgstr "Wufa Shezhi Quanping Xuanxiang"
-#: engines/engine.cpp:461
+#: engines/engine.cpp:464
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1553,7 +1553,7 @@ msgstr ""
"Kaobei Dao Yingpan Zhong Lai Yunxing.\n"
"Chakan README Huode Gengduo Xinxi."
-#: engines/engine.cpp:472
+#: engines/engine.cpp:475
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1567,7 +1567,7 @@ msgstr ""
"Bofang.\n"
"Juti Xinxi Qing Chakan README."
-#: engines/engine.cpp:530
+#: engines/engine.cpp:533
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1576,7 +1576,7 @@ msgstr ""
"Cundang Zairu Shibai (%s)! Qing Chayue README Huode Bangzhu XInxi Yiji "
"Gengduo Bangzhu."
-#: engines/engine.cpp:543
+#: engines/engine.cpp:546
msgid ""
"WARNING: The game you are about to start is not yet fully supported by "
"ScummVM. As such, it is likely to be unstable, and any saves you make might "
@@ -1586,7 +1586,7 @@ msgstr ""
"Yunxing Youkeneng Buwending, Renhe Cundang Youkeneng zai Yihou de ScummVM "
"Banben Bu Keyong."
-#: engines/engine.cpp:546
+#: engines/engine.cpp:549
msgid "Start anyway"
msgstr "Qiangzhi Qidong"
@@ -1811,19 +1811,19 @@ msgctxt "lowres"
msgid "Normal (no scaling)"
msgstr "Putong"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2215
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2213
msgid "Enabled aspect ratio correction"
msgstr "Qiyong Bili Jiaozheng"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2221
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2219
msgid "Disabled aspect ratio correction"
msgstr "Jinyong Bili Jiaozheng"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2276
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2274
msgid "Active graphics filter:"
msgstr "Huodong de Tuxing Guolvqi:"
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2318
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2316
msgid "Windowed mode"
msgstr "Chuangkou Moshi"
@@ -2370,14 +2370,14 @@ msgstr "Xianshi Wuti Biaoqian"
#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
-#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:410
+#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:424
#: engines/toltecs/detection.cpp:200 engines/zvision/detection_tables.h:51
msgid "Use original save/load screens"
msgstr "Shiyong Yuanshi Baocun/Zairu Pingmu"
#: engines/agi/detection.cpp:148 engines/cine/detection.cpp:71
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
-#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:411
+#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:425
#: engines/toltecs/detection.cpp:201
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr "Shiyong Yuanshi Baocun/Zairu Pingmu, Bu Shiyong ScummVM de"
@@ -2426,9 +2426,9 @@ msgstr ""
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore game:"
msgstr "Huifu Youxi:"
@@ -2436,13 +2436,13 @@ msgstr "Huifu Youxi:"
#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
#: engines/drascula/saveload.cpp:377 engines/dreamweb/saveload.cpp:170
#: engines/hugo/file.cpp:400 engines/neverhood/menumodule.cpp:893
-#: engines/sci/engine/kfile.cpp:877 engines/sherlock/scalpel/scalpel.cpp:1263
-#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:256
-#: engines/toon/toon.cpp:3431
+#: engines/sci/engine/kfile.cpp:834 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
+#: engines/toon/toon.cpp:3432
msgid "Restore"
msgstr "Huifu"
-#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2393
+#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2395
#, c-format
msgid ""
"Failed to load game state from file:\n"
@@ -2453,7 +2453,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2386
+#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2388
#, c-format
msgid ""
"Failed to save game state to file:\n"
@@ -2464,7 +2464,7 @@ msgstr ""
"\n"
"%s"
-#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2404
+#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2406
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -2710,39 +2710,39 @@ msgstr ""
"'import_savefile'.\n"
"\n"
-#: engines/mohawk/detection.cpp:168
+#: engines/mohawk/detection.cpp:169
msgid "Play the Myst fly by movie"
msgstr ""
-#: engines/mohawk/detection.cpp:169
+#: engines/mohawk/detection.cpp:170
msgid "The Myst fly by movie was not played by the original engine."
msgstr ""
#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:96 engines/mohawk/dialogs.cpp:239
+#: engines/mohawk/dialogs.cpp:178 engines/mohawk/dialogs.cpp:264
msgid "~Z~ip Mode Activated"
msgstr "~Z~Yasuo Moshi Qidong"
-#: engines/mohawk/dialogs.cpp:97
+#: engines/mohawk/dialogs.cpp:179
msgid "~T~ransitions Enabled"
msgstr "~T~Qiyong Zhuanyi"
#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:99
+#: engines/mohawk/dialogs.cpp:181
msgid "~D~rop Page"
msgstr "~D~shanchu Yemian"
-#: engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/dialogs.cpp:185
#, fuzzy
msgid "Show ~M~ap"
msgstr "~S~Xianshi Ditu"
-#: engines/mohawk/dialogs.cpp:109
+#: engines/mohawk/dialogs.cpp:191
#, fuzzy
msgid "Main Men~u~"
msgstr "~M~Zhucaidan"
-#: engines/mohawk/dialogs.cpp:240
+#: engines/mohawk/dialogs.cpp:265
msgid "~W~ater Effect Enabled"
msgstr "~W~Qiyong Shuimian Xiaoguo"
@@ -2862,35 +2862,43 @@ msgstr "QIta Jieshao"
msgid "Use an alternative game intro (CD version only)"
msgstr "Shiyong Qita Youxi Jieshao (Jin CD Ban)"
-#: engines/sci/detection.cpp:380
+#: engines/sci/detection.cpp:384
msgid "Skip EGA dithering pass (full color backgrounds)"
msgstr "Tiaoguo EGA Doudong (quancai Beijing)"
-#: engines/sci/detection.cpp:381
+#: engines/sci/detection.cpp:385
msgid "Skip dithering pass in EGA games, graphics are shown with full colors"
msgstr "tiaoguo EGA Youxi Zhong de Doudong, Tuxiang Yi Quancai Xianshi"
-#: engines/sci/detection.cpp:390
+#: engines/sci/detection.cpp:394
msgid "Enable high resolution graphics"
msgstr "QIyong Gaofenbianlv Tu"
-#: engines/sci/detection.cpp:391
+#: engines/sci/detection.cpp:395
msgid "Enable high resolution graphics/content"
msgstr "Qiyong Gaofenbianlv Tubian/Neirong"
-#: engines/sci/detection.cpp:400
+#: engines/sci/detection.cpp:404
+msgid "Enable black-lined video"
+msgstr ""
+
+#: engines/sci/detection.cpp:405
+msgid "Draw black lines over videos to increase their apparent sharpness"
+msgstr ""
+
+#: engines/sci/detection.cpp:414
msgid "Prefer digital sound effects"
msgstr "Youxianshiyong Shuzi Yinxiao"
-#: engines/sci/detection.cpp:401
+#: engines/sci/detection.cpp:415
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Youxian SHiyong shuzi YInxiao, er fei Hecheng"
-#: engines/sci/detection.cpp:420
+#: engines/sci/detection.cpp:434
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Shiyong IMF/yamaha Fb-01 Huo MIDI shuchu"
-#: engines/sci/detection.cpp:421
+#: engines/sci/detection.cpp:435
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -2898,28 +2906,28 @@ msgstr ""
"Shiyong IBM Music Feature Ka Huozhe Yamaha FB-01 FM hecheng Mokuai zuowei "
"MIDI shuchu"
-#: engines/sci/detection.cpp:431
+#: engines/sci/detection.cpp:445
msgid "Use CD audio"
msgstr "Shiyong CD YInpin"
-#: engines/sci/detection.cpp:432
+#: engines/sci/detection.cpp:446
msgid "Use CD audio instead of in-game audio, if available"
msgstr "Shiyong CD Yinpin erfei Youxinei Yinpin (ruguo keyong)"
-#: engines/sci/detection.cpp:442
+#: engines/sci/detection.cpp:456
msgid "Use Windows cursors"
msgstr "Shiyong WIndows Guangbiao"
-#: engines/sci/detection.cpp:443
+#: engines/sci/detection.cpp:457
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr "Shiyong Windows Guangbiao (gengxiao Danse) erfei DOS Guangbiao"
-#: engines/sci/detection.cpp:453
+#: engines/sci/detection.cpp:467
msgid "Use silver cursors"
msgstr "Shiyong Yinse Guangbiao"
-#: engines/sci/detection.cpp:454
+#: engines/sci/detection.cpp:468
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr "Shiyong Qita Yinse Guangbiao"
@@ -3598,7 +3606,7 @@ msgstr "Yinyue Yinliang:"
msgid "Subtitle speed: "
msgstr "Zimu Sudu:"
-#: engines/scumm/scumm.cpp:1848
+#: engines/scumm/scumm.cpp:1850
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -3607,7 +3615,7 @@ msgstr ""
"Bendi MIDI Zhichi Xuyao Cong LucasArts Shengji Zhi Roland,\n"
"Dnahsi %s meiyou zhaodao. Shiyong AdLib."
-#: engines/scumm/scumm.cpp:2664
+#: engines/scumm/scumm.cpp:2666
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 "
diff --git a/video/coktel_decoder.cpp b/video/coktel_decoder.cpp
index 21dda15cd0..278dc2d1fc 100644
--- a/video/coktel_decoder.cpp
+++ b/video/coktel_decoder.cpp
@@ -2810,6 +2810,10 @@ void AdvancedVMDDecoder::close() {
_decoder->close();
}
+void AdvancedVMDDecoder::setSurfaceMemory(void *mem, uint16 width, uint16 height, uint8 bpp) {
+ _decoder->setSurfaceMemory(mem, width, height, bpp);
+}
+
AdvancedVMDDecoder::VMDVideoTrack::VMDVideoTrack(VMDDecoder *decoder) : _decoder(decoder) {
}
diff --git a/video/coktel_decoder.h b/video/coktel_decoder.h
index a72f76eb9d..44de1c7d68 100644
--- a/video/coktel_decoder.h
+++ b/video/coktel_decoder.h
@@ -568,6 +568,8 @@ public:
bool loadStream(Common::SeekableReadStream *stream);
void close();
+ void setSurfaceMemory(void *mem, uint16 width, uint16 height, uint8 bpp);
+
private:
class VMDVideoTrack : public FixedRateVideoTrack {
public: