aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README26
-rw-r--r--backends/networking/sdl_net/localwebserver.h2
-rw-r--r--backends/networking/sdl_net/reader.cpp2
-rw-r--r--backends/platform/dc/dc-fs.cpp2
-rw-r--r--common/macresman.h6
-rw-r--r--engines/adl/adl.cpp13
-rw-r--r--engines/adl/adl.h4
-rw-r--r--engines/adl/hires5.cpp70
-rw-r--r--engines/bladerunner/bladerunner.h2
-rw-r--r--engines/director/director.cpp28
-rw-r--r--engines/director/director.h3
-rw-r--r--engines/director/frame.cpp94
-rw-r--r--engines/director/frame.h2
-rw-r--r--engines/director/lingo/tests/d3.keywords.txt264
-rw-r--r--engines/director/lingo/tests/d3.menus.txt21
-rw-r--r--engines/director/lingo/tests/d4.keywords.txt513
-rw-r--r--engines/director/score.cpp6
-rw-r--r--engines/dm/dungeonman.cpp6
-rw-r--r--engines/dm/gfx.cpp404
-rw-r--r--engines/dm/gfx.h5
-rw-r--r--engines/sci/detection_tables.h1
-rw-r--r--engines/sci/engine/file.cpp3
-rw-r--r--engines/sci/engine/kernel.cpp5
-rw-r--r--engines/sci/engine/kernel_tables.h8
-rw-r--r--engines/sci/engine/kfile.cpp5
-rw-r--r--engines/sci/engine/script_patches.cpp62
-rw-r--r--engines/sci/engine/workarounds.cpp9
-rw-r--r--engines/sci/engine/workarounds.h1
-rw-r--r--engines/sci/graphics/celobj32.h2
-rw-r--r--engines/sci/graphics/cursor32.cpp5
-rw-r--r--engines/sci/graphics/screen_item32.cpp2
-rw-r--r--engines/sci/sci.cpp10
-rw-r--r--engines/sci/sci.h1
-rw-r--r--engines/titanic/carry/brain.cpp3
-rw-r--r--engines/titanic/carry/carry_parrot.cpp2
-rw-r--r--engines/titanic/carry/central_core.cpp6
-rw-r--r--engines/titanic/carry/hose.cpp13
-rw-r--r--engines/titanic/carry/hose.h2
-rw-r--r--engines/titanic/carry/hose_end.cpp5
-rw-r--r--engines/titanic/core/drop_target.cpp8
-rw-r--r--engines/titanic/core/drop_target.h2
-rw-r--r--engines/titanic/core/game_object.cpp32
-rw-r--r--engines/titanic/core/game_object.h8
-rw-r--r--engines/titanic/core/named_item.cpp6
-rw-r--r--engines/titanic/core/named_item.h2
-rw-r--r--engines/titanic/core/saveable_object.cpp202
-rw-r--r--engines/titanic/core/tree_item.h2
-rw-r--r--engines/titanic/game/cage.cpp4
-rw-r--r--engines/titanic/game/light.cpp45
-rw-r--r--engines/titanic/game/light.h8
-rw-r--r--engines/titanic/game/light_switch.cpp2
-rw-r--r--engines/titanic/game/parrot/parrot_lobby_link_updater.cpp4
-rw-r--r--engines/titanic/game/parrot/parrot_perch_holder.cpp2
-rw-r--r--engines/titanic/game/television.cpp6
-rw-r--r--engines/titanic/game/throw_tv_down_well.cpp4
-rw-r--r--engines/titanic/game_state.cpp4
-rw-r--r--engines/titanic/messages/messages.h4
-rw-r--r--engines/titanic/npcs/bellbot.cpp26
-rw-r--r--engines/titanic/npcs/bilge_succubus.cpp8
-rw-r--r--engines/titanic/npcs/deskbot.cpp34
-rw-r--r--engines/titanic/npcs/doorbot.cpp34
-rw-r--r--engines/titanic/npcs/parrot.cpp385
-rw-r--r--engines/titanic/npcs/parrot.h66
-rw-r--r--engines/titanic/npcs/parrot_succubus.cpp32
-rw-r--r--engines/titanic/npcs/parrot_succubus.h2
-rw-r--r--engines/titanic/npcs/succubus.cpp132
-rw-r--r--engines/titanic/npcs/succubus.h26
-rw-r--r--engines/titanic/npcs/true_talk_npc.cpp4
-rw-r--r--engines/titanic/npcs/true_talk_npc.h12
-rw-r--r--engines/titanic/pet_control/pet_control.h7
-rw-r--r--engines/titanic/room_flags.h7
-rw-r--r--engines/titanic/support/avi_surface.cpp18
-rw-r--r--engines/titanic/support/avi_surface.h2
-rw-r--r--engines/titanic/support/mouse_cursor.cpp36
-rw-r--r--engines/titanic/support/mouse_cursor.h22
-rw-r--r--engines/titanic/support/movie.cpp2
-rw-r--r--engines/titanic/support/video_surface.cpp4
-rw-r--r--engines/titanic/true_talk/bellbot_script.cpp12
-rw-r--r--engines/titanic/true_talk/liftbot_script.cpp6
-rw-r--r--engines/titanic/true_talk/parrot_script.cpp4
-rw-r--r--engines/titanic/true_talk/tt_vocab.cpp4
-rw-r--r--graphics/font.cpp2
-rw-r--r--graphics/fonts/macfont.cpp497
-rw-r--r--graphics/fonts/macfont.h169
-rw-r--r--graphics/macgui/macfontmanager.cpp119
-rw-r--r--graphics/macgui/macfontmanager.h11
-rw-r--r--graphics/macgui/mactext.cpp23
-rw-r--r--graphics/macgui/mactext.h5
-rw-r--r--graphics/module.mk1
-rw-r--r--po/be_BY.po14
-rw-r--r--po/ca_ES.po14
-rw-r--r--po/cs_CZ.po14
-rw-r--r--po/da_DK.po14
-rw-r--r--po/de_DE.po14
-rw-r--r--po/el.po14
-rw-r--r--po/es_ES.po18
-rw-r--r--po/eu.po14
-rw-r--r--po/fi_FI.po14
-rw-r--r--po/fr_FR.po165
-rw-r--r--po/gl_ES.po14
-rw-r--r--po/hu_HU.po14
-rw-r--r--po/it_IT.po14
-rw-r--r--po/nb_NO.po14
-rw-r--r--po/nl_NL.po14
-rw-r--r--po/nn_NO.po14
-rw-r--r--po/pl_PL.po14
-rw-r--r--po/pt_BR.po14
-rw-r--r--po/pt_PT.po14
-rw-r--r--po/ru_RU.po14
-rw-r--r--po/scummvm.pot14
-rw-r--r--po/sv_SE.po14
-rw-r--r--po/uk_UA.po14
-rw-r--r--po/zh-Latn_CN.po14
113 files changed, 2929 insertions, 1237 deletions
diff --git a/README b/README
index 3c9474f64d..2b58713054 100644
--- a/README
+++ b/README
@@ -19,7 +19,7 @@ Table of Contents:
* 3.2 Datafiles
* 3.3 Multi-CD games notes
* 3.4 Known Problems
- * 3.5 Beneath a Steel Sky notes
+ * 3.5 Beneath a Steel Sky notes
* 3.6 Broken Sword games notes
* * 3.6.1 Broken Sword
* * 3.6.2 Broken Sword II
@@ -30,12 +30,12 @@ Table of Contents:
* 3.9 Dragon History notes
* 3.10 Flight of the Amazon Queen notes
* 3.11 Gobliiins notes
- * 3.12 Inherit the Earth: Quest for the Orb notes
+ * 3.12 Inherit the Earth: Quest for the Orb notes
* 3.13 Maniac Mansion Apple II/NES notes
* 3.14 Mickey's Space Adventure notes
* 3.15 Nippon Safes Inc. Amiga notes
* 3.16 Simon the Sorcerer notes
- * 3.17 The Curse of Monkey Island notes
+ * 3.17 The Curse of Monkey Island notes
* 3.18 The Feeble Files notes
* 3.19 The Legend of Kyrandia notes
* 3.20 Troll's Tale notes
@@ -43,8 +43,8 @@ Table of Contents:
* 3.22 Sierra AGI games: Predictive Input Dialog notes
* 3.23 Sierra SCI games: Simultaneous speech and subtitles
* 3.24 Zork games notes
- * 3.25 Commodore64 games notes
- * 3.26 Macintosh games notes
+ * 3.25 Commodore64 games notes
+ * 3.26 Macintosh games notes
4.0) Supported Platforms
5.0) Running ScummVM
* 5.1 Command Line Options
@@ -1324,7 +1324,7 @@ arguments -- see the next section.
--filtering Force filtered graphics mode
--no-filtering Force unfiltered graphics mode
-
+
--gui-theme=THEME Select GUI theme (default, modern, classic)
--themepath=PATH Path to where GUI themes are stored
--list-themes Display list of all usable GUI themes
@@ -2653,18 +2653,12 @@ debug messages (see <https://technet.microsoft.com/en-us/sysinternals/debugview.
Windows:
- * Dev-C++
- Please refer to:
- <http://wiki.scummvm.org/index.php/Compiling_ScummVM/DevCPP>
* MinGW
Please refer to:
<http://wiki.scummvm.org/index.php/Compiling_ScummVM/MinGW>
* Visual Studio (MSVC)
Please refer to:
<http://wiki.scummvm.org/index.php/Compiling_ScummVM/Visual_Studio>
- * Windows CE/Mobile
- Please refer to:
- <http://wiki.scummvm.org/index.php/Compiling_ScummVM/Windows_CE>
Linux:
* GCC
@@ -2673,7 +2667,7 @@ debug messages (see <https://technet.microsoft.com/en-us/sysinternals/debugview.
AmigaOS4:
Please refer to:
- <http://wiki.scummvm.org/index.php/AmigaOS>
+ <http://wiki.scummvm.org/index.php/AmigaOS4>
Apple iPhone:
Please refer to:
@@ -2714,10 +2708,6 @@ debug messages (see <https://technet.microsoft.com/en-us/sysinternals/debugview.
Please refer to:
<http://wiki.scummvm.org/index.php/Compiling_ScummVM/Maemo>
- Nintendo DS:
- Please refer to:
- <http://wiki.scummvm.org/index.php/Compiling_ScummVM/Nintendo_DS>
-
Nintendo Wii and Gamecube:
Please refer to:
<http://wiki.scummvm.org/index.php/Compiling_ScummVM/Wii>
@@ -2750,7 +2740,7 @@ debug messages (see <https://technet.microsoft.com/en-us/sysinternals/debugview.
----- -------
Please refer to our extensive Credits list at:
- <http://www.scummvm.org/credits/>
+ <http://www.scummvm.org/credits>
------------------------------------------------------------------------
diff --git a/backends/networking/sdl_net/localwebserver.h b/backends/networking/sdl_net/localwebserver.h
index 5c94d6d091..243db11fb4 100644
--- a/backends/networking/sdl_net/localwebserver.h
+++ b/backends/networking/sdl_net/localwebserver.h
@@ -59,7 +59,7 @@ class LocalWebserver : public Common::Singleton<LocalWebserver> {
SDLNet_SocketSet _set;
TCPsocket _serverSocket;
Client _client[MAX_CONNECTIONS];
- int _clients;
+ uint32 _clients;
bool _timerStarted, _stopOnIdle, _minimalMode;
Common::HashMap<Common::String, BaseHandler*> _pathHandlers;
BaseHandler *_defaultHandler;
diff --git a/backends/networking/sdl_net/reader.cpp b/backends/networking/sdl_net/reader.cpp
index 27254dee4f..46fb21a47a 100644
--- a/backends/networking/sdl_net/reader.cpp
+++ b/backends/networking/sdl_net/reader.cpp
@@ -350,7 +350,7 @@ bool Reader::readOneByteInStream(Common::WriteStream *stream, const Common::Stri
}
byte Reader::readOne() {
- byte b;
+ byte b = 0;
_content->read(&b, 1);
--_availableBytes;
--_bytesLeft;
diff --git a/backends/platform/dc/dc-fs.cpp b/backends/platform/dc/dc-fs.cpp
index 4bd7e5a777..1cc7b56710 100644
--- a/backends/platform/dc/dc-fs.cpp
+++ b/backends/platform/dc/dc-fs.cpp
@@ -57,7 +57,7 @@ public:
virtual Common::SeekableReadStream *createReadStream();
virtual Common::WriteStream *createWriteStream() { return 0; }
- virtual bool create(bool isDirectory) { return false; }
+ virtual bool create(bool isDirectoryFlag) { return false; }
static AbstractFSNode *makeFileNodePath(const Common::String &path);
};
diff --git a/common/macresman.h b/common/macresman.h
index 05b2a875f4..1be825b7b4 100644
--- a/common/macresman.h
+++ b/common/macresman.h
@@ -176,6 +176,11 @@ public:
*/
MacResTagArray getResTagArray();
+ /**
+ * Load from stream in MacBinary format
+ */
+ bool loadFromMacBinary(SeekableReadStream &stream);
+
private:
SeekableReadStream *_stream;
String _baseFileName;
@@ -183,7 +188,6 @@ private:
bool load(SeekableReadStream &stream);
bool loadFromRawFork(SeekableReadStream &stream);
- bool loadFromMacBinary(SeekableReadStream &stream);
bool loadFromAppleDouble(SeekableReadStream &stream);
static String constructAppleDoubleName(String name);
diff --git a/engines/adl/adl.cpp b/engines/adl/adl.cpp
index 3b5ebfb3ca..33124a2ea4 100644
--- a/engines/adl/adl.cpp
+++ b/engines/adl/adl.cpp
@@ -471,7 +471,7 @@ void AdlEngine::bell(uint count) const {
playTones(tones, false);
}
-void AdlEngine::playTones(const Tones &tones, bool isMusic) const {
+bool AdlEngine::playTones(const Tones &tones, bool isMusic, bool allowSkip) const {
Audio::SoundHandle handle;
Audio::AudioStream *stream = new Sound(tones);
@@ -480,8 +480,17 @@ void AdlEngine::playTones(const Tones &tones, bool isMusic) const {
while (!g_engine->shouldQuit() && g_system->getMixer()->isSoundHandleActive(handle)) {
Common::Event event;
pollEvent(event);
+
+ if (allowSkip && event.type == Common::EVENT_KEYDOWN) {
+ // FIXME: Preserve this event
+ g_system->getMixer()->stopHandle(handle);
+ return true;
+ }
+
g_system->delayMillis(16);
}
+
+ return false;
}
const Region &AdlEngine::getRegion(uint i) const {
@@ -904,7 +913,7 @@ byte AdlEngine::convertKey(uint16 ascii) const {
return 0;
}
-Common::String AdlEngine::getLine() const {
+Common::String AdlEngine::getLine() {
// Original engine uses a global here, which isn't reset between
// calls and may not match actual mode
bool textMode = false;
diff --git a/engines/adl/adl.h b/engines/adl/adl.h
index 8883416fd3..543c190793 100644
--- a/engines/adl/adl.h
+++ b/engines/adl/adl.h
@@ -252,6 +252,7 @@ protected:
virtual Common::String getItemDescription(const Item &item) const;
void delay(uint32 ms) const;
+ virtual Common::String getLine();
Common::String inputString(byte prompt = 0) const;
byte inputKey(bool showCursor = true) const;
void getInput(uint &verb, uint &noun);
@@ -312,7 +313,7 @@ protected:
// Sound
void bell(uint count = 1) const;
- void playTones(const Tones &tones, bool isMusic) const;
+ bool playTones(const Tones &tones, bool isMusic, bool allowSkip = false) const;
// Game state functions
const Region &getRegion(uint i) const;
@@ -413,7 +414,6 @@ private:
// Text input
byte convertKey(uint16 ascii) const;
- Common::String getLine() const;
Common::String getWord(const Common::String &line, uint &index) const;
Console *_console;
diff --git a/engines/adl/hires5.cpp b/engines/adl/hires5.cpp
index ffcd2fb04c..4bf65ab822 100644
--- a/engines/adl/hires5.cpp
+++ b/engines/adl/hires5.cpp
@@ -38,7 +38,8 @@ namespace Adl {
class HiRes5Engine : public AdlEngine_v4 {
public:
HiRes5Engine(OSystem *syst, const AdlGameDescription *gd) :
- AdlEngine_v4(syst, gd) { }
+ AdlEngine_v4(syst, gd),
+ _doAnimation(false) { }
private:
// AdlEngine
@@ -48,22 +49,27 @@ private:
void initGameState();
void applyRegionWorkarounds();
void applyRoomWorkarounds(byte roomNr);
+ Common::String getLine();
// AdlEngine_v4
bool isInventoryFull();
void loadSong(Common::ReadStream &stream);
+ void drawLight(uint index, byte color) const;
+ void animateLights() const;
int o_checkItemTimeLimits(ScriptEnv &e);
int o_startAnimation(ScriptEnv &e);
int o_winGame(ScriptEnv &e);
+ static const uint kClock = 1022727; // Apple II CPU clock rate
static const uint kRegions = 41;
static const uint kItems = 69;
Common::Array<byte> _itemTimeLimits;
Common::String _itemTimeLimitMsg;
Tones _song;
+ bool _doAnimation;
struct {
Common::String itemTimeLimit;
@@ -71,6 +77,63 @@ private:
} _gameStrings;
};
+Common::String HiRes5Engine::getLine() {
+ if (_doAnimation) {
+ animateLights();
+ _doAnimation = false;
+ }
+
+ return AdlEngine_v4::getLine();
+}
+
+void HiRes5Engine::drawLight(uint index, byte color) const {
+ const byte xCoord[5] = { 189, 161, 133, 105, 77 };
+ const byte yCoord = 72;
+
+ assert(index < 5);
+
+ for (int yDelta = 0; yDelta < 4; ++yDelta)
+ for (int xDelta = 0; xDelta < 7; ++xDelta)
+ _display->putPixel(Common::Point(xCoord[index] + xDelta, yCoord + yDelta), color);
+
+ _display->updateHiResScreen();
+}
+
+void HiRes5Engine::animateLights() const {
+ int index;
+ byte color = 0x2a;
+
+ for (index = 4; index >= 0; --index)
+ drawLight(index, color);
+
+ index = 4;
+
+ while (!g_engine->shouldQuit()) {
+ drawLight(index, color ^ 0x7f);
+
+ // There's a delay here in the original engine. We leave it out as
+ // we're already slower than the original without any delay.
+
+ const uint kLoopCycles = 25;
+ const byte period = (index + 1) << 4;
+ const double freq = kClock / 2.0 / (period * kLoopCycles);
+ const double len = 128 * period * kLoopCycles * 1000 / (double)kClock;
+
+ Tones tone;
+ tone.push_back(Tone(freq, len));
+
+ if (playTones(tone, false, true))
+ break;
+
+ drawLight(index, color ^ 0xff);
+
+ if (--index < 0) {
+ index = 4;
+ color ^= 0xff;
+ }
+ }
+}
+
typedef Common::Functor1Mem<ScriptEnv &, int, HiRes5Engine> OpcodeH5;
#define SetOpcodeTable(x) table = &x;
#define Opcode(x) table->push_back(new OpcodeH5(this, &HiRes5Engine::x))
@@ -173,7 +236,6 @@ void HiRes5Engine::loadSong(Common::ReadStream &stream) {
if (stream.err() || stream.eos())
error("Error loading song");
- const uint kClock = 1022727; // Apple II CPU clock rate
const uint kLoopCycles = 20; // Delay loop cycles
double freq = 0.0;
@@ -219,7 +281,7 @@ int HiRes5Engine::o_checkItemTimeLimits(ScriptEnv &e) {
int HiRes5Engine::o_startAnimation(ScriptEnv &e) {
OP_DEBUG_0("\tSTART_ANIMATION()");
- // TODO: sets a flag that triggers an animation
+ _doAnimation = true;
return 0;
}
@@ -341,6 +403,8 @@ void HiRes5Engine::initGameState() {
loadRegion(1);
_state.room = 5;
+
+ _doAnimation = false;
}
void HiRes5Engine::applyRegionWorkarounds() {
diff --git a/engines/bladerunner/bladerunner.h b/engines/bladerunner/bladerunner.h
index b0eb4591cd..23ea88b43a 100644
--- a/engines/bladerunner/bladerunner.h
+++ b/engines/bladerunner/bladerunner.h
@@ -135,7 +135,7 @@ public:
int _walkSoundBalance;
int _walkingActorId;
private:
- static const int kArchiveCount = 10;
+ static const uint kArchiveCount = 10;
MIXArchive _archives[kArchiveCount];
public:
diff --git a/engines/director/director.cpp b/engines/director/director.cpp
index 83708e0028..89018f5d0d 100644
--- a/engines/director/director.cpp
+++ b/engines/director/director.cpp
@@ -24,6 +24,9 @@
#include "common/debug-channels.h"
#include "common/error.h"
+#include "common/macresman.h"
+#include "graphics/fonts/macfont.h"
+
#include "graphics/macgui/macwindowmanager.h"
#include "director/director.h"
@@ -116,6 +119,8 @@ Common::Error DirectorEngine::run() {
_mainArchive = nullptr;
_currentScore = nullptr;
+ testFonts();
+
_lingo->runTests();
return Common::kNoError;
@@ -125,7 +130,7 @@ Common::Error DirectorEngine::run() {
//_mainArchive = new RIFFArchive();
//_mainArchive->openFile("bookshelf_example.mmm");
- //testFont();
+ //testFontScaling();
if (getPlatform() == Common::kPlatformWindows)
_sharedCastFile = "SHARDCST.MMM";
@@ -190,4 +195,25 @@ void DirectorEngine::setPalette(byte *palette, uint16 count) {
_currentPaletteLength = count;
}
+void DirectorEngine::testFonts() {
+ Common::String fontName("Helvetica");
+
+ Common::MacResManager *fontFile = new Common::MacResManager();
+ if (!fontFile->open(fontName))
+ error("Could not open %s as a resource fork", fontName.c_str());
+
+ Common::MacResIDArray fonds = fontFile->getResIDArray(MKTAG('F','O','N','D'));
+ if (fonds.size() > 0) {
+ for (Common::Array<uint16>::iterator iterator = fonds.begin(); iterator != fonds.end(); ++iterator) {
+ Common::SeekableReadStream *stream = fontFile->getResource(MKTAG('F', 'O', 'N', 'D'), *iterator);
+ Common::String name = fontFile->getResName(MKTAG('F', 'O', 'N', 'D'), *iterator);
+
+ debug("Font: %s", name.c_str());
+
+ Graphics::MacFontFamily font;
+ font.load(*stream);
+ }
+ }
+}
+
} // End of namespace Director
diff --git a/engines/director/director.h b/engines/director/director.h
index a2cc1fa9db..8d5f6b5211 100644
--- a/engines/director/director.h
+++ b/engines/director/director.h
@@ -142,7 +142,8 @@ private:
Common::String _sharedCastFile;
private:
- void testFont();
+ void testFontScaling();
+ void testFonts();
};
extern DirectorEngine *g_director;
diff --git a/engines/director/frame.cpp b/engines/director/frame.cpp
index 9b8f25f4fa..1dce3113da 100644
--- a/engines/director/frame.cpp
+++ b/engines/director/frame.cpp
@@ -875,8 +875,6 @@ void Frame::renderText(Graphics::ManagedSurface &surface, uint16 spriteId, Commo
const Graphics::Font *font = _vm->_wm->_fontMan->getFont(macFont);
- height = font->getFontHeight();
-
debugC(3, kDebugText, "renderText: x: %d y: %d w: %d h: %d font: '%s'", x, y, width, height, _vm->_wm->_fontMan->getFontName(macFont));
int alignment = (int)textCast->textAlign;
@@ -885,7 +883,15 @@ void Frame::renderText(Graphics::ManagedSurface &surface, uint16 spriteId, Commo
else
alignment++;
- uint16 textX = x, textY = y;
+ Graphics::MacText mt(text, font, 0x00, 0xff, width, (Graphics::TextAlign)alignment);
+ mt.setInterLinear(1);
+ mt.render();
+ const Graphics::ManagedSurface *textSurface = mt.getSurface();
+
+ height = textSurface->h;
+
+ uint16 textX = 0, textY = 0;
+
if (!isButtonLabel) {
if (borderSize > 0) {
if (_vm->getVersion() <= 3)
@@ -895,71 +901,57 @@ void Frame::renderText(Graphics::ManagedSurface &surface, uint16 spriteId, Commo
textX += (borderSize + 1);
textY += borderSize;
- } else
- textX += 1;
+ } else {
+ x += 1;
+ }
if (padding > 0) {
width += padding * 2;
height += padding;
-
- if (textCast->textAlign == kTextAlignLeft)
- textX += padding;
- else if (textCast->textAlign == kTextAlignRight)
- textX -= padding;
- //TODO: alignment issue with odd-size-width center-aligned text
- //else if (textCast->textAlign == kTextAlignCenter && ((borderSize + padding) % 2 == 1))
- // textX--;
-
textY += padding / 2;
}
- if (textCast->textAlign == kTextAlignRight) textX -= 1;
+ if (textCast->textAlign == kTextAlignRight)
+ textX -= 1;
- if (textShadow > 0) {
- if (borderSize == 0 && _vm->getVersion() > 3)
- textX += 1;
- if (_vm->getVersion() > 3)
- height -= (textShadow - 1);
- }
+ if (textShadow > 0)
+ textX--;
} else {
- textY += 2;
+ y += 2;
}
- Graphics::MacText mt(text, font, 0x00, 0xff, width);
- mt.render();
- Graphics::ManagedSurface *textSurface = mt.getSurface();
-
- if (isButtonLabel) {
- uint16 borderX = x + borderSize - 1, borderY = y + borderSize - 1, borderHeight = height, borderWidth = width;
- if (borderSize != kSizeNone) {
- while (borderSize) {
- borderWidth += 2;
- borderHeight += 2;
- textSurface->frameRect(Common::Rect(borderX, borderY, borderX + borderWidth, borderY + borderHeight), 0);
- borderSize--;
- borderX--;
- borderY--;
- }
- }
+ switch (textCast->textAlign) {
+ case kTextAlignLeft:
+ break;
+ case kTextAlignCenter:
+ textX = (width / 2) - (textSurface->w / 2) + (padding / 2) + borderSize;
+ break;
+ case kTextAlignRight:
+ textX = width - (textSurface->w + 1) + (borderSize * 2) - (textShadow * 2) - (padding);
+ break;
+ }
- if (boxShadow > 0) {
- borderSize = (uint16)textCast->borderSize;
- uint baseOffsetX = x + boxShadow;
- uint baseOffsetY = y + height + (borderSize * 2);
- uint sideOffsetX = x + borderWidth;
- uint sideOffsetY = y + boxShadow;
- while (boxShadow) {
- textSurface->drawLine(baseOffsetX, baseOffsetY + (boxShadow - 1), baseOffsetX + borderWidth - 1, baseOffsetY + (boxShadow - 1), 0);
- textSurface->drawLine(sideOffsetX + (boxShadow - 1), sideOffsetY, sideOffsetX + (boxShadow - 1), sideOffsetY + borderHeight - 1, 0);
- boxShadow--;
- }
+ Graphics::ManagedSurface textWithFeatures(width + (borderSize * 2) + boxShadow + textShadow, height + borderSize + boxShadow + textShadow);
+ textWithFeatures.fillRect(Common::Rect(textWithFeatures.w, textWithFeatures.h), 0xff);
+
+ if (!isButtonLabel && boxShadow > 0) {
+ textWithFeatures.fillRect(Common::Rect(boxShadow, boxShadow, textWithFeatures.w + boxShadow, textWithFeatures.h), 0);
+ }
+
+ if (!isButtonLabel && borderSize != kSizeNone) {
+ for (int bb = 0; bb < borderSize; bb++) {
+ Common::Rect borderRect(bb, bb, textWithFeatures.w - bb - boxShadow - textShadow, textWithFeatures.h - bb - boxShadow - textShadow);
+ textWithFeatures.fillRect(borderRect, 0xff);
+ textWithFeatures.frameRect(borderRect, 0);
}
}
if (textShadow > 0)
- inkBasedBlit(surface, *textSurface, spriteId, Common::Rect(textX + textShadow, textY + textShadow, textX + textShadow + width, textY + textShadow + height));
+ textWithFeatures.transBlitFrom(textSurface->rawSurface(), Common::Point(textX + textShadow, textY + textShadow), 0xff);
- inkBasedBlit(surface, *textSurface, spriteId, Common::Rect(textX, textY, textX + width, textY + height));
+ textWithFeatures.transBlitFrom(textSurface->rawSurface(), Common::Point(textX, textY), 0xff);
+
+ inkBasedBlit(surface, textWithFeatures, spriteId, Common::Rect(x, y, x + width, y + height));
}
void Frame::drawBackgndTransSprite(Graphics::ManagedSurface &target, const Graphics::Surface &sprite, Common::Rect &drawRect) {
diff --git a/engines/director/frame.h b/engines/director/frame.h
index b41ee832ae..f822a83fdb 100644
--- a/engines/director/frame.h
+++ b/engines/director/frame.h
@@ -33,7 +33,7 @@ namespace Director {
class Sprite;
-#define CHANNEL_COUNT 24
+#define CHANNEL_COUNT 30
enum {
kChannelDataSize = (25 * 50)
diff --git a/engines/director/lingo/tests/d3.keywords.txt b/engines/director/lingo/tests/d3.keywords.txt
new file mode 100644
index 0000000000..6b5ddba754
--- /dev/null
+++ b/engines/director/lingo/tests/d3.keywords.txt
@@ -0,0 +1,264 @@
+
+ -
+ -
+()
+*
+/
+&
+&&
++
+<
+<=
+<>
+=
+>
+>=
+abs
+alert
+and
+backColor
+BACKSPACE
+beep
+beepOn
+bottom
+buttonStyle
+cast hilite
+cast name
+cast number
+cast picture
+cast size
+cast text
+castNum
+centerStage
+char
+chars
+charToNum
+checkBoxAccess
+checkBoxType
+clearGlobals
+clickOn
+closeDA
+closeResFile
+closeXLib
+colorDepth
+colorQD
+commandDown
+constrainH
+constraint
+constrainV
+contains
+continue
+controlDown
+controller
+cursor
+cursor
+date
+delay
+delete
+directToStage
+do
+dontPassEvent
+doubleClick
+duration
+editableText
+EMPTY
+ENTER
+exit
+exitLock
+factory
+factory
+FALSE
+field
+field textAlign
+field textFont
+field textHeight
+field textSize
+field textStyle
+fixStageSize
+floatp
+floatPrecision
+foreColor
+frame
+framesToHMS
+freeBlock
+freeBytes
+fullColorPermit
+global
+go to
+go to movie
+height
+hilite
+HMStoFrames
+if
+imageDirect
+immediate
+ink
+installMenu
+instance
+integer
+integerp
+item
+key
+keyCode
+keyDownScript
+label
+labelList
+lastClick
+lastEvent
+lastKey
+lastRoll
+left
+length
+line
+lineSize
+locH
+locV
+loop
+machineType
+macro
+marker
+maxInteger
+mci
+memorySize
+menu checkMark
+menu enabled
+menu name
+menu script
+menu:
+method
+mod
+mouseCast
+mouseChar
+mouseDown
+mouseDownScript
+mouseH
+mouseItem
+mouseLine
+mouseUp
+mouseUpScript
+mouseV
+mouseWord
+moveableSprite
+movie
+movieRate
+movieTime
+multiSound
+not
+nothing
+numToChar
+objectp
+offset
+on
+on idle
+on startMovie
+on stepMovie
+on stopMovie
+open
+openDA
+openResFile
+openXLib
+optionDown
+or
+pathName
+pattern
+pause
+pauseState
+perFrameHook
+play
+play done
+play movie
+playAccel
+preLoad
+preLoadCast
+printFrom
+puppet
+puppetPalette
+puppetSound
+puppetSprite
+puppetTempo
+puppetTransition
+put
+put after
+put before
+put into
+quickTimePresent
+quit
+QUOTE
+ramNeeded
+random
+repeat while
+repeat with
+restart
+result
+return
+RETURN
+right
+rollover
+romanLingo
+selection
+selEnd
+selStart
+set
+setCallBack
+shiftDown
+showGlobals
+showLocals
+showResFile
+showXlib
+shutDown
+sound
+sound fadeIn
+sound fadeOut
+sound playFile
+sound stop
+sound volume
+soundBusy
+soundEnabled
+soundLevel
+sprite s intersects
+sprite s within
+spriteBox
+sqrt
+stageBottom
+stageColor
+stageLeft
+stageRight
+stageTop
+starts
+startTime
+startTimer
+stillDown
+stopTime
+stretch
+string
+stringp
+switchColorDepth
+symbolp
+TAB
+ticks
+time
+timeoutKeydown
+timeoutLapsed
+timeoutLength
+timeoutMouse
+timeoutPlay
+timeoutScript
+timer
+top
+trails
+TRUE
+type
+unLoad
+unLoadCast
+updateStage
+value
+visibility
+volume
+when keyDown
+when mouseDown
+when mouseUp
+when timeOut
+width
+word
+xfactoryList
+zoomBox
diff --git a/engines/director/lingo/tests/d3.menus.txt b/engines/director/lingo/tests/d3.menus.txt
new file mode 100644
index 0000000000..601fd1dfbb
--- /dev/null
+++ b/engines/director/lingo/tests/d3.menus.txt
@@ -0,0 +1,21 @@
+menu: Commands A-O
+alert;beep;clearGlobals;closeDA;closeResFile;closeXLib;continue;cursor;delay;delete;do;dontPassEvent;editableText;go to;go to movie;hilite;installMenu;mci;moveableSprite;nothing;open;openDA;openResFile;openXLib
+menu: Commands P-Z
+pause;play;play done;play movie;playAccel;preLoad;preLoadCast;printFrom;puppetPalette;puppetSound;puppetSprite;puppetTempo;puppetTransition;put ;put after;put before;put into;quit;restart;set;setCallBack;showGlobals;showLocals;showResFile;showXlib;shutDown;sound fadeIn;sound fadeOut;sound playFile;sound stop;spriteBox;startTimer;unLoad;unLoadCast;updateStage;when keyDown;when mouseDown;when mouseUp;when timeOut;zoomBox
+menu: Functions A-L
+abs;char;chars;charToNum;clickOn;colorQD;commandDown;constrainH;constrainV;controlDown;date;doubleClick;factory;floatp;frame;framesToHMS;freeBlock;freeBytes;HMStoFrames;integer;integerp;item;key;keyCode;label;labelList;lastClick;lastEvent;lastKey;lastRoll;length;line
+menu: Functions M-Z
+machineType;marker;memorySize;mouseCast;mouseChar;mouseItem;mouseLine;mouseDown;mouseWord;mouseH;mouseUp;mouseV;movie;multiSound;numToChar;objectp;offset;optionDown;pathName;pauseState;quickTimePresent;ramNeeded;random;result;rollover;selection;shiftDown;sqrt;stageBottom;stageLeft;stageRight;stageTop;stillDown;string;stringp;soundBusy;symbolp;ticks;time;value;word;xfactoryList
+menu: Keywords
+exit;factory;global;if;instance;macro;menu:;method;on;on idle;on startMovie;on stepMovie;on stopMovie;repeat while;repeat with;return
+menu: Operators
+() ;sprite s within ;sprite s intersects ; - ;not ;and ;or ;* ;/ ;mod ;+ ; - ;& ;&& ;< ;<= ;> ;>= ;<> ;contains ;starts ;=
+menu: Constants
+BACKSPACE ;EMPTY ;ENTER ;FALSE ;QUOTE ;RETURN ;TAB ;TRUE
+menu: Properties
+beepOn;buttonStyle;centerStage;checkBoxAccess;checkBoxType;colorDepth;exitLock;fixStageSize;floatPrecision;fullColorPermit;imageDirect;keyDownScript;maxInteger;mouseDownScript;mouseUpScript;perFrameHook;romanLingo;soundEnabled;soundLevel;stageColor;switchColorDepth;timeoutKeydown;timeoutLapsed;timeoutLength;timeoutMouse;timeoutPlay;timeoutScript;timer
+menu: Sprite Properties
+backColor;bottom;castNum;constraint;cursor;foreColor;height;immediate;ink;left;lineSize;locH;locV;movieRate;movieTime;pattern;puppet;right;startTime;stopTime;stretch;top;trails;type;visibility;volume;width
+menu: Other Properties
+cast hilite;cast name;cast number;cast picture;cast size;cast text;controller;directToStage;duration;field;field textAlign;field textFont;field textHeight;field textSize;field textStyle;loop;menu checkMark;menu enabled;menu name;menu script;selEnd;selStart;sound;sound volume
+
diff --git a/engines/director/lingo/tests/d4.keywords.txt b/engines/director/lingo/tests/d4.keywords.txt
new file mode 100644
index 0000000000..1395c8f563
--- /dev/null
+++ b/engines/director/lingo/tests/d4.keywords.txt
@@ -0,0 +1,513 @@
+ -
+ --
+ ()
+ []
+ *
+ /
+ &
+ &&
+ #
+ +
+ <
+ <=
+ <>
+ =
+ >
+ >=
+ �
+abbr
+abort
+abs
+actorList
+add
+addAt
+addProp
+after
+alert
+ancestor
+and
+append
+atan
+backColor of cast
+backColor of sprite
+BACKSPACE
+beep
+beepOn
+before
+birth
+blend of sprite
+bottom of sprite
+buttonStyle
+cast backColor
+cast castType
+cast depth
+cast fileName
+cast foreColor
+cast height
+cast hilite
+cast loaded
+cast modified
+cast name
+cast number
+cast palette
+cast picture
+cast purgePriority
+cast rect
+cast regPoint
+cast scriptText
+cast size
+cast text
+cast width
+castmembers
+castNum of sprite
+castType of cast
+center
+centerStage
+char of
+chars
+charToNum
+checkBoxAccess
+checkBoxType
+checkMark of menuItem
+clearGlobals
+clickLoc
+clickOn
+close window
+closeDA
+closeResFile
+closeXlib
+colorDepth
+colorQD
+commandDown
+constrainH
+constraint of sprite
+constrainV
+contains
+continue
+controlDown
+controller of cast
+copyToClipBoard cast
+cos
+count
+crop
+cursor
+cursor of sprite
+date
+delay
+delete
+deleteAt
+deleteProp
+depth of cast
+digitalVideo
+digitalVideo cast center
+digitalVideo cast controller
+digitalVideo cast crop
+digitalVideo cast directToStage
+digitalVideo cast duration
+digitalVideo cast frameRate
+digitalVideo cast loop
+digitalVideo cast pausedAtStart
+digitalVideo cast preload
+digitalVideo cast sound
+digitalVideo cast video
+digitalVideo sprite movieRate
+digitalVideo sprite movieTime
+digitalVideo sprite startTime
+digitalVideo sprite stopTime
+digitalVideo sprite volume
+directToStage of cast
+do
+done
+dontPassEvent
+doubleClick
+down
+drawRect of window
+duplicate cast {n}
+editableText of sprite
+else
+EMPTY
+enabled of menuItem
+end
+ENTER
+erase cast
+exit
+exit repeat
+exitFrame
+exitLock
+exp
+factory
+fadeIn
+fadeOut
+FALSE
+field
+fileName of cast
+fileName of window
+findEmpty
+findPos
+findPosNear
+fixStageSize
+float
+floatP
+floatPrecision
+foreColor of cast
+foreColor of sprite
+forget
+frame
+frameLabel
+framePalette
+frameRate of cast
+frameScript
+framesToHMS
+frameTempo
+freeBlock
+freeBytes
+getaProp
+getAt
+getLast
+getNthFileNameInFolder
+getOne
+getPos
+getProp
+getPropAt
+global
+go
+go loop
+go next
+go previous
+halt
+height of cast
+height of sprite
+hilite
+hilite of cast
+HMStoFrames
+idle
+if
+ilk list
+ilk point
+ilk rect
+importFileInto
+in
+inflate rect
+ink of sprite
+inside point
+installMenu
+instance
+integer
+integerP
+intersect rect
+intersects
+into
+item of
+itemDelimiter
+items
+key
+keyCode
+keyDown
+keyDownScript
+keyUp
+keyUpScript
+label
+labelList
+last
+lastClick
+lastEvent
+lastFrame
+lastKey
+lastRoll
+left of sprite
+length
+line of
+lines
+lineSize of sprite
+list
+list ilk
+listP
+loaded of cast
+locH of sprite
+locV of sprite
+log
+long
+loop
+loop of cast
+machineType
+map point
+map rect
+marker
+mAtFrame
+max
+maxInteger
+mci
+mDescribe
+mDispose
+me
+memorySize
+menu
+menuItem
+menuItems
+menus
+mGet
+min
+mInstanceRespondsTo
+mMessageList
+mName
+mNew
+mod
+modal window
+modified of cast
+mouseCast
+mouseChar
+mouseDown
+mouseDownScript
+mouseH
+mouseItem
+mouseLine
+mouseUp
+mouseUpScript
+mouseV
+mouseWord
+move
+moveableSprite of sprite
+moveToBack
+moveToFront
+movie
+movieFileFreeSize
+movieFileSize
+movieName
+moviePath
+movieRate of sprite
+movieTime of sprite
+mPerform
+mPut
+mRespondsTo
+multiSound
+name of cast
+name of menu
+name of menuItem
+next
+next repeat
+not
+nothing
+number of cast
+number of castMembers
+number of chars
+number of items
+number of lines
+number of menuItems
+number of menus
+number of words
+numToChar
+objectP
+of
+offset
+offset rect
+on
+on enterFrame
+on enterFrame
+on exitFrame
+on idle
+on keyDown
+on keyUp
+on mouseDown
+on mouseUp
+on startMovie
+on stopMovie
+open
+open window
+openDA
+openResFile
+openXlib
+optionDown
+or
+palette of cast
+param
+paramCount
+pass
+pasteClipBoardInto
+pathName
+pause
+pausedAtStart of cast
+pauseState
+perFrameHook
+pi
+picture of cast
+pictureP
+play
+play done
+playFile
+point
+power
+preLoad
+preload of cast
+preLoadCast
+preLoadEventAbort
+preLoadRAM
+previous
+printFrom
+property
+puppet
+puppetPalette
+puppetSound
+puppetSprite
+puppetTempo
+puppetTransition
+purgePriority of cast
+put
+put after
+put before
+put into
+quickTimePresent
+quit
+QUOTE
+ramNeeded
+random
+randomSeed
+rect
+rect of cast
+rect of window
+rect point
+regPoint of cast
+repeat while
+repeat with
+restart
+result
+return
+RETURN
+right of sprite
+rollOver
+romanLingo
+saveMovie
+scoreColor
+script of menuItem
+scriptNum of sprite
+scriptText of cast
+searchCurrentFolder
+searchPath
+selection
+selEnd
+selStart
+set
+setaProp
+setAt
+setCallBack
+setProp
+shiftDown
+short
+showGlobals
+showLocals
+showResFile
+showXlib
+shutDown
+sin
+size of cast
+sort
+sound close
+sound fadeIn
+sound fadeOut
+sound of cast
+sound playFile
+sound stop
+soundBusy
+soundEnabled
+soundLevel
+sourceRect of window
+sprite
+sprite backColor
+sprite blend
+sprite bottom
+sprite castNum
+sprite constraint
+sprite cursor
+sprite editableText
+sprite foreColor
+sprite height
+sprite ink
+sprite intersects
+sprite left
+sprite lineSize
+sprite locH
+sprite locV
+sprite moveableSprite
+sprite right
+sprite scriptNum
+sprite stretch
+sprite top
+sprite trails
+sprite type
+sprite visible
+sprite width
+sprite within
+spriteBox
+sqrt
+stage
+stageBottom
+stageColor
+stageLeft
+stageRight
+stageTop
+startMovie
+starts
+startTime of sprite
+startTimer
+stillDown
+stop
+stopMovie
+stopTime of sprite
+stretch of sprite
+string
+stringP
+switchColorDepth
+symbolP
+TAB
+tan
+tell
+text of cast
+textAlign
+textFont
+textHeight
+textSize
+textStyle
+the
+then
+ticks
+time
+timeoutKeyDown
+timeoutLapsed
+timeoutLength
+timeoutMouse
+timeoutPlay
+timeoutScript
+timer
+title
+titleVisible
+to
+top of sprite
+trace
+traceLoad
+traceLogFile
+trails of sprite
+TRUE
+type of sprite
+union rect
+unLoad
+unLoadCast
+updateMovieEnabled
+updateStage
+value
+video
+visible of sprite
+visible of window
+voidP
+volume of sound
+volume of sprite
+while
+width of cast
+width of sprite
+window
+windowList
+windowType
+with
+within
+word of
+words
+xFactoryList
+zoomBox
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index d8c21d6637..e5e137c881 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -91,7 +91,7 @@ static byte defaultPalette[768] = {
204, 51, 255, 204, 102, 255, 204, 153, 255, 204, 204, 255, 204, 255, 255, 255,
0, 255, 255, 51, 255, 255, 102, 255, 255, 153, 255, 255, 204, 255, 255, 255 };
-void DirectorEngine::testFont() {
+void DirectorEngine::testFontScaling() {
int x = 10;
int y = 10;
int w = 640;
@@ -406,7 +406,9 @@ void Score::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id,
if (stream.size() == 0)
return;
- if (stream.size() < 26) {
+ //TODO: Determine if there really is a minimum size.
+ //This value was too small for Shape Casts.
+ if (stream.size() < 10) {
warning("CAST data id %d is too small", id);
return;
}
diff --git a/engines/dm/dungeonman.cpp b/engines/dm/dungeonman.cpp
index 417f3e31e7..618c61a307 100644
--- a/engines/dm/dungeonman.cpp
+++ b/engines/dm/dungeonman.cpp
@@ -647,8 +647,8 @@ void DungeonMan::loadDungeonFile(Common::InSaveFile *file) {
_dungeonMaps[i]._wallSet = (WallSet)((tmp >> 4) & 0xF);
_dungeonMaps[i]._floorSet = (FloorSet)(tmp & 0xF);
- if (!file)
- delete dunDataStream;
+ //if (!file)
+ // delete dunDataStream;
}
// load column stuff thingy
@@ -769,7 +769,7 @@ void DungeonMan::loadDungeonFile(Common::InSaveFile *file) {
}
if (!file) { // this means that we created a new MemoryReadStream
- delete file;
+ delete dunDataStream;
} // the deletion of the function parameter 'file' happens elsewhere
}
diff --git a/engines/dm/gfx.cpp b/engines/dm/gfx.cpp
index 46d90366cd..ccab619b50 100644
--- a/engines/dm/gfx.cpp
+++ b/engines/dm/gfx.cpp
@@ -167,6 +167,8 @@ DisplayMan::DisplayMan(DMEngine *dmEngine) : _vm(dmEngine) {
for (uint16 i = 0; i < 16; ++i)
_paletteFadeTemporary[i] = 0;
+ _refreshDungeonViewPaleteRequested = false;
+
initConstants();
}
@@ -386,6 +388,181 @@ void DisplayMan::initConstants() {
static byte palChangesFloorOrnD3[16] = {0, 120, 10, 30, 40, 30, 0, 60, 30, 90, 100, 110, 0, 20, 140, 130}; // @ G0213_auc_Graphic558_PaletteChanges_FloorOrnament_D3
static byte palChangesFloorOrnD2[16] = {0, 10, 20, 30, 40, 30, 60, 70, 50, 90, 100, 110, 120, 130, 140, 150}; // @ G0214_auc_Graphic558_PaletteChanges_FloorOrnament_D2
+ static byte const wallOrnamentCoordSets[8][13][6] = { // @ G0205_aaauc_Graphic558_WallOrnamentCoordinateSets
+ /* { X1, X2, Y1, Y2, ByteWidth, Height } */
+ {
+ {80, 83, 41, 45, 8, 5}, /* D3L */
+ {140, 143, 41, 45, 8, 5}, /* D3R */
+ {16, 29, 39, 50, 8, 12}, /* D3L */
+ {107, 120, 39, 50, 8, 12}, /* D3C */
+ {187, 200, 39, 50, 8, 12}, /* D3R */
+ {67, 77, 40, 49, 8, 10}, /* D2L */
+ {146, 156, 40, 49, 8, 10}, /* D2R */
+ {0, 17, 38, 55, 16, 18}, /* D2L */
+ {102, 123, 38, 55, 16, 18}, /* D2C */
+ {206, 223, 38, 55, 16, 18}, /* D2R */
+ {48, 63, 38, 56, 8, 19}, /* D1L */
+ {160, 175, 38, 56, 8, 19}, /* D1R */
+ {96, 127, 36, 63, 16, 28} /* D1C */
+ },
+ {
+ {74, 82, 41, 60, 8, 20}, /* D3L */
+ {141, 149, 41, 60, 8, 20}, /* D3R */
+ {1, 47, 37, 63, 24, 27}, /* D3L */
+ {88, 134, 37, 63, 24, 27}, /* D3C */
+ {171, 217, 37, 63, 24, 27}, /* D3R */
+ {61, 76, 38, 67, 8, 30}, /* D2L */
+ {147, 162, 38, 67, 8, 30}, /* D2R */
+ {0, 43, 37, 73, 32, 37}, /* D2L */
+ {80, 143, 37, 73, 32, 37}, /* D2C */
+ {180, 223, 37, 73, 32, 37}, /* D2R */
+ {32, 63, 36, 83, 16, 48}, /* D1L */
+ {160, 191, 36, 83, 16, 48}, /* D1R */
+ {64, 159, 36, 91, 48, 56} /* D1C */
+ },
+ {
+ {80, 83, 66, 70, 8, 5}, /* D3L */
+ {140, 143, 66, 70, 8, 5}, /* D3R */
+ {16, 29, 64, 75, 8, 12}, /* D3L */
+ {106, 119, 64, 75, 8, 12}, /* D3C */
+ {187, 200, 64, 75, 8, 12}, /* D3R */
+ {67, 77, 74, 83, 8, 10}, /* D2L */
+ {146, 156, 74, 83, 8, 10}, /* D2R */
+ {0, 17, 73, 90, 16, 18}, /* D2L */
+ {100, 121, 73, 90, 16, 18}, /* D2C */
+ {206, 223, 73, 90, 16, 18}, /* D2R */
+ {48, 63, 84, 102, 8, 19}, /* D1L */
+ {160, 175, 84, 102, 8, 19}, /* D1R */
+ {96, 127, 92, 119, 16, 28} /* D1C */
+ },
+ {
+ {80, 83, 49, 53, 8, 5}, /* D3L */
+ {140, 143, 49, 53, 8, 5}, /* D3R */
+ {16, 29, 50, 61, 8, 12}, /* D3L */
+ {106, 119, 50, 61, 8, 12}, /* D3C */
+ {187, 200, 50, 61, 8, 12}, /* D3R */
+ {67, 77, 53, 62, 8, 10}, /* D2L */
+ {146, 156, 53, 62, 8, 10}, /* D2R */
+ {0, 17, 55, 72, 16, 18}, /* D2L */
+ {100, 121, 55, 72, 16, 18}, /* D2C */
+ {206, 223, 55, 72, 16, 18}, /* D2R */
+ {48, 63, 57, 75, 8, 19}, /* D1L */
+ {160, 175, 57, 75, 8, 19}, /* D1R */
+ {96, 127, 64, 91, 16, 28} /* D1C */
+ },
+ {
+ {75, 90, 40, 44, 8, 5}, /* D3L */
+ {133, 148, 40, 44, 8, 5}, /* D3R */
+ {1, 48, 44, 49, 24, 6}, /* D3L */
+ {88, 135, 44, 49, 24, 6}, /* D3C */
+ {171, 218, 44, 49, 24, 6}, /* D3R */
+ {60, 77, 40, 46, 16, 7}, /* D2L */
+ {146, 163, 40, 46, 16, 7}, /* D2R */
+ {0, 35, 43, 50, 32, 8}, /* D2L */
+ {80, 143, 43, 50, 32, 8}, /* D2C */
+ {184, 223, 43, 50, 32, 8}, /* D2R */
+ {32, 63, 41, 52, 16, 12}, /* D1L */
+ {160, 191, 41, 52, 16, 12}, /* D1R */
+ {64, 159, 41, 52, 48, 12} /* D1C */
+ },
+ {
+ {78, 85, 36, 51, 8, 16}, /* D3L */
+ {138, 145, 36, 51, 8, 16}, /* D3R */
+ {10, 41, 34, 53, 16, 20}, /* D3L */
+ {98, 129, 34, 53, 16, 20}, /* D3C */
+ {179, 210, 34, 53, 16, 20}, /* D3R */
+ {66, 75, 34, 56, 8, 23}, /* D2L */
+ {148, 157, 34, 56, 8, 23}, /* D2R */
+ {0, 26, 33, 61, 24, 29}, /* D2L */
+ {91, 133, 33, 61, 24, 29}, /* D2C */
+ {194, 223, 33, 61, 24, 29}, /* D2R */
+ {41, 56, 31, 65, 8, 35}, /* D1L */
+ {167, 182, 31, 65, 8, 35}, /* D1R */
+ {80, 143, 29, 71, 32, 43} /* D1C */
+ },
+ {
+ {75, 82, 25, 75, 8, 51}, /* D3L */
+ {142, 149, 25, 75, 8, 51}, /* D3R */
+ {12, 60, 25, 75, 32, 51}, /* D3L */
+ {88, 136, 25, 75, 32, 51}, /* D3C */
+ {163, 211, 25, 75, 32, 51}, /* D3R */
+ {64, 73, 20, 90, 8, 71}, /* D2L */
+ {150, 159, 20, 90, 8, 71}, /* D2R */
+ {0, 38, 20, 90, 32, 71}, /* D2L */
+ {82, 142, 20, 90, 32, 71}, /* D2C */
+ {184, 223, 20, 90, 32, 71}, /* D2R */
+ {41, 56, 9, 119, 8, 111}, /* D1L */
+ {169, 184, 9, 119, 8, 111}, /* D1R */
+ {64, 159, 9, 119, 48, 111} /* D1C */
+ },
+ {
+ {74, 85, 25, 75, 8, 51}, /* D3L */
+ {137, 149, 25, 75, 8, 51}, /* D3R */
+ {0, 75, 25, 75, 40, 51}, /* D3L Atari ST: { 0, 83, 25, 75, 48, 51 } */
+ {74, 149, 25, 75, 40, 51}, /* D3C Atari ST: { 74, 149, 25, 75, 48, 51 } */
+ {148, 223, 25, 75, 40, 51}, /* D3R Atari ST: { 139, 223, 25, 75, 48, 51 } */
+ {60, 77, 20, 90, 16, 71}, /* D2L */
+ {146, 163, 20, 90, 16, 71}, /* D2R */
+ {0, 74, 20, 90, 56, 71}, /* D2L */
+ {60, 163, 20, 90, 56, 71}, /* D2C */
+ {149, 223, 20, 90, 56, 71}, /* D2R */
+ {32, 63, 9, 119, 16, 111}, /* D1L */
+ {160, 191, 9, 119, 16, 111}, /* D1R */
+ {32, 191, 9, 119, 80, 111} /* D1C */
+ }
+ };
+
+ static uint16 const doorOrnCoordSets[4][3][6] = { // @ G0207_aaauc_Graphic558_DoorOrnamentCoordinateSets
+ /* { X1, X2, Y1, Y2, ByteWidth, Height } */
+ {
+ {17, 31, 8, 17, 8, 10}, /* D3LCR */
+ {22, 42, 11, 23, 16, 13}, /* D2LCR */
+ {32, 63, 13, 31, 16, 19} /* D1LCR */
+ },
+ {
+ {0, 47, 0, 40, 24, 41}, /* D3LCR */
+ {0, 63, 0, 60, 32, 61}, /* D2LCR */
+ {0, 95, 0, 87, 48, 88} /* D1LCR */
+ },
+ {
+ {17, 31, 15, 24, 8, 10}, /* D3LCR */
+ {22, 42, 22, 34, 16, 13}, /* D2LCR */
+ {32, 63, 31, 49, 16, 19} /* D1LCR */
+ },
+ {
+ {23, 35, 31, 39, 8, 9}, /* D3LCR */
+ {30, 48, 41, 52, 16, 12}, /* D2LCR */
+ {44, 75, 61, 79, 16, 19} /* D1LCR */
+ }
+ };
+
+ static byte const doorButtonCoordSet[1] = {0}; // @ G0197_auc_Graphic558_DoorButtonCoordinateSet
+ static uint16 const doorButtonCoordSets[1][4][6] = { // @ G0208_aaauc_Graphic558_DoorButtonCoordinateSets
+ // X1, X2, Y1, Y2, ByteWidth, Height
+ { {199, 204, 41, 44, 8, 4}, /* D3R */
+ {136, 141, 41, 44, 8, 4}, /* D3C */
+ {144, 155, 42, 47, 8, 6}, /* D2C */
+ {160, 175, 44, 52, 8, 9} /* D1C */
+ }
+ };
+
+ _doorButtonCoordSet[0] = doorButtonCoordSet[0];
+
+ for(int a = 0; a < 1; ++a)
+ for(int b = 0; b < 4; ++b)
+ for(int c = 0; c < 6; ++c)
+ _doorButtonCoordSets[a][b][c] = doorButtonCoordSets[a][b][c];
+
+ for(int a = 0; a < 8; ++a)
+ for(int b = 0; b < 13; ++b)
+ for(int c = 0; c < 6; ++c)
+ _wallOrnamentCoordSets[a][b][c] = wallOrnamentCoordSets[a][b][c];
+
+ for(int a = 0; a < 4; ++a)
+ for(int b = 0; b < 3; ++b)
+ for(int c = 0; c < 6; ++c)
+ _doorOrnCoordSets[a][b][c] = doorOrnCoordSets[a][b][c];
+
_frameWallD3R2 = Frame(208, 223, 25, 73, 8, 49, 0, 0); // @ G0712_s_Graphic558_Frame_Wall_D3R2
_doorFrameLeftD1C = Frame(43, 74, 14, 107, 16, 94, 0, 0); // @ G0170_s_Graphic558_Frame_DoorFrameLeft_D1C
@@ -446,6 +623,7 @@ DisplayMan::~DisplayMan() {
delete[] _packedItemPos;
delete[] _packedBitmaps;
delete[] _bitmapScreen;
+ delete[] _tmpBitmap;
if (_bitmaps) {
delete[] _bitmaps[0];
delete[] _bitmaps;
@@ -520,12 +698,13 @@ void DisplayMan::initializeGraphicData() {
_bitmapWallSetDoorFrameLeftD3C = new byte[32 * 44];
_bitmapWallSetDoorFrameLeftD2C = new byte[48 * 65];
_bitmapWallSetDoorFrameLeftD1C = new byte[32 * 94];
- _bitmapWallSetDoorFrameRightD1C = new byte[32 * 94];
+ _bitmapWallSetDoorFrameRightD1C = new byte[32 * 94]();
_bitmapWallSetDoorFrameFront = new byte[32 * 123];
- _bitmapViewport = new byte[224 * 136];
+ _bitmapViewport = new byte[224 * 136]();
- if (!_derivedBitmapByteCount)
- _derivedBitmapByteCount = new uint16[k730_DerivedBitmapMaximumCount];
+ if (!_derivedBitmapByteCount) {
+ _derivedBitmapByteCount = new uint16[k730_DerivedBitmapMaximumCount];
+ }
if (!_derivedBitmaps) {
_derivedBitmaps = new byte *[k730_DerivedBitmapMaximumCount];
for (uint16 i = 0; i < k730_DerivedBitmapMaximumCount; ++i)
@@ -753,16 +932,6 @@ void DisplayMan::drawDoorFrameBitmapFlippedHorizontally(byte *bitmap, Frame *fra
}
void DisplayMan::drawDoorButton(int16 doorButtonOrdinal, DoorButton doorButton) {
- static byte doorButtonCoordSet[1] = {0}; // @ G0197_auc_Graphic558_DoorButtonCoordinateSet
- static uint16 doorButtonCoordSets[1][4][6] = { // @ G0208_aaauc_Graphic558_DoorButtonCoordinateSets
- // X1, X2, Y1, Y2, ByteWidth, Height
- { {199, 204, 41, 44, 8, 4}, /* D3R */
- {136, 141, 41, 44, 8, 4}, /* D3C */
- {144, 155, 42, 47, 8, 6}, /* D2C */
- {160, 175, 44, 52, 8, 9} /* D1C */
- }
- };
-
DungeonMan &dungeon = *_vm->_dungeonMan;
if (doorButtonOrdinal) {
@@ -771,8 +940,8 @@ void DisplayMan::drawDoorButton(int16 doorButtonOrdinal, DoorButton doorButton)
assert(doorButtonOrdinal == 0);
int16 nativeBitmapIndex = doorButtonOrdinal + kDMGraphicIdxFirstDoorButton;
- int coordSet = doorButtonCoordSet[doorButtonOrdinal];
- uint16 *coordSetRedEagle = doorButtonCoordSets[coordSet][doorButton];
+ int coordSet = _doorButtonCoordSet[doorButtonOrdinal];
+ uint16 *coordSetRedEagle = _doorButtonCoordSets[coordSet][doorButton];
byte *bitmap = nullptr;
if (doorButton == kDMDoorButtonD1C) {
@@ -785,7 +954,7 @@ void DisplayMan::drawDoorButton(int16 doorButtonOrdinal, DoorButton doorButton)
} else {
doorButtonOrdinal = kDMDerivedBitmapFirstDoorButton + (doorButtonOrdinal * 2) + ((doorButton != kDMDoorButtonD3R) ? 0 : (int16)doorButton - 1);
if (!isDerivedBitmapInCache(doorButtonOrdinal)) {
- uint16 *coordSetBlueGoat = doorButtonCoordSets[coordSet][kDMDoorButtonD1C];
+ uint16 *coordSetBlueGoat = _doorButtonCoordSets[coordSet][kDMDoorButtonD1C];
byte *bitmapNative = getNativeBitmapOrGraphic(nativeBitmapIndex);
blitToBitmapShrinkWithPalChange(bitmapNative, getDerivedBitmap(doorButtonOrdinal),
coordSetBlueGoat[4] << 1, coordSetBlueGoat[5],
@@ -843,7 +1012,7 @@ void DisplayMan::loadIntoBitmap(uint16 index, byte *destBitmap) {
destBitmap[k++] = nibble2;
} else if (nibble1 == 0xB) {
uint8 byte1 = data[nextByteIndex++];
- for (int j = 0; j < byte1 + 1; ++j, ++k)
+for (int j = 0; j < byte1 + 1; ++j, ++k)
destBitmap[k] = destBitmap[k - width];
destBitmap[k++] = nibble2;
} else if (nibble1 == 0xF) {
@@ -1148,29 +1317,7 @@ void DisplayMan::drawDoor(uint16 doorThingIndex, DoorState doorState, int16 *doo
void DisplayMan::drawDoorOrnament(int16 doorOrnOrdinal, DoorOrnament doorOrnament) {
static byte palChangesDoorOrnD3[16] = {0, 120, 10, 30, 40, 30, 0, 60, 30, 90, 100, 110, 0, 20, 0, 130}; // @ G0200_auc_Graphic558_PaletteChanges_DoorOrnament_D3
static byte palChangesDoorOrnd2[16] = {0, 10, 20, 30, 40, 30, 60, 70, 50, 90, 100, 110, 120, 130, 140, 150}; // @ G0201_auc_Graphic558_PaletteChanges_DoorOrnament_D2
- static uint16 doorOrnCoordSets[4][3][6] = { // @ G0207_aaauc_Graphic558_DoorOrnamentCoordinateSets
- /* { X1, X2, Y1, Y2, ByteWidth, Height } */
- {
- {17, 31, 8, 17, 8, 10}, /* D3LCR */
- {22, 42, 11, 23, 16, 13}, /* D2LCR */
- {32, 63, 13, 31, 16, 19} /* D1LCR */
- },
- {
- {0, 47, 0, 40, 24, 41}, /* D3LCR */
- {0, 63, 0, 60, 32, 61}, /* D2LCR */
- {0, 95, 0, 87, 48, 88} /* D1LCR */
- },
- {
- {17, 31, 15, 24, 8, 10}, /* D3LCR */
- {22, 42, 22, 34, 16, 13}, /* D2LCR */
- {32, 63, 31, 49, 16, 19} /* D1LCR */
- },
- {
- {23, 35, 31, 39, 8, 9}, /* D3LCR */
- {30, 48, 41, 52, 16, 12}, /* D2LCR */
- {44, 75, 61, 79, 16, 19} /* D1LCR */
- }
- };
+
int16 height = doorOrnOrdinal;
@@ -1182,7 +1329,7 @@ void DisplayMan::drawDoorOrnament(int16 doorOrnOrdinal, DoorOrnament doorOrnamen
int16 nativeBitmapIndex = _currMapDoorOrnInfo[height].nativeIndice;
int16 coordSetGreenToad = _currMapDoorOrnInfo[height].coordinateSet;
- uint16 *coordSetOrangeElk = &doorOrnCoordSets[coordSetGreenToad][doorOrnament][0];
+ uint16 *coordSetOrangeElk = &_doorOrnCoordSets[coordSetGreenToad][doorOrnament][0];
byte *blitBitmap;
if (doorOrnament == kDMDoorOrnamentD1LCR) {
blitBitmap = getNativeBitmapOrGraphic(nativeBitmapIndex);
@@ -1191,7 +1338,7 @@ void DisplayMan::drawDoorOrnament(int16 doorOrnOrdinal, DoorOrnament doorOrnamen
} else {
height = kDMDerivedBitmapFirstDoorOrnamentD3 + (height * 2) + doorOrnament;
if (!isDerivedBitmapInCache(height)) {
- uint16 *coordSetRedEagle = &doorOrnCoordSets[coordSetGreenToad][kDMDoorOrnamentD1LCR][0];
+ uint16 *coordSetRedEagle = &_doorOrnCoordSets[coordSetGreenToad][kDMDoorOrnamentD1LCR][0];
byte *nativeBitmap = getNativeBitmapOrGraphic(nativeBitmapIndex);
blitToBitmapShrinkWithPalChange(nativeBitmap, getDerivedBitmap(height), coordSetRedEagle[4] << 1, coordSetRedEagle[5], coordSetOrangeElk[1] - coordSetOrangeElk[0] + 1, coordSetOrangeElk[5], (doorOrnament == kDMDoorOrnamentD3LCR) ? palChangesDoorOrnD3 : palChangesDoorOrnd2);
addDerivedBitmap(height);
@@ -2438,9 +2585,9 @@ void DisplayMan::loadCurrentMapGraphics() {
_currMapViAltarIndex = -1;
for (int16 ornamentIndex = 0; ornamentIndex <= currMap._wallOrnCount; ornamentIndex++) {
- int16 greenOrn = _currMapWallOrnIndices[ornamentIndex];
- int16 counter = k121_FirstWallOrn + greenOrn * 2; /* Each wall ornament has 2 graphics */
- _currMapWallOrnInfo[ornamentIndex].nativeIndice = counter;
+ uint16 greenOrn = _currMapWallOrnIndices[ornamentIndex];
+ /* Each wall ornament has 2 graphics */
+ _currMapWallOrnInfo[ornamentIndex].nativeIndice = k121_FirstWallOrn + greenOrn * 2;
for (int16 ornamentCounter = 0; ornamentCounter < k3_AlcoveOrnCount; ornamentCounter++) {
if (greenOrn == g192_AlcoveOrnIndices[ornamentCounter]) {
_currMapAlcoveOrnIndices[alcoveCount++] = ornamentIndex;
@@ -2454,8 +2601,18 @@ void DisplayMan::loadCurrentMapGraphics() {
}
_currMapWallOrnInfo[ornamentIndex].coordinateSet = g194_WallOrnCoordSetIndices[greenOrn];
- }
+ byte *coords = _wallOrnamentCoordSets[_currMapWallOrnInfo[ornamentIndex].coordinateSet][0];
+
+ for (uint16 counter = kDMDerivedBitmapFirstWallOrnament + (ornamentIndex * 4),
+ index = counter + 4;
+ counter < index;
+ coords += ((index - counter) == 2) ? 18 : 12) {
+
+ releaseBlock(counter | 0x8000);
+ _derivedBitmapByteCount[counter++] = coords[4] * coords[5];
+ }
+ }
for (uint16 i = 0; i < currMap._floorOrnCount; ++i) {
uint16 ornIndice = _currMapFloorOrnIndices[i];
@@ -2464,11 +2621,27 @@ void DisplayMan::loadCurrentMapGraphics() {
_currMapFloorOrnInfo[i].coordinateSet = floorOrnCoordSetIndices[ornIndice];
}
+
+
for (uint16 i = 0; i < currMap._doorOrnCount; ++i) {
uint16 ornIndice = _currMapDoorOrnIndices[i];
- uint16 nativeIndice = k303_FirstDoorOrn + ornIndice;
- _currMapDoorOrnInfo[i].nativeIndice = nativeIndice;
+ _currMapDoorOrnInfo[i].nativeIndice = k303_FirstDoorOrn + ornIndice;
_currMapDoorOrnInfo[i].coordinateSet = doorOrnCoordIndices[ornIndice];
+
+ uint16 *coords = _doorOrnCoordSets[_currMapDoorOrnInfo[i].coordinateSet][0];
+
+ for (uint16 nativeIndice = kDMDerivedBitmapFirstDoorOrnamentD3 + i * 2,
+ index = nativeIndice + 2; nativeIndice < index; coords += 6) {
+ releaseBlock(nativeIndice | 0x8000);
+ _derivedBitmapByteCount[nativeIndice++] = coords[4] * coords[5];
+ }
+ }
+
+ for (uint16 index = kDMDerivedBitmapFirstDoorButton, counter = 0; counter < k1_DoorButtonCount; counter++) {
+ uint16 *coords = _doorButtonCoordSets[_doorButtonCoordSet[counter]][1];
+ _derivedBitmapByteCount[index++] = coords[4] * coords[5];
+ coords += 6;
+ _derivedBitmapByteCount[index++] = coords[4] * coords[5];
}
applyCreatureReplColors(9, 8);
@@ -2560,129 +2733,6 @@ bool DisplayMan::isDrawnWallOrnAnAlcove(int16 wallOrnOrd, ViewWall viewWallIndex
46, 57, 68 /* D1L Right, D1R Left */
};
- static byte wallOrnamentCoordSets[8][13][6] = { // @ G0205_aaauc_Graphic558_WallOrnamentCoordinateSets
- /* { X1, X2, Y1, Y2, ByteWidth, Height } */
- {
- {80, 83, 41, 45, 8, 5}, /* D3L */
- {140, 143, 41, 45, 8, 5}, /* D3R */
- {16, 29, 39, 50, 8, 12}, /* D3L */
- {107, 120, 39, 50, 8, 12}, /* D3C */
- {187, 200, 39, 50, 8, 12}, /* D3R */
- {67, 77, 40, 49, 8, 10}, /* D2L */
- {146, 156, 40, 49, 8, 10}, /* D2R */
- {0, 17, 38, 55, 16, 18}, /* D2L */
- {102, 123, 38, 55, 16, 18}, /* D2C */
- {206, 223, 38, 55, 16, 18}, /* D2R */
- {48, 63, 38, 56, 8, 19}, /* D1L */
- {160, 175, 38, 56, 8, 19}, /* D1R */
- {96, 127, 36, 63, 16, 28} /* D1C */
- },
- {
- {74, 82, 41, 60, 8, 20}, /* D3L */
- {141, 149, 41, 60, 8, 20}, /* D3R */
- {1, 47, 37, 63, 24, 27}, /* D3L */
- {88, 134, 37, 63, 24, 27}, /* D3C */
- {171, 217, 37, 63, 24, 27}, /* D3R */
- {61, 76, 38, 67, 8, 30}, /* D2L */
- {147, 162, 38, 67, 8, 30}, /* D2R */
- {0, 43, 37, 73, 32, 37}, /* D2L */
- {80, 143, 37, 73, 32, 37}, /* D2C */
- {180, 223, 37, 73, 32, 37}, /* D2R */
- {32, 63, 36, 83, 16, 48}, /* D1L */
- {160, 191, 36, 83, 16, 48}, /* D1R */
- {64, 159, 36, 91, 48, 56} /* D1C */
- },
- {
- {80, 83, 66, 70, 8, 5}, /* D3L */
- {140, 143, 66, 70, 8, 5}, /* D3R */
- {16, 29, 64, 75, 8, 12}, /* D3L */
- {106, 119, 64, 75, 8, 12}, /* D3C */
- {187, 200, 64, 75, 8, 12}, /* D3R */
- {67, 77, 74, 83, 8, 10}, /* D2L */
- {146, 156, 74, 83, 8, 10}, /* D2R */
- {0, 17, 73, 90, 16, 18}, /* D2L */
- {100, 121, 73, 90, 16, 18}, /* D2C */
- {206, 223, 73, 90, 16, 18}, /* D2R */
- {48, 63, 84, 102, 8, 19}, /* D1L */
- {160, 175, 84, 102, 8, 19}, /* D1R */
- {96, 127, 92, 119, 16, 28} /* D1C */
- },
- {
- {80, 83, 49, 53, 8, 5}, /* D3L */
- {140, 143, 49, 53, 8, 5}, /* D3R */
- {16, 29, 50, 61, 8, 12}, /* D3L */
- {106, 119, 50, 61, 8, 12}, /* D3C */
- {187, 200, 50, 61, 8, 12}, /* D3R */
- {67, 77, 53, 62, 8, 10}, /* D2L */
- {146, 156, 53, 62, 8, 10}, /* D2R */
- {0, 17, 55, 72, 16, 18}, /* D2L */
- {100, 121, 55, 72, 16, 18}, /* D2C */
- {206, 223, 55, 72, 16, 18}, /* D2R */
- {48, 63, 57, 75, 8, 19}, /* D1L */
- {160, 175, 57, 75, 8, 19}, /* D1R */
- {96, 127, 64, 91, 16, 28} /* D1C */
- },
- {
- {75, 90, 40, 44, 8, 5}, /* D3L */
- {133, 148, 40, 44, 8, 5}, /* D3R */
- {1, 48, 44, 49, 24, 6}, /* D3L */
- {88, 135, 44, 49, 24, 6}, /* D3C */
- {171, 218, 44, 49, 24, 6}, /* D3R */
- {60, 77, 40, 46, 16, 7}, /* D2L */
- {146, 163, 40, 46, 16, 7}, /* D2R */
- {0, 35, 43, 50, 32, 8}, /* D2L */
- {80, 143, 43, 50, 32, 8}, /* D2C */
- {184, 223, 43, 50, 32, 8}, /* D2R */
- {32, 63, 41, 52, 16, 12}, /* D1L */
- {160, 191, 41, 52, 16, 12}, /* D1R */
- {64, 159, 41, 52, 48, 12} /* D1C */
- },
- {
- {78, 85, 36, 51, 8, 16}, /* D3L */
- {138, 145, 36, 51, 8, 16}, /* D3R */
- {10, 41, 34, 53, 16, 20}, /* D3L */
- {98, 129, 34, 53, 16, 20}, /* D3C */
- {179, 210, 34, 53, 16, 20}, /* D3R */
- {66, 75, 34, 56, 8, 23}, /* D2L */
- {148, 157, 34, 56, 8, 23}, /* D2R */
- {0, 26, 33, 61, 24, 29}, /* D2L */
- {91, 133, 33, 61, 24, 29}, /* D2C */
- {194, 223, 33, 61, 24, 29}, /* D2R */
- {41, 56, 31, 65, 8, 35}, /* D1L */
- {167, 182, 31, 65, 8, 35}, /* D1R */
- {80, 143, 29, 71, 32, 43} /* D1C */
- },
- {
- {75, 82, 25, 75, 8, 51}, /* D3L */
- {142, 149, 25, 75, 8, 51}, /* D3R */
- {12, 60, 25, 75, 32, 51}, /* D3L */
- {88, 136, 25, 75, 32, 51}, /* D3C */
- {163, 211, 25, 75, 32, 51}, /* D3R */
- {64, 73, 20, 90, 8, 71}, /* D2L */
- {150, 159, 20, 90, 8, 71}, /* D2R */
- {0, 38, 20, 90, 32, 71}, /* D2L */
- {82, 142, 20, 90, 32, 71}, /* D2C */
- {184, 223, 20, 90, 32, 71}, /* D2R */
- {41, 56, 9, 119, 8, 111}, /* D1L */
- {169, 184, 9, 119, 8, 111}, /* D1R */
- {64, 159, 9, 119, 48, 111} /* D1C */
- },
- {
- {74, 85, 25, 75, 8, 51}, /* D3L */
- {137, 149, 25, 75, 8, 51}, /* D3R */
- {0, 75, 25, 75, 40, 51}, /* D3L Atari ST: { 0, 83, 25, 75, 48, 51 } */
- {74, 149, 25, 75, 40, 51}, /* D3C Atari ST: { 74, 149, 25, 75, 48, 51 } */
- {148, 223, 25, 75, 40, 51}, /* D3R Atari ST: { 139, 223, 25, 75, 48, 51 } */
- {60, 77, 20, 90, 16, 71}, /* D2L */
- {146, 163, 20, 90, 16, 71}, /* D2R */
- {0, 74, 20, 90, 56, 71}, /* D2L */
- {60, 163, 20, 90, 56, 71}, /* D2C */
- {149, 223, 20, 90, 56, 71}, /* D2R */
- {32, 63, 9, 119, 16, 111}, /* D1L */
- {160, 191, 9, 119, 16, 111}, /* D1R */
- {32, 191, 9, 119, 80, 111} /* D1C */
- }
- };
static Box boxChampionPortraitOnWall = Box(96, 127, 35, 63); // G0109_s_Graphic558_Box_ChampionPortraitOnWall
@@ -2693,7 +2743,7 @@ bool DisplayMan::isDrawnWallOrnAnAlcove(int16 wallOrnOrd, ViewWall viewWallIndex
int16 wallOrnamentIndex = wallOrnOrd;
int16 ornNativeBitmapIndex = _currMapWallOrnInfo[wallOrnamentIndex].nativeIndice;
int16 wallOrnamentCoordinateSetIndex = _currMapWallOrnInfo[wallOrnamentIndex].coordinateSet;
- byte *ornCoordSet = wallOrnamentCoordSets[wallOrnamentCoordinateSetIndex][viewWallIndex];
+ byte *ornCoordSet = _wallOrnamentCoordSets[wallOrnamentCoordinateSetIndex][viewWallIndex];
DungeonMan &dungeon = *_vm->_dungeonMan;
@@ -2755,12 +2805,12 @@ bool DisplayMan::isDrawnWallOrnAnAlcove(int16 wallOrnOrd, ViewWall viewWallIndex
int16 coordinateSetOffset = 0;
bool flipHorizontal = (viewWallIndex == kDMViewWallD2RLeft) || (viewWallIndex == kDMViewWallD3RLeft);
if (flipHorizontal)
- ornBlitBitmap = wallOrnamentCoordSets[wallOrnamentCoordinateSetIndex][kDMViewWallD1RLeft];
+ ornBlitBitmap = _wallOrnamentCoordSets[wallOrnamentCoordinateSetIndex][kDMViewWallD1RLeft];
else if ((viewWallIndex == kDMViewWallD2LRight) || (viewWallIndex == kDMViewWallD3LRight))
- ornBlitBitmap = wallOrnamentCoordSets[wallOrnamentCoordinateSetIndex][kDMViewWallD1LRight];
+ ornBlitBitmap = _wallOrnamentCoordSets[wallOrnamentCoordinateSetIndex][kDMViewWallD1LRight];
else {
ornNativeBitmapIndex++;
- ornBlitBitmap = wallOrnamentCoordSets[wallOrnamentCoordinateSetIndex][kDMViewWallD1CFront];
+ ornBlitBitmap = _wallOrnamentCoordSets[wallOrnamentCoordinateSetIndex][kDMViewWallD1CFront];
if (viewWallIndex == kDMViewWallD2LFront)
coordinateSetOffset = 6;
else if (viewWallIndex == kDMViewWallD2RFront)
@@ -3844,7 +3894,7 @@ uint16 DisplayMan::getHorizontalOffsetM22(uint16 val) {
bool DisplayMan::isDerivedBitmapInCache(int16 derivedBitmapIndex) {
if (_derivedBitmaps[derivedBitmapIndex] == nullptr) {
// * 2, because the original uses 4 bits instead of 8 bits to store a pixel
- _derivedBitmaps[derivedBitmapIndex] = new byte[_derivedBitmapByteCount[derivedBitmapIndex] * 2];
+ _derivedBitmaps[derivedBitmapIndex] = new byte[_derivedBitmapByteCount[derivedBitmapIndex] * 2 + 16];
return false;
}
diff --git a/engines/dm/gfx.h b/engines/dm/gfx.h
index 8c58ed8cbf..c2ccea5626 100644
--- a/engines/dm/gfx.h
+++ b/engines/dm/gfx.h
@@ -671,6 +671,11 @@ private:
bool _useFlippedWallAndFootprintsBitmap; // @ G0076_B_UseFlippedWallAndFootprintsBitmaps
+ byte _wallOrnamentCoordSets[8][13][6]; // @ G0205_aaauc_Graphic558_WallOrnamentCoordinateSets
+ uint16 _doorOrnCoordSets[4][3][6]; // @ G0207_aaauc_Graphic558_DoorOrnamentCoordinateSet
+ byte _doorButtonCoordSet[1]; // @ G0197_auc_Graphic558_DoorButtonCoordinateSet
+ uint16 _doorButtonCoordSets[1][4][6]; // @ G0208_aaauc_Graphic558_DoorButtonCoordinate
+
int16 _doorNativeBitmapIndexFrontD3LCR[2]; // @ G0693_ai_DoorNativeBitmapIndex_Front_D3LCR
int16 _doorNativeBitmapIndexFrontD2LCR[2]; // @ G0694_ai_DoorNativeBitmapIndex_Front_D2LCR
int16 _doorNativeBitmapIndexFrontD1LCR[2]; // @ G0695_ai_DoorNativeBitmapIndex_Front_D1LCR
diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h
index 90b9412b9a..52fb703e13 100644
--- a/engines/sci/detection_tables.h
+++ b/engines/sci/detection_tables.h
@@ -4233,6 +4233,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 4 1.052 - English DOS Floppy (supplied by markcoolio in bug report #2723865)
+ // Also matches floppies labeled "VER#1.1 INT#4.29.91" (tsoliman)
// Executable scanning reports "1.000.753"
// SCI interpreter version 1.000.200 (just a guess)
{"sq4", "", {
diff --git a/engines/sci/engine/file.cpp b/engines/sci/engine/file.cpp
index 75aa4fa2ca..f4bd437d3e 100644
--- a/engines/sci/engine/file.cpp
+++ b/engines/sci/engine/file.cpp
@@ -201,6 +201,9 @@ reg_t file_open(EngineState *s, const Common::String &filename, kFileOpenMode mo
isCompressed = false;
break;
#ifdef ENABLE_SCI32
+ // Hoyle5 has no save games, but creates very simple text-based game options
+ // files that do not need to be compressed
+ case GID_HOYLE5:
// Phantasmagoria game scripts create their own save files, so they are
// interoperable with the original interpreter just by renaming them as long
// as they are not compressed. They are also never larger than a couple
diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp
index 1845ecaac5..c7732c6b15 100644
--- a/engines/sci/engine/kernel.cpp
+++ b/engines/sci/engine/kernel.cpp
@@ -905,6 +905,11 @@ void Kernel::loadKernelNames(GameFeatures *features) {
} else {
// Normal SCI2.1 kernel table
_kernelNames = Common::StringArray(sci21_default_knames, kKernelEntriesSci21);
+
+ // Used by script patcher to remove CPU spinning on kGetTime
+ if (g_sci->getGameId() == GID_HOYLE5) {
+ _kernelNames[0x4f] = "Wait";
+ }
}
break;
diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h
index ac4987e603..af8e2d8f70 100644
--- a/engines/sci/engine/kernel_tables.h
+++ b/engines/sci/engine/kernel_tables.h
@@ -225,7 +225,7 @@ static const SciKernelMapSubEntry kDoAudio_subops[] = {
{ SIG_SCI32, 2, MAP_CALL(DoAudioPlay), "(i)(i)(i)(i)(i)(i)(i)", NULL },
{ SIG_SCI32, 3, MAP_CALL(DoAudioStop), "(i)(i)(i)(i)(i)", NULL },
{ SIG_SCI32, 4, MAP_CALL(DoAudioPause), "(i)(i)(i)(i)(i)", NULL },
- { SIG_SCI32, 5, MAP_CALL(DoAudioResume), "(i)(i)(i)(i)(i)", NULL },
+ { SIG_SCI32, 5, MAP_CALL(DoAudioResume), "(i)(i)(i)(i)(i)", kDoAudioResume_workarounds },
{ SIG_SCI32, 6, MAP_CALL(DoAudioPosition), "(i)(i)(i)(i)(i)", NULL },
{ SIG_SCI32, 7, MAP_CALL(DoAudioRate), "(i)", NULL },
{ SIG_SCI32, 8, MAP_CALL(DoAudioVolume), "(i)(i)(i)(i)(i)(i)", NULL },
@@ -930,6 +930,8 @@ static SciKernelMapEntry s_kernelMap[] = {
{ MAP_DUMMY(PointSize), SIG_EVERYWHERE, "(.*)", NULL, NULL },
// SCI2.1 Kernel Functions
+ { "CheckCDisc", kCheckCD, SIG_SCI21EARLY, SIGFOR_ALL, "(i)", NULL, NULL },
+ { "GetSaveCDisc", kGetSavedCD, SIG_SCI21EARLY, SIGFOR_ALL, "", NULL, NULL },
{ MAP_CALL(CD), SIG_SINCE_SCI21MID, SIGFOR_ALL, "(.*)", kCD_subops, NULL },
{ MAP_CALL(IsOnMe), SIG_EVERYWHERE, "iioi", NULL, NULL },
{ MAP_CALL(List), SIG_SINCE_SCI21, SIGFOR_ALL, "(.*)", kList_subops, NULL },
@@ -993,8 +995,6 @@ static SciKernelMapEntry s_kernelMap[] = {
// Unused / debug functions in the in-between SCI2.1 interpreters
{ MAP_DUMMY(PreloadResource), SIG_EVERYWHERE, "(.*)", NULL, NULL },
- { MAP_DUMMY(CheckCDisc), SIG_EVERYWHERE, "(.*)", NULL, NULL },
- { MAP_DUMMY(GetSaveCDisc), SIG_EVERYWHERE, "(.*)", NULL, NULL },
{ MAP_DUMMY(TestPoly), SIG_EVERYWHERE, "(.*)", NULL, NULL },
// Used by Phantasmagoria 1, script 64981 (used in the chase scene)
@@ -1408,7 +1408,7 @@ static const char *const sci21_default_knames[] = {
/*0x4c*/ "ScrollWindow", // Dummy in SCI3
/*0x4d*/ "Dummy",
/*0x4e*/ "Dummy",
- /*0x4f*/ "Dummy",
+ /*0x4f*/ "Dummy", // Replaced with kWait for Hoyle5 in ScummVM
/*0x50*/ "GetEvent",
/*0x51*/ "GlobalToLocal",
/*0x52*/ "LocalToGlobal",
diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp
index 7bc3c2d212..49ad4caedb 100644
--- a/engines/sci/engine/kfile.cpp
+++ b/engines/sci/engine/kfile.cpp
@@ -220,8 +220,9 @@ reg_t kCheckCD(EngineState *s, int argc, reg_t *argv) {
}
reg_t kGetSavedCD(EngineState *s, int argc, reg_t *argv) {
- // TODO: This is wrong, CD number needs to be available prior to
- // the save game being loaded
+ // Normally this code would read the CD number from the currently loaded
+ // save game file, but since we don't have one of those, just return the
+ // disc number from the resource manager
return make_reg(0, g_sci->getResMan()->getCurrentDiscNo());
}
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp
index b2d66d0170..c542be7ef2 100644
--- a/engines/sci/engine/script_patches.cpp
+++ b/engines/sci/engine/script_patches.cpp
@@ -699,6 +699,43 @@ static const SciScriptPatcherEntry freddypharkasSignatures[] = {
#ifdef ENABLE_SCI32
#pragma mark -
+#pragma mark Hoyle 5
+
+// Several scripts in Hoyle5 contain a subroutine which spins on kGetTime until
+// a certain number of ticks elapse. Since this wastes CPU and makes ScummVM
+// unresponsive, the kWait kernel function (which was removed in SCI2) is
+// reintroduced at 0x4f in kernel.cpp only for Hoyle5, and the spin subroutines
+// are patched here to call that function instead.
+// Applies to at least: English Demo
+static const uint16 hoyle5SignatureSpinLoop[] = {
+ SIG_MAGICDWORD,
+ 0x76, // push0
+ 0x43, 0x79, SIG_UINT16(0x00), // callk GetTime, $0
+ 0x36, // push
+ 0x87, 0x01, // lap param[1]
+ 0x02, // add
+ 0xa5, 0x00, // sat temp[0]
+ SIG_END
+};
+
+static const uint16 hoyle5PatchSpinLoop[] = {
+ 0x78, // push1
+ 0x8f, 0x01, // lsp param[1]
+ 0x43, 0x4f, PATCH_UINT16(0x02), // callk Wait, $2
+ 0x48, // ret
+ PATCH_END
+};
+
+// script, description, signature patch
+static const SciScriptPatcherEntry hoyle5Signatures[] = {
+ { true, 3, "remove kGetTime spin", 1, hoyle5SignatureSpinLoop, hoyle5PatchSpinLoop },
+ { true, 23, "remove kGetTime spin", 1, hoyle5SignatureSpinLoop, hoyle5PatchSpinLoop },
+ { true, 500, "remove kGetTime spin", 1, hoyle5SignatureSpinLoop, hoyle5PatchSpinLoop },
+ { true, 64937, "remove kGetTime spin", 1, hoyle5SignatureSpinLoop, hoyle5PatchSpinLoop },
+ SCI_SIGNATUREENTRY_TERMINATOR
+};
+
+#pragma mark -
#pragma mark Gabriel Knight 1
// ===========================================================================
@@ -2925,9 +2962,31 @@ static const uint16 mothergooseHiresPatchLogo[] = {
PATCH_END
};
+// After finishing the rhyme at the fountain, a horse will appear and walk
+// across the screen. The priority of the horse is set too high, so it is
+// rendered in front of the fountain instead of behind the fountain. This patch
+// corrects the priority so the horse draws behind the fountain.
+//
+// Applies to at least: English CD from King's Quest Collection
+// Responsible method: rhymeScript::changeState
+static const uint16 mothergooseHiresSignatureHorse[] = {
+ SIG_MAGICDWORD,
+ 0x39, 0x4a, // pushi $4a (setPri)
+ 0x78, // push1
+ 0x38, SIG_UINT16(0xb7), // pushi $b7
+ SIG_END
+};
+
+static const uint16 mothergooseHiresPatchHorse[] = {
+ PATCH_ADDTOOFFSET(3),
+ 0x38, PATCH_UINT16(0x59),
+ PATCH_END
+};
+
// script, description, signature patch
static const SciScriptPatcherEntry mothergooseHiresSignatures[] = {
{ true, 108, "bad logo rendering", 1, mothergooseHiresSignatureLogo, mothergooseHiresPatchLogo },
+ { true, 318, "bad horse z-index", 1, mothergooseHiresSignatureHorse, mothergooseHiresPatchHorse },
SCI_SIGNATUREENTRY_TERMINATOR
};
@@ -5170,6 +5229,9 @@ void ScriptPatcher::processScript(uint16 scriptNr, byte *scriptData, const uint3
signatureTable = freddypharkasSignatures;
break;
#ifdef ENABLE_SCI32
+ case GID_HOYLE5:
+ signatureTable = hoyle5Signatures;
+ break;
case GID_GK1:
signatureTable = gk1Signatures;
break;
diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp
index 560a383e24..7c41b1f4e5 100644
--- a/engines/sci/engine/workarounds.cpp
+++ b/engines/sci/engine/workarounds.cpp
@@ -321,6 +321,8 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = {
{ 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_KQ7, 2450, 2450, 0, "maliciaComes", "handleEvent", NULL, 0, { WORKAROUND_FAKE, 0 } }, // when malicia appears at the southeast exit of the main chamber near the end of chapter 2
+ { GID_KQ7, 6060, 64964, 0, "DPath", "init", NULL, 1, { WORKAROUND_FAKE, 0 } }, // after entering the harp crystal in chapter 5
{ 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
@@ -550,6 +552,7 @@ const SciWorkaroundEntry kDirLoop_workarounds[] = {
const SciWorkaroundEntry kDisposeScript_workarounds[] = {
{ GID_LAURABOW, 777, 777, 0, "myStab", "changeState", NULL, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: after the will is signed, parameter 0 is an object - bug #4967
{ GID_LSL2, -1, 54, 0, "rm54", "dispose", NULL, 0, { WORKAROUND_IGNORE, 0 } }, // Amiga: room 55, script tries to kDisposeScript an object (does not happen for DOS) - bug #6818
+ { GID_MOTHERGOOSEHIRES,37, 337, 0, "rhymeScript", "changeState", NULL, 0, { WORKAROUND_IGNORE, 0 } }, // after the rhyme with the king
{ GID_QFG1, -1, 64, 0, "rm64", "dispose", NULL, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving graveyard, parameter 0 is an object
{ GID_SQ4, 150, 151, 0, "fightScript", "dispose", NULL, 0, { WORKAROUND_IGNORE, 0 } }, // during fight with Vohaul, parameter 0 is an object
{ GID_SQ4, 150, 152, 0, "driveCloseUp", "dispose", NULL, 0, { WORKAROUND_IGNORE, 0 } }, // when choosing "beam download", parameter 0 is an object
@@ -558,6 +561,12 @@ const SciWorkaroundEntry kDisposeScript_workarounds[] = {
};
// gameID, room,script,lvl, object-name, method-name, local-call-signature, index, workaround
+const SciWorkaroundEntry kDoAudioResume_workarounds[] = {
+ { GID_HOYLE5, -1, 17, 0, NULL, "startAudio", NULL, 0, { WORKAROUND_STILLCALL, 0 } }, // when a character talks during a game
+ SCI_WORKAROUNDENTRY_TERMINATOR
+};
+
+// gameID, room,script,lvl, object-name, method-name, local-call-signature, index, workaround
const SciWorkaroundEntry kDoSoundPlay_workarounds[] = {
{ GID_LSL6HIRES, -1, 64989, 0, NULL, "play", NULL, 0, { WORKAROUND_STILLCALL, 0 } }, // always passes an extra null argument
{ GID_QFG4, -1, 64989, 0, NULL, "play", NULL, 0, { WORKAROUND_STILLCALL, 0 } }, // always passes an extra null argument
diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h
index cb928faf09..960c01efdd 100644
--- a/engines/sci/engine/workarounds.h
+++ b/engines/sci/engine/workarounds.h
@@ -68,6 +68,7 @@ extern const SciWorkaroundEntry kDeviceInfo_workarounds[];
extern const SciWorkaroundEntry kDisplay_workarounds[];
extern const SciWorkaroundEntry kDirLoop_workarounds[];
extern const SciWorkaroundEntry kDisposeScript_workarounds[];
+extern const SciWorkaroundEntry kDoAudioResume_workarounds[];
extern const SciWorkaroundEntry kDoSoundPlay_workarounds[];
extern const SciWorkaroundEntry kDoSoundFade_workarounds[];
extern const SciWorkaroundEntry kFileIOOpen_workarounds[];
diff --git a/engines/sci/graphics/celobj32.h b/engines/sci/graphics/celobj32.h
index 70cbd09e7d..3e3f81ac62 100644
--- a/engines/sci/graphics/celobj32.h
+++ b/engines/sci/graphics/celobj32.h
@@ -127,7 +127,7 @@ struct CelInfo32 {
if (type == kCelTypeView) {
return Common::String::format("view %u, loop %d, cel %d", resourceId, loopNo, celNo);
} else if (type == kCelTypePic) {
- return Common::String::format("pic %u", resourceId);
+ return Common::String::format("pic %u, cel %d", resourceId, celNo);
} else if (kCelTypeColor) {
return Common::String::format("color %d", color);
} else if (type == kCelTypeMem) {
diff --git a/engines/sci/graphics/cursor32.cpp b/engines/sci/graphics/cursor32.cpp
index 6bb1323cac..34a6d547e1 100644
--- a/engines/sci/graphics/cursor32.cpp
+++ b/engines/sci/graphics/cursor32.cpp
@@ -291,8 +291,9 @@ void GfxCursor32::readVideo(DrawRegion &target) {
copy(target, _vmapRegion);
} else {
// NOTE: SSCI would read the background for the cursor directly out of
- // video memory here, but as far as can be determined, this does not
- // seem to actually be necessary for proper cursor rendering
+ // video memory here, but this is not necessary in ScummVM because mouse
+ // events in ScummVM are polled so can never interrupt the renderer
+ // between frames
}
}
diff --git a/engines/sci/graphics/screen_item32.cpp b/engines/sci/graphics/screen_item32.cpp
index 4757770dc0..c07e07538e 100644
--- a/engines/sci/graphics/screen_item32.cpp
+++ b/engines/sci/graphics/screen_item32.cpp
@@ -236,7 +236,7 @@ void ScreenItem::setFromObject(SegManager *segMan, const reg_t object, const boo
writeSelectorValue(segMan, object, SELECTOR(priority), _position.y);
}
- _z = readSelectorValue(segMan, object, SELECTOR(z));
+ _z = (int16)readSelectorValue(segMan, object, SELECTOR(z));
_position.y -= _z;
if (g_sci->_features->usesAlternateSelectors()) {
diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp
index d725e36a5a..20547f3601 100644
--- a/engines/sci/sci.cpp
+++ b/engines/sci/sci.cpp
@@ -1068,16 +1068,6 @@ void SciEngine::syncSoundSettings() {
}
}
-// used by Script Patcher. Used to find out, if Laura Bow 2/King's Quest 6 need patching for Speech+Subtitles - or not
-bool SciEngine::speechAndSubtitlesEnabled() {
- bool subtitlesOn = ConfMan.getBool("subtitles");
- bool speechOn = !ConfMan.getBool("speech_mute");
-
- if (isCD() && subtitlesOn && speechOn)
- return true;
- return false;
-}
-
void SciEngine::syncIngameAudioOptions() {
bool useGlobal90 = false;
diff --git a/engines/sci/sci.h b/engines/sci/sci.h
index b3ec3259a6..f5ccc19d7c 100644
--- a/engines/sci/sci.h
+++ b/engines/sci/sci.h
@@ -282,7 +282,6 @@ public:
* script patches are needed:
* - King's Quest 6 CD
*/
- bool speechAndSubtitlesEnabled();
void syncIngameAudioOptions();
void updateScummVMAudioOptions();
diff --git a/engines/titanic/carry/brain.cpp b/engines/titanic/carry/brain.cpp
index 64b068697b..b00f026718 100644
--- a/engines/titanic/carry/brain.cpp
+++ b/engines/titanic/carry/brain.cpp
@@ -75,8 +75,7 @@ bool CBrain::UseWithOtherMsg(CUseWithOtherMsg *msg) {
}
return true;
- }
- else {
+ } else {
return CCarry::UseWithOtherMsg(msg);
}
}
diff --git a/engines/titanic/carry/carry_parrot.cpp b/engines/titanic/carry/carry_parrot.cpp
index c97adc080c..3a2f2c9368 100644
--- a/engines/titanic/carry/carry_parrot.cpp
+++ b/engines/titanic/carry/carry_parrot.cpp
@@ -107,7 +107,7 @@ bool CCarryParrot::MouseDragEndMsg(CMouseDragEndMsg *msg) {
petAddToInventory();
} else if (compareViewNameTo("ParrotLobby.Node 1.N")) {
if (msg->_mousePos.x >= 75 && msg->_mousePos.x <= 565 &&
- !CParrot::_v2 && !CCage::_open) {
+ !CParrot::_takeOff && !CCage::_open) {
setVisible(false);
_canTake = false;
CTreeItem *perchedParrot = findUnder(getRoot(), "PerchedParrot");
diff --git a/engines/titanic/carry/central_core.cpp b/engines/titanic/carry/central_core.cpp
index afc3b85bf0..457428ccfc 100644
--- a/engines/titanic/carry/central_core.cpp
+++ b/engines/titanic/carry/central_core.cpp
@@ -57,9 +57,9 @@ bool CCentralCore::UseWithOtherMsg(CUseWithOtherMsg *msg) {
bool CCentralCore::DropZoneLostObjectMsg(CDropZoneLostObjectMsg *msg) {
CString name = msg->_object->getName();
if (name == "PerchCoreHolder") {
- CParrot::_v2 = 1;
+ CParrot::_takeOff = true;
if (isEquals("CentralCore"))
- CParrot::_v5 = 0;
+ CParrot::_coreReplaced = false;
CActMsg actMsg("LosePerch");
actMsg.execute("ParrotLobbyController");
@@ -75,7 +75,7 @@ bool CCentralCore::DropZoneGotObjectMsg(CDropZoneGotObjectMsg *msg) {
CString name = msg->_object->getName();
if (name == "PerchCoreHolder") {
if (isEquals("CentralCore")) {
- CParrot::_v5 = 1;
+ CParrot::_coreReplaced = true;
CActMsg actMsg("CoreReplaced");
actMsg.execute("ParrotCage");
}
diff --git a/engines/titanic/carry/hose.cpp b/engines/titanic/carry/hose.cpp
index 3bfb4eae47..ac7c7813ca 100644
--- a/engines/titanic/carry/hose.cpp
+++ b/engines/titanic/carry/hose.cpp
@@ -44,15 +44,14 @@ void CHose::deinit() {
delete _statics;
}
-CHose::CHose() : CCarry(),
- _string6(g_vm->_strings[HOSE_INCOMPATIBLE]) {
+CHose::CHose() : CCarry() {
}
void CHose::save(SimpleFile *file, int indent) {
file->writeNumberLine(1, indent);
file->writeNumberLine(_statics->_actionVal, indent);
file->writeQuotedLine(_statics->_actionTarget, indent);
- file->writeQuotedLine(_string6, indent);
+ file->writeQuotedLine(_unused1, indent);
CCarry::save(file, indent);
}
@@ -60,7 +59,7 @@ void CHose::load(SimpleFile *file) {
file->readNumber();
_statics->_actionVal = file->readNumber();
_statics->_actionTarget = file->readString();
- _string6 = file->readString();
+ _unused1 = file->readString();
CCarry::load(file);
}
@@ -70,7 +69,7 @@ bool CHose::DropZoneGotObjectMsg(CDropZoneGotObjectMsg *msg) {
pumpingMsg._value = _statics->_actionVal;
pumpingMsg.execute(_statics->_actionTarget);
CHoseConnectedMsg connectedMsg;
- connectedMsg._value = 1;
+ connectedMsg._connected = true;
connectedMsg.execute(this);
return true;
@@ -99,11 +98,11 @@ bool CHose::UseWithCharMsg(CUseWithCharMsg *msg) {
}
bool CHose::HoseConnectedMsg(CHoseConnectedMsg *msg) {
- if (msg->_value) {
+ if (msg->_connected) {
CHose *hose = dynamic_cast<CHose *>(findChildInstanceOf(CHose::_type));
if (hose) {
setVisible(true);
- petAddToInventory();
+ hose->petAddToInventory();
}
}
diff --git a/engines/titanic/carry/hose.h b/engines/titanic/carry/hose.h
index 3c8c1549c1..0ec37b5b4d 100644
--- a/engines/titanic/carry/hose.h
+++ b/engines/titanic/carry/hose.h
@@ -41,7 +41,7 @@ class CHose : public CCarry {
bool HoseConnectedMsg(CHoseConnectedMsg *msg);
bool DropZoneLostObjectMsg(CDropZoneLostObjectMsg *msg);
protected:
- CString _string6;
+ CString _unused1;
public:
static CHoseStatics *_statics;
public:
diff --git a/engines/titanic/carry/hose_end.cpp b/engines/titanic/carry/hose_end.cpp
index c9996437bb..6f8c965182 100644
--- a/engines/titanic/carry/hose_end.cpp
+++ b/engines/titanic/carry/hose_end.cpp
@@ -27,18 +27,17 @@ namespace Titanic {
EMPTY_MESSAGE_MAP(CHoseEnd, CHose);
CHoseEnd::CHoseEnd() : CHose() {
- _string6 = "Connection refused by remote hose.";
}
void CHoseEnd::save(SimpleFile *file, int indent) {
file->writeNumberLine(1, indent);
- file->writeQuotedLine(_string6, indent);
+ file->writeQuotedLine(_unused1, indent);
CHose::save(file, indent);
}
void CHoseEnd::load(SimpleFile *file) {
file->readNumber();
- _string6 = file->readString();
+ _unused1 = file->readString();
CHose::load(file);
}
diff --git a/engines/titanic/core/drop_target.cpp b/engines/titanic/core/drop_target.cpp
index ffeab03545..d021705e05 100644
--- a/engines/titanic/core/drop_target.cpp
+++ b/engines/titanic/core/drop_target.cpp
@@ -34,7 +34,7 @@ BEGIN_MESSAGE_MAP(CDropTarget, CGameObject)
END_MESSAGE_MAP()
CDropTarget::CDropTarget() : CGameObject(), _itemFrame(0),
- _itemMatchSize(0), _showItem(false), _dropEnabled(false), _dropFrame(0),
+ _itemMatchStartsWith(false), _showItem(false), _dropEnabled(false), _dropFrame(0),
_dragFrame(0), _dragCursorId(CURSOR_ARROW), _dropCursorId(CURSOR_HAND),
_clipFlags(20) {
}
@@ -44,7 +44,7 @@ void CDropTarget::save(SimpleFile *file, int indent) {
file->writePoint(_pos1, indent);
file->writeNumberLine(_itemFrame, indent);
file->writeQuotedLine(_itemMatchName, indent);
- file->writeNumberLine(_itemMatchSize, indent);
+ file->writeNumberLine(_itemMatchStartsWith, indent);
file->writeQuotedLine(_soundName, indent);
file->writeNumberLine(_showItem, indent);
file->writeQuotedLine(_itemName, indent);
@@ -64,7 +64,7 @@ void CDropTarget::load(SimpleFile *file) {
_pos1 = file->readPoint();
_itemFrame = file->readNumber();
_itemMatchName = file->readString();
- _itemMatchSize = file->readNumber();
+ _itemMatchStartsWith = file->readNumber();
_soundName = file->readString();
_showItem = file->readNumber();
_itemName = file->readString();
@@ -87,7 +87,7 @@ bool CDropTarget::DropObjectMsg(CDropObjectMsg *msg) {
}
}
- if (!msg->_item->isEquals(_itemMatchName, _itemMatchSize))
+ if (!msg->_item->isEquals(_itemMatchName, _itemMatchStartsWith))
return false;
msg->_item->detach();
diff --git a/engines/titanic/core/drop_target.h b/engines/titanic/core/drop_target.h
index bdf8891789..d77efb4ce3 100644
--- a/engines/titanic/core/drop_target.h
+++ b/engines/titanic/core/drop_target.h
@@ -38,7 +38,7 @@ protected:
Point _pos1;
int _itemFrame;
CString _itemMatchName;
- int _itemMatchSize;
+ bool _itemMatchStartsWith;
CString _soundName;
bool _showItem;
CString _itemName;
diff --git a/engines/titanic/core/game_object.cpp b/engines/titanic/core/game_object.cpp
index bcdf77b675..af7020532c 100644
--- a/engines/titanic/core/game_object.cpp
+++ b/engines/titanic/core/game_object.cpp
@@ -960,14 +960,14 @@ CGameObject *CGameObject::getMailManNextObject(CGameObject *prior) const {
return mailMan ? mailMan->getNextObject(prior) : nullptr;
}
-CGameObject *CGameObject::findMailByFlags(int mode, uint roomFlags) {
+CGameObject *CGameObject::findMailByFlags(RoomFlagsComparison compareType, uint roomFlags) {
CMailMan *mailMan = getMailMan();
if (!mailMan)
return nullptr;
for (CGameObject *obj = mailMan->getFirstObject(); obj;
obj = mailMan->getNextObject(obj)) {
- if (compareRoomFlags(mode, roomFlags, obj->_roomFlags))
+ if (compareRoomFlags(compareType, roomFlags, obj->_roomFlags))
return obj;
}
@@ -1151,7 +1151,15 @@ void CGameObject::lockMouse() {
gameMan->lockInputHandler();
if (CScreenManager::_screenManagerPtr->_mouseCursor)
- CScreenManager::_screenManagerPtr->_mouseCursor->hide();
+ CScreenManager::_screenManagerPtr->_mouseCursor->incBusyCount();
+}
+
+void CGameObject::unlockMouse() {
+ if (CScreenManager::_screenManagerPtr->_mouseCursor)
+ CScreenManager::_screenManagerPtr->_mouseCursor->decBusyCount();
+
+ CGameManager *gameMan = getGameManager();
+ gameMan->unlockInputHandler();
}
void CGameObject::hideMouse() {
@@ -1192,14 +1200,6 @@ void CGameObject::unlockInputHandler() {
getGameManager()->unlockInputHandler();
}
-void CGameObject::unlockMouse() {
- if (CScreenManager::_screenManagerPtr->_mouseCursor)
- CScreenManager::_screenManagerPtr->_mouseCursor->show();
-
- CGameManager *gameMan = getGameManager();
- gameMan->unlockInputHandler();
-}
-
void CGameObject::loadSurface() {
if (!_surface && !_resource.empty()) {
loadResource(_resource);
@@ -1413,15 +1413,15 @@ Common::SeekableReadStream *CGameObject::getResource(const CString &name) {
return g_vm->_filesManager->getResource(name);
}
-bool CGameObject::compareRoomFlags(int mode, uint flags1, uint flags2) {
- switch (mode) {
- case 1:
+bool CGameObject::compareRoomFlags(RoomFlagsComparison compareType, uint flags1, uint flags2) {
+ switch (compareType) {
+ case RFC_LOCATION:
return CRoomFlags::compareLocation(flags1, flags2);
- case 2:
+ case RFC_CLASS_ELEVATOR:
return CRoomFlags::compareClassElevator(flags1, flags2);
- case 3:
+ case RFC_TITANIA:
return CRoomFlags::isTitania(flags1, flags2);
default:
diff --git a/engines/titanic/core/game_object.h b/engines/titanic/core/game_object.h
index 629c6a038d..30b3321128 100644
--- a/engines/titanic/core/game_object.h
+++ b/engines/titanic/core/game_object.h
@@ -41,6 +41,7 @@ namespace Titanic {
enum Find { FIND_GLOBAL = 1, FIND_ROOM = 2, FIND_PET = 4, FIND_MAILMAN = 8 };
enum Found { FOUND_NONE = 0, FOUND_GLOBAL = 1, FOUND_ROOM = 2, FOUND_PET = 3, FOUND_MAILMAN = 4 };
+enum RoomFlagsComparison { RFC_LOCATION = 1, RFC_CLASS_ELEVATOR = 2, RFC_TITANIA = 3 };
class CDontSaveFileItem;
class CMailMan;
@@ -337,7 +338,7 @@ protected:
/**
* Find mail by room flags
*/
- CGameObject *findMailByFlags(int mode, uint roomFlags);
+ CGameObject *findMailByFlags(RoomFlagsComparison compareType, uint roomFlags);
/**
* Find next mail from a given prior one
@@ -712,7 +713,10 @@ public:
*/
CGameObject *getDraggingObject() const;
- bool compareRoomFlags(int mode, uint flags1, uint flags2);
+ /**
+ * Compares two sets of room flags together
+ */
+ static bool compareRoomFlags(RoomFlagsComparison compareType, uint flags1, uint flags2);
/*--- Text display methods ---*/
diff --git a/engines/titanic/core/named_item.cpp b/engines/titanic/core/named_item.cpp
index 9c4c28d04d..5fb4f8d6b4 100644
--- a/engines/titanic/core/named_item.cpp
+++ b/engines/titanic/core/named_item.cpp
@@ -51,9 +51,9 @@ void CNamedItem::load(SimpleFile *file) {
CTreeItem::load(file);
}
-bool CNamedItem::isEquals(const CString &name, int maxLen) const {
- if (maxLen) {
- return getName().left(maxLen).compareToIgnoreCase(name) == 0;
+bool CNamedItem::isEquals(const CString &name, bool startsWith) const {
+ if (startsWith) {
+ return getName().left(name.size()).compareToIgnoreCase(name) == 0;
} else {
return getName().compareToIgnoreCase(name) == 0;
}
diff --git a/engines/titanic/core/named_item.h b/engines/titanic/core/named_item.h
index 9ee3d490ae..9d46fe0673 100644
--- a/engines/titanic/core/named_item.h
+++ b/engines/titanic/core/named_item.h
@@ -61,7 +61,7 @@ public:
/**
* Returns true if the item's name matches a passed name
*/
- virtual bool isEquals(const CString &name, int maxLen = 0) const;
+ virtual bool isEquals(const CString &name, bool startsWith = false) const;
/**
* Find a parent node for the item
diff --git a/engines/titanic/core/saveable_object.cpp b/engines/titanic/core/saveable_object.cpp
index f718ba79b3..8bb8a92b7f 100644
--- a/engines/titanic/core/saveable_object.cpp
+++ b/engines/titanic/core/saveable_object.cpp
@@ -1022,72 +1022,82 @@ DEFFN(CTimeEventInfo);
void CSaveableObject::initClassList() {
_classDefs = new ClassDefList();
_classList = new ClassListMap();
+
+ // Setup the type definitions for each class. Note that these have to be
+ // in order of hierarchy from ancestor class to descendent
+ ADDFN(CSaveableObject, CSaveableObject);
+ ADDFN(CMessage, CSaveableObject);
+ ADDFN(CMessageTarget, CSaveableObject);
+ ADDFN(CResourceKey, CSaveableObject);
+ ADDFN(ListItem, CSaveableObject);
+ ADDFN(CTreeItem, CMessageTarget);
+ ADDFN(CFileItem, CTreeItem);
+ ADDFN(CGameObjectDescItem, CTreeItem);
+ ADDFN(CDontSaveFileItem, CFileItem);
+ ADDFN(CProjectItem, CFileItem);
+ ADDFN(CNamedItem, CTreeItem);
+ ADDFN(CRoomItem, CNamedItem);
+ ADDFN(CGameObject, CNamedItem);
+ ADDFN(CLinkItem, CNamedItem);
+ ADDFN(CNodeItem, CNamedItem);
+ ADDFN(CPlaceHolderItem, CNamedItem);
+ ADDFN(CViewItem, CNamedItem);
+ ADDFN(CBackground, CGameObject);
+ ADDFN(CClickResponder, CGameObject);
+ ADDFN(CDropTarget, CGameObject);
+ ADDFN(CFileListItem, ListItem);
+ ADDFN(CMailMan, CGameObject);
+ ADDFN(CMovieClip, ListItem);
+ ADDFN(CMultiDropTarget, CDropTarget);
+ ADDFN(CStartAction, CBackground);
+ ADDFN(CEditControl, CGameObject);
+ ADDFN(CToggleButton, CBackground);
+ ADDFN(CToggleSwitch, CGameObject);
+ ADDFN(CPlaceHolder, CGameObject);
+
+ ADDFN(CCarry, CGameObject);
ADDFN(CArm, CCarry);
- ADDFN(CAuditoryCentre, CBrain);
- ADDFN(CBowlEar, CEar);
ADDFN(CBrain, CCarry);
ADDFN(CBridgePiece, CCarry);
- ADDFN(CCarry, CGameObject);
ADDFN(CCarryParrot, CCarry);
- ADDFN(CCentralCore, CBrain);
ADDFN(CChicken, CCarry);
ADDFN(CCrushedTV, CCarry);
- ADDFN(CEar, CHeadPiece);
- ADDFN(CEye, CHeadPiece);
ADDFN(CFeathers, CCarry);
ADDFN(CFruit, CCarry);
ADDFN(CGlass, CCarry);
ADDFN(CHammer, CCarry);
ADDFN(CHeadPiece, CCarry);
ADDFN(CHose, CCarry);
- ADDFN(CHoseEnd, CHose);
ADDFN(CKey, CCarry);
ADDFN(CLiftbotHead, CCarry);
ADDFN(CLongStick, CCarry);
ADDFN(CMagazine, CCarry);
- ADDFN(CMaitreDLeftArm, CArm);
- ADDFN(CMaitreDRightArm, CArm);
- ADDFN(CMouth, CHeadPiece);
ADDFN(CNapkin, CCarry);
- ADDFN(CNose, CHeadPiece);
ADDFN(CNote, CCarry);
ADDFN(CParcel, CCarry);
- ADDFN(CPerch, CCentralCore);
ADDFN(CPhonographCylinder, CCarry);
- ADDFN(CPhonographEar, CEar);
ADDFN(CPhotograph, CCarry);
ADDFN(CPlugIn, CCarry);
- ADDFN(CSpeechCentre, CBrain);
ADDFN(CSweets, CCarry);
+ ADDFN(CMaitreDLeftArm, CArm);
+ ADDFN(CMaitreDRightArm, CArm);
+ ADDFN(CCentralCore, CBrain);
+ ADDFN(CSpeechCentre, CBrain);
ADDFN(CVisionCentre, CBrain);
+ ADDFN(CAuditoryCentre, CBrain);
+ ADDFN(CPerch, CCentralCore);
+ ADDFN(CEar, CHeadPiece);
+ ADDFN(CBowlEar, CEar);
+ ADDFN(CPhonographEar, CEar);
+ ADDFN(CEye, CHeadPiece);
+ ADDFN(CMouth, CHeadPiece);
+ ADDFN(CNose, CHeadPiece);
+ ADDFN(CHoseEnd, CHose);
- ADDFN(CBackground, CGameObject);
- ADDFN(CClickResponder, CGameObject);
- ADDFN(CDontSaveFileItem, CFileItem);
- ADDFN(CDropTarget, CGameObject);
- ADDFN(CFileItem, CTreeItem);
- ADDFN(CFileListItem, ListItem);
- ADDFN(CGameObject, CNamedItem);
- ADDFN(CGameObjectDescItem, CTreeItem);
- ADDFN(CLinkItem, CNamedItem);
- ADDFN(ListItem, CSaveableObject);
- ADDFN(CMessageTarget, CSaveableObject);
- ADDFN(CMailMan, CGameObject);
- ADDFN(CMovieClip, ListItem);
- ADDFN(CMultiDropTarget, CDropTarget);
- ADDFN(CNamedItem, CTreeItem);
- ADDFN(CNodeItem, CNamedItem);
- ADDFN(CProjectItem, CFileItem);
- ADDFN(CResourceKey, CSaveableObject);
- ADDFN(CRoomItem, CNamedItem);
- ADDFN(CSaveableObject, CSaveableObject);
ADDFN(CStaticImage, CGameObject);
ADDFN(CTurnOnObject, CBackground);
- ADDFN(CTreeItem, CMessageTarget);
ADDFN(CTurnOnPlaySound, CTurnOnObject);
ADDFN(CTurnOnTurnOff, CBackground);
- ADDFN(CViewItem, CNamedItem);
-
ADDFN(CAnnounce, CGameObject);
ADDFN(CAnnoyBarbot, CGameObject);
ADDFN(CArbBackground, CBackground);
@@ -1097,7 +1107,6 @@ void CSaveableObject::initClassList() {
ADDFN(CBarMenu, CGameObject);
ADDFN(CBarMenuButton, CGameObject);
ADDFN(CBelbotGetLight, CGameObject);
- ADDFN(CBilgeSuccUBus, CSuccUBus);
ADDFN(CBomb, CBackground);
ADDFN(CBottomOfWellMonitor, CGameObject);
ADDFN(CBowlUnlocker, CGameObject);
@@ -1130,8 +1139,6 @@ void CSaveableObject::initClassList() {
ADDFN(CDoorbotElevatorHandler, CGameObject);
ADDFN(CDoorbotHomeHandler, CGameObject);
ADDFN(CDropTarget, CGameObject);
- ADDFN(CEarSweetBowl, CSweetBowl);
- ADDFN(CEjectPhonographButton, CBackground);
ADDFN(CElevatorActionArea, CGameObject);
ADDFN(CEmmaControl, CBackground);
ADDFN(CEmptyNutBowl, CGameObject);
@@ -1167,9 +1174,6 @@ void CSaveableObject::initClassList() {
ADDFN(CMissiveOMatButton, CEditControl);
ADDFN(CMovieTester, CGameObject);
ADDFN(CMusicalInstrument, CBackground);
- ADDFN(CMusicConsoleButton, CMusicPlayer);
- ADDFN(CMusicRoomPhonograph, CRestaurantPhonograph);
- ADDFN(CMusicRoomStopPhonographButton, CEjectPhonographButton);
ADDFN(CMusicSystemLock, CDropTarget);
ADDFN(CNavHelmet, CGameObject);
ADDFN(CNavHelmetOn, CGameObject);
@@ -1180,9 +1184,7 @@ void CSaveableObject::initClassList() {
ADDFN(CNullPortHole, CClickResponder);
ADDFN(CNutReplacer, CGameObject);
ADDFN(CPetDisabler, CGameObject);
- ADDFN(CPhonograph, CMusicPlayer);
ADDFN(CPhonographLid, CGameObject);
- ADDFN(CPlaceHolderItem, CNamedItem);
ADDFN(CPlayMusicButton, CBackground);
ADDFN(CPlayOnAct, CBackground);
ADDFN(CPortHole, CGameObject);
@@ -1190,7 +1192,6 @@ void CSaveableObject::initClassList() {
ADDFN(CReplacementEar, CBackground);
ADDFN(CReservedTable, CGameObject);
ADDFN(CRestaurantCylinderHolder, CDropTarget);
- ADDFN(CRestaurantPhonograph, CPhonograph);
ADDFN(CSauceDispensor, CBackground);
ADDFN(CSearchPoint, CGameObject);
ADDFN(CSeasonBackground, CBackground);
@@ -1203,11 +1204,11 @@ void CSaveableObject::initClassList() {
ADDFN(CSpeechDispensor, CBackground);
ADDFN(CSplashAnimation, CGameObject);
ADDFN(CStarlingPuret, CGameObject);
- ADDFN(CStartAction, CBackground);
ADDFN(CStopPhonographButton, CBackground);
ADDFN(CSUBGlass, CGameObject);
ADDFN(CSUBWrapper, CGameObject);
ADDFN(CSweetBowl, CGameObject);
+ ADDFN(CEarSweetBowl, CSweetBowl);
ADDFN(CTelevision, CBackground);
ADDFN(CThirdClassCanal, CBackground);
ADDFN(CThrowTVDownWell, CGameObject);
@@ -1227,32 +1228,31 @@ void CSaveableObject::initClassList() {
ADDFN(CGondolierMixer, CGondolierBase);
ADDFN(CGondolierSlider, CGondolierBase);
ADDFN(CMaitreDArmHolder, CDropTarget);
+ ADDFN(CMaitreDProdReceptor, CGameObject);
ADDFN(CMaitreDBody, CMaitreDProdReceptor);
ADDFN(CMaitreDLegs, CMaitreDProdReceptor);
- ADDFN(CMaitreDProdReceptor, CGameObject);
+ ADDFN(CParrotLobbyObject, CGameObject);
ADDFN(CParrotLobbyController, CParrotLobbyObject);
ADDFN(CParrotLobbyLinkUpdater, CParrotLobbyObject);
- ADDFN(CParrotLobbyObject, CGameObject);
ADDFN(CParrotLobbyViewObject, CParrotLobbyObject);
ADDFN(CParrotLoser, CGameObject);
ADDFN(CParrotNutBowlActor, CGameObject);
ADDFN(CParrotNutEater, CGameObject);
ADDFN(CParrotPerchHolder, CMultiDropTarget);
- ADDFN(CParrotSuccUBus, CSuccUBus);
ADDFN(CParrotTrigger, CGameObject);
ADDFN(CPlayerMeetsParrot, CGameObject);
ADDFN(CPET, CGameObject);
ADDFN(CPETClass1, CGameObject);
ADDFN(CPETClass2, CGameObject);
ADDFN(CPETClass3, CGameObject);
- ADDFN(CPETLift, CPETTransport);
ADDFN(CPETMonitor, CGameObject);
- ADDFN(CPETPellerator, CPETTransport);
ADDFN(CPETPosition, CGameObject);
ADDFN(CPETSentinal, CGameObject);
ADDFN(CPETSounds, CGameObject);
ADDFN(CPETTransition, CGameObject);
ADDFN(CPETTransport, CGameObject);
+ ADDFN(CPETPellerator, CPETTransport);
+ ADDFN(CPETLift, CPETTransport);
ADDFN(CPickUp, CGameObject);
ADDFN(CPickUpBarGlass, CPickUp);
ADDFN(CPickUpHose, CPickUp);
@@ -1261,8 +1261,8 @@ void CSaveableObject::initClassList() {
ADDFN(CPickUpVisCentre, CPickUp);
ADDFN(CBarShelfVisCentre, CPlaceHolder);
ADDFN(CLemonOnBar, CPlaceHolder);
- ADDFN(CPlaceHolder, CGameObject);
ADDFN(CTVOnBar, CPlaceHolder);
+ ADDFN(CSGTStateRoom, CBackground);
ADDFN(CArmchair, CSGTStateRoom);
ADDFN(CBasin, CSGTStateRoom);
ADDFN(CBedfoot, CSGTStateRoom);
@@ -1276,40 +1276,34 @@ void CSaveableObject::initClassList() {
ADDFN(CSGTNavigation, CGameObject);
ADDFN(CSGTRestaurantDoors, CGameObject);
ADDFN(CSGTStateControl, CBackground);
- ADDFN(CSGTStateRoom, CBackground);
ADDFN(CSGTTV, CSGTStateRoom);
ADDFN(CSGTUpperDoorsSound, CClickResponder);
ADDFN(CToilet, CSGTStateRoom);
ADDFN(CVase, CSGTStateRoom);
ADDFN(CWashstand, CSGTStateRoom);
- ADDFN(CGondolier, CTransport);
- ADDFN(CLift, CTransport);
- ADDFN(CLiftindicator, CLift);
- ADDFN(CPellerator, CTransport);
- ADDFN(CServiceElevator, CTransport);
- ADDFN(CTransport, CMobile);
-
+ ADDFN(CPetGraphic, CGameObject);
+ ADDFN(CPetGraphic2, CGameObject);
+ ADDFN(CSTButton, CBackground);
ADDFN(CActButton, CSTButton);
ADDFN(CChangesSeasonButton, CSTButton);
+ ADDFN(CElevatorButton, CSTButton);
+ ADDFN(CIconNavButt, CPetGraphic);
+ ADDFN(CIconNavImage, CPetGraphic);
+ ADDFN(CIconNavReceive, CPetGraphic);
+ ADDFN(CIconNavSend, CPetGraphic);
ADDFN(CChevLeftOff, CToggleSwitch);
ADDFN(CChevLeftOn, CToggleSwitch);
ADDFN(CChevRightOff, CToggleSwitch);
ADDFN(CChevRightOn, CToggleSwitch);
ADDFN(CChevSendRecSwitch, CToggleSwitch);
- ADDFN(CEditControl, CGameObject);
- ADDFN(CElevatorButton, CSTButton);
ADDFN(CGetFromSucc, CToggleSwitch);
ADDFN(CHelmetOnOff, CToggleSwitch);
ADDFN(CHomePhoto, CToggleSwitch);
ADDFN(CIconNavAction, CToggleSwitch);
- ADDFN(CIconNavButt, CPetGraphic);
ADDFN(CIconNavDown, CToggleSwitch);
- ADDFN(CIconNavImage, CPetGraphic);
ADDFN(CIconNavLeft, CToggleSwitch);
- ADDFN(CIconNavReceive, CPetGraphic);
ADDFN(CIconNavRight, CToggleSwitch);
- ADDFN(CIconNavSend, CPetGraphic);
ADDFN(CIconNavUp, CToggleSwitch);
ADDFN(CKeybrdButt, CToggleSwitch);
ADDFN(CMoveObjectButton, CSTButton);
@@ -1323,8 +1317,6 @@ void CSaveableObject::initClassList() {
ADDFN(CMusicVoiceMute, CMusicControl);
ADDFN(CPetControl, CGameObject);
ADDFN(CPetDragChev, CPetGraphic2);
- ADDFN(CPetGraphic, CGameObject);
- ADDFN(CPetGraphic2, CGameObject);
ADDFN(PETLeaf, CGameObject);
ADDFN(CPetModeOff, CToggleSwitch);
ADDFN(CPetModeOn, CToggleSwitch);
@@ -1341,12 +1333,9 @@ void CSaveableObject::initClassList() {
ADDFN(CSmallChevRightOff, CToggleSwitch);
ADDFN(CSmallChevRightOn, CToggleSwitch);
ADDFN(CStatusChangeButton, CSTButton);
- ADDFN(CSTButton, CBackground);
ADDFN(CTextDown, CPetGraphic);
ADDFN(CTextSkrew, CPetGraphic);
ADDFN(CTextUp, CPetGraphic);
- ADDFN(CToggleButton, CBackground);
- ADDFN(CToggleSwitch, CGameObject);
ADDFN(CActMsg, CMessage);
ADDFN(CActivationmsg, CMessage);
@@ -1415,7 +1404,6 @@ void CSaveableObject::initClassList() {
ADDFN(CLockPhonographMsg, CMessage);
ADDFN(CMaitreDDefeatedMsg, CMessage);
ADDFN(CMaitreDHappyMsg, CMessage);
- ADDFN(CMessage, CSaveableObject);
ADDFN(CMissiveOMatActionMsg, CMessage);
ADDFN(CMouseMsg, CMessage);
ADDFN(CMouseMoveMsg, CMouseMsg);
@@ -1551,33 +1539,35 @@ void CSaveableObject::initClassList() {
ADDFN(CVirtualKeyCharMsg, CMessage);
ADDFN(CVisibleMsg, CMessage);
+ ADDFN(CMovePlayerTo, CGameObject);
+ ADDFN(CMovePlayerToFrom, CGameObject);
ADDFN(CEnterBombRoom, CMovePlayerTo);
+ ADDFN(CExitArboretum, CMovePlayerTo);
+ ADDFN(CExitBridge, CMovePlayerTo);
+ ADDFN(CExitStateRoom, CMovePlayerTo);
+ ADDFN(CMovePlayerInParrotRoom, CMovePlayerTo);
+ ADDFN(CExitTiania, CMovePlayerTo);
+ ADDFN(CMultiMove, CMovePlayerTo);
+ ADDFN(CRestaurantPanHandler, CMovePlayerTo);
+ ADDFN(CPanFromPel, CMovePlayerTo);
+ ADDFN(CRestrictedMove, CMovePlayerTo);
+ ADDFN(CTripDownCanal, CMovePlayerTo);
ADDFN(CEnterBridge, CGameObject);
ADDFN(CEnterExitFirstClassState, CGameObject);
ADDFN(CEnterExitMiniLift, CSGTNavigation);
ADDFN(CEnterExitSecClassMiniLift, CGameObject);
ADDFN(CEnterExitView, CGameObject);
ADDFN(CEnterSecClassState, CGameObject);
- ADDFN(CExitArboretum, CMovePlayerTo);
- ADDFN(CExitBridge, CMovePlayerTo);
ADDFN(CExitLift, CGameObject);
ADDFN(CExitPellerator, CGameObject);
- ADDFN(CExitStateRoom, CMovePlayerTo);
- ADDFN(CExitTiania, CMovePlayerTo);
- ADDFN(CMovePlayerInParrotRoom, CMovePlayerTo);
- ADDFN(CMovePlayerTo, CGameObject);
- ADDFN(CMovePlayerToFrom, CGameObject);
- ADDFN(CMultiMove, CMovePlayerTo);
- ADDFN(CPanFromPel, CMovePlayerTo);
- ADDFN(CRestaurantPanHandler, CMovePlayerTo);
ADDFN(CScraliontisTable, CRestaurantPanHandler);
- ADDFN(CRestrictedMove, CMovePlayerTo);
- ADDFN(CTripDownCanal, CMovePlayerTo);
+ ADDFN(CCharacter, CGameObject);
+ ADDFN(CStarlings, CCharacter);
+ ADDFN(CTrueTalkNPC, CCharacter);
ADDFN(CBarbot, CTrueTalkNPC);
ADDFN(CBellBot, CTrueTalkNPC);
ADDFN(CCallBot, CGameObject);
- ADDFN(CCharacter, CGameObject);
ADDFN(CDeskbot, CTrueTalkNPC);
ADDFN(CDoorbot, CTrueTalkNPC);
ADDFN(CMaitreD, CTrueTalkNPC);
@@ -1585,36 +1575,48 @@ void CSaveableObject::initClassList() {
ADDFN(CMobile, CCharacter);
ADDFN(CParrot, CTrueTalkNPC);
ADDFN(CRobotController, CGameObject);
- ADDFN(CStarlings, CCharacter);
ADDFN(CSuccUBus, CTrueTalkNPC);
+ ADDFN(CBilgeSuccUBus, CSuccUBus);
+ ADDFN(CParrotSuccUBus, CSuccUBus);
ADDFN(CSummonBots, CRobotController);
ADDFN(CTitania, CCharacter);
- ADDFN(CTrueTalkNPC, CCharacter);
+ ADDFN(CTransport, CMobile);
+ ADDFN(CGondolier, CTransport);
+ ADDFN(CLift, CTransport);
+ ADDFN(CLiftindicator, CLift);
+ ADDFN(CPellerator, CTransport);
+ ADDFN(CServiceElevator, CTransport);
- ADDFN(CAutoMusicPlayer, CAutoMusicPlayerBase);
+ ADDFN(CMusicPlayer, CGameObject);
ADDFN(CAutoMusicPlayerBase, CGameObject);
ADDFN(CAutoSoundPlayer, CGameObject);
- ADDFN(CAutoSoundPlayerADSR, CAutoSoundPlayer);
ADDFN(CBackgroundSoundMaker, CGameObject);
- ADDFN(CBirdSong, CRoomAutoSoundPlayer);
- ADDFN(CDomeFromTopOfWell, CViewAutoSoundPlayer);
ADDFN(CGondolierSong, CGameObject);
- ADDFN(CEnterViewTogglesOtherMusic, CTriggerAutoMusicPlayer);
- ADDFN(CGondolierSong, CRoomAutoSoundPlayer);
- ADDFN(CMusicPlayer, CGameObject);
+ ADDFN(CTriggerAutoMusicPlayer, CGameObject);
+ ADDFN(CMusicConsoleButton, CMusicPlayer);
+ ADDFN(CPhonograph, CMusicPlayer);
+ ADDFN(CRestaurantPhonograph, CPhonograph);
+ ADDFN(CMusicRoomPhonograph, CRestaurantPhonograph);
+ ADDFN(CEjectPhonographButton, CBackground);
+ ADDFN(CMusicRoomStopPhonographButton, CEjectPhonographButton);
+ ADDFN(CAutoMusicPlayer, CAutoMusicPlayerBase);
+ ADDFN(CAutoSoundPlayerADSR, CAutoSoundPlayer);
ADDFN(CNodeAutoSoundPlayer, CAutoSoundPlayer);
- ADDFN(CRestrictedAutoMusicPlayer, CAutoMusicPlayer);
+ ADDFN(CViewAutoSoundPlayer, CAutoSoundPlayer);
ADDFN(CRoomAutoSoundPlayer, CAutoSoundPlayer);
+ ADDFN(CRestrictedAutoMusicPlayer, CAutoMusicPlayer);
ADDFN(CRoomTriggerAutoMusicPlayer, CTriggerAutoMusicPlayer);
+ ADDFN(CEnterViewTogglesOtherMusic, CTriggerAutoMusicPlayer);
+ ADDFN(CViewTogglesOtherMusic, CEnterViewTogglesOtherMusic);
+ ADDFN(CWaterLappingSounds, CRoomAutoSoundPlayer);
+ ADDFN(CBirdSong, CRoomAutoSoundPlayer);
+ ADDFN(CDomeFromTopOfWell, CViewAutoSoundPlayer);
+ ADDFN(CGondolierSong, CRoomAutoSoundPlayer);
ADDFN(CSeasonNoises, CViewAutoSoundPlayer);
ADDFN(CSeasonalMusicPlayer, CAutoMusicPlayerBase);
ADDFN(CAutoMusicPlayer, CAutoMusicPlayerBase);
ADDFN(CAutoMusicPlayerBase, CAutoMusicPlayer);
ADDFN(CTitaniaSpeech, CGameObject);
- ADDFN(CTriggerAutoMusicPlayer, CGameObject);
- ADDFN(CViewAutoSoundPlayer, CAutoSoundPlayer);
- ADDFN(CViewTogglesOtherMusic, CEnterViewTogglesOtherMusic);
- ADDFN(CWaterLappingSounds, CRoomAutoSoundPlayer);
ADDFN(CStarControl, CGameObject);
ADDFN(CTimeEventInfo, ListItem);
}
diff --git a/engines/titanic/core/tree_item.h b/engines/titanic/core/tree_item.h
index e92f5cda49..498d2da4f4 100644
--- a/engines/titanic/core/tree_item.h
+++ b/engines/titanic/core/tree_item.h
@@ -127,7 +127,7 @@ public:
/**
* Returns true if the item's name matches a passed name
*/
- virtual bool isEquals(const CString &name, int maxLen = 0) const { return false; }
+ virtual bool isEquals(const CString &name, bool startsWith = false) const{ return false; }
/**
* Compares the name of the item to a passed name
diff --git a/engines/titanic/game/cage.cpp b/engines/titanic/game/cage.cpp
index 11f5837e4c..f51e935231 100644
--- a/engines/titanic/game/cage.cpp
+++ b/engines/titanic/game/cage.cpp
@@ -53,7 +53,7 @@ void CCage::load(SimpleFile *file) {
}
bool CCage::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
- if (CParrot::_state != PARROT_IN_CAGE && !CParrot::_v5) {
+ if (CParrot::_state != PARROT_IN_CAGE && !CParrot::_coreReplaced) {
CActMsg actMsg(_open ? "Open" : "Shut");
actMsg.execute(this);
}
@@ -103,7 +103,7 @@ bool CCage::PreEnterViewMsg(CPreEnterViewMsg *msg) {
}
bool CCage::MouseMoveMsg(CMouseMoveMsg *msg) {
- _cursorId = CParrot::_state != PARROT_IN_CAGE && !CParrot::_v5 ? CURSOR_ACTIVATE : CURSOR_ARROW;
+ _cursorId = CParrot::_state != PARROT_IN_CAGE && !CParrot::_coreReplaced ? CURSOR_ACTIVATE : CURSOR_ARROW;
return true;
}
diff --git a/engines/titanic/game/light.cpp b/engines/titanic/game/light.cpp
index 76dc9a44b0..30fc53463f 100644
--- a/engines/titanic/game/light.cpp
+++ b/engines/titanic/game/light.cpp
@@ -37,18 +37,18 @@ BEGIN_MESSAGE_MAP(CLight, CBackground)
ON_MESSAGE(EnterRoomMsg)
END_MESSAGE_MAP()
-CLight::CLight() : CBackground(), _unused1(0), _upRight(false),
- _upLeft(false), _downLeft(false), _downRight(false), _unused2(0),
+CLight::CLight() : CBackground(), _unused1(0), _topRight(false),
+ _topLeft(false), _bottomLeft(false), _bottomRight(false), _unused2(0),
_unused3(0), _eyePresent(false) {
}
void CLight::save(SimpleFile *file, int indent) {
file->writeNumberLine(1, indent);
file->writeNumberLine(_unused1, indent);
- file->writeNumberLine(_upRight, indent);
- file->writeNumberLine(_upLeft, indent);
- file->writeNumberLine(_downLeft, indent);
- file->writeNumberLine(_downRight, indent);
+ file->writeNumberLine(_topRight, indent);
+ file->writeNumberLine(_topLeft, indent);
+ file->writeNumberLine(_bottomLeft, indent);
+ file->writeNumberLine(_bottomRight, indent);
file->writeNumberLine(_unused2, indent);
file->writeNumberLine(_unused3, indent);
file->writeNumberLine(_eyePresent, indent);
@@ -59,10 +59,10 @@ void CLight::save(SimpleFile *file, int indent) {
void CLight::load(SimpleFile *file) {
file->readNumber();
_unused1 = file->readNumber();
- _upRight = file->readNumber();
- _upLeft = file->readNumber();
- _downLeft = file->readNumber();
- _downRight = file->readNumber();
+ _topRight = file->readNumber();
+ _topLeft = file->readNumber();
+ _bottomLeft = file->readNumber();
+ _bottomRight = file->readNumber();
_unused2 = file->readNumber();
_unused3 = file->readNumber();
_eyePresent = file->readNumber();
@@ -76,8 +76,15 @@ bool CLight::TurnOff(CTurnOff *msg) {
}
bool CLight::LightsMsg(CLightsMsg *msg) {
- if ((msg->_upLeft && _upLeft) || (msg->_downLeft && _downLeft)
- || (msg->_upRight && _upRight) || (msg->_downRight && _downRight)) {
+ // WORKAROUND: Since solving the puzzle to get Titania's eye explicitly
+ // requires referring to the "broken light", don't allow the top left
+ // light to be turned on in the player's stateroom until it's gotten/fixed
+ if (msg->_topLeft && _topLeft) {
+ bool showFlag = !getPetControl()->isFirstClassSuite() ||
+ getRoom()->findByName("Eye1") == nullptr;
+ setVisible(showFlag);
+ } else if ((msg->_bottomLeft && _bottomLeft) || (msg->_topRight && _topRight) ||
+ (msg->_bottomRight && _bottomRight)) {
setVisible(true);
} else {
setVisible(false);
@@ -98,9 +105,9 @@ bool CLight::TurnOn(CTurnOn *msg) {
bool CLight::StatusChangeMsg(CStatusChangeMsg *msg) {
CPetControl *pet = getPetControl();
- bool flag = pet ? pet->isRoom59706() : false;
+ bool isYourStateroom = pet ? pet->isFirstClassSuite() : false;
- if (_eyePresent && flag) {
+ if (_eyePresent && isYourStateroom) {
petDisplayMessage(1, LIGHT_IS_LOOSE);
playSound("z#144.wav", 70);
} else {
@@ -113,9 +120,9 @@ bool CLight::StatusChangeMsg(CStatusChangeMsg *msg) {
bool CLight::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
CPetControl *pet = getPetControl();
- bool flag = pet ? pet->isRoom59706() : false;
+ bool isYourStateroom = pet ? pet->isFirstClassSuite() : false;
- if (_eyePresent && flag) {
+ if (_eyePresent && isYourStateroom) {
petDisplayMessage(1, LIGHT_IS_LOOSE);
playSound("z#144.wav", 70);
} else {
@@ -138,11 +145,11 @@ bool CLight::EnterRoomMsg(CEnterRoomMsg *msg) {
setVisible(true);
if (isEquals("6WTL")) {
- CLightsMsg lightsMsg(1, 1, 1, 1);
+ CLightsMsg lightsMsg(true, true, true, true);
lightsMsg.execute("1stClassState", CLight::_type, MSGFLAG_SCAN);
- bool flag = pet ? pet->isRoom59706() : false;
- if (flag)
+ bool isYourStateroom = pet ? pet->isFirstClassSuite() : false;
+ if (isYourStateroom)
CTelevision::_turnOn = true;
}
diff --git a/engines/titanic/game/light.h b/engines/titanic/game/light.h
index 12f7d88bcb..2e5dbfaee6 100644
--- a/engines/titanic/game/light.h
+++ b/engines/titanic/game/light.h
@@ -40,10 +40,10 @@ class CLight : public CBackground {
bool EnterRoomMsg(CEnterRoomMsg *msg);
private:
int _unused1;
- bool _upRight;
- bool _upLeft;
- bool _downLeft;
- bool _downRight;
+ bool _topRight;
+ bool _topLeft;
+ bool _bottomLeft;
+ bool _bottomRight;
int _unused2;
int _unused3;
bool _eyePresent;
diff --git a/engines/titanic/game/light_switch.cpp b/engines/titanic/game/light_switch.cpp
index 0137ff9965..a5b44d2351 100644
--- a/engines/titanic/game/light_switch.cpp
+++ b/engines/titanic/game/light_switch.cpp
@@ -144,7 +144,7 @@ bool CLightSwitch::EnterRoomMsg(CEnterRoomMsg *msg) {
_flag = true;
CPetControl *pet = getPetControl();
if (pet)
- _turnOnTV = pet->isRoom59706();
+ _turnOnTV = pet->isFirstClassSuite();
return true;
}
diff --git a/engines/titanic/game/parrot/parrot_lobby_link_updater.cpp b/engines/titanic/game/parrot/parrot_lobby_link_updater.cpp
index 47311c31f5..c32a06db39 100644
--- a/engines/titanic/game/parrot/parrot_lobby_link_updater.cpp
+++ b/engines/titanic/game/parrot/parrot_lobby_link_updater.cpp
@@ -80,9 +80,9 @@ bool CParrotLobbyLinkUpdater::ActMsg(CActMsg *msg) {
if (isEquals("ParrotLobbyUpdater_TOW")) {
entriesP = &_entries[4];
} else {
- if (node->_nodeNumber > 3)
+ if (node->_nodeNumber < 1 || node->_nodeNumber > 4)
return true;
- entriesP = &_entries[node->_nodeNumber];
+ entriesP = &_entries[node->_nodeNumber - 1];
}
int count = entriesP->size();
diff --git a/engines/titanic/game/parrot/parrot_perch_holder.cpp b/engines/titanic/game/parrot/parrot_perch_holder.cpp
index 557f70437a..fb7564ea17 100644
--- a/engines/titanic/game/parrot/parrot_perch_holder.cpp
+++ b/engines/titanic/game/parrot/parrot_perch_holder.cpp
@@ -45,7 +45,7 @@ void CParrotPerchHolder::load(SimpleFile *file) {
}
bool CParrotPerchHolder::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
- if (!CParrot::_v1) {
+ if (!CParrot::_eatingChicken) {
if (CCage::_open) {
petDisplayMessage(CANNOT_TAKE_CAGE_LOCKED);
} else if (CParrot::_state == PARROT_IN_CAGE) {
diff --git a/engines/titanic/game/television.cpp b/engines/titanic/game/television.cpp
index ba48d8061a..dbef81151c 100644
--- a/engines/titanic/game/television.cpp
+++ b/engines/titanic/game/television.cpp
@@ -283,12 +283,12 @@ bool CTelevision::TurnOn(CTurnOn *msg) {
bool CTelevision::LightsMsg(CLightsMsg *msg) {
CPetControl *pet = getPetControl();
- bool flag = false;
+ bool isYourStateroom = false;
if (pet)
- flag = pet->isRoom59706();
+ isYourStateroom = pet->isFirstClassSuite();
- if (msg->_upLeft || !flag)
+ if (msg->_topLeft || !isYourStateroom)
_turnOn = true;
return true;
diff --git a/engines/titanic/game/throw_tv_down_well.cpp b/engines/titanic/game/throw_tv_down_well.cpp
index 9de028cbde..be61f6e9ab 100644
--- a/engines/titanic/game/throw_tv_down_well.cpp
+++ b/engines/titanic/game/throw_tv_down_well.cpp
@@ -48,9 +48,9 @@ void CThrowTVDownWell::load(SimpleFile *file) {
bool CThrowTVDownWell::ActMsg(CActMsg *msg) {
if (msg->_action == "ThrowTVDownWell" && !_flag) {
- CString viewName = getFullViewName();
+ _viewName = getFullViewName();
lockMouse();
- addTimer(1, 8000, 0);
+ addTimer(1, 4000, 0);
CActMsg actMsg("ThrownTVDownWell");
actMsg.execute("BOWTelevisionMonitor");
diff --git a/engines/titanic/game_state.cpp b/engines/titanic/game_state.cpp
index 49779ad745..964d6e604a 100644
--- a/engines/titanic/game_state.cpp
+++ b/engines/titanic/game_state.cpp
@@ -83,11 +83,11 @@ void CGameState::setMode(GameStateMode newMode) {
_gameManager->lockInputHandler();
if (sm && sm->_mouseCursor)
- sm->_mouseCursor->setBusy();
+ sm->_mouseCursor->incBusyCount();
} else if (newMode != GSMODE_CUTSCENE && _mode == GSMODE_CUTSCENE) {
if (sm && sm->_mouseCursor)
- sm->_mouseCursor->clearBusy();
+ sm->_mouseCursor->decBusyCount();
if (_gameManager)
_gameManager->unlockInputHandler();
diff --git a/engines/titanic/messages/messages.h b/engines/titanic/messages/messages.h
index 123003fee5..6832c69f3c 100644
--- a/engines/titanic/messages/messages.h
+++ b/engines/titanic/messages/messages.h
@@ -270,7 +270,7 @@ MESSAGE1(CGetChevLiftBits, int, liftBits, 0);
MESSAGE1(CGetChevLiftNum, int, liftNum, 0);
MESSAGE1(CGetChevRoomBits, int, roomNum, 0);
MESSAGE1(CGetChevRoomNum, int, roomNum, 0);
-MESSAGE2(CHoseConnectedMsg, int, value, 1, CGameObject *, object, nullptr);
+MESSAGE2(CHoseConnectedMsg, bool, connected, true, CGameObject *, object, nullptr);
MESSAGE0(CInitializeAnimMsg);
MESSAGE1(CIsEarBowlPuzzleDone, int, value, 0);
MESSAGE3(CIsHookedOnMsg, Rect, rect, Rect(), bool, result, false, CString, string1, "");
@@ -280,7 +280,7 @@ MESSAGE2(CLeaveNodeMsg, CNodeItem *, oldNode, nullptr, CNodeItem *, newNode, nul
MESSAGE2(CLeaveRoomMsg, CRoomItem *, oldRoom, nullptr, CRoomItem *, newRoom, nullptr);
MESSAGE2(CLeaveViewMsg, CViewItem *, oldView, nullptr, CViewItem *, newView, nullptr);
MESSAGE1(CLemonFallsFromTreeMsg, Point, pt, Point());
-MESSAGE4(CLightsMsg, bool, upRight, false, bool, upLeft, false, bool, downLeft, false, bool, downRight, false);
+MESSAGE4(CLightsMsg, bool, topRight, false, bool, topLeft, false, bool, bottomLeft, false, bool, bottomRight, false);
MESSAGE1(CLoadSuccessMsg, int, ticks, 0);
MESSAGE1(CLockPhonographMsg, int, value, 0);
MESSAGE0(CMaitreDDefeatedMsg);
diff --git a/engines/titanic/npcs/bellbot.cpp b/engines/titanic/npcs/bellbot.cpp
index 1326655299..26c9b13e40 100644
--- a/engines/titanic/npcs/bellbot.cpp
+++ b/engines/titanic/npcs/bellbot.cpp
@@ -62,7 +62,7 @@ void CBellBot::load(SimpleFile *file) {
bool CBellBot::OnSummonBotMsg(COnSummonBotMsg *msg) {
if (msg->_value == 1) {
- _npcFlags |= NPCFLAG_40000;
+ _npcFlags |= NPCFLAG_MOVE_LOOP;
} else {
static const char *const ROOM_WAVES[8][2] = {
{ "EmbLobby", "z#193.wav" },
@@ -86,18 +86,18 @@ bool CBellBot::OnSummonBotMsg(COnSummonBotMsg *msg) {
playSound("z#147.wav");
sleep(2000);
- _npcFlags &= ~NPCFLAG_40000;
+ _npcFlags &= ~NPCFLAG_MOVE_LOOP;
}
playClip("Walk On", MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE);
movieEvent();
- _npcFlags |= NPCFLAG_10000;
+ _npcFlags |= NPCFLAG_MOVING;
return true;
}
bool CBellBot::LeaveViewMsg(CLeaveViewMsg *msg) {
- if (_npcFlags & NPCFLAG_10000) {
+ if (_npcFlags & NPCFLAG_MOVING) {
performAction(1);
_npcFlags &= ~NPCFLAG_START_IDLING;
CDismissBotMsg dismissMsg;
@@ -108,15 +108,15 @@ bool CBellBot::LeaveViewMsg(CLeaveViewMsg *msg) {
}
bool CBellBot::MovieEndMsg(CMovieEndMsg *msg) {
- if (!(_npcFlags & NPCFLAG_10000)) {
+ if (!(_npcFlags & NPCFLAG_MOVING)) {
CTrueTalkNPC::MovieEndMsg(msg);
} else if (clipExistsByEnd("Walk On", msg->_endFrame)) {
setPosition(Point(80, 10));
loadFrame(543);
_npcFlags |= NPCFLAG_START_IDLING;
- if (_npcFlags & NPCFLAG_40000) {
+ if (_npcFlags & NPCFLAG_MOVE_LOOP) {
startTalking(this, 157);
- _npcFlags &= ~NPCFLAG_40000;
+ _npcFlags &= ~NPCFLAG_MOVE_LOOP;
}
setTalking(this, true);
@@ -125,7 +125,7 @@ bool CBellBot::MovieEndMsg(CMovieEndMsg *msg) {
CPutBotBackInHisBoxMsg boxMsg;
boxMsg.execute(this);
- if (_npcFlags & NPCFLAG_20000)
+ if (_npcFlags & NPCFLAG_MOVE_START)
startAnimTimer("SummonDoorbot", 1500);
} else {
CTrueTalkNPC::MovieEndMsg(msg);
@@ -140,7 +140,7 @@ bool CBellBot::Use(CUse *msg) {
}
bool CBellBot::DismissBotMsg(CDismissBotMsg *msg) {
- if (_npcFlags & NPCFLAG_10000) {
+ if (_npcFlags & NPCFLAG_MOVING) {
playClip("Walk Off", MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE);
if (_npcFlags & NPCFLAG_START_IDLING) {
_npcFlags &= ~NPCFLAG_START_IDLING;
@@ -167,7 +167,7 @@ bool CBellBot::TrueTalkTriggerActionMsg(CTrueTalkTriggerActionMsg *msg) {
}
case 5:
- _npcFlags &= ~NPCFLAG_20000;
+ _npcFlags &= ~NPCFLAG_MOVE_START;
playClip("Walk Off", MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE);
movieEvent();
break;
@@ -246,7 +246,7 @@ bool CBellBot::TimerMsg(CTimerMsg *msg) {
botMsg.execute(room);
}
- _npcFlags &= ~NPCFLAG_20000;
+ _npcFlags &= ~NPCFLAG_MOVE_START;
} else {
CTrueTalkNPC::TimerMsg(msg);
}
@@ -256,10 +256,10 @@ bool CBellBot::TimerMsg(CTimerMsg *msg) {
bool CBellBot::TrueTalkGetStateValueMsg(CTrueTalkGetStateValueMsg *msg) {
CPetControl *pet = getPetControl();
- bool flag = pet ? pet->isRoom59706() : false;
+ bool isYourStateroom = pet ? pet->isFirstClassSuite() : false;
if (msg->_stateNum == 7)
- msg->_stateVal = flag ? 1 : 0;
+ msg->_stateVal = isYourStateroom ? 1 : 0;
return true;
}
diff --git a/engines/titanic/npcs/bilge_succubus.cpp b/engines/titanic/npcs/bilge_succubus.cpp
index 628f2eb24b..d5436ebc55 100644
--- a/engines/titanic/npcs/bilge_succubus.cpp
+++ b/engines/titanic/npcs/bilge_succubus.cpp
@@ -88,7 +88,7 @@ bool CBilgeSuccUBus::PETReceiveMsg(CPETReceiveMsg *msg) {
} else {
uint roomFlags = pet->getRoomFlags();
CGameObject *mailObject = findMailByFlags(
- _v3 && compareRoomNameTo("Titania") ? 3 : _field140,
+ _v3 && compareRoomNameTo("Titania") ? RFC_TITANIA : _flagsComparison,
roomFlags);
if (mailObject) {
@@ -184,7 +184,7 @@ bool CBilgeSuccUBus::MovieEndMsg(CMovieEndMsg *msg) {
if (_offStartFrame >= 0)
playSound("z#27.wav");
} else if (msg->_endFrame == _offEndFrame) {
- if (_startFrame11 >= 0)
+ if (_endingStartFrame >= 0)
playSound("z#30.wav");
} else {
if (msg->_endFrame == _onEndFrame && pet) {
@@ -378,8 +378,8 @@ bool CBilgeSuccUBus::EnterViewMsg(CEnterViewMsg *msg) {
petSetRemoteTarget();
_mailP = nullptr;
- if (_startFrame8 >= 0)
- loadFrame(_startFrame8);
+ if (_initialStartFrame >= 0)
+ loadFrame(_initialStartFrame);
return true;
}
diff --git a/engines/titanic/npcs/deskbot.cpp b/engines/titanic/npcs/deskbot.cpp
index 20dc3af39b..56f4d98f18 100644
--- a/engines/titanic/npcs/deskbot.cpp
+++ b/engines/titanic/npcs/deskbot.cpp
@@ -87,7 +87,7 @@ bool CDeskbot::TurnOn(CTurnOn *msg) {
playSound("b#69.wav");
petSetArea(PET_CONVERSATION);
- _npcFlags |= NPCFLAG_20000;
+ _npcFlags |= NPCFLAG_MOVE_START;
_deskbotActive = true;
}
@@ -113,7 +113,7 @@ bool CDeskbot::ActMsg(CActMsg *msg) {
bool CDeskbot::MovieEndMsg(CMovieEndMsg *msg) {
bool flag = false;
- if (_npcFlags & NPCFLAG_10000) {
+ if (_npcFlags & NPCFLAG_MOVING) {
if (_classNum) {
petSetArea(PET_ROOMS);
decTransitions();
@@ -122,32 +122,32 @@ bool CDeskbot::MovieEndMsg(CMovieEndMsg *msg) {
_classNum = NO_CLASS;
}
- _npcFlags &= ~NPCFLAG_10000;
+ _npcFlags &= ~NPCFLAG_MOVING;
flag = true;
}
- if (_npcFlags & NPCFLAG_40000) {
+ if (_npcFlags & NPCFLAG_MOVE_LOOP) {
_deskbotActive = false;
- _npcFlags &= ~(NPCFLAG_40000 | NPCFLAG_20000);
+ _npcFlags &= ~(NPCFLAG_MOVE_LOOP | NPCFLAG_MOVE_START);
- if (_npcFlags & NPCFLAG_80000) {
+ if (_npcFlags & NPCFLAG_MOVE_FINISH) {
CTurnOn turnOn;
turnOn.execute("EmbBellbotTrigger");
unlockMouse();
changeView("EmbLobby.Node 4.N", "");
- } else if (_npcFlags & NPCFLAG_100000) {
+ } else if (_npcFlags & NPCFLAG_MOVE_LEFT) {
CTurnOn turnOn;
turnOn.execute("EmbDoorBotTrigger");
unlockMouse();
changeView("EmbLobby.Node 4.N", "");
}
- _npcFlags &= ~(NPCFLAG_80000 | NPCFLAG_100000);
+ _npcFlags &= ~(NPCFLAG_MOVE_FINISH | NPCFLAG_MOVE_LEFT);
flag = true;
}
- if (_npcFlags & NPCFLAG_20000) {
- _npcFlags &= ~(NPCFLAG_40000 | NPCFLAG_20000);
+ if (_npcFlags & NPCFLAG_MOVE_START) {
+ _npcFlags &= ~(NPCFLAG_MOVE_LOOP | NPCFLAG_MOVE_START);
setTalking(this, true, findView());
_npcFlags |= NPCFLAG_START_IDLING;
@@ -176,7 +176,7 @@ bool CDeskbot::TrueTalkTriggerActionMsg(CTrueTalkTriggerActionMsg *msg) {
lockMouse();
petSetArea(PET_CONVERSATION);
playClip("ReprogramPETInHand", MOVIE_NOTIFY_OBJECT);
- _npcFlags |= NPCFLAG_10000;
+ _npcFlags |= NPCFLAG_MOVING;
_classNum = (PassengerClass)msg->_param1;
switch (_classNum) {
@@ -231,7 +231,7 @@ bool CDeskbot::TrueTalkTriggerActionMsg(CTrueTalkTriggerActionMsg *msg) {
break;
case 26:
- _npcFlags |= NPCFLAG_80000;
+ _npcFlags |= NPCFLAG_MOVE_FINISH;
CTurnOff turnOff;
turnOff.execute(this);
lockMouse();
@@ -254,7 +254,7 @@ bool CDeskbot::NPCPlayIdleAnimationMsg(CNPCPlayIdleAnimationMsg *msg) {
}
bool CDeskbot::TrueTalkNotifySpeechStartedMsg(CTrueTalkNotifySpeechStartedMsg *msg) {
- if (_npcFlags & NPCFLAG_40000)
+ if (_npcFlags & NPCFLAG_MOVE_LOOP)
return true;
CTrueTalkNPC::TrueTalkNotifySpeechStartedMsg(msg);
@@ -274,7 +274,7 @@ bool CDeskbot::TrueTalkNotifySpeechStartedMsg(CTrueTalkNotifySpeechStartedMsg *m
}
bool CDeskbot::TrueTalkNotifySpeechEndedMsg(CTrueTalkNotifySpeechEndedMsg *msg) {
- if (_npcFlags & NPCFLAG_40000)
+ if (_npcFlags & NPCFLAG_MOVE_LOOP)
return true;
CTurnOff turnOff;
@@ -285,11 +285,11 @@ bool CDeskbot::TrueTalkNotifySpeechEndedMsg(CTrueTalkNotifySpeechEndedMsg *msg)
case 41787:
case 41788:
case 41789:
- _npcFlags |= NPCFLAG_80000;
+ _npcFlags |= NPCFLAG_MOVE_FINISH;
turnOff.execute(this);
case 41686:
- _npcFlags |= NPCFLAG_100000;
+ _npcFlags |= NPCFLAG_MOVE_LEFT;
turnOff.execute(this);
break;
@@ -305,7 +305,7 @@ bool CDeskbot::TurnOff(CTurnOff *msg) {
stopMovie();
performAction(1, findView());
- _npcFlags = (_npcFlags & ~(NPCFLAG_SPEAKING | NPCFLAG_IDLING | NPCFLAG_START_IDLING)) | NPCFLAG_40000;
+ _npcFlags = (_npcFlags & ~(NPCFLAG_SPEAKING | NPCFLAG_IDLING | NPCFLAG_START_IDLING)) | NPCFLAG_MOVE_LOOP;
playClip("Closing", MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT);
}
diff --git a/engines/titanic/npcs/doorbot.cpp b/engines/titanic/npcs/doorbot.cpp
index ae59497ee8..79e3dafed4 100644
--- a/engines/titanic/npcs/doorbot.cpp
+++ b/engines/titanic/npcs/doorbot.cpp
@@ -120,9 +120,9 @@ bool CDoorbot::MovieEndMsg(CMovieEndMsg *msg) {
}
CTrueTalkNPC::MovieEndMsg(msg);
- } else if (_npcFlags & NPCFLAG_100000) {
+ } else if (_npcFlags & NPCFLAG_MOVE_LEFT) {
if (clipExistsByEnd("Cloak Off", msg->_endFrame)) {
- _npcFlags = (_npcFlags & ~NPCFLAG_8) | NPCFLAG_START_IDLING;
+ _npcFlags = (_npcFlags & ~NPCFLAG_DOORBOT_IN_HOME) | NPCFLAG_START_IDLING;
setTalking(this, false);
startTalking(this, 221474);
_npcFlags |= NPCFLAG_DOORBOT_INTRO;
@@ -134,7 +134,7 @@ bool CDoorbot::MovieEndMsg(CMovieEndMsg *msg) {
} else {
CTrueTalkNPC::MovieEndMsg(msg);
}
- } else if (_npcFlags & NPCFLAG_400000) {
+ } else if (_npcFlags & NPCFLAG_MOVE_END) {
if (clipExistsByEnd("Whizz On Left", msg->_endFrame)
|| clipExistsByEnd("Whizz On Right", msg->_endFrame)) {
setPosition(Point((600 - _bounds.width()) / 2 + 18, 42));
@@ -146,7 +146,7 @@ bool CDoorbot::MovieEndMsg(CMovieEndMsg *msg) {
|| clipExistsByEnd("Whizz Off Right", msg->_endFrame)) {
CPutBotBackInHisBoxMsg boxMsg;
boxMsg.execute(this);
- if (_npcFlags & NPCFLAG_4000000)
+ if (_npcFlags & NPCFLAG_SUMMON_BELLBOT)
startAnimTimer("SummonBellbot", 1500);
} else {
CTrueTalkNPC::MovieEndMsg(msg);
@@ -187,7 +187,7 @@ bool CDoorbot::OnSummonBotMsg(COnSummonBotMsg *msg) {
playClip(getRandomNumber(1) ? "Whizz On Left" : "Whizz On Right",
MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE);
movieEvent();
- _npcFlags |= NPCFLAG_400000;
+ _npcFlags |= NPCFLAG_MOVE_END;
return true;
}
@@ -199,7 +199,7 @@ bool CDoorbot::TrueTalkTriggerActionMsg(CTrueTalkTriggerActionMsg *msg) {
break;
case 4:
- _npcFlags = (_npcFlags & ~NPCFLAG_IDLING) | NPCFLAG_4000000;
+ _npcFlags = (_npcFlags & ~NPCFLAG_IDLING) | NPCFLAG_SUMMON_BELLBOT;
playClip("Whizz Off Left", MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE);
break;
@@ -217,12 +217,12 @@ bool CDoorbot::TrueTalkTriggerActionMsg(CTrueTalkTriggerActionMsg *msg) {
bool CDoorbot::DoorbotNeededInHomeMsg(CDoorbotNeededInHomeMsg *msg) {
moveToView();
setPosition(Point(90, 42));
- _npcFlags = NPCFLAG_100000;
+ _npcFlags = NPCFLAG_MOVE_LEFT;
stopMovie();
playClip("Cloak Off", MOVIE_NOTIFY_OBJECT);
- _npcFlags |= NPCFLAG_8;
+ _npcFlags |= NPCFLAG_DOORBOT_IN_HOME;
return true;
}
@@ -232,7 +232,7 @@ bool CDoorbot::DoorbotNeededInElevatorMsg(CDoorbotNeededInElevatorMsg *msg) {
if (_npcFlags & NPCFLAG_DOORBOT_INTRO) {
_introMovieNum = 7;
- _npcFlags |= NPCFLAG_200000;
+ _npcFlags |= NPCFLAG_MOVE_RIGHT;
loadFrame(797);
} else {
_npcFlags = 0;
@@ -244,7 +244,7 @@ bool CDoorbot::DoorbotNeededInElevatorMsg(CDoorbotNeededInElevatorMsg *msg) {
}
bool CDoorbot::LeaveViewMsg(CLeaveViewMsg *msg) {
- if (!(_npcFlags & NPCFLAG_DOORBOT_INTRO) && (_npcFlags & NPCFLAG_400000)) {
+ if (!(_npcFlags & NPCFLAG_DOORBOT_INTRO) && (_npcFlags & NPCFLAG_MOVE_END)) {
performAction(true);
_npcFlags &= ~NPCFLAG_START_IDLING;
}
@@ -320,7 +320,7 @@ bool CDoorbot::TimerMsg(CTimerMsg *msg) {
botMsg.execute(room);
}
- _npcFlags &= ~NPCFLAG_4000000;
+ _npcFlags &= ~NPCFLAG_SUMMON_BELLBOT;
}
return true;
@@ -342,7 +342,7 @@ bool CDoorbot::NPCPlayTalkingAnimationMsg(CNPCPlayTalkingAnimationMsg *msg) {
};
if (msg->_value2 != 2) {
- if (_npcFlags & NPCFLAG_200000) {
+ if (_npcFlags & NPCFLAG_MOVE_RIGHT) {
switch (_introMovieNum) {
case 8:
case 10:
@@ -355,7 +355,7 @@ bool CDoorbot::NPCPlayTalkingAnimationMsg(CNPCPlayTalkingAnimationMsg *msg) {
default:
break;
}
- } else if (_npcFlags & (NPCFLAG_100000 | NPCFLAG_400000)) {
+ } else if (_npcFlags & (NPCFLAG_MOVE_LEFT | NPCFLAG_MOVE_END)) {
msg->_names = NAMES1;
}
}
@@ -368,8 +368,8 @@ bool CDoorbot::NPCPlayIdleAnimationMsg(CNPCPlayIdleAnimationMsg *msg) {
"Hand swivel", "Prompt Push", "Eye Roll", "Say something", nullptr
};
- if (!(_npcFlags & (NPCFLAG_100000 | NPCFLAG_200000))
- && (_npcFlags & NPCFLAG_400000))
+ if (!(_npcFlags & (NPCFLAG_MOVE_LEFT | NPCFLAG_MOVE_RIGHT))
+ && (_npcFlags & NPCFLAG_MOVE_END))
msg->_names = NAMES;
return true;
@@ -377,7 +377,7 @@ bool CDoorbot::NPCPlayIdleAnimationMsg(CNPCPlayIdleAnimationMsg *msg) {
bool CDoorbot::PutBotBackInHisBoxMsg(CPutBotBackInHisBoxMsg *msg) {
petMoveToHiddenRoom();
- _npcFlags &= ~(NPCFLAG_START_IDLING | NPCFLAG_100000 | NPCFLAG_200000 | NPCFLAG_DOORBOT_INTRO);
+ _npcFlags &= ~(NPCFLAG_START_IDLING | NPCFLAG_MOVE_LEFT | NPCFLAG_MOVE_RIGHT | NPCFLAG_DOORBOT_INTRO);
if (msg->_value)
performAction(true);
@@ -385,7 +385,7 @@ bool CDoorbot::PutBotBackInHisBoxMsg(CPutBotBackInHisBoxMsg *msg) {
}
bool CDoorbot::DismissBotMsg(CDismissBotMsg *msg) {
- if (_npcFlags & NPCFLAG_400000) {
+ if (_npcFlags & NPCFLAG_MOVE_END) {
playClip(getRandomNumber(1) ? "Whizz Off Left" : "Whizz Off Right",
MOVIE_STOP_PREVIOUS | MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE);
movieEvent();
diff --git a/engines/titanic/npcs/parrot.cpp b/engines/titanic/npcs/parrot.cpp
index 9e6366ace2..b570bea6ae 100644
--- a/engines/titanic/npcs/parrot.cpp
+++ b/engines/titanic/npcs/parrot.cpp
@@ -45,69 +45,23 @@ BEGIN_MESSAGE_MAP(CParrot, CTrueTalkNPC)
ON_MESSAGE(LeaveRoomMsg)
END_MESSAGE_MAP()
-int CParrot::_v1;
-int CParrot::_v2;
-int CParrot::_v3;
+bool CParrot::_eatingChicken;
+bool CParrot::_takeOff;
+bool CParrot::_unused;
ParrotState CParrot::_state;
-int CParrot::_v5;
+bool CParrot::_coreReplaced;
CParrot::CParrot() : CTrueTalkNPC() {
- _field108 = 0;
- _string2 = "CarryParrot";
- _field118 = 1;
- _field11C = 25;
+ _unused1 = 0;
+ _carryParrot = "CarryParrot";
+ _canDrag = true;
+ _unused2 = 25;
_lastSpeakTime = 0;
_newXp = 73;
_newXc = 58;
- _field12C = 0;
- _field130 = 0;
+ _canEatChicken = false;
+ _eatOffsetX = 0;
_panTarget = nullptr;
- _field138 = 851;
- _field13C = 851;
- _field140 = 265;
- _field144 = 274;
- _field148 = 726;
- _field14C = 730;
- _field150 = 510;
- _field154 = 570;
- _field158 = 569;
- _field15C = 689;
- _field160 = 690;
- _field164 = 725;
- _field168 = 375;
- _field16C = 508;
- _field170 = 363;
- _field174 = 375;
- _field178 = 303;
- _field17C = 313;
- _field180 = 279;
- _field184 = 302;
- _field188 = 260;
- _field18C = 264;
- _field190 = 315;
- _field194 = 327;
- _field198 = 330;
- _field19C = 360;
- _field1A0 = 175;
- _field1A4 = 259;
- _field1A8 = 175;
- _field1AC = 175;
- _field1B0 = 162;
- _field1B4 = 175;
- _field1B8 = 150;
- _field1BC = 162;
- _field1C0 = 135;
- _field1C4 = 150;
- _field1C8 = 95;
- _field1CC = 135;
- _field1D0 = 76;
- _field1D4 = 95;
- _field1D8 = 55;
- _field1DC = 76;
- _field1E0 = 30;
- _field1E4 = 55;
- _field1E8 = 0;
- _field1EC = 30;
_assetName = "z454.dlg";
_assetNumber = 0x13880;
@@ -118,21 +72,21 @@ void CParrot::save(SimpleFile *file, int indent) {
file->writeNumberLine(_assetNumber, indent);
file->writeQuotedLine(_assetName, indent);
- file->writeNumberLine(_field108, indent);
- file->writeNumberLine(_v1, indent);
- file->writeNumberLine(_v2, indent);
- file->writeNumberLine(_v3, indent);
-
- file->writeQuotedLine(_string2, indent);
- file->writeNumberLine(_field118, indent);
- file->writeNumberLine(_field11C, indent);
+ file->writeNumberLine(_unused1, indent);
+ file->writeNumberLine(_eatingChicken, indent);
+ file->writeNumberLine(_takeOff, indent);
+ file->writeNumberLine(_unused, indent);
+
+ file->writeQuotedLine(_carryParrot, indent);
+ file->writeNumberLine(_canDrag, indent);
+ file->writeNumberLine(_unused2, indent);
file->writeNumberLine(_lastSpeakTime, indent);
file->writeNumberLine(_newXp, indent);
file->writeNumberLine(_newXc, indent);
- file->writeNumberLine(_field12C, indent);
- file->writeNumberLine(_field130, indent);
+ file->writeNumberLine(_canEatChicken, indent);
+ file->writeNumberLine(_eatOffsetX, indent);
file->writeNumberLine(_state, indent);
- file->writeNumberLine(_v5, indent);
+ file->writeNumberLine(_coreReplaced, indent);
CTrueTalkNPC::save(file, indent);
}
@@ -142,21 +96,21 @@ void CParrot::load(SimpleFile *file) {
_assetNumber = file->readNumber();
_assetName = file->readString();
- _field108 = file->readNumber();
- _v1 = file->readNumber();
- _v2 = file->readNumber();
- _v3 = file->readNumber();
-
- _string2 = file->readString();
- _field118 = file->readNumber();
- _field11C = file->readNumber();
+ _unused1 = file->readNumber();
+ _eatingChicken = file->readNumber();
+ _takeOff = file->readNumber();
+ _unused = file->readNumber();
+
+ _carryParrot = file->readString();
+ _canDrag = file->readNumber();
+ _unused2 = file->readNumber();
_lastSpeakTime = file->readNumber();
_newXp = file->readNumber();
_newXc = file->readNumber();
- _field12C = file->readNumber();
- _field130 = file->readNumber();
+ _canEatChicken = file->readNumber();
+ _eatOffsetX = file->readNumber();
_state = (ParrotState)file->readNumber();
- _v5 = file->readNumber();
+ _coreReplaced = file->readNumber();
CTrueTalkNPC::load(file);
}
@@ -168,8 +122,8 @@ bool CParrot::ActMsg(CActMsg *msg) {
} else if (msg->_action == "Chicken") {
// Nothing to do
} else if (msg->_action == "CarryParrotLeftView") {
- if (!_v2) {
- _v1 = 0;
+ if (!_takeOff) {
+ _eatingChicken = false;
CStatusChangeMsg statusMsg;
statusMsg._newStatus = 1;
statusMsg.execute("PerchCoreHolder");
@@ -178,12 +132,12 @@ bool CParrot::ActMsg(CActMsg *msg) {
if (_state == PARROT_IN_CAGE) {
stopMovie();
startTalking(this, 280275, findView());
- _field12C = 0;
+ _canEatChicken = false;
}
} else if (msg->_action == "EnteringFromTOW" &&
(_state == PARROT_IN_CAGE || _state == PARROT_ESCAPED)) {
- if (_v2) {
- _v2 = 2;
+ if (_takeOff) {
+ _state = PARROT_ESCAPED;
} else {
setVisible(true);
CTreeItem *cageBar = getRoot()->findByName("CageBar");
@@ -202,7 +156,7 @@ bool CParrot::ActMsg(CActMsg *msg) {
}
bool CParrot::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
- if (!(_npcFlags & NPCFLAG_2000000) && _speechCounter == 0) {
+ if (!(_npcFlags & NPCFLAG_TAKE_OFF) && _speechCounter == 0) {
CTrueTalkTriggerActionMsg triggerMsg(280250, 280250, 1);
triggerMsg.execute(this);
}
@@ -211,7 +165,7 @@ bool CParrot::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
}
bool CParrot::MovieEndMsg(CMovieEndMsg *msg) {
- if ((_npcFlags & NPCFLAG_2000000) && clipExistsByEnd("Take Off", msg->_endFrame)) {
+ if ((_npcFlags & NPCFLAG_TAKE_OFF) && clipExistsByEnd("Take Off", msg->_endFrame)) {
setVisible(false);
moveUnder(findRoom());
stopMovie();
@@ -228,21 +182,23 @@ bool CParrot::MovieEndMsg(CMovieEndMsg *msg) {
actMsg2.execute("ParrotCage");
}
- _npcFlags &= ~NPCFLAG_2000000;
+ _npcFlags &= ~NPCFLAG_TAKE_OFF;
_state = PARROT_ESCAPED;
- } else if (_npcFlags & NPCFLAG_10000) {
- if (_npcFlags & NPCFLAG_20000) {
- _npcFlags = (_npcFlags & ~NPCFLAG_20000) | NPCFLAG_40000;
- if (_npcFlags & NPCFLAG_100000) {
+ } else if (_npcFlags & NPCFLAG_MOVING) {
+ if (_npcFlags & NPCFLAG_MOVE_START) {
+ // Parrot is about to loop
+ _npcFlags = (_npcFlags & ~NPCFLAG_MOVE_START) | NPCFLAG_MOVE_LOOP;
+ if (_npcFlags & NPCFLAG_MOVE_LEFT) {
playClip("Walk Left Loop", MOVIE_NOTIFY_OBJECT);
movieEvent(236);
} else {
playClip("Walk Right Loop", MOVIE_NOTIFY_OBJECT);
}
- } else if (_npcFlags & NPCFLAG_40000) {
+ } else if (_npcFlags & NPCFLAG_MOVE_LOOP) {
+ // In progress movement loop
int xp = _bounds.left + _bounds.width() / 2;
- if (_npcFlags & NPCFLAG_100000) {
+ if (_npcFlags & NPCFLAG_MOVE_LEFT) {
if ((xp - _newXc) > 32) {
setPosition(Point(_bounds.left - 40, _bounds.top));
playClip("Walk Left Loop", MOVIE_NOTIFY_OBJECT);
@@ -250,7 +206,7 @@ bool CParrot::MovieEndMsg(CMovieEndMsg *msg) {
} else {
setPosition(Point(_bounds.left - 10, _bounds.top));
playClip("Walk Left Outro", MOVIE_NOTIFY_OBJECT);
- _npcFlags = (_npcFlags & ~NPCFLAG_40000) | NPCFLAG_80000;
+ _npcFlags = (_npcFlags & ~NPCFLAG_MOVE_LOOP) | NPCFLAG_MOVE_FINISH;
}
} else {
if ((_newXc - xp) > 32) {
@@ -258,86 +214,92 @@ bool CParrot::MovieEndMsg(CMovieEndMsg *msg) {
movieEvent(244);
} else {
playClip("Walk Right Outro", MOVIE_NOTIFY_OBJECT);
- _npcFlags = (_npcFlags & NPCFLAG_40000) | NPCFLAG_80000;
+ _npcFlags = (_npcFlags & ~NPCFLAG_MOVE_LOOP) | NPCFLAG_MOVE_FINISH;
}
}
- } else if (_npcFlags & NPCFLAG_80000) {
+ } else if (_npcFlags & NPCFLAG_MOVE_FINISH) {
+ // Finishing movement
loadFrame(0);
- if (_npcFlags & NPCFLAG_100000)
+ if (_npcFlags & NPCFLAG_MOVE_LEFT)
setPosition(Point(_bounds.left - 30, _bounds.top));
else
setPosition(Point(_bounds.left + 14, _bounds.top));
- _npcFlags &= ~(NPCFLAG_10000 | NPCFLAG_80000 | NPCFLAG_100000 | NPCFLAG_200000);
+ _npcFlags &= ~(NPCFLAG_MOVING | NPCFLAG_MOVE_FINISH | NPCFLAG_MOVE_LEFT | NPCFLAG_MOVE_RIGHT);
CTrueTalkNPC::MovieEndMsg(msg);
- } else {
- if (_npcFlags & NPCFLAG_1000000) {
- Point pt = getMousePos();
- if (pt.x > 70 || pt.y < 90 || pt.y > 280) {
- stopMovie();
- loadFrame(0);
- _npcFlags &= ~NPCFLAG_1000000;
- }
+ }
+ } else if (_npcFlags & NPCFLAG_CHICKEN_OUTSIDE_CAGE) {
+ Point pt = getMousePos();
+ if (pt.x > 70 || pt.y < 90 || pt.y > 280) {
+ stopMovie();
+ loadFrame(0);
+ _npcFlags &= ~NPCFLAG_CHICKEN_OUTSIDE_CAGE;
+ }
- if (clipExistsByEnd("Walk Left Loop", msg->_endFrame)) {
- playClip("Lean Over To Chicken", MOVIE_NOTIFY_OBJECT);
- setPosition(Point(_bounds.left - 55, _bounds.top));
- _field130 = (-100 - _bounds.left) / 5;
- movieEvent(261);
- movieEvent(262);
- movieEvent(265);
- movieEvent(268);
- movieEvent(271);
- return true;
-
- } else if (clipExistsByEnd("Lean Over To Chicken", msg->_endFrame)) {
- playClip("Eat Chicken");
- playClip("Eat Chicken 2", MOVIE_NOTIFY_OBJECT);
- _v1 = 1;
-
- CStatusChangeMsg statusMsg;
- statusMsg._newStatus = 0;
- statusMsg.execute("PerchCoreHolder");
-
- CTrueTalkTriggerActionMsg actionMsg;
- actionMsg._param1 = 280266;
- actionMsg._param2 = 1;
- actionMsg.execute(this);
-
- CCarry *chicken = dynamic_cast<CCarry *>(findUnder(getRoot(), "Chicken"));
- if (chicken) {
- CActMsg actMsg("Eaten");
- actMsg.execute(chicken);
- }
-
- _npcFlags &= ~NPCFLAG_1000000;
- return true;
- }
- }
+ if (clipExistsByEnd("Walk Left Loop", msg->_endFrame)) {
+ playClip("Lean Over To Chicken", MOVIE_NOTIFY_OBJECT);
+ setPosition(Point(_bounds.left - 55, _bounds.top));
+ _eatOffsetX = (-100 - _bounds.left) / 5;
+ movieEvent(261);
+ movieEvent(262);
+ movieEvent(265);
+ movieEvent(268);
+ movieEvent(271);
+ return true;
- if (clipExistsByEnd("Eat Chicken 2", msg->_endFrame)) {
- CStatusChangeMsg statusMsg;
- statusMsg._newStatus = 1;
- statusMsg.execute("PerchCoreHolder");
+ } else if (clipExistsByEnd("Lean Over To Chicken", msg->_endFrame)) {
+ // Leaning left out of cage to eat the chicken
+ playClip("Eat Chicken");
+ playClip("Eat Chicken 2", MOVIE_NOTIFY_OBJECT);
+ _eatingChicken = true;
- if (_v2) {
- loadMovie("z168.avi", false);
- playClip("Take Off", MOVIE_NOTIFY_OBJECT);
- setPosition(Point(20, 10));
- _npcFlags |= NPCFLAG_2000000;
- } else {
- _npcFlags &= ~(NPCFLAG_10000 | NPCFLAG_20000 | NPCFLAG_40000 | NPCFLAG_80000 | NPCFLAG_100000 | NPCFLAG_200000);
- _npcFlags |= NPCFLAG_400000;
- stopMovie();
- loadFrame(0);
- setPosition(Point(-90, _bounds.top));
- }
- } else {
- CTrueTalkNPC::MovieEndMsg(msg);
+ CStatusChangeMsg statusMsg;
+ statusMsg._newStatus = 0;
+ statusMsg.execute("PerchCoreHolder");
+
+ CTrueTalkTriggerActionMsg actionMsg;
+ actionMsg._action = 280266;
+ actionMsg._param2 = 1;
+ actionMsg.execute(this);
+
+ CCarry *chicken = dynamic_cast<CCarry *>(findUnder(getRoot(), "Chicken"));
+ if (chicken) {
+ CActMsg actMsg("Eaten");
+ actMsg.execute(chicken);
}
+
+ _npcFlags &= ~NPCFLAG_CHICKEN_OUTSIDE_CAGE;
+ return true;
}
}
+ if (clipExistsByEnd("Eat Chicken 2", msg->_endFrame)) {
+ // Parrot has finished eating Chicken
+ _eatingChicken = false;
+
+ CStatusChangeMsg statusMsg;
+ statusMsg._newStatus = 1;
+ statusMsg.execute("PerchCoreHolder");
+
+ if (_takeOff) {
+ // Perch has been taken, so take off
+ loadMovie("z168.avi", false);
+ playClip("Take Off", MOVIE_NOTIFY_OBJECT);
+ setPosition(Point(20, 10));
+ _npcFlags |= NPCFLAG_TAKE_OFF;
+ } else {
+ // Resetting back to standing
+ _npcFlags &= ~(NPCFLAG_MOVING | NPCFLAG_MOVE_START | NPCFLAG_MOVE_LOOP
+ | NPCFLAG_MOVE_FINISH | NPCFLAG_MOVE_LEFT | NPCFLAG_MOVE_RIGHT);
+ _npcFlags |= NPCFLAG_MOVE_END;
+ stopMovie();
+ loadFrame(0);
+ setPosition(Point(-90, _bounds.top));
+ }
+ } else {
+ return CTrueTalkNPC::MovieEndMsg(msg);
+ }
+
return true;
}
@@ -349,8 +311,9 @@ bool CParrot::EnterViewMsg(CEnterViewMsg *msg) {
if (_state == PARROT_IN_CAGE) {
setPosition(Point(_newXp, _bounds.top));
- _field118 = 1;
- _npcFlags &= ~(NPCFLAG_10000 | NPCFLAG_20000 | NPCFLAG_40000 | NPCFLAG_80000 | NPCFLAG_100000 | NPCFLAG_200000 | NPCFLAG_400000);
+ _canDrag = true;
+ _npcFlags &= ~(NPCFLAG_MOVING | NPCFLAG_MOVE_START | NPCFLAG_MOVE_LOOP
+ | NPCFLAG_MOVE_FINISH | NPCFLAG_MOVE_LEFT | NPCFLAG_MOVE_RIGHT | NPCFLAG_MOVE_END);
loadFrame(0);
setTalking(this, true, findView());
@@ -361,7 +324,7 @@ bool CParrot::EnterViewMsg(CEnterViewMsg *msg) {
}
petSetArea(PET_CONVERSATION);
- _field12C = 0;
+ _canEatChicken = false;
_npcFlags |= NPCFLAG_START_IDLING;
}
@@ -378,7 +341,7 @@ bool CParrot::TrueTalkTriggerActionMsg(CTrueTalkTriggerActionMsg *msg) {
}
bool CParrot::MouseDragStartMsg(CMouseDragStartMsg *msg) {
- if (_field118 && _state == PARROT_IN_CAGE && checkPoint(msg->_mousePos, false, true)) {
+ if (_canDrag && _state == PARROT_IN_CAGE && checkPoint(msg->_mousePos, false, true)) {
setVisible(false);
CRoomItem *room = findRoom();
@@ -386,7 +349,7 @@ bool CParrot::MouseDragStartMsg(CMouseDragStartMsg *msg) {
startTalking(this, 280129);
performAction(true);
- CCarry *item = dynamic_cast<CCarry *>(getRoot()->findByName(_string2));
+ CCarry *item = dynamic_cast<CCarry *>(getRoot()->findByName(_carryParrot));
if (item) {
item->_canTake = true;
CPassOnDragStartMsg passMsg;
@@ -483,7 +446,8 @@ bool CParrot::NPCPlayTalkingAnimationMsg(CNPCPlayTalkingAnimationMsg *msg) {
"Talking5", "Talking6", "Talking7", nullptr
};
- if (!(_npcFlags & (NPCFLAG_10000 | NPCFLAG_20000 | NPCFLAG_40000 | NPCFLAG_80000 | NPCFLAG_100000 | NPCFLAG_200000 | NPCFLAG_400000))
+ if (!(_npcFlags & (NPCFLAG_MOVING | NPCFLAG_MOVE_START | NPCFLAG_MOVE_LOOP | NPCFLAG_MOVE_FINISH
+ | NPCFLAG_MOVE_LEFT | NPCFLAG_MOVE_RIGHT | NPCFLAG_MOVE_END))
&& _visible && _state == PARROT_IN_CAGE) {
if (!compareViewNameTo("ParrotLobby.Node 1.N"))
msg->_names = NAMES;
@@ -498,11 +462,12 @@ bool CParrot::NPCPlayIdleAnimationMsg(CNPCPlayIdleAnimationMsg *msg) {
"Peck At Feet Right", nullptr
};
- if (!(_npcFlags & (NPCFLAG_10000 | NPCFLAG_20000 | NPCFLAG_40000 | NPCFLAG_80000 | NPCFLAG_100000 | NPCFLAG_200000 | NPCFLAG_400000))
+ if (!(_npcFlags & (NPCFLAG_MOVING | NPCFLAG_MOVE_START | NPCFLAG_MOVE_LOOP | NPCFLAG_MOVE_FINISH
+ | NPCFLAG_MOVE_LEFT | NPCFLAG_MOVE_RIGHT | NPCFLAG_MOVE_END))
&& _visible && _state == PARROT_IN_CAGE && !compareViewNameTo("ParrotLobby.Node 1.N")) {
CGameObject *dragItem = getDraggingObject();
if (!dragItem || dragItem->getName() == "Chicken") {
- if (!_v5 ||getRandomNumber(3) != 0) {
+ if (!_coreReplaced ||getRandomNumber(3) != 0) {
if (getRandomNumber(1)) {
startTalking(this, 280267, findView());
} else {
@@ -572,8 +537,9 @@ bool CParrot::FrameMsg(CFrameMsg *msg) {
Point pt = getMousePos();
CGameObject *dragObject = getDraggingObject();
int xp = _bounds.left + _bounds.width() / 2;
+ bool chickenFlag = false;
- if ((_npcFlags & NPCFLAG_400000) && !hasActiveMovie()) {
+ if ((_npcFlags & NPCFLAG_MOVE_END) && !hasActiveMovie()) {
_newXc = _newXp + _bounds.width() / 2;
int xDiff = ABS(xp - _newXc);
@@ -584,78 +550,84 @@ bool CParrot::FrameMsg(CFrameMsg *msg) {
_panTarget = nullptr;
}
- _npcFlags &= ~(NPCFLAG_10000 | NPCFLAG_20000 | NPCFLAG_40000
- | NPCFLAG_80000 | NPCFLAG_100000 | NPCFLAG_200000 | NPCFLAG_400000);
+ _npcFlags &= ~(NPCFLAG_MOVING | NPCFLAG_MOVE_START | NPCFLAG_MOVE_LOOP
+ | NPCFLAG_MOVE_FINISH | NPCFLAG_MOVE_LEFT | NPCFLAG_MOVE_RIGHT | NPCFLAG_MOVE_END);
return true;
}
- }
-
- bool chickenFlag = dragObject && dragObject->isEquals("Chicken");
-
- if (_npcFlags & NPCFLAG_1000000) {
- if (!chickenFlag || pt.x > 70 || pt.y < 90 || pt.y > 280) {
- stopMovie();
- loadFrame(0);
- setPosition(Point(-90, _bounds.top));
- }
} else {
- if (!chickenFlag)
- return false;
+ if (dragObject)
+ chickenFlag = dragObject && dragObject->isEquals("Chicken");
+
+ if (_npcFlags & NPCFLAG_CHICKEN_OUTSIDE_CAGE) {
+ if (!chickenFlag || pt.x > 70 || pt.y < 90 || pt.y > 280) {
+ // A start of eating the chicken outside the cage has to be
+ // aborted because the chicken has been moved out of range
+ stopMovie();
+ loadFrame(0);
+ setPosition(Point(-90, _bounds.top));
+ _npcFlags &= ~NPCFLAG_CHICKEN_OUTSIDE_CAGE;
+ }
+ } else {
+ if (!chickenFlag)
+ return false;
+ }
+
+ _newXc = CLIP((int)pt.x, 230, 480);
}
- _newXc = CLIP((int)pt.x, 230, 480);
- if ((_npcFlags & NPCFLAG_10000) || hasActiveMovie())
+ if ((_npcFlags & NPCFLAG_MOVING) || hasActiveMovie())
return true;
- if (_newXc > 64) {
- _npcFlags |= NPCFLAG_10000 | NPCFLAG_20000;
+ if (ABS(_newXc - xp) > 64) {
+ _npcFlags |= NPCFLAG_MOVING | NPCFLAG_MOVE_START;
if (_newXc >= xp) {
setPosition(Point(_bounds.left + 30, _bounds.top));
- _npcFlags |= NPCFLAG_200000;
+ _npcFlags |= NPCFLAG_MOVE_RIGHT;
playClip("Walk Right Intro", MOVIE_NOTIFY_OBJECT);
} else {
- _npcFlags |= NPCFLAG_100000;
+ _npcFlags |= NPCFLAG_MOVE_LEFT;
playClip("Walk Left Intro", MOVIE_NOTIFY_OBJECT);
}
- } else if (chickenFlag && pt.y >= 90 && pt.y <= 280 && !_field12C) {
+ } else if (chickenFlag && pt.y >= 90 && pt.y <= 280 && !_canEatChicken) {
CParrotTriesChickenMsg triesMsg;
triesMsg.execute(dragObject);
CTrueTalkTriggerActionMsg triggerMsg;
- int id;
+ int &action = triggerMsg._action;
switch (triesMsg._value2) {
case 1:
- id = 280056 + (triesMsg._value1 ? 234 : 0);
+ action = 280056 + (triesMsg._value1 ? 234 : 0);
break;
case 2:
- id = 280055 + (triesMsg._value1 ? 234 : 0);
+ action = 280055 + (triesMsg._value1 ? 234 : 0);
break;
case 3:
- id = 280054 + (triesMsg._value1 ? 234 : 0);
+ action = 280054 + (triesMsg._value1 ? 234 : 0);
break;
default:
- id = 280053 + (triesMsg._value1 ? 234 : 0);
+ action = 280053 + (triesMsg._value1 ? 234 : 0);
break;
}
- if (id < 280266) {
+ if (action != 280266) {
if (pt.x < 75) {
- _npcFlags |= NPCFLAG_1000000;
+ // Parrot needs to reach outside the cage
+ _npcFlags |= NPCFLAG_CHICKEN_OUTSIDE_CAGE;
playClip("Walk Left Intro", MOVIE_STOP_PREVIOUS);
playClip("Walk Left Loop", MOVIE_NOTIFY_OBJECT);
movieEvent(236);
chickenFlag = false;
} else if ((pt.x - xp) > 15) {
- _npcFlags |= NPCFLAG_800000;
+ _npcFlags |= NPCFLAG_PECKING;
playClip("Peck At Feet Right", MOVIE_NOTIFY_OBJECT);
movieEvent(170);
} else if ((xp - pt.x) > 15) {
- _npcFlags |= NPCFLAG_800000;
+ _npcFlags |= NPCFLAG_PECKING;
playClip("Peck At Feet Left", MOVIE_NOTIFY_OBJECT);
movieEvent(142);
} else {
- _npcFlags |= NPCFLAG_800000;
+ _npcFlags |= NPCFLAG_PECKING;
playClip("Peck At Feet", MOVIE_NOTIFY_OBJECT);
movieEvent(157);
}
@@ -664,7 +636,7 @@ bool CParrot::FrameMsg(CFrameMsg *msg) {
if (chickenFlag) {
triggerMsg._param2 = 1;
triggerMsg.execute(this);
- _field12C = 1;
+ _canEatChicken = true;
}
}
@@ -672,26 +644,27 @@ bool CParrot::FrameMsg(CFrameMsg *msg) {
}
bool CParrot::MovieFrameMsg(CMovieFrameMsg *msg) {
- if (_npcFlags & NPCFLAG_800000) {
+ if (_npcFlags & NPCFLAG_PECKING) {
+ // Whoopsy, the Parrot got your chicken
CCarry *chicken = dynamic_cast<CCarry *>(findUnder(getRoot(), "Chicken"));
if (chicken) {
CActMsg actMsg("Eaten");
actMsg.execute(chicken);
}
- _npcFlags &= ~NPCFLAG_800000;
+ _npcFlags &= ~NPCFLAG_PECKING;
}
switch (msg->_frameNumber) {
case 244:
- setPosition(Point(_bounds.left, _bounds.top + 45));
+ setPosition(Point(_bounds.left + 45, _bounds.top));
break;
case 261:
case 262:
case 265:
case 268:
case 271:
- setPosition(Point(_bounds.left + _field130, _bounds.top));
+ setPosition(Point(_bounds.left + _eatOffsetX, _bounds.top));
break;
default:
break;
@@ -734,14 +707,14 @@ bool CParrot::PanningAwayFromParrotMsg(CPanningAwayFromParrotMsg *msg) {
CActMsg actMsg("PanAwayFromParrot");
actMsg.execute(msg->_target);
_panTarget = nullptr;
- } else if (_v2) {
+ } else if (_takeOff) {
_panTarget = msg->_target;
loadMovie("z168.avi", false);
stopMovie();
playClip("Take Off", MOVIE_NOTIFY_OBJECT);
- _npcFlags |= NPCFLAG_2000000;
+ _npcFlags |= NPCFLAG_TAKE_OFF;
} else {
- _npcFlags |= NPCFLAG_400000;
+ _npcFlags |= NPCFLAG_MOVE_END;
_panTarget = msg->_target;
stopMovie();
}
diff --git a/engines/titanic/npcs/parrot.h b/engines/titanic/npcs/parrot.h
index ce0397fb71..c178a2086a 100644
--- a/engines/titanic/npcs/parrot.h
+++ b/engines/titanic/npcs/parrot.h
@@ -52,68 +52,22 @@ class CParrot : public CTrueTalkNPC {
bool PanningAwayFromParrotMsg(CPanningAwayFromParrotMsg *msg);
bool LeaveRoomMsg(CLeaveRoomMsg *msg);
public:
- static int _v1;
- static int _v2;
- static int _v3;
+ static bool _eatingChicken;
+ static bool _takeOff;
+ static bool _unused;
static ParrotState _state;
- static int _v5;
+ static bool _coreReplaced;
private:
- int _field108;
- CString _string2;
- int _field118;
- int _field11C;
+ int _unused1;
+ CString _carryParrot;
+ bool _canDrag;
+ int _unused2;
uint _lastSpeakTime;
int _newXp;
int _newXc;
- int _field12C;
- int _field130;
+ bool _canEatChicken;
+ int _eatOffsetX;
CMovePlayerTo *_panTarget;
- int _field138;
- int _field13C;
- int _field140;
- int _field144;
- int _field148;
- int _field14C;
- int _field150;
- int _field154;
- int _field158;
- int _field15C;
- int _field160;
- int _field164;
- int _field168;
- int _field16C;
- int _field170;
- int _field174;
- int _field178;
- int _field17C;
- int _field180;
- int _field184;
- int _field188;
- int _field18C;
- int _field190;
- int _field194;
- int _field198;
- int _field19C;
- int _field1A0;
- int _field1A4;
- int _field1A8;
- int _field1AC;
- int _field1B0;
- int _field1B4;
- int _field1B8;
- int _field1BC;
- int _field1C0;
- int _field1C4;
- int _field1C8;
- int _field1CC;
- int _field1D0;
- int _field1D4;
- int _field1D8;
- int _field1DC;
- int _field1E0;
- int _field1E4;
- int _field1E8;
- int _field1EC;
public:
CLASSDEF;
CParrot();
diff --git a/engines/titanic/npcs/parrot_succubus.cpp b/engines/titanic/npcs/parrot_succubus.cpp
index 08866f187d..2fa5b2f844 100644
--- a/engines/titanic/npcs/parrot_succubus.cpp
+++ b/engines/titanic/npcs/parrot_succubus.cpp
@@ -34,13 +34,13 @@ BEGIN_MESSAGE_MAP(CParrotSuccUBus, CSuccUBus)
ON_MESSAGE(LeaveNodeMsg)
END_MESSAGE_MAP()
-CParrotSuccUBus::CParrotSuccUBus() : CSuccUBus(), _field1DC(0),
+CParrotSuccUBus::CParrotSuccUBus() : CSuccUBus(), _hoseConnected(false),
_field1EC(0), _field1F0(376), _field1F4(393) {
}
void CParrotSuccUBus::save(SimpleFile *file, int indent) {
file->writeNumberLine(1, indent);
- file->writeNumberLine(_field1DC, indent);
+ file->writeNumberLine(_hoseConnected, indent);
file->writeQuotedLine(_string3, indent);
file->writeNumberLine(_field1EC, indent);
@@ -49,7 +49,7 @@ void CParrotSuccUBus::save(SimpleFile *file, int indent) {
void CParrotSuccUBus::load(SimpleFile *file) {
file->readNumber();
- _field1DC = file->readNumber();
+ _hoseConnected = file->readNumber();
_string3 = file->readString();
_field1EC = file->readNumber();
@@ -58,13 +58,13 @@ void CParrotSuccUBus::load(SimpleFile *file) {
bool CParrotSuccUBus::HoseConnectedMsg(CHoseConnectedMsg *msg) {
CPetControl *pet = getPetControl();
- if (msg->_value == _field1DC)
+ if (msg->_connected == _hoseConnected)
return true;
if (mailExists(pet->getRoomFlags()))
return false;
- _field1DC = msg->_value;
- if (_field1DC) {
+ _hoseConnected = msg->_connected;
+ if (_hoseConnected) {
CGameObject *item = msg->_object;
_string3 = item->getName();
CHoseConnectedMsg hoseMsg(1, this);
@@ -73,7 +73,7 @@ bool CParrotSuccUBus::HoseConnectedMsg(CHoseConnectedMsg *msg) {
CPumpingMsg pumpingMsg(1, this);
pumpingMsg.execute(this);
- _field1DC = 1;
+ _hoseConnected = true;
if (_enabled) {
_enabled = false;
@@ -82,7 +82,7 @@ bool CParrotSuccUBus::HoseConnectedMsg(CHoseConnectedMsg *msg) {
playSound("z#26.wav");
}
- playMovie(_field1C4, _field1C8, MOVIE_NOTIFY_OBJECT);
+ playMovie(_hoseStartFrame, _hoseEndFrame, MOVIE_NOTIFY_OBJECT);
} else {
stopMovie();
stopSound(_field1EC);
@@ -106,8 +106,8 @@ bool CParrotSuccUBus::HoseConnectedMsg(CHoseConnectedMsg *msg) {
}
bool CParrotSuccUBus::EnterViewMsg(CEnterViewMsg *msg) {
- if (_field1DC) {
- playMovie(_field1CC, _field1D0, MOVIE_REPEAT);
+ if (_hoseConnected) {
+ playMovie(_pumpingStartFrame, _pumpingEndFrame, MOVIE_REPEAT);
return true;
} else {
return CSuccUBus::EnterViewMsg(msg);
@@ -115,8 +115,8 @@ bool CParrotSuccUBus::EnterViewMsg(CEnterViewMsg *msg) {
}
bool CParrotSuccUBus::MovieEndMsg(CMovieEndMsg *msg) {
- if (msg->_endFrame == _field1C8) {
- playMovie(_field1CC, _field1D0, MOVIE_REPEAT);
+ if (msg->_endFrame == _hoseEndFrame) {
+ playMovie(_pumpingStartFrame, _pumpingEndFrame, MOVIE_REPEAT);
_field1EC = playSound("z#472.wav");
return true;
} else {
@@ -125,9 +125,9 @@ bool CParrotSuccUBus::MovieEndMsg(CMovieEndMsg *msg) {
}
bool CParrotSuccUBus::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
- if (_field1DC) {
+ if (_hoseConnected) {
CHoseConnectedMsg hoseMsg;
- hoseMsg._value = 0;
+ hoseMsg._connected = false;
hoseMsg.execute(this);
return true;
} else {
@@ -136,12 +136,12 @@ bool CParrotSuccUBus::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
}
bool CParrotSuccUBus::LeaveNodeMsg(CLeaveNodeMsg *msg) {
- if (_field1DC) {
+ if (_hoseConnected) {
getHiddenObject(_string3);
if (CHose::_statics->_actionTarget.empty()) {
playSound("z#51.wav");
CHoseConnectedMsg hoseMsg;
- hoseMsg._value = 0;
+ hoseMsg._connected = false;
hoseMsg.execute(this);
}
}
diff --git a/engines/titanic/npcs/parrot_succubus.h b/engines/titanic/npcs/parrot_succubus.h
index 74a4a032eb..69a076c622 100644
--- a/engines/titanic/npcs/parrot_succubus.h
+++ b/engines/titanic/npcs/parrot_succubus.h
@@ -35,7 +35,7 @@ class CParrotSuccUBus : public CSuccUBus {
bool MouseButtonDownMsg(CMouseButtonDownMsg *msg);
bool LeaveNodeMsg(CLeaveNodeMsg *msg);
public:
- int _field1DC;
+ bool _hoseConnected;
CString _string3;
int _field1EC;
int _field1F0;
diff --git a/engines/titanic/npcs/succubus.cpp b/engines/titanic/npcs/succubus.cpp
index 3534ba03e3..de3c3793e1 100644
--- a/engines/titanic/npcs/succubus.cpp
+++ b/engines/titanic/npcs/succubus.cpp
@@ -53,10 +53,10 @@ int CSuccUBus::_v3;
int CSuccUBus::_v4;
CSuccUBus::CSuccUBus() : CTrueTalkNPC() {
- _startFrame8 = -1;
- _endFrame8 = -1;
- _startFrame11 = -1;
- _endFrame11 = -1;
+ _initialStartFrame = -1;
+ _initialEndFrame = -1;
+ _endingStartFrame = -1;
+ _endingEndFrame = -1;
_sendStartFrame = 68;
_sendEndFrame = 168;
_receiveStartFrame = 168;
@@ -67,7 +67,7 @@ CSuccUBus::CSuccUBus() : CTrueTalkNPC() {
_offEndFrame = 27;
_okStartFrame = 40;
_okEndFrame = 68;
- _field140 = 1;
+ _flagsComparison = RFC_LOCATION;
_mailP = nullptr;
_afterReceiveStartFrame = 0;
_afterReceiveEndFrame = 0;
@@ -86,28 +86,28 @@ CSuccUBus::CSuccUBus() : CTrueTalkNPC() {
_soundHandle = -1;
_isChicken = false;
_isFeathers = false;
- _field1AC = 0;
- _field1B0 = 0;
+ _priorRandomVal1 = 0;
+ _priorRandomVal2 = 0;
_emptyStartFrame = 303;
_emptyEndFrame = 312;
_smokeStartFrame = 313;
_smokeEndFrame = 325;
- _field1C4 = 326;
- _field1C8 = 347;
- _field1CC = 348;
- _field1D0 = 375;
- _field1D4 = 1;
- _field1D8 = 0;
+ _hoseStartFrame = 326;
+ _hoseEndFrame = 347;
+ _pumpingStartFrame = 348;
+ _pumpingEndFrame = 375;
+ _destRoomFlags = 1;
+ _inProgress = false;
}
void CSuccUBus::save(SimpleFile *file, int indent) {
file->writeNumberLine(1, indent);
file->writeNumberLine(_enabled, indent);
- file->writeNumberLine(_startFrame8, indent);
- file->writeNumberLine(_endFrame8, indent);
- file->writeNumberLine(_startFrame11, indent);
- file->writeNumberLine(_endFrame11, indent);
+ file->writeNumberLine(_initialStartFrame, indent);
+ file->writeNumberLine(_initialEndFrame, indent);
+ file->writeNumberLine(_endingStartFrame, indent);
+ file->writeNumberLine(_endingEndFrame, indent);
file->writeNumberLine(_sendStartFrame, indent);
file->writeNumberLine(_sendEndFrame, indent);
file->writeNumberLine(_receiveStartFrame, indent);
@@ -118,7 +118,7 @@ void CSuccUBus::save(SimpleFile *file, int indent) {
file->writeNumberLine(_offEndFrame, indent);
file->writeNumberLine(_okStartFrame, indent);
file->writeNumberLine(_okEndFrame, indent);
- file->writeNumberLine(_field140, indent);
+ file->writeNumberLine(_flagsComparison, indent);
file->writeNumberLine(_v2, indent);
file->writeNumberLine(_afterReceiveStartFrame, indent);
@@ -145,20 +145,20 @@ void CSuccUBus::save(SimpleFile *file, int indent) {
file->writeNumberLine(_soundHandle, indent);
file->writeNumberLine(_isChicken, indent);
file->writeNumberLine(_isFeathers, indent);
- file->writeNumberLine(_field1AC, indent);
- file->writeNumberLine(_field1B0, indent);
+ file->writeNumberLine(_priorRandomVal1, indent);
+ file->writeNumberLine(_priorRandomVal2, indent);
file->writeNumberLine(_emptyStartFrame, indent);
file->writeNumberLine(_emptyEndFrame, indent);
file->writeNumberLine(_smokeStartFrame, indent);
file->writeNumberLine(_smokeEndFrame, indent);
- file->writeNumberLine(_field1C4, indent);
- file->writeNumberLine(_field1C8, indent);
- file->writeNumberLine(_field1CC, indent);
- file->writeNumberLine(_field1D0, indent);
- file->writeNumberLine(_field1D4, indent);
+ file->writeNumberLine(_hoseStartFrame, indent);
+ file->writeNumberLine(_hoseEndFrame, indent);
+ file->writeNumberLine(_pumpingStartFrame, indent);
+ file->writeNumberLine(_pumpingEndFrame, indent);
+ file->writeNumberLine(_destRoomFlags, indent);
file->writeNumberLine(_v3, indent);
- file->writeNumberLine(_field1D8, indent);
+ file->writeNumberLine(_inProgress, indent);
file->writeNumberLine(_field104, indent);
CTrueTalkNPC::save(file, indent);
@@ -168,10 +168,10 @@ void CSuccUBus::load(SimpleFile *file) {
file->readNumber();
_enabled = file->readNumber();
- _startFrame8 = file->readNumber();
- _endFrame8 = file->readNumber();
- _startFrame11 = file->readNumber();
- _endFrame11 = file->readNumber();
+ _initialStartFrame = file->readNumber();
+ _initialEndFrame = file->readNumber();
+ _endingStartFrame = file->readNumber();
+ _endingEndFrame = file->readNumber();
_sendStartFrame = file->readNumber();
_sendEndFrame = file->readNumber();
_receiveStartFrame = file->readNumber();
@@ -182,7 +182,7 @@ void CSuccUBus::load(SimpleFile *file) {
_offEndFrame = file->readNumber();
_okStartFrame = file->readNumber();
_okEndFrame = file->readNumber();
- _field140 = file->readNumber();
+ _flagsComparison = (RoomFlagsComparison)file->readNumber();
_v2 = file->readNumber();
_afterReceiveStartFrame = file->readNumber();
@@ -209,27 +209,27 @@ void CSuccUBus::load(SimpleFile *file) {
_soundHandle = file->readNumber();
_isChicken = file->readNumber();
_isFeathers = file->readNumber();
- _field1AC = file->readNumber();
- _field1B0 = file->readNumber();
+ _priorRandomVal1 = file->readNumber();
+ _priorRandomVal2 = file->readNumber();
_emptyStartFrame = file->readNumber();
_emptyEndFrame = file->readNumber();
_smokeStartFrame = file->readNumber();
_smokeEndFrame = file->readNumber();
- _field1C4 = file->readNumber();
- _field1C8 = file->readNumber();
- _field1CC = file->readNumber();
- _field1D0 = file->readNumber();
- _field1D4 = file->readNumber();
+ _hoseStartFrame = file->readNumber();
+ _hoseEndFrame = file->readNumber();
+ _pumpingStartFrame = file->readNumber();
+ _pumpingEndFrame = file->readNumber();
+ _destRoomFlags = file->readNumber();
_v3 = file->readNumber();
- _field1D8 = file->readNumber();
+ _inProgress = file->readNumber();
_field104 = file->readNumber();
CTrueTalkNPC::load(file);
}
bool CSuccUBus::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
- if (!_field1D8) {
+ if (!_inProgress) {
Rect tempRect = _rect1;
tempRect.translate(_bounds.left, _bounds.top);
@@ -242,7 +242,7 @@ bool CSuccUBus::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
CTurnOff offMsg;
offMsg.execute(this);
} else {
- switch (getRandomNumber(2)) {
+ switch (getRandomNumber(2, &_priorRandomVal1)) {
case 0:
startTalking(this, 230055, findView());
break;
@@ -340,16 +340,16 @@ bool CSuccUBus::EnterViewMsg(CEnterViewMsg *msg) {
petSetRemoteTarget();
_mailP = nullptr;
- if (_startFrame8 >= 0)
- loadFrame(_startFrame8);
+ if (_initialStartFrame >= 0)
+ loadFrame(_initialStartFrame);
return true;
}
bool CSuccUBus::LeaveViewMsg(CLeaveViewMsg *msg) {
petDisplayMessage(2, BLANK);
- if (_startFrame8 >= 0)
- loadFrame(_startFrame8);
+ if (_initialStartFrame >= 0)
+ loadFrame(_initialStartFrame);
else if (!_field15C && _onStartFrame >= 0)
loadFrame(_onStartFrame);
@@ -376,7 +376,7 @@ bool CSuccUBus::LeaveViewMsg(CLeaveViewMsg *msg) {
}
bool CSuccUBus::PETDeliverMsg(CPETDeliverMsg *msg) {
- if (_field1D8)
+ if (_inProgress)
return true;
if (!_enabled) {
@@ -409,7 +409,7 @@ bool CSuccUBus::PETDeliverMsg(CPETDeliverMsg *msg) {
} else {
_sendLost = false;
- CRoomFlags roomFlags = _roomFlags;
+ CRoomFlags roomFlags = _destRoomFlags;
if (!pet->isSuccUBusDest(roomFlags) || pet->getMailDestClass(roomFlags) < getPassengerClass()) {
roomFlags = pet->getSpecialRoomFlags("BilgeRoom");
_sendLost = true;
@@ -419,7 +419,7 @@ bool CSuccUBus::PETDeliverMsg(CPETDeliverMsg *msg) {
_isChicken = mailObject->getName() == "Chicken";
_field158 = 0;
_field188 = 0;
- _field1D8 = 1;
+ _inProgress = true;
incTransitions();
if (_isFeathers) {
@@ -466,7 +466,7 @@ bool CSuccUBus::PETDeliverMsg(CPETDeliverMsg *msg) {
bool CSuccUBus::PETReceiveMsg(CPETReceiveMsg *msg) {
CPetControl *pet = getPetControl();
- if (_field1D8 || !pet)
+ if (_inProgress || !pet)
return true;
if (!_enabled) {
petDisplayMessage(2, SUCCUBUS_IS_IN_STANDBY);
@@ -491,7 +491,7 @@ bool CSuccUBus::PETReceiveMsg(CPETReceiveMsg *msg) {
}
} else {
CGameObject *mailObject = findMailByFlags(
- _v3 && compareRoomNameTo("Titania") ? 3 : _field140, petRoomFlags);
+ _v3 && compareRoomNameTo("Titania") ? RFC_TITANIA : _flagsComparison, petRoomFlags);
if (!mailObject) {
// No mail for this SuccUBus
if (getRandomNumber(1) == 0) {
@@ -510,7 +510,7 @@ bool CSuccUBus::PETReceiveMsg(CPETReceiveMsg *msg) {
if (_receiveStartFrame >= 0) {
_field158 = 1;
- _field1D8 = 1;
+ _inProgress = true;
incTransitions();
playMovie(_receiveStartFrame, _receiveEndFrame, MOVIE_NOTIFY_OBJECT);
}
@@ -525,7 +525,7 @@ bool CSuccUBus::MovieEndMsg(CMovieEndMsg *msg) {
uint petRoomFlags = pet ? pet->getRoomFlags() : 0;
if (msg->_endFrame == _offEndFrame) {
- if (_startFrame11 >= 0)
+ if (_endingStartFrame >= 0)
playSound("z#30.wav", 100);
if (_field15C) {
@@ -542,8 +542,8 @@ bool CSuccUBus::MovieEndMsg(CMovieEndMsg *msg) {
if (pet && !mailExists(petRoomFlags)) {
CGameObject *mailObject = _v3 && compareRoomNameTo("Titania") ?
- findMailByFlags(3, petRoomFlags) :
- findMailByFlags(_field140, petRoomFlags);
+ findMailByFlags(RFC_TITANIA, petRoomFlags) :
+ findMailByFlags(_flagsComparison, petRoomFlags);
if (mailObject) {
switch (getRandomNumber(4)) {
@@ -573,7 +573,7 @@ bool CSuccUBus::MovieEndMsg(CMovieEndMsg *msg) {
stopSound(_soundHandle);
_soundHandle = -1;
- switch (getRandomNumber(_v2 ? 7 : 5, &_field1B0)) {
+ switch (getRandomNumber(_v2 ? 7 : 5, &_priorRandomVal2)) {
case 2:
startTalking(this, 230001, findView());
break;
@@ -613,8 +613,8 @@ bool CSuccUBus::MovieEndMsg(CMovieEndMsg *msg) {
startTalking(this, 230013, findView());
}
- if (_field1D8) {
- _field1D8 = 0;
+ if (_inProgress) {
+ _inProgress = false;
decTransitions();
}
@@ -629,9 +629,9 @@ bool CSuccUBus::MovieEndMsg(CMovieEndMsg *msg) {
}
_field188 = 1;
- _mailP = 0;
- if (_field1D8) {
- _field1D8 = 0;
+ _mailP = nullptr;
+ if (_inProgress) {
+ _inProgress = false;
decTransitions();
}
@@ -669,8 +669,8 @@ bool CSuccUBus::TurnOn(CTurnOn *msg) {
CPetControl *pet = getPetControl();
if (pet) {
- if (!_field15C && _startFrame8 >= 0) {
- playMovie(_startFrame8, _endFrame8, 0);
+ if (!_field15C && _initialStartFrame >= 0) {
+ playMovie(_initialStartFrame, _initialEndFrame, 0);
playSound("z#30.wav", 100);
}
@@ -707,8 +707,8 @@ bool CSuccUBus::TurnOff(CTurnOff *msg) {
playMovie(_offStartFrame, _offEndFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE);
}
- if (!_field15C && _startFrame11 >= 0)
- playMovie(_startFrame11, _endFrame11, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE);
+ if (!_field15C && _endingStartFrame >= 0)
+ playMovie(_endingStartFrame, _endingEndFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE);
_enabled = false;
performAction(true);
@@ -743,7 +743,7 @@ bool CSuccUBus::SUBTransition(CSUBTransition *msg) {
bool CSuccUBus::SetChevRoomBits(CSetChevRoomBits *msg) {
if (_enabled) {
- _roomFlags = msg->_roomFlags;
+ _destRoomFlags = msg->_roomFlags;
playSound("z#98.wav", 100);
}
@@ -764,7 +764,7 @@ bool CSuccUBus::MouseDragStartMsg(CMouseDragStartMsg *msg) {
Rect tempRect = _rect1;
tempRect.translate(_bounds.left, _bounds.top);
- if (_field1D8 || !_enabled || !_field188 || !tempRect.contains(msg->_mousePos)
+ if (_inProgress || !_enabled || !_field188 || !tempRect.contains(msg->_mousePos)
|| !pet)
return true;
diff --git a/engines/titanic/npcs/succubus.h b/engines/titanic/npcs/succubus.h
index d996bcdc68..7c0edf711a 100644
--- a/engines/titanic/npcs/succubus.h
+++ b/engines/titanic/npcs/succubus.h
@@ -52,10 +52,10 @@ protected:
static int _v3;
static int _v4;
protected:
- int _startFrame8;
- int _endFrame8;
- int _startFrame11;
- int _endFrame11;
+ int _initialStartFrame;
+ int _initialEndFrame;
+ int _endingStartFrame;
+ int _endingEndFrame;
int _sendStartFrame;
int _sendEndFrame;
int _receiveStartFrame;
@@ -66,7 +66,7 @@ protected:
int _offEndFrame;
int _okStartFrame;
int _okEndFrame;
- int _field140;
+ RoomFlagsComparison _flagsComparison;
CGameObject *_mailP;
int _afterReceiveStartFrame;
int _afterReceiveEndFrame;
@@ -88,18 +88,18 @@ protected:
int _soundHandle;
bool _isChicken;
bool _isFeathers;
- int _field1AC;
- int _field1B0;
+ int _priorRandomVal1;
+ int _priorRandomVal2;
int _emptyStartFrame;
int _emptyEndFrame;
int _smokeStartFrame;
int _smokeEndFrame;
- int _field1C4;
- int _field1C8;
- int _field1CC;
- int _field1D0;
- int _field1D4;
- int _field1D8;
+ int _hoseStartFrame;
+ int _hoseEndFrame;
+ int _pumpingStartFrame;
+ int _pumpingEndFrame;
+ uint _destRoomFlags;
+ bool _inProgress;
public:
CLASSDEF;
CSuccUBus();
diff --git a/engines/titanic/npcs/true_talk_npc.cpp b/engines/titanic/npcs/true_talk_npc.cpp
index 8d08600c9b..768ce46338 100644
--- a/engines/titanic/npcs/true_talk_npc.cpp
+++ b/engines/titanic/npcs/true_talk_npc.cpp
@@ -102,7 +102,7 @@ bool CTrueTalkNPC::TrueTalkNotifySpeechStartedMsg(CTrueTalkNotifySpeechStartedMs
_npcFlags |= NPCFLAG_SPEAKING;
++_speechCounter;
- if (!(_npcFlags & NPCFLAG_8)) {
+ if (!(_npcFlags & NPCFLAG_DOORBOT_IN_HOME)) {
// Stop any previous animation
if (_speechTimerId)
stopAnimTimer(_speechTimerId);
@@ -134,7 +134,7 @@ bool CTrueTalkNPC::TrueTalkNotifySpeechEndedMsg(CTrueTalkNotifySpeechEndedMsg *m
--_speechCounter;
_speechDuration = 0;
- if (!(_npcFlags & NPCFLAG_8)) {
+ if (!(_npcFlags & NPCFLAG_DOORBOT_IN_HOME)) {
CNPCPlayTalkingAnimationMsg msg1(0, 2, nullptr);
msg1.execute(this);
CNPCQueueIdleAnimMsg msg2;
diff --git a/engines/titanic/npcs/true_talk_npc.h b/engines/titanic/npcs/true_talk_npc.h
index d9ea037a72..03a463474d 100644
--- a/engines/titanic/npcs/true_talk_npc.h
+++ b/engines/titanic/npcs/true_talk_npc.h
@@ -31,12 +31,12 @@ namespace Titanic {
enum NpcFlag {
NPCFLAG_SPEAKING = 1, NPCFLAG_IDLING = 2, NPCFLAG_START_IDLING = 4,
- NPCFLAG_8 = 8, NPCFLAG_10000 = 0x10000, NPCFLAG_20000 = 0x20000,
- NPCFLAG_40000 = 0x40000, NPCFLAG_80000 = 0x80000,
- NPCFLAG_100000 = 0x100000, NPCFLAG_200000 = 0x200000,
- NPCFLAG_400000 = 0x400000, NPCFLAG_800000 = 0x800000,
- NPCFLAG_1000000 = 0x1000000, NPCFLAG_2000000 = 0x2000000,
- NPCFLAG_4000000 = 0x4000000, NPCFLAG_DOORBOT_INTRO = 0x8000000
+ NPCFLAG_DOORBOT_IN_HOME = 8, NPCFLAG_MOVING = 0x10000, NPCFLAG_MOVE_START = 0x20000,
+ NPCFLAG_MOVE_LOOP = 0x40000, NPCFLAG_MOVE_FINISH = 0x80000,
+ NPCFLAG_MOVE_LEFT = 0x100000, NPCFLAG_MOVE_RIGHT = 0x200000,
+ NPCFLAG_MOVE_END = 0x400000, NPCFLAG_PECKING = 0x800000,
+ NPCFLAG_CHICKEN_OUTSIDE_CAGE = 0x1000000, NPCFLAG_TAKE_OFF = 0x2000000,
+ NPCFLAG_SUMMON_BELLBOT = 0x4000000, NPCFLAG_DOORBOT_INTRO = 0x8000000
};
class CViewItem;
diff --git a/engines/titanic/pet_control/pet_control.h b/engines/titanic/pet_control/pet_control.h
index a63c29d6b3..a60e386525 100644
--- a/engines/titanic/pet_control/pet_control.h
+++ b/engines/titanic/pet_control/pet_control.h
@@ -561,8 +561,11 @@ public:
_rooms.setElevatorBroken(flag);
}
- bool isRoom59706() const {
- return CRoomFlags(getRoomFlags()).is59706();
+ /**
+ * Returns true if the player is in their 1st class stateroom
+ */
+ bool isFirstClassSuite() const {
+ return CRoomFlags(getRoomFlags()).isFirstClassSuite();
}
/**
diff --git a/engines/titanic/room_flags.h b/engines/titanic/room_flags.h
index e2fb91015a..79b673b7da 100644
--- a/engines/titanic/room_flags.h
+++ b/engines/titanic/room_flags.h
@@ -225,7 +225,12 @@ public:
bool not5() const { return getConditionally() != 5; }
- bool is59706() const { return _data == 0x59706; }
+ /**
+ * Returns true if the player is in their 1st class stateroom
+ */
+ bool isFirstClassSuite() const {
+ return _data == 0x59706;
+ }
};
} // End of namespace Titanic
diff --git a/engines/titanic/support/avi_surface.cpp b/engines/titanic/support/avi_surface.cpp
index 36a5891f0d..42e3618b97 100644
--- a/engines/titanic/support/avi_surface.cpp
+++ b/engines/titanic/support/avi_surface.cpp
@@ -47,6 +47,7 @@ AVISurface::AVISurface(const CResourceKey &key) : _movieName(key.getString()) {
// since it needs to be able to go beyond the frame count or to negative to allow
// correct detection of when range playbacks have finished
_currentFrame = -1;
+ _priorFrame = -1;
_isReversed = false;
// Create a decoder
@@ -55,6 +56,10 @@ AVISurface::AVISurface(const CResourceKey &key) : _movieName(key.getString()) {
error("Could not open video - %s", key.getString().c_str());
_streamCount = _decoder->videoTrackCount();
+
+ _soundManager = nullptr;
+ _hasAudio = false;
+ _frameRate = 0.0;
}
AVISurface::~AVISurface() {
@@ -154,7 +159,7 @@ void AVISurface::seekToFrame(uint frameNumber) {
if (_isReversed && frameNumber == _decoder->getFrameCount())
--frameNumber;
- if ((int)frameNumber != getFrame()) {
+ if ((int)frameNumber != _currentFrame) {
_decoder->seekToFrame(frameNumber);
_currentFrame = _priorFrame = (int)frameNumber;
}
@@ -401,21 +406,22 @@ bool AVISurface::renderFrame() {
return false;
}
-bool AVISurface::addEvent(int frameNumber, CGameObject *obj) {
+bool AVISurface::addEvent(int *frameNumber, CGameObject *obj) {
if (!_movieRangeInfo.empty()) {
CMovieRangeInfo *tail = _movieRangeInfo.back();
- if (frameNumber == -1)
- frameNumber = tail->_startFrame;
+ assert(frameNumber);
+ if (*frameNumber == -1)
+ *frameNumber = tail->_startFrame;
CMovieEvent *me = new CMovieEvent();
me->_type = MET_FRAME;
me->_startFrame = 0;
me->_endFrame = 0;
- me->_initialFrame = frameNumber;
+ me->_initialFrame = *frameNumber;
me->_gameObject = obj;
tail->addEvent(me);
- return _movieRangeInfo.size() == 1 && frameNumber == getFrame();
+ return _movieRangeInfo.size() == 1 && *frameNumber == getFrame();
}
return false;
diff --git a/engines/titanic/support/avi_surface.h b/engines/titanic/support/avi_surface.h
index 099a257361..f45db3599e 100644
--- a/engines/titanic/support/avi_surface.h
+++ b/engines/titanic/support/avi_surface.h
@@ -181,7 +181,7 @@ public:
/**
* Add a movie event
*/
- bool addEvent(int frameNumber, CGameObject *obj);
+ bool addEvent(int *frameNumber, CGameObject *obj);
/**
* Set the frame rate
diff --git a/engines/titanic/support/mouse_cursor.cpp b/engines/titanic/support/mouse_cursor.cpp
index 86623da044..eb58296502 100644
--- a/engines/titanic/support/mouse_cursor.cpp
+++ b/engines/titanic/support/mouse_cursor.cpp
@@ -55,7 +55,7 @@ CMouseCursor::CursorEntry::~CursorEntry() {
CMouseCursor::CMouseCursor(CScreenManager *screenManager) :
_screenManager(screenManager), _cursorId(CURSOR_HOURGLASS), _hideCounter(0),
- _hiddenCount(0), _cursorSuppressed(false), _setCursorCount(0), _inputEnabled(true), _fieldE8(0) {
+ _busyCount(0), _cursorSuppressed(false), _setCursorCount(0), _inputEnabled(true), _fieldE8(0) {
loadCursorImages();
setCursor(CURSOR_ARROW);
CursorMan.showMouse(true);
@@ -87,45 +87,45 @@ void CMouseCursor::loadCursorImages() {
}
}
-void CMouseCursor::show() {
- assert(_hiddenCount > 0);
-
- if (--_hiddenCount == 0)
- CursorMan.showMouse(!_cursorSuppressed);
+void CMouseCursor::incBusyCount() {
+ if (_busyCount == 0)
+ setCursor(CURSOR_HOURGLASS);
+ ++_busyCount;
}
-void CMouseCursor::hide() {
- CursorMan.showMouse(false);
- ++_hiddenCount;
+void CMouseCursor::decBusyCount() {
+ assert(_busyCount > 0);
+ if (--_busyCount == 0)
+ setCursor(CURSOR_ARROW);
}
void CMouseCursor::incHideCounter() {
if (_hideCounter++ == 0)
- hide();
+ CursorMan.showMouse(false);
}
void CMouseCursor::decHideCounter() {
--_hideCounter;
assert(_hideCounter >= 0);
if (_hideCounter == 0)
- show();
+ CursorMan.showMouse(true);
}
void CMouseCursor::suppressCursor() {
_cursorSuppressed = true;
- hide();
+ CursorMan.showMouse(false);
}
void CMouseCursor::unsuppressCursor() {
_cursorSuppressed = false;
if (_hideCounter == 0)
- show();
+ CursorMan.showMouse(true);
}
void CMouseCursor::setCursor(CursorId cursorId) {
++_setCursorCount;
- if (cursorId != _cursorId) {
+ if (cursorId != _cursorId && _busyCount == 0) {
// The original cursors supported partial alpha when rendering the cursor.
// Since we're using the ScummVM CursorMan, we can't do that, so we need
// to build up a surface of the cursor with even partially transparent
@@ -192,14 +192,6 @@ void CMouseCursor::enableControl() {
CScreenManager::_screenManagerPtr->_inputHandler->decLockCount();
}
-void CMouseCursor::setBusy() {
- setCursor(CURSOR_HOURGLASS);
-}
-
-void CMouseCursor::clearBusy() {
- setCursor(CURSOR_ARROW);
-}
-
void CMouseCursor::setPosition(const Point &pt, double duration) {
_moveStartPos = g_vm->_events->getMousePos();
_moveDestPos = pt;
diff --git a/engines/titanic/support/mouse_cursor.h b/engines/titanic/support/mouse_cursor.h
index cd5e49fb90..325e31de96 100644
--- a/engines/titanic/support/mouse_cursor.h
+++ b/engines/titanic/support/mouse_cursor.h
@@ -67,7 +67,7 @@ private:
CursorEntry _cursors[NUM_CURSORS];
uint _setCursorCount;
int _hideCounter;
- int _hiddenCount;
+ int _busyCount;
bool _cursorSuppressed;
int _fieldE8;
Common::Point _moveStartPos;
@@ -85,14 +85,15 @@ public:
~CMouseCursor();
/**
- * Make the mouse cursor visible
+ * Increment the busy count for the cursor, showing an hourglass
*/
- void show();
+ void incBusyCount();
/**
- * Hide the mouse cursor
+ * Decrements the busy count, resetting back to an arrow cursor
+ * when the count reaches zero
*/
- void hide();
+ void decBusyCount();
/**
* Decrements the hide counter, and shows the mouse if
@@ -143,17 +144,6 @@ public:
void enableControl();
/**
- * Shows the busy cursor
- */
- void setBusy();
-
- /**
- * Resets the cursor back to normal
- */
- void clearBusy();
-
-
- /**
* Move the mouse to a new position
*/
void setPosition(const Point &pt, double duration);
diff --git a/engines/titanic/support/movie.cpp b/engines/titanic/support/movie.cpp
index 8863e94e14..3095715bc9 100644
--- a/engines/titanic/support/movie.cpp
+++ b/engines/titanic/support/movie.cpp
@@ -140,7 +140,7 @@ void OSMovie::stop() {
}
void OSMovie::addEvent(int frameNumber, CGameObject *obj) {
- if (_aviSurface.addEvent(frameNumber, obj)) {
+ if (_aviSurface.addEvent(&frameNumber, obj)) {
CMovieFrameMsg frameMsg(frameNumber, 0);
frameMsg.execute(obj);
}
diff --git a/engines/titanic/support/video_surface.cpp b/engines/titanic/support/video_surface.cpp
index e24063188d..b886dc094c 100644
--- a/engines/titanic/support/video_surface.cpp
+++ b/engines/titanic/support/video_surface.cpp
@@ -206,6 +206,7 @@ void CVideoSurface::transBlitRect(const Rect &srcRect, const Rect &destRect, CVi
Graphics::ManagedSurface *srcSurface = src->_rawSurface;
Graphics::ManagedSurface *destSurface = _rawSurface;
Graphics::Surface destArea = destSurface->getSubArea(destRect);
+ uint transColor = getTransparencyColor();
const uint16 *srcPtr = (const uint16 *)srcSurface->getBasePtr(
srcRect.left, flipFlag ? srcRect.top : srcRect.bottom - 1);
@@ -223,7 +224,8 @@ void CVideoSurface::transBlitRect(const Rect &srcRect, const Rect &destRect, CVi
transSurface.setCol(srcRect.left);
for (int srcX = srcRect.left; srcX < srcRect.right; ++srcX) {
- copyPixel(lineDestP, lineSrcP, transSurface.getAlpha() >> 3, srcSurface->format, isAlpha);
+ if (*lineSrcP != transColor)
+ copyPixel(lineDestP, lineSrcP, transSurface.getAlpha() >> 3, srcSurface->format, isAlpha);
++lineSrcP;
++lineDestP;
diff --git a/engines/titanic/true_talk/bellbot_script.cpp b/engines/titanic/true_talk/bellbot_script.cpp
index 44fa961fcc..c958727a8b 100644
--- a/engines/titanic/true_talk/bellbot_script.cpp
+++ b/engines/titanic/true_talk/bellbot_script.cpp
@@ -169,19 +169,21 @@ int BellbotScript::process(const TTroomScript *roomScript, const TTsentence *sen
|| sentence->localWord("smash") || sentence->localWord("destroy")
|| sentence->localWord("toss") || sentence->localWord("put")
|| sentence->localWord("pitch") || sentence->localWord("heft")) {
+ // You've instructed the Bellbot to go all Pete Townshend on a TV
if (getValue(40) == 1) {
+ // Won't smash
addResponse(getDialogueId(201687));
applyResponse();
return 2;
- }
- else if (roomScript->_scriptId == 111) {
- addResponse(getDialogueId(201687));
+ } else if (roomScript->_scriptId == 111) {
+ // Within the Parrot Lobby
+ addResponse(getDialogueId(200914));
applyResponse();
CTrueTalkManager::triggerAction(17, 0);
CTrueTalkManager::setFlags(40, 1);
return 2;
- }
- else {
+ } else {
+ // In any other room other than the Parrot Lobby
addResponse(getDialogueId(200710));
addResponse(getDialogueId(201334));
applyResponse();
diff --git a/engines/titanic/true_talk/liftbot_script.cpp b/engines/titanic/true_talk/liftbot_script.cpp
index e52e47d99d..c77885e3ab 100644
--- a/engines/titanic/true_talk/liftbot_script.cpp
+++ b/engines/titanic/true_talk/liftbot_script.cpp
@@ -506,7 +506,7 @@ int LiftbotScript::addResponse1(int index, bool flag, int id) {
return 1;
} else if (index == getCurrentFloor()) {
if (index == 1) {
- addResponse(30558 - getRandomBit() ? 290 : 0);
+ addResponse(30558 - (getRandomBit() ? 290 : 0));
addResponse(getDialogueId(210589));
} else {
if (index == 39)
@@ -535,7 +535,7 @@ int LiftbotScript::addResponse1(int index, bool flag, int id) {
if (flag) {
if (index == 1) {
- selectResponse(30558 - getRandomBit() ? 290 : 0);
+ selectResponse(30558 - (getRandomBit() ? 290 : 0));
} else if (index == 39) {
addResponse(30346);
} else {
@@ -619,7 +619,7 @@ int LiftbotScript::sentence1(const TTsentence *sentence) {
} else if (sentence->localWord("titaniaroom")) {
newId = 210723;
} else if (sentence->localWord("restaurant")) {
- if (classNum == 1) {
+ if (classNum == FIRST_CLASS) {
newId = 210719;
diff = 1;
} else {
diff --git a/engines/titanic/true_talk/parrot_script.cpp b/engines/titanic/true_talk/parrot_script.cpp
index 25b54f0715..f44b9d3be2 100644
--- a/engines/titanic/true_talk/parrot_script.cpp
+++ b/engines/titanic/true_talk/parrot_script.cpp
@@ -76,7 +76,7 @@ ScriptChangedResult ParrotScript::scriptChanged(const TTroomScript *roomScript,
} else {
if ((id == 280146 || id == 280147) && CTrueTalkManager::_currentNPC) {
CGameObject *chicken;
- if (CTrueTalkManager::_currentNPC->find("Chicken", &chicken, FIND_PET))
+ if (!CTrueTalkManager::_currentNPC->find("Chicken", &chicken, FIND_PET))
id = 280142;
}
@@ -90,7 +90,7 @@ ScriptChangedResult ParrotScript::scriptChanged(const TTroomScript *roomScript,
if (id >= 80000 && id <= 80244) {
if ((id == 80155 || id == 80156) && CTrueTalkManager::_currentNPC) {
CGameObject *chicken;
- if (CTrueTalkManager::_currentNPC->find("Chicken", &chicken, FIND_PET))
+ if (!CTrueTalkManager::_currentNPC->find("Chicken", &chicken, FIND_PET))
id = 80151;
}
diff --git a/engines/titanic/true_talk/tt_vocab.cpp b/engines/titanic/true_talk/tt_vocab.cpp
index 6748d6535b..b37d30e65e 100644
--- a/engines/titanic/true_talk/tt_vocab.cpp
+++ b/engines/titanic/true_talk/tt_vocab.cpp
@@ -202,11 +202,12 @@ TTword *TTvocab::getPrimeWord(TTstring &str, TTword **srcWord) const {
newWord = new TTword(str, WC_ABSTRACT, 300);
} else {
// Standard word
- for (vocabP = _headP; vocabP && !newWord; vocabP = vocabP->_nextP) {
+ for (vocabP = _headP; vocabP; vocabP = vocabP->_nextP) {
if (_vocabMode == 3 && !strcmp(str.c_str(), vocabP->c_str())) {
newWord = vocabP->copy();
newWord->_nextP = nullptr;
newWord->setSyn(nullptr);
+ break;
} else if (vocabP->findSynByName(str, &tempSyn, _vocabMode)) {
// Create a copy of the word and the found synonym
TTsynonym *newSyn = new TTsynonym(tempSyn);
@@ -214,6 +215,7 @@ TTword *TTvocab::getPrimeWord(TTstring &str, TTword **srcWord) const {
newWord = vocabP->copy();
newWord->_nextP = nullptr;
newWord->setSyn(newSyn);
+ break;
}
}
}
diff --git a/graphics/font.cpp b/graphics/font.cpp
index 4f53dfe858..7768b7362d 100644
--- a/graphics/font.cpp
+++ b/graphics/font.cpp
@@ -227,7 +227,7 @@ int wordWrapTextImpl(const Font &font, const StringType &str, int maxWidth, Comm
if (lineWidth > 0) {
wrapper.add(line, lineWidth);
}
- return MAX(wrapper.actualMaxLineWidth, maxWidth);
+ return wrapper.actualMaxLineWidth;
}
} // End of anonymous namespace
diff --git a/graphics/fonts/macfont.cpp b/graphics/fonts/macfont.cpp
new file mode 100644
index 0000000000..f20b64eb63
--- /dev/null
+++ b/graphics/fonts/macfont.cpp
@@ -0,0 +1,497 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/stream.h"
+#include "common/textconsole.h"
+#include "graphics/surface.h"
+#include "graphics/fonts/macfont.h"
+
+namespace Graphics {
+
+enum {
+ kFontTypeImageHeightTable = (1 << 0),
+ kFontTypeGlyphWidthTable = (1 << 1),
+ kFontTypeFontColorTable = (1 << 7),
+ kFontTypeSyntheticFont = (1 << 8),
+ kFontTypeFixedWidthFont = (1 << 13),
+ kFontTypeNotExpandable = (1 << 14)
+};
+
+enum {
+ kFamilyGlyphWidthTable = (1 << 1),
+ kFamilyFractEnable = (1 << 12),
+ kFamilyIntegerExtra = (1 << 13),
+ kFamilyNoFractionalTable = (1 << 14),
+ kFamilyFixedWidthFonts = (1 << 15)
+};
+
+enum {
+ kStylePropertyPlain = 0,
+ kStylePropertyBold = 1,
+ kStylePropertyItalic = 2,
+ kStylePropertyUnderline = 3,
+ kStylePropertyOutline = 4,
+ kStylePropertyShadow = 5,
+ kStylePropertyCondensed = 6,
+ kStylePropertyExtended = 7,
+ kStylePropertyUnused = 8
+};
+
+static int getDepth(uint16 _fontType) {
+ // Returns 1, 2, 4, 8
+
+ return 1 << ((_fontType >> 2) & 3);
+}
+
+MacFontFamily::MacFontFamily() {
+ _ffFlags = 0;
+ _ffFamID = 0;
+ _ffFirstChar = 0;
+ _ffLastChar = 0;
+ _ffAscent = 0;
+ _ffDescent = 0;
+ _ffLeading = 0;
+ _ffWidMax = 0;
+ _ffWTabOff = 0;
+ _ffKernOff = 0;
+ _ffStylOff = 0;
+
+ for (int i = 0; i < 9; i++)
+ _ffProperty[i] = 0;
+
+ _ffIntl[0] = 0;
+ _ffIntl[1] = 0;
+ _ffVersion = 0;
+
+ _ffNumAssoc = 0;
+ _ffNumOffsets = 0;
+ _ffOffsets = nullptr;
+ _ffNumBBoxes = 0;
+}
+
+MacFontFamily::~MacFontFamily() {
+ free(_ffOffsets);
+}
+
+bool MacFontFamily::load(Common::SeekableReadStream &stream) {
+ _ffFlags = stream.readUint16BE(); // flags for family
+ _ffFamID = stream.readUint16BE(); // family ID number
+ _ffFirstChar = stream.readUint16BE(); // ASCII code of first character
+ _ffLastChar = stream.readUint16BE(); // ASCII code of last character
+ _ffAscent = stream.readSint16BE(); // maximum ascent for 1-pt font
+ _ffDescent = stream.readSint16BE(); // maximum descent for 1-pt font
+ _ffLeading = stream.readSint16BE(); // maximum leading for 1-pt font
+ _ffWidMax = stream.readSint16BE(); // maximum glyph width for 1-pt font
+ _ffWTabOff = stream.readUint32BE(); // offset to family glyph-width table
+ _ffKernOff = stream.readUint32BE(); // offset to kerning table
+ _ffStylOff = stream.readUint32BE(); // offset to style-mapping table
+
+ debug(10, "flags: %x famid: %d first: %d last: %d", _ffFlags, _ffFamID, _ffFirstChar, _ffLastChar);
+ debug(10, "ascent: %g descent: %g, leading: %g, widmax: %g", _ffAscent / (double)(1<<12),
+ _ffDescent / (double)(1<<12), _ffLeading / (double)(1<<12), _ffWidMax / (double)(1<<12));
+
+ debug(10, "wtaboff: %d kernoff: %d styloff: %d", _ffWTabOff, _ffKernOff, _ffStylOff);
+
+ debugN(10, "Extra width: ");
+ for (int i = 0; i < 9; i++) { // style properties info
+ _ffProperty[i] = stream.readUint16BE();
+ debugN(10, "%d ", _ffProperty[i]);
+ }
+ debug(10, "%s", "");
+
+ _ffIntl[0] = stream.readUint16BE(); // for international use
+ _ffIntl[1] = stream.readUint16BE(); // for international use
+ _ffVersion = stream.readUint16BE(); // version number
+
+ debug(10, "version: %d", _ffVersion);
+
+ _ffNumAssoc = stream.readUint16BE(); // number of entries - 1
+ _ffAssocEntries.resize(_ffNumAssoc + 1);
+
+ debug(10, "association cnt: %d", _ffNumAssoc + 1);
+
+ for (uint i = 0; i <= _ffNumAssoc; i++) {
+ _ffAssocEntries[i]._fontSize = stream.readUint16BE(); // point size of font
+ _ffAssocEntries[i]._fontStyle = stream.readUint16BE(); // style of font
+ _ffAssocEntries[i]._fontID = stream.readUint16BE(); // font resource ID
+
+ debug(10, " size: %d style: %d id: %d", _ffAssocEntries[i]._fontSize, _ffAssocEntries[i]._fontStyle,
+ _ffAssocEntries[i]._fontID);
+ }
+
+ if (_ffWTabOff || _ffStylOff || _ffKernOff) {
+ _ffNumOffsets = stream.readUint16BE(); // number of entries - 1
+ _ffOffsets = (uint32 *)calloc(_ffNumOffsets + 1, sizeof(uint32));
+ debugN(10, "offset cnt: %d, OFF: ", _ffNumOffsets + 1);
+ for (uint i = 0; i <= _ffNumOffsets; i++) {
+ _ffOffsets[i] = stream.readUint32BE();
+ debugN(10, "%d ", _ffOffsets[i]);
+ }
+ debug(10, "%s", "");
+
+ _ffNumBBoxes = stream.readUint16BE(); // number of entries - 1
+ _ffBBoxes.resize(_ffNumBBoxes + 1);
+ debug(10, "num BBoxes: %d", _ffNumBBoxes + 1);
+ for (uint i = 0; i <= _ffNumBBoxes; i++) {
+ _ffBBoxes[i]._style = stream.readUint16BE();
+ _ffBBoxes[i]._left = stream.readSint16BE();
+ _ffBBoxes[i]._bottom = stream.readSint16BE();
+ _ffBBoxes[i]._right = stream.readSint16BE();
+ _ffBBoxes[i]._top = stream.readSint16BE();
+
+ debug(10, "style: %d left: %g bottom: %g rigth: %g top: %g", _ffBBoxes[i]._style,
+ _ffBBoxes[i]._left / (double)(1<<12), _ffBBoxes[i]._bottom / (double)(1<<12),
+ _ffBBoxes[i]._right / (double)(1<<12), _ffBBoxes[i]._top / (double)(1<<12));
+ }
+ }
+
+ if (_ffWTabOff) {
+ // TODO: Read widths table
+ }
+
+ if (_ffStylOff) {
+ // TODO: Read styles table
+ }
+
+ if (_ffKernOff) {
+ stream.seek(_ffKernOff);
+
+ _ffNumKerns = stream.readUint16BE(); // number of entries - 1
+ _ffKernEntries.resize(_ffNumKerns + 1);
+
+ debug(10, "kern entries: %d", _ffNumKerns + 1);
+
+ for (uint i = 0; i <= _ffNumKerns; i++) {
+ _ffKernEntries[i]._style = stream.readUint16BE();
+ _ffKernEntries[i]._entryLength = stream.readUint16BE();
+ _ffKernEntries[i]._kernPairs.resize(_ffKernEntries[i]._entryLength);
+
+ debug(10, " style: %x kernpairs: %d", _ffKernEntries[i]._style, _ffKernEntries[i]._entryLength);
+
+ for (uint j = 0; j < _ffKernEntries[i]._entryLength; j++) {
+ byte f, s;
+ int16 d;
+ f = _ffKernEntries[i]._kernPairs[j]._firstChar = stream.readByte();
+ s = _ffKernEntries[i]._kernPairs[j]._secondChar = stream.readByte();
+ d = _ffKernEntries[i]._kernPairs[j]._distance = stream.readSint16BE();
+
+ _ffKernEntries[i]._kernTable[(f << 8) | s] = d;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ int MacFontFamily::getKerningOffset(uint style, int32 left, uint32 right) const {
+ uint16 idx = ((left & 0xff) << 8) | (right & 0xff);
+
+ for (uint i = 0; i < _ffKernEntries.size(); i++) {
+ if (_ffKernEntries[i]._style == style)
+ if (_ffKernEntries[i]._kernTable.contains(idx))
+ return _ffKernEntries[i]._kernTable[idx];
+ }
+
+ return 0;
+ }
+
+
+ MacFONTFont::MacFONTFont() {
+ _data._fontType = 0;
+ _data._firstChar = 0;
+ _data._lastChar = 0;
+ _data._maxWidth = 0;
+ _data._kernMax = 0;
+ _data._nDescent = 0;
+ _data._fRectWidth = 0;
+ _data._fRectHeight = 0;
+ _data._owTLoc = 0;
+ _data._ascent = 0;
+ _data._descent = 0;
+ _data._leading = 0;
+ _data._rowWords = 0;
+ _data._bitImage = nullptr;
+
+ _data._family = nullptr;
+ _data._size = 12;
+ _data._style = 0;
+ }
+
+ MacFONTFont::MacFONTFont(const MacFONTdata &data) {
+ _data = data;
+ }
+
+ MacFONTFont::~MacFONTFont() {
+ free(_data._bitImage);
+ }
+
+bool MacFONTFont::loadFont(Common::SeekableReadStream &stream, MacFontFamily *family, int size, int style) {
+ _data._family = family;
+ _data._size = size;
+ _data._style = style;
+
+ _data._fontType = stream.readUint16BE(); // font type
+ _data._firstChar = stream.readUint16BE(); // character code of first glyph
+ _data._lastChar = stream.readUint16BE(); // character code of last glyph
+ _data._maxWidth = stream.readUint16BE(); // maximum glyph width
+ _data._kernMax = stream.readSint16BE(); // maximum glyph kern
+ _data._nDescent = stream.readSint16BE(); // negative of descent
+ _data._fRectWidth = stream.readUint16BE(); // width of font rectangle
+ _data._fRectHeight = stream.readUint16BE(); // height of font rectangle
+ _data._owTLoc = stream.readUint16BE(); // offset to width/offset table
+ _data._ascent = stream.readUint16BE(); // maximum ascent measurement
+ _data._descent = stream.readUint16BE(); // maximum descent measurement
+ _data._leading = stream.readUint16BE(); // leading measurement
+ _data._rowWords = stream.readUint16BE() * 2; // row width of bit image in 16-bit wds
+
+ if (getDepth(_data._fontType) != 1) {
+ warning("MacFONTFont: %dbpp fonts are not supported", getDepth(_data._fontType));
+
+ return false;
+ }
+
+ // If positive, _nDescent holds the high bits of the offset to the
+ // width/offset table.
+ // http://mirror.informatimago.com/next/developer.apple.com/documentation/mac/Text/Text-252.html
+ if (_data._nDescent > 0)
+ _data._owTLoc |= _data._nDescent << 16;
+
+ // Alignment is by word
+ _data._owTLoc *= 2;
+ _data._owTLoc += 16;
+
+ uint16 glyphCount = _data._lastChar - _data._firstChar + 1;
+ _data._glyphs.resize(glyphCount);
+
+ // Bit image table
+ uint16 bitImageSize = _data._rowWords * _data._fRectHeight;
+ _data._bitImage = new byte[bitImageSize];
+ stream.read(_data._bitImage, bitImageSize);
+
+ // Bitmap location table
+ // Last glyph is the pic for the missing glyph
+ // One more word for determinig width
+ uint16 *bitmapOffsets = (uint16 *)calloc(glyphCount + 2, sizeof(uint16));
+
+ for (uint16 i = 0; i < glyphCount + 2; i++)
+ bitmapOffsets[i] = stream.readUint16BE();
+
+ for (uint16 i = 0; i < glyphCount + 1; i++) {
+ MacGlyph *glyph = (i == glyphCount) ? &_data._defaultChar : &_data._glyphs[i];
+ glyph->bitmapOffset = bitmapOffsets[i];
+ glyph->bitmapWidth = bitmapOffsets[i + 1] - bitmapOffsets[i];
+ }
+
+ // Width/offset table
+ stream.seek(_data._owTLoc);
+
+ for (uint16 i = 0; i < glyphCount; i++) {
+ byte kerningOffset = stream.readByte();
+ byte width = stream.readByte();
+
+ // 0xFF designates missing glyph
+ if (kerningOffset == 0xFF && width == 0xFF)
+ continue;
+
+ _data._glyphs[i].kerningOffset = _data._kernMax + kerningOffset;
+ _data._glyphs[i].width = width;
+ }
+
+ _data._defaultChar.kerningOffset = _data._kernMax + stream.readByte();
+ _data._defaultChar.width = _data._kernMax + stream.readByte();
+
+ if (_data._fontType & kFontTypeGlyphWidthTable) {
+ warning("Skipping glyph-width table");
+
+ for (uint16 i = 0; i < glyphCount; i++)
+ stream.readUint16BE();
+ }
+
+ if (_data._fontType & kFontTypeImageHeightTable) {
+ warning("Skipping image height table");
+
+ for (uint16 i = 0; i < glyphCount; i++)
+ stream.readUint16BE();
+ }
+
+ return true;
+}
+
+int MacFONTFont::getCharWidth(uint32 chr) const {
+ const MacGlyph *glyph = findGlyph(chr);
+
+ if (!glyph)
+ return _data._maxWidth;
+
+ return glyph->width;
+}
+
+void MacFONTFont::drawChar(Surface *dst, uint32 chr, int x, int y, uint32 color) const {
+ assert(dst != 0);
+ assert(dst->format.bytesPerPixel == 1 || dst->format.bytesPerPixel == 2 || dst->format.bytesPerPixel == 4);
+
+ const MacGlyph *glyph = findGlyph(chr);
+ if (!glyph || glyph->width == 0)
+ return;
+
+ for (uint16 i = 0; i < _data._fRectHeight; i++) {
+ byte *srcRow = _data._bitImage + i * _data._rowWords;
+
+ for (uint16 j = 0; j < glyph->bitmapWidth; j++) {
+ uint16 bitmapOffset = glyph->bitmapOffset + j;
+
+ if (srcRow[bitmapOffset / 8] & (1 << (7 - (bitmapOffset % 8)))) {
+ if (dst->format.bytesPerPixel == 1)
+ *((byte *)dst->getBasePtr(x + j, y + i)) = color;
+ else if (dst->format.bytesPerPixel == 2)
+ *((uint16 *)dst->getBasePtr(x + j, y + i)) = color;
+ else if (dst->format.bytesPerPixel == 4)
+ *((uint32 *)dst->getBasePtr(x + j, y + i)) = color;
+ }
+ }
+ }
+}
+
+const MacGlyph *MacFONTFont::findGlyph(uint32 c) const {
+ if (_data._glyphs.empty())
+ return 0;
+
+ if (c < _data._firstChar || c > _data._lastChar)
+ return &_data._defaultChar;
+
+ return &_data._glyphs[c - _data._firstChar];
+}
+
+int MacFONTFont::getKerningOffset(uint32 left, uint32 right) const {
+ if (_data._family) {
+ int kerning = _data._family->getKerningOffset(_data._style, left, right);
+ kerning *= _data._size;
+
+ return (int)(kerning / (double)(1 << 12));
+ }
+
+ return 0;
+}
+
+MacFONTFont *MacFONTFont::scaleFont(MacFONTFont *src, int newSize) {
+ if (!src) {
+ warning("Empty font reference in scale font");
+ return NULL;
+ }
+
+ if (src->getFontSize() == 0) {
+ warning("Requested to scale 0 size font");
+ return NULL;
+ }
+
+ float scale = (float)newSize / (float)src->getFontSize();
+
+ MacFONTdata data;
+
+ data._fontType = src->_data._fontType;
+ data._firstChar = src->_data._firstChar;
+ data._lastChar = src->_data._firstChar;
+ data._maxWidth = (int)((float)src->_data._maxWidth * scale);
+ data._kernMax = (int)((float)src->_data._kernMax * scale);
+ data._nDescent = (int)((float)src->_data._nDescent * scale);
+ data._fRectWidth = (int)((float)src->_data._fRectWidth * scale);
+ data._fRectHeight = (int)((float)src->_data._fRectHeight * scale);
+ data._owTLoc = src->_data._owTLoc;
+ data._ascent = (int)((float)src->_data._ascent * scale);
+ data._descent = (int)((float)src->_data._descent * scale);
+ data._leading = (int)((float)src->_data._leading * scale);
+
+ data._family = src->_data._family;
+ data._size = src->_data._size;
+ data._style = src->_data._style;
+
+ // Dtermine width of the bit image table
+ int newBitmapWidth = 0;
+ for (uint i = 0; i < src->_data._glyphs.size() + 1; i++) {
+ MacGlyph *glyph = (i == src->_data._glyphs.size()) ? &_data._defaultChar : &_data._glyphs[i];
+
+ glyph->width = (int)((float)src->_data._glyphs[i].width * scale);
+ glyph->kerningOffset = (int)((float)src->_data._glyphs[i].kerningOffset * scale);
+ glyph->bitmapWidth = (int)((float)src->_data._glyphs[i].bitmapWidth * scale);
+ glyph->bitmapOffset = newBitmapWidth;
+
+ newBitmapWidth += ((glyph->bitmapWidth + 7) / 8);
+ }
+
+ data._rowWords = newBitmapWidth;
+
+ uint16 bitImageSize = data._rowWords * _data._fRectHeight;
+ _data._bitImage = new byte[bitImageSize];
+
+#if 0
+ for (int i = 0; i < data.numCharacters; i++) {
+ const BdfBoundingBox &box = data.boxes ? data.boxes[i] : data.defaultBox;
+ const BdfBoundingBox &srcBox = data.boxes ? src->_data.boxes[i] : src->_data.defaultBox;
+
+ if (src->_data.bitmaps[i]) {
+ const int bytes = ((box.width + 7) / 8) * box.height; // Dimensions have been already corrected
+ bitmaps[i] = new byte[bytes];
+
+ int srcPitch = (srcBox.width + 7) / 8;
+ int dstPitch = (box.width + 7) / 8;
+
+ byte *ptr = bitmaps[i];
+
+ for (int y = 0; y < box.height; y++) {
+ const byte *srcd = (const byte *)&src->_data.bitmaps[i][((int)((float)y / scale)) * srcPitch];
+ byte *dst = ptr;
+ byte b = 0;
+
+ for (int x = 0; x < box.width; x++) {
+ int sx = (int)((float)x / scale);
+
+ if (srcd[sx / 8] & (0x80 >> (sx % 8)))
+ b |= 1;
+
+ if (!(x % 8) && x) {
+ *dst++ = b;
+ b = 0;
+ }
+
+ b <<= 1;
+ }
+
+ if (((box.width - 1) % 8)) {
+ b <<= 7 - ((box.width - 1) % 8);
+ *dst = b;
+ }
+
+ ptr += dstPitch;
+ }
+
+ } else {
+ bitmaps[i] = 0;
+ }
+ }
+
+ data.bitmaps = bitmaps;
+#endif
+
+ return new MacFONTFont(data);
+}
+
+} // End of namespace Graphics
diff --git a/graphics/fonts/macfont.h b/graphics/fonts/macfont.h
new file mode 100644
index 0000000000..ab285ed905
--- /dev/null
+++ b/graphics/fonts/macfont.h
@@ -0,0 +1,169 @@
+/* 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 GRAPHICS_FONTS_MACFONT_H
+#define GRAPHICS_FONTS_MACFONT_H
+
+#include "common/array.h"
+#include "common/hashmap.h"
+#include "graphics/font.h"
+
+namespace Graphics {
+
+class MacFontFamily {
+public:
+ MacFontFamily();
+ ~MacFontFamily();
+
+ bool load(Common::SeekableReadStream &stream);
+ int getKerningOffset(uint style, int32 left, uint32 right) const;
+
+ struct AsscEntry {
+ uint16 _fontSize;
+ uint16 _fontStyle;
+ uint16 _fontID;
+ };
+
+ Common::Array<AsscEntry> *getAssocTable() { return &_ffAssocEntries; }
+
+private:
+ // FOND
+ uint16 _ffFlags;
+ uint16 _ffFamID;
+ uint16 _ffFirstChar;
+ uint16 _ffLastChar;
+ int16 _ffAscent;
+ int16 _ffDescent;
+ int16 _ffLeading;
+ int16 _ffWidMax;
+ uint32 _ffWTabOff;
+ uint32 _ffKernOff;
+ uint32 _ffStylOff;
+ uint16 _ffProperty[9];
+ uint16 _ffIntl[2];
+ uint16 _ffVersion;
+
+ uint16 _ffNumAssoc;
+ Common::Array<AsscEntry> _ffAssocEntries;
+
+ uint16 _ffNumOffsets;
+ uint32 *_ffOffsets;
+
+ struct BBoxEntry {
+ uint16 _style;
+ int16 _left;
+ int16 _bottom;
+ int16 _right;
+ int16 _top;
+ };
+
+ uint16 _ffNumBBoxes;
+ Common::Array<BBoxEntry> _ffBBoxes;
+
+ struct KernPair {
+ byte _firstChar;
+ byte _secondChar;
+ uint16 _distance;
+ };
+
+ struct KernEntry {
+ uint16 _style;
+ uint16 _entryLength;
+ Common::Array<KernPair> _kernPairs;
+
+ Common::HashMap<uint16, int16> _kernTable;
+ };
+
+ uint16 _ffNumKerns;
+ Common::Array<KernEntry> _ffKernEntries;
+};
+
+struct MacGlyph {
+ void clear() {
+ bitmapOffset = 0;
+ width = 0;
+ bitmapWidth = 0;
+ kerningOffset = 0;
+ }
+
+ uint16 bitmapOffset;
+ byte width;
+ uint16 bitmapWidth;
+ int kerningOffset;
+};
+
+struct MacFONTdata {
+ uint16 _fontType;
+ uint16 _firstChar;
+ uint16 _lastChar;
+ uint16 _maxWidth;
+ int16 _kernMax;
+ int16 _nDescent;
+ uint16 _fRectWidth;
+ uint16 _fRectHeight;
+ uint32 _owTLoc;
+ uint16 _ascent;
+ uint16 _descent;
+ uint16 _leading;
+ uint16 _rowWords;
+
+ byte *_bitImage;
+
+ Common::Array<MacGlyph> _glyphs;
+ MacGlyph _defaultChar;
+
+ MacFontFamily *_family;
+ int _size;
+ int _style;
+};
+
+/**
+ * Processing of Mac FONT/NFNT rResources
+ */
+class MacFONTFont : public Font {
+public:
+ MacFONTFont();
+ MacFONTFont(const MacFONTdata &data);
+ virtual ~MacFONTFont();
+
+ virtual int getFontHeight() const { return _data._fRectHeight; }
+ virtual int getMaxCharWidth() const { return _data._maxWidth; }
+ virtual int getCharWidth(uint32 chr) const;
+ virtual void drawChar(Surface *dst, uint32 chr, int x, int y, uint32 color) const;
+
+ bool loadFont(Common::SeekableReadStream &stream, MacFontFamily *family = nullptr, int size = 12, int style = 0);
+
+ virtual int getKerningOffset(uint32 left, uint32 right) const;
+
+ int getFontSize() const { return _data._size; }
+
+ MacFONTFont *scaleFont(MacFONTFont *src, int newSize);
+
+private:
+ MacFONTdata _data;
+
+ const MacGlyph *findGlyph(uint32 c) const;
+};
+
+} // End of namespace Graphics
+
+#endif
diff --git a/graphics/macgui/macfontmanager.cpp b/graphics/macgui/macfontmanager.cpp
index c6e8d7e4a7..836255ad0d 100644
--- a/graphics/macgui/macfontmanager.cpp
+++ b/graphics/macgui/macfontmanager.cpp
@@ -22,7 +22,9 @@
#include "common/archive.h"
#include "common/stream.h"
#include "common/unzip.h"
+#include "common/macresman.h"
#include "graphics/fonts/bdf.h"
+#include "graphics/fonts/macfont.h"
#include "graphics/macgui/macfontmanager.h"
@@ -80,7 +82,7 @@ MacFontManager::MacFontManager() {
loadFonts();
}
-void MacFontManager::loadFonts() {
+void MacFontManager::loadFontsBDF() {
Common::Archive *dat;
dat = Common::makeZipArchive("classicmacfonts.dat");
@@ -127,7 +129,7 @@ void MacFontManager::loadFonts() {
}
FontMan.assignFontToName(fontName, font);
- macfont->setBdfFont(font);
+ macfont->setFont(font);
_fontRegistry.setVal(fontName, macfont);
debug(2, " %s", fontName.c_str());
@@ -138,6 +140,88 @@ void MacFontManager::loadFonts() {
delete dat;
}
+void MacFontManager::loadFonts() {
+ Common::Archive *dat;
+
+ dat = Common::makeZipArchive("classicmacfonts.dat");
+
+ if (!dat) {
+ warning("Could not find classicmacfonts.dat. Falling back to built-in fonts");
+ _builtInFonts = true;
+
+ return;
+ }
+
+ Common::ArchiveMemberList list;
+ dat->listMembers(list);
+
+ for (Common::ArchiveMemberList::iterator it = list.begin(); it != list.end(); ++it) {
+ Common::SeekableReadStream *stream = dat->createReadStreamForMember((*it)->getName());
+
+ Common::MacResManager *fontFile = new Common::MacResManager();
+
+ if (!fontFile->loadFromMacBinary(*stream))
+ error("Could not open %s as a resource fork", (*it)->getName().c_str());
+
+ Common::MacResIDArray fonds = fontFile->getResIDArray(MKTAG('F','O','N','D'));
+ if (fonds.size() > 0) {
+ for (Common::Array<uint16>::iterator iterator = fonds.begin(); iterator != fonds.end(); ++iterator) {
+ Common::SeekableReadStream *fond = fontFile->getResource(MKTAG('F', 'O', 'N', 'D'), *iterator);
+
+ Common::String familyName = fontFile->getResName(MKTAG('F', 'O', 'N', 'D'), *iterator);
+
+ Graphics::MacFontFamily fontFamily;
+ fontFamily.load(*fond);
+
+ Common::Array<Graphics::MacFontFamily::AsscEntry> *assoc = fontFamily.getAssocTable();
+
+ for (uint i = 0; i < assoc->size(); i++) {
+ debug("size: %d style: %d id: %d", (*assoc)[i]._fontSize, (*assoc)[i]._fontStyle,
+ (*assoc)[i]._fontID);
+
+ Common::SeekableReadStream *fontstream;
+ MacFont *macfont;
+ Graphics::MacFONTFont *font;
+
+ fontstream = fontFile->getResource(MKTAG('N', 'F', 'N', 'T'), (*assoc)[i]._fontID);
+
+ if (!fontstream)
+ fontstream = fontFile->getResource(MKTAG('F', 'O', 'N', 'T'), (*assoc)[i]._fontID);
+
+ if (!fontstream) {
+ warning("Unknown FontId: %d", (*assoc)[i]._fontID);
+
+ continue;
+ }
+
+ font = new Graphics::MacFONTFont;
+ font->loadFont(*fontstream);
+
+ delete fontstream;
+
+ Common::String fontName = Common::String::format("%s-%d-%d", familyName.c_str(), (*assoc)[i]._fontStyle, (*assoc)[i]._fontSize);
+
+ macfont = new MacFont(_fontNames.getVal(familyName, kMacFontNonStandard), (*assoc)[i]._fontSize, (*assoc)[i]._fontStyle);
+
+ FontMan.assignFontToName(fontName, font);
+ macfont->setFont(font);
+ _fontRegistry.setVal(fontName, macfont);
+
+ debug(2, " %s", fontName.c_str());
+ }
+
+ delete fond;
+ }
+ }
+
+ delete stream;
+ }
+
+ _builtInFonts = false;
+
+ delete dat;
+}
+
const Font *MacFontManager::getFont(MacFont macFont) {
const Font *font = 0;
@@ -165,40 +249,25 @@ const Font *MacFontManager::getFont(MacFont macFont) {
int MacFontManager::parseFontSlant(Common::String slant) {
slant.toUppercase();
+ int slantVal = 0;
if (slant == "I")
- return kMacFontItalic;
+ slantVal |= kMacFontItalic;
if (slant == "B")
- return kMacFontBold;
+ slantVal |= kMacFontBold;
if (slant == "R")
- return kMacFontRegular;
-
- warning("Unknown font slant '%s'", slant.c_str());
+ slantVal |= kMacFontRegular;
- return kMacFontRegular;
+ return slantVal;
}
const char *MacFontManager::getFontName(int id, int size, int slant) {
static char name[128];
- const char *sslant;
-
- switch (slant) {
- case kMacFontItalic:
- sslant = "I";
- break;
- case kMacFontBold:
- sslant = "B";
- break;
- case kMacFontRegular:
- default:
- sslant = "R";
- break;
- }
if (id > ARRAYSIZE(fontNames))
return NULL;
- snprintf(name, 128, "%s-%s-%d", fontNames[id], sslant, size);
+ snprintf(name, 128, "%s-%d-%d", fontNames[id], slant, size);
return name;
}
@@ -271,14 +340,14 @@ void MacFontManager::generateFont(MacFont &toFont, MacFont &fromFont) {
debugN("Found font substitute for font '%s' ", getFontName(toFont));
debug("as '%s'", getFontName(fromFont));
- Graphics::BdfFont *font = Graphics::BdfFont::scaleFont(fromFont.getBdfFont(), toFont.getSize());
+ Font *font = fromFont.getFont(); // = Graphics::BdfFont::scaleFont(fromFont.getFont(), toFont.getSize());
if (!font) {
warning("Failed to generate font '%s'", getFontName(toFont));
}
toFont.setGenerated(true);
- toFont.setBdfFont(font);
+ toFont.setFont(font);
FontMan.assignFontToName(getFontName(toFont), font);
_fontRegistry.setVal(getFontName(toFont), new MacFont(toFont));
diff --git a/graphics/macgui/macfontmanager.h b/graphics/macgui/macfontmanager.h
index c098d797ed..bfec6b7645 100644
--- a/graphics/macgui/macfontmanager.h
+++ b/graphics/macgui/macfontmanager.h
@@ -57,7 +57,7 @@ enum {
kMacFontExtend = 64
};
-class BdfFont;
+class Font;
class MacFont {
public:
@@ -67,7 +67,7 @@ public:
_slant = slant;
_fallback = fallback;
_generated = false;
- _bdfFont = NULL;
+ _font = NULL;
}
int getId() { return _id; };
@@ -79,8 +79,8 @@ public:
FontManager::FontUsage getFallback() { return _fallback; }
bool isGenerated() { return _generated; }
void setGenerated(bool gen) { _generated = gen; }
- BdfFont *getBdfFont() { return _bdfFont; }
- void setBdfFont(BdfFont *bdfFont) { _bdfFont = bdfFont; }
+ Font *getFont() { return _font; }
+ void setFont(Font *font) { _font = font; }
private:
int _id;
@@ -90,7 +90,7 @@ private:
FontManager::FontUsage _fallback;
bool _generated;
- BdfFont *_bdfFont;
+ Font *_font;
};
class MacFontManager {
@@ -121,6 +121,7 @@ public:
int getFontIdByName(Common::String name);
private:
+ void loadFontsBDF();
void loadFonts();
void generateFontSubstitute(MacFont &macFont);
diff --git a/graphics/macgui/mactext.cpp b/graphics/macgui/mactext.cpp
index 4d671e89fc..7a23b018c3 100644
--- a/graphics/macgui/mactext.cpp
+++ b/graphics/macgui/mactext.cpp
@@ -24,20 +24,17 @@
namespace Graphics {
-MacText::MacText(Common::String s, const Graphics::Font *font, int fgcolor, int bgcolor, int maxWidth) {
+MacText::MacText(Common::String s, const Graphics::Font *font, int fgcolor, int bgcolor, int maxWidth, TextAlign textAlignment) {
_str = s;
_font = font;
_fgcolor = fgcolor;
_bgcolor = bgcolor;
_maxWidth = maxWidth;
+ _textMaxWidth = 0;
_surface = nullptr;
+ _textAlignment = textAlignment;
- _interLinear = 0; // 0 pixels between the lines by default
-
- if (_maxWidth == -1)
- _textMaxWidth = 1000000; // Some big value
- else
- _textMaxWidth = -1;
+ _interLinear = 0; // 0 pixels between the lines by default
splitString(_str);
@@ -62,7 +59,7 @@ void MacText::splitString(Common::String &str) {
prevCR = true;
if (*s == '\r' || *s == '\n') {
- _maxWidth = MIN(_font->wordWrapText(tmp, _maxWidth, _text), _maxWidth);
+ _textMaxWidth = MAX(_font->wordWrapText(tmp, _maxWidth, _text), _textMaxWidth);
tmp.clear();
@@ -75,7 +72,7 @@ void MacText::splitString(Common::String &str) {
}
if (tmp.size())
- _maxWidth = MIN(_font->wordWrapText(tmp, _maxWidth, _text), _maxWidth);
+ _textMaxWidth = MAX(_font->wordWrapText(tmp, _maxWidth, _text), _textMaxWidth);
}
void MacText::reallocSurface() {
@@ -84,7 +81,7 @@ void MacText::reallocSurface() {
//TODO: work out why this rounding doesn't correctly fill the entire width
//int requiredH = (_text.size() + (_text.size() * 10 + 9) / 10) * lineH
int requiredH = _text.size() * lineH;
- int surfW = _maxWidth == -1 ? _textMaxWidth : _maxWidth;
+ int surfW = _textMaxWidth;
if (!_surface) {
_surface = new ManagedSurface(surfW, requiredH);
@@ -123,8 +120,12 @@ void MacText::render(int from, int to) {
_surface->fillRect(Common::Rect(0, y, _surface->w, to * lineH), _bgcolor);
for (int i = from; i < to; i++) {
+ int xOffset = 0;
+ if (_textAlignment == kTextAlignRight) xOffset = _textMaxWidth - _font->getStringWidth(_text[i]);
+ else if (_textAlignment == kTextAlignCenter) xOffset = (_textMaxWidth / 2) - (_font->getStringWidth(_text[i]) / 2);
+
//TODO: _textMaxWidth, when -1, was not rendering ANY text.
- _font->drawString(_surface, _text[i], 0, y, _maxWidth, _fgcolor);
+ _font->drawString(_surface, _text[i], xOffset, y, _maxWidth, _fgcolor);
y += _font->getFontHeight() + _interLinear;
}
diff --git a/graphics/macgui/mactext.h b/graphics/macgui/mactext.h
index 21c063f896..28f0e50b76 100644
--- a/graphics/macgui/mactext.h
+++ b/graphics/macgui/mactext.h
@@ -25,12 +25,13 @@
#include "graphics/fontman.h"
#include "graphics/managed_surface.h"
+#include "graphics/font.h"
namespace Graphics {
class MacText {
public:
- MacText(Common::String s, const Graphics::Font *font, int fgcolor, int bgcolor, int maxWidth = -1);
+ MacText(Common::String s, const Graphics::Font *font, int fgcolor, int bgcolor, int maxWidth = -1, TextAlign textAlignment = kTextAlignLeft);
void setInterLinear(int interLinear) { _interLinear = interLinear; }
@@ -61,6 +62,8 @@ private:
Graphics::ManagedSurface *_surface;
bool _fullRefresh;
+
+ TextAlign _textAlignment;
};
} // End of namespace Graphics
diff --git a/graphics/module.mk b/graphics/module.mk
index 51e2ef7f2d..d862ee840a 100644
--- a/graphics/module.mk
+++ b/graphics/module.mk
@@ -7,6 +7,7 @@ MODULE_OBJS := \
fontman.o \
fonts/bdf.o \
fonts/consolefont.o \
+ fonts/macfont.o \
fonts/newfont_big.o \
fonts/newfont.o \
fonts/ttf.o \
diff --git a/po/be_BY.po b/po/be_BY.po
index 820c695f2f..45e82239da 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.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
"PO-Revision-Date: 2016-12-31 15:15+0000\n"
"Last-Translator: Ivan Lukyanov <lid-gr@tut.by>\n"
"Language-Team: Belarusian <https://translations.scummvm.org/projects/scummvm/"
@@ -1802,7 +1802,7 @@ msgstr "³~Ð~ÛÞþÝÐÕ ÜÕÝî"
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1823,7 +1823,7 @@ msgstr "·ÐåÐÒÐæì ÓãÛìÝî:"
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -2855,8 +2855,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2868,8 +2868,8 @@ msgstr "Ã×ÝÐÒöæì ÓãÛìÝî:"
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"
diff --git a/po/ca_ES.po b/po/ca_ES.po
index edd9138a7c..6ab17be154 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.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
"PO-Revision-Date: 2016-12-04 15:46+0000\n"
"Last-Translator: Eugene Sandulenko <sev@scummvm.org>\n"
"Language-Team: Catalan <https://translations.scummvm.org/projects/scummvm/"
@@ -1815,7 +1815,7 @@ msgstr "~R~etorna al Llançador"
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1836,7 +1836,7 @@ msgstr "Desa la partida:"
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -2865,8 +2865,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2878,8 +2878,8 @@ msgstr "Recupera la partida:"
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"
diff --git a/po/cs_CZ.po b/po/cs_CZ.po
index f397c22b28..7cf31a5e4a 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.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
"PO-Revision-Date: 2016-12-04 15:43+0000\n"
"Last-Translator: Eugene Sandulenko <sev@scummvm.org>\n"
"Language-Team: Czech <https://translations.scummvm.org/projects/scummvm/"
@@ -1803,7 +1803,7 @@ msgstr "~N~ávrat do Spou¹tìèe"
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1824,7 +1824,7 @@ msgstr "Ulo¾it hru:"
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -2854,8 +2854,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2867,8 +2867,8 @@ msgstr "Obnovit hru:"
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"
diff --git a/po/da_DK.po b/po/da_DK.po
index 85273bf5ae..503d90761b 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.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
"PO-Revision-Date: 2016-12-29 07:29+0000\n"
"Last-Translator: poulsen93 <poulsen93@gmail.com>\n"
"Language-Team: Danish <https://translations.scummvm.org/projects/scummvm/"
@@ -1795,7 +1795,7 @@ msgstr "~R~etur til oversigt"
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1816,7 +1816,7 @@ msgstr "Gemmer:"
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -2845,8 +2845,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2858,8 +2858,8 @@ msgstr "Gendan spil:"
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"
diff --git a/po/de_DE.po b/po/de_DE.po
index 18c300bb37..fe4ef017ea 100644
--- a/po/de_DE.po
+++ b/po/de_DE.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.10.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
"PO-Revision-Date: 2016-12-27 09:55+0000\n"
"Last-Translator: Lothar Serra Mari <rootfather@scummvm.org>\n"
"Language-Team: German <https://translations.scummvm.org/projects/scummvm/"
@@ -1827,7 +1827,7 @@ msgstr "Zur Spiele~l~iste"
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1848,7 +1848,7 @@ msgstr "Speichern:"
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -2882,8 +2882,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2895,8 +2895,8 @@ msgstr "Spiel laden:"
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"
diff --git a/po/el.po b/po/el.po
index bbbf804a62..f44dd1274d 100644
--- a/po/el.po
+++ b/po/el.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.10.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
"PO-Revision-Date: 2017-01-07 02:29+0000\n"
"Last-Translator: Filippos Karapetis <bluegr@gmail.com>\n"
"Language-Team: Greek <https://translations.scummvm.org/projects/scummvm/"
@@ -1834,7 +1834,7 @@ msgstr "Åðéó~ô~ñ. óôïí ÏäçãçôÞ"
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1855,7 +1855,7 @@ msgstr "ÁðïèÞêåõóç ðáé÷íéäéïý:"
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -2890,8 +2890,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2903,8 +2903,8 @@ msgstr "ÅðáíáöïñÜ ðáé÷íéäéïý:"
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"
diff --git a/po/es_ES.po b/po/es_ES.po
index c76cb46787..82f979911a 100644
--- a/po/es_ES.po
+++ b/po/es_ES.po
@@ -7,11 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.4.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
"PO-Revision-Date: 2017-01-15 22:05+0000\n"
"Last-Translator: Rodrigo Vegas Sánchez-Ferrero <rodrigo.vegas@gmail.com>\n"
-"Language-Team: Spanish "
-"<https://translations.scummvm.org/projects/scummvm/scummvm/es/>\n"
+"Language-Team: Spanish <https://translations.scummvm.org/projects/scummvm/"
+"scummvm/es/>\n"
"Language: es_ES\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-1\n"
@@ -1812,7 +1812,7 @@ msgstr "~V~olver al lanzador"
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1833,7 +1833,7 @@ msgstr "Guardar partida:"
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -2860,8 +2860,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2873,8 +2873,8 @@ msgstr "Cargar partida:"
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"
diff --git a/po/eu.po b/po/eu.po
index b6592a4327..87b63f1403 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.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
"PO-Revision-Date: 2016-12-04 13:27+0000\n"
"Last-Translator: Eugene Sandulenko <sev@scummvm.org>\n"
"Language-Team: Basque <https://translations.scummvm.org/projects/scummvm/"
@@ -1799,7 +1799,7 @@ msgstr "It~z~uli abiarazlera"
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1820,7 +1820,7 @@ msgstr "Gorde jokoa:"
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -2849,8 +2849,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2862,8 +2862,8 @@ msgstr "Jokoa kargatu:"
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"
diff --git a/po/fi_FI.po b/po/fi_FI.po
index 192a4ee78d..209bacfdc2 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.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
"PO-Revision-Date: 2017-01-06 16:03+0000\n"
"Last-Translator: Timo Mikkolainen <tmikkola@gmail.com>\n"
"Language-Team: Finnish <https://translations.scummvm.org/projects/scummvm/"
@@ -1801,7 +1801,7 @@ msgstr "Palaa p~e~livalitsimeen"
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1822,7 +1822,7 @@ msgstr "Tallenna peli:"
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -2848,8 +2848,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2861,8 +2861,8 @@ msgstr "Lataa pelitallenne:"
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"
diff --git a/po/fr_FR.po b/po/fr_FR.po
index 0aea2ec110..f84bc68a5b 100644
--- a/po/fr_FR.po
+++ b/po/fr_FR.po
@@ -7,11 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.8.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
-"PO-Revision-Date: 2017-01-03 19:44+0000\n"
-"Last-Translator: Thierry Crozat <criezy@scummvm.org>\n"
-"Language-Team: French <https://translations.scummvm.org/projects/scummvm/"
-"scummvm/fr/>\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
+"PO-Revision-Date: 2017-01-18 21:18+0000\n"
+"Last-Translator: Purple T <zeonk@hotmail.com>\n"
+"Language-Team: French "
+"<https://translations.scummvm.org/projects/scummvm/scummvm/fr/>\n"
"Language: fr_FR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-1\n"
@@ -96,12 +96,12 @@ msgstr "Vers : "
#: gui/downloaddialog.cpp:63
msgid "Cancel download"
-msgstr "Annuler"
+msgstr "Annuler téléch."
#: gui/downloaddialog.cpp:65
msgctxt "lowres"
msgid "Cancel download"
-msgstr "Annuler"
+msgstr "Annuler téléch."
#: gui/downloaddialog.cpp:67
msgid "Hide"
@@ -112,7 +112,7 @@ msgid ""
"It looks like your connection is limited. Do you really want to download "
"files with it?"
msgstr ""
-"Votre connexion semble limité. Voulez-vous vraiment télécharger des "
+"Votre connexion semble limitée. Voulez-vous vraiment télécharger des "
"fichiers ?"
#: gui/downloaddialog.cpp:118 gui/downloaddialog.cpp:152
@@ -244,7 +244,7 @@ msgstr ""
#: gui/options.cpp:812 gui/options.cpp:825 gui/options.cpp:1356
#: audio/null.cpp:41
msgid "<default>"
-msgstr "<defaut>"
+msgstr "<défaut>"
#: gui/editgamedialog.cpp:161
msgid "Platform:"
@@ -274,12 +274,12 @@ msgstr "GFX"
#: gui/editgamedialog.cpp:187
msgid "Override global graphic settings"
-msgstr "Utiliser des réglages graphiques spécifiques à ce jeux"
+msgstr "Utiliser des réglages graphiques spécifiques à ce jeu"
#: gui/editgamedialog.cpp:189
msgctxt "lowres"
msgid "Override global graphic settings"
-msgstr "Réglages spécifiques à ce jeux"
+msgstr "Réglages spécifiques à ce jeu"
#: gui/editgamedialog.cpp:196 gui/options.cpp:1238
msgid "Audio"
@@ -287,12 +287,12 @@ msgstr "Audio"
#: gui/editgamedialog.cpp:199
msgid "Override global audio settings"
-msgstr "Utiliser des réglages audio spécifiques à ce jeux"
+msgstr "Utiliser des réglages audio spécifiques à ce jeu"
#: gui/editgamedialog.cpp:201
msgctxt "lowres"
msgid "Override global audio settings"
-msgstr "Réglages spécifiques à ce jeux"
+msgstr "Réglages spécifiques à ce jeu"
#: gui/editgamedialog.cpp:210 gui/options.cpp:1243
msgid "Volume"
@@ -305,12 +305,12 @@ msgstr "Volume"
#: gui/editgamedialog.cpp:215
msgid "Override global volume settings"
-msgstr "Utiliser des réglages de volume sonore spécifiques à ce jeux"
+msgstr "Utiliser des réglages de volume sonore spécifiques à ce jeu"
#: gui/editgamedialog.cpp:217
msgctxt "lowres"
msgid "Override global volume settings"
-msgstr "Réglages spécifiques à ce jeux"
+msgstr "Réglages spécifiques à ce jeu"
#: gui/editgamedialog.cpp:226 gui/options.cpp:1253
msgid "MIDI"
@@ -318,12 +318,12 @@ msgstr "MIDI"
#: gui/editgamedialog.cpp:229
msgid "Override global MIDI settings"
-msgstr "Utiliser des réglages MIDI spécifiques à ce jeux"
+msgstr "Utiliser des réglages MIDI spécifiques à ce jeu"
#: gui/editgamedialog.cpp:231
msgctxt "lowres"
msgid "Override global MIDI settings"
-msgstr "Réglages spécifiques à ce jeux"
+msgstr "Réglages spécifiques à ce jeu"
#: gui/editgamedialog.cpp:241 gui/options.cpp:1263
msgid "MT-32"
@@ -331,12 +331,12 @@ msgstr "MT-32"
#: gui/editgamedialog.cpp:244
msgid "Override global MT-32 settings"
-msgstr "Utiliser des réglages MT-32 spécifiques à ce jeux"
+msgstr "Utiliser des réglages MT-32 spécifiques à ce jeu"
#: gui/editgamedialog.cpp:246
msgctxt "lowres"
msgid "Override global MT-32 settings"
-msgstr "Réglages spécifiques à ce jeux"
+msgstr "Réglages spécifiques à ce jeu"
#: gui/editgamedialog.cpp:255 gui/options.cpp:1270
msgid "Paths"
@@ -363,7 +363,7 @@ msgstr "Extra :"
#: gui/editgamedialog.cpp:271 gui/editgamedialog.cpp:273
#: gui/editgamedialog.cpp:274
msgid "Specifies path to additional data used by the game"
-msgstr "Définie un chemin vers des données suplémentaires utilisées par le jeu"
+msgstr "Définie un chemin vers des données supplémentaires utilisées par le jeu"
#: gui/editgamedialog.cpp:273 gui/options.cpp:1298
msgctxt "lowres"
@@ -425,7 +425,7 @@ msgstr ""
#: gui/editgamedialog.cpp:534
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."
+msgstr "Cet ID est déjà utilisé par un autre jeu. Choisissez-en un autre svp."
#: gui/editrecorddialog.cpp:58
msgid "Author:"
@@ -570,7 +570,7 @@ msgstr "Affecter"
#: gui/KeysDialog.cpp:49
msgid "Select an action and click 'Map'"
-msgstr "Selectionez une action et cliquez 'Affecter'"
+msgstr "Sélectionnez une action et cliquez 'Affecter'"
#: gui/KeysDialog.cpp:80 gui/KeysDialog.cpp:102 gui/KeysDialog.cpp:141
#, c-format
@@ -583,7 +583,7 @@ msgstr "Touche associée : aucune"
#: gui/KeysDialog.cpp:90
msgid "Please select an action"
-msgstr "Selectionnez une action"
+msgstr "Sélectionnez une action"
#: gui/KeysDialog.cpp:106
msgid "Press the key to associate"
@@ -727,11 +727,11 @@ msgstr ""
#: gui/launcher.cpp:526
msgid "ScummVM could not find any engine capable of running the selected game!"
-msgstr "ScummVM n'a pas pu trouvé de moteur pour lancer le jeu sélectionné !"
+msgstr "ScummVM n'a pas pu trouver de moteur pour lancer le jeu sélectionné !"
#: gui/launcher.cpp:577
msgid "ScummVM could not find any game in the specified directory!"
-msgstr "ScummVM n'a pas trouvé de jeux dans le répertoire sélectionné !"
+msgstr "ScummVM n'a pas trouvé de jeu dans le répertoire sélectionné !"
#: gui/launcher.cpp:590
msgid "Pick the game:"
@@ -767,7 +767,7 @@ msgstr "%d répertoires examinés ..."
#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr ""
-"%d nouveaux jeux trouvés, %d jeux ignorés (déjà ajouté précédemment) ..."
+"%d nouveaux jeux trouvés, %d jeux ignorés (déjà ajoutés précédemment) ..."
#: gui/onscreendialog.cpp:101 gui/onscreendialog.cpp:103
msgid "Stop"
@@ -888,7 +888,7 @@ msgstr "Corrige le rapport d'aspect pour les jeux en 320x200"
#: gui/options.cpp:849
msgid "Preferred Device:"
-msgstr "Sortie Préféré :"
+msgstr "Sortie Préférée :"
#: gui/options.cpp:849
msgid "Music Device:"
@@ -907,7 +907,7 @@ msgstr "Spécifie le périphérique de sortie audio ou l'émulateur de carte audio"
#: gui/options.cpp:851
msgctxt "lowres"
msgid "Preferred Dev.:"
-msgstr "Sortie Préféré :"
+msgstr "Sortie Préférée :"
#: gui/options.cpp:851
msgctxt "lowres"
@@ -932,7 +932,7 @@ msgid ""
"soundcard"
msgstr ""
"Une valeur plus élevée donne une meilleure qualité audio mais peut ne pas "
-"être supporté par votre carte son"
+"être supportée par votre carte son"
#: gui/options.cpp:900
msgid "GM Device:"
@@ -967,7 +967,7 @@ msgstr "SoundFont :"
#: gui/options.cpp:942
msgid "Mixed AdLib/MIDI mode"
-msgstr "Mode mixe AdLib/MIDI"
+msgstr "Mode mixte AdLib/MIDI"
#: gui/options.cpp:942
msgid "Use both MIDI and AdLib sound generation"
@@ -1219,7 +1219,7 @@ msgstr "Synchronisé :"
#: gui/options.cpp:1425
msgid "When the last saved games sync for this storage occured"
-msgstr "Quand la dernière synchronisation des sauvegardes à eu lieu"
+msgstr "Quand la dernière synchronisation des sauvegardes a eu lieu"
#: gui/options.cpp:1428 gui/storagewizarddialog.cpp:71
msgid "Connect"
@@ -1265,7 +1265,7 @@ msgstr "Chemin /racine/ :"
#: gui/options.cpp:1437 gui/options.cpp:1439 gui/options.cpp:1440
msgid "Specifies which directory the Files Manager can access"
-msgstr "Indique le répertoire que le gestionnaire de fichier peut accéder"
+msgstr "Indique le répertoire auquel le gestionnaire de fichier peut accéder"
#: gui/options.cpp:1439
msgctxt "lowres"
@@ -1301,13 +1301,13 @@ msgid ""
"The theme you selected does not support your current language. If you want "
"to use this theme you need to switch to another language first."
msgstr ""
-"Le thème que vous avez sélectioné ne support pas la langue française. Si "
+"Le thème que vous avez sélectionné ne support pas la langue française. Si "
"vous voulez l'utiliser vous devez d'abord changer de langue."
#: gui/options.cpp:1702
msgid "The chosen directory cannot be written to. Please select another one."
msgstr ""
-"Le répertoire sélectionné est vérouillé en écriture. Sélectionnez un autre "
+"Le répertoire sélectionné est verrouillé en écriture. Sélectionnez un autre "
"répertoire."
#: gui/options.cpp:1711
@@ -1316,7 +1316,7 @@ msgstr "Sélectionner le répertoire des thèmes d'interface"
#: gui/options.cpp:1721
msgid "Select directory for extra files"
-msgstr "Sélectionner le répertoire pour les fichiers suplémentaires"
+msgstr "Sélectionner le répertoire pour les fichiers supplémentaires"
#: gui/options.cpp:1732
msgid "Select directory for plugins"
@@ -1428,7 +1428,7 @@ msgstr "Auteur inconnu"
#: gui/remotebrowser.cpp:128
msgid "ScummVM could not access the directory!"
-msgstr "ScummVM n'a pas pu accédé au répertoire !"
+msgstr "ScummVM n'a pas pu accéder au répertoire !"
#: gui/saveload-dialog.cpp:334
msgid "List view"
@@ -1652,7 +1652,7 @@ msgstr "Passer la phrase"
#: base/main.cpp:547
msgid "Error running game:"
-msgstr "Erreur lors de l'éxécution du jeu : "
+msgstr "Erreur lors de l'exécution du jeu : "
#: base/main.cpp:594
msgid "Could not find any engine capable of running the selected game"
@@ -1664,7 +1664,7 @@ msgstr "Pas d'erreur"
#: common/error.cpp:40
msgid "Game data not found"
-msgstr "Fichier de donées introuvable"
+msgstr "Fichier de données introuvable"
#: common/error.cpp:42
msgid "Game id not supported"
@@ -1676,7 +1676,7 @@ msgstr "Mode de couleurs non supporté"
#: common/error.cpp:47
msgid "Read permission denied"
-msgstr "Véroullié en lecture"
+msgstr "Verrouillé en lecture"
#: common/error.cpp:49
msgid "Write permission denied"
@@ -1716,7 +1716,7 @@ msgstr "Ce moteur de jeu ne supporte pas les sauvegardes"
#: common/error.cpp:71
msgid "User canceled"
-msgstr "Annuler par l'utilisateur"
+msgstr "Annulé par l'utilisateur"
#: common/error.cpp:75
msgid "Unknown error"
@@ -1775,8 +1775,7 @@ msgstr ""
"Votre version du jeu dans '%s' n'est pas reconnue.\n"
"Veuillez reporter les informations ci-dessous à l'équipe de ScummVM ainsi "
"que\n"
-"le nom du jeu que vous avez essayé d'ajouter, sa version, le language, "
-"etc... :"
+"le nom du jeu que vous avez essayé d'ajouter, sa version, la langue, etc... :"
#: engines/dialogs.cpp:85
msgid "~R~esume"
@@ -1819,7 +1818,7 @@ msgstr "Retour au ~L~anceur"
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1840,7 +1839,7 @@ msgstr "Sauvegarde :"
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -1966,7 +1965,7 @@ msgstr "Émulateur DOSBox OPL"
#: audio/fmopl.cpp:67
msgid "ALSA Direct FM"
-msgstr "ALSA direct-FM"
+msgstr "ALSA Direct FM"
#: audio/mididrv.cpp:209
#, c-format
@@ -2055,7 +2054,7 @@ msgstr "Émulateur C64 Audio"
#: backends/cloud/storage.cpp:211
msgid "Saved games sync complete."
-msgstr "Synchronisation des sauvegardes terminé."
+msgstr "Synchronisation des sauvegardes terminée."
#: backends/cloud/storage.cpp:222
msgid "Saved games sync was cancelled."
@@ -2295,7 +2294,7 @@ msgstr "Décalage X du toucher"
#: backends/platform/ds/arm9/source/dsoptions.cpp:75
msgid "Touch Y Offset"
-msgstr "Décallage Y du toucher"
+msgstr "Décalage Y du toucher"
#: backends/platform/ds/arm9/source/dsoptions.cpp:87
msgid "Use laptop trackpad-style cursor control"
@@ -2319,7 +2318,7 @@ msgstr "Échelle de l'écran principal :"
#: backends/platform/ds/arm9/source/dsoptions.cpp:107
msgid "Hardware scale (fast, but low quality)"
-msgstr "Mise à l'echelle matérielle (rapide mais qualité faible)"
+msgstr "Mise à l'échelle matérielle (rapide mais qualité faible)"
#: backends/platform/ds/arm9/source/dsoptions.cpp:108
msgid "Software scale (good quality, but slower)"
@@ -2339,7 +2338,7 @@ msgstr "Audio haute qualité (plus lent) (redémarrer)"
#: backends/platform/ds/arm9/source/dsoptions.cpp:122
msgid "Disable power off"
-msgstr "Désactivé l'extinction"
+msgstr "Désactiver l'extinction"
#: backends/platform/ios7/ios7_osys_events.cpp:309
#: backends/platform/ios7/ios7_osys_events.cpp:519
@@ -2542,7 +2541,7 @@ msgstr "Sensibilité du pad GC :"
#: backends/platform/wii/options.cpp:80
msgid "GC Pad acceleration:"
-msgstr "Acceleration du pad GC :"
+msgstr "Accélération du pad GC :"
#: backends/platform/wii/options.cpp:86
msgid "DVD"
@@ -2554,7 +2553,7 @@ msgstr "État :"
#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
msgid "Unknown"
-msgstr "Inconue"
+msgstr "Inconnue"
#: backends/platform/wii/options.cpp:93
msgid "Mount DVD"
@@ -2639,7 +2638,7 @@ msgstr "Réseau non initialisé (%d)"
#: backends/platform/wince/CEActionsPocket.cpp:46
msgid "Hide Toolbar"
-msgstr "Caché la barre d'outils"
+msgstr "Cacher la barre d'outils"
#: backends/platform/wince/CEActionsPocket.cpp:47
msgid "Show Keyboard"
@@ -2732,13 +2731,13 @@ msgstr ""
#: backends/platform/wince/wince-sdl.cpp:529
msgid "Map hide toolbar action"
-msgstr "Affecter l'action 'Cacher Bar d'Outils'"
+msgstr "Affecter l'action 'Cacher Barre d'Outils'"
#: backends/platform/wince/wince-sdl.cpp:533
msgid "You must map a key to the 'Hide toolbar' action to play this game"
msgstr ""
-"Vous devez affecter une touche à l'action 'Cacher Bar d'Outils' pour pouvoir "
-"jouer à ce jeu"
+"Vous devez affecter une touche à l'action 'Cacher Barre d'Outils' pour "
+"pouvoir jouer à ce jeu"
#: backends/platform/wince/wince-sdl.cpp:542
msgid "Map Zoom Up action (optional)"
@@ -2752,7 +2751,7 @@ msgstr "Affecter l'action 'Zoomer' (optionnelle)"
msgid ""
"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
msgstr ""
-"Noubliez pas d'affecter une touche à l'action 'Cacher Bar d'Outils' pour "
+"N'oubliez pas d'affecter une touche à l'action 'Cacher Barre d'Outils' pour "
"pouvoir voir entièrement l'inventaire"
#: backends/updates/macosx/macosx-updates.mm:79
@@ -2871,8 +2870,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2884,8 +2883,8 @@ msgstr "Charger le jeu :"
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"
@@ -2920,7 +2919,7 @@ msgid ""
"\n"
"%s"
msgstr ""
-"Sauvegarde enregistré avec succès dans le fichier :\n"
+"Sauvegarde enregistrée avec succès dans le fichier :\n"
"\n"
"%s"
@@ -2949,7 +2948,7 @@ msgid ""
msgstr ""
"ScummVM a trouvé des anciennes sauvegardes pour Drascula qui ont besoin "
"d'être converties.\n"
-"L'ancien format de sauvegarde n'est plus supporté, donc vous ne pourrez pas "
+"L'ancien format de sauvegarde n'est plus supporté, vous ne pourrez donc pas "
"les charger si vous ne les convertissez pas.\n"
"\n"
"Appuyer sur OK pour les convertir maintenant, sinon le même message "
@@ -3040,20 +3039,20 @@ msgstr "Activer le défilement régulier en marchant"
#. walk towards that direction.
#: engines/kyra/detection.cpp:112
msgid "Floating cursors"
-msgstr "Curseurs flotants"
+msgstr "Curseurs flottants"
#: engines/kyra/detection.cpp:113
msgid "Enable floating cursors"
-msgstr "Activer les curseurs flotants"
+msgstr "Activer les curseurs flottants"
#. I18N: HP stands for Hit Points
#: engines/kyra/detection.cpp:127
msgid "HP bar graphs"
-msgstr "Bar HP"
+msgstr "Barres HP"
#: engines/kyra/detection.cpp:128
msgid "Enable hit point bar graphs"
-msgstr "Activer les bars de santé (Hit Point)"
+msgstr "Activer les barres de santé (Hit Point)"
#: engines/kyra/eobcommon.cpp:331 engines/kyra/lol.cpp:481
msgid "Move Forward"
@@ -3222,7 +3221,7 @@ msgstr "Éléments d'inventaire animés"
#: engines/mads/detection.cpp:111 engines/mads/detection.cpp:112
msgid "Animated game interface"
-msgstr "Interface du jeu animé"
+msgstr "Interface du jeu animée"
#: engines/mads/detection.cpp:121 engines/mads/detection.cpp:122
msgid "Naughty game mode"
@@ -3300,8 +3299,8 @@ msgid ""
"the game. ScummVM cannot do that and\n"
"the site no longer exists."
msgstr ""
-"A ce point la démo de Riven vous\n"
-"demanderais si vous voulez ouvrir un\n"
+"A ce point, la démo de Riven vous\n"
+"demanderait si vous voulez ouvrir un\n"
"navigateur web pour vous amener sur\n"
"la page de Red Orb et acheter le jeu.\n"
"ScummVM ne peut pas faire ça et le\n"
@@ -3366,7 +3365,7 @@ msgid ""
msgstr ""
"ScummVM a trouvé des anciens fichiers de sauvegarde pour Nippon Safes qui "
"ont besoin d'être convertis.\n"
-"L'ancien format de sauvegarde n'est plus supporté, donc vous ne pourrez pas "
+"L'ancien format de sauvegarde n'est plus supporté, vous ne pourrez donc pas "
"les charger si vous ne les convertissez pas.\n"
"\n"
"Appuyer sur OK pour les convertir maintenant, sinon le même message "
@@ -3515,10 +3514,10 @@ msgid ""
"to add and its version, language, etc.:\n"
msgstr ""
"Votre version du jeu n'est pas reconnue. Si ce n'est pas une version\n"
-"modifié (par exemple traduite par des fans), veuillez reporter les "
+"modifiée (par exemple traduite par des fans), veuillez reporter les "
"informations\n"
"ci-dessous à l'équipe de ScummVM ainsi que le nom du jeu que vous avez\n"
-"essayé d'ajouter, sa version, le language, etc... :\n"
+"essayé d'ajouter, sa version, la langue, etc... :\n"
#: engines/scumm/detection.cpp:1138
msgid ""
@@ -4096,7 +4095,7 @@ msgstr " active/désactive le combat à la souris"
#: engines/scumm/help.cpp:304
msgid "Fighting controls (numpad):"
-msgstr "Contrôles de combat (pavet numérique) :"
+msgstr "Contrôles de combat (pavé numérique) :"
#: engines/scumm/help.cpp:305 engines/scumm/help.cpp:306
#: engines/scumm/help.cpp:307
@@ -4117,7 +4116,7 @@ msgstr "Bloquer bas"
#: engines/scumm/help.cpp:311
msgid "Punch high"
-msgstr "Fraper haut"
+msgstr "Frapper haut"
#: engines/scumm/help.cpp:312
msgid "Punch middle"
@@ -4149,7 +4148,7 @@ msgstr "respectivement."
#: engines/scumm/help.cpp:328
msgid "Biplane controls (numpad):"
-msgstr "Contrôles du biplane (paver numérique) :"
+msgstr "Contrôles du biplan (pavé numérique) :"
#: engines/scumm/help.cpp:329
msgid "Fly to upper left"
@@ -4219,9 +4218,9 @@ msgid ""
"Tentacle game directory, and the game has to be added to ScummVM."
msgstr ""
"Normalement, Maniac Mansion devrait démarrer maintenant. Mais pour que cela "
-"marche il faut que les fichiers du jeu Maniac Mansion soient dans e "
+"marche, il faut que les fichiers du jeu Maniac Mansion soient dans le "
"répertoire 'Maniac' à l'intérieur du répertoire du jeu Day of the Tentacle, "
-"et le jeu doit être ajouter à ScummVM."
+"et le jeu doit être ajouté à ScummVM."
#: engines/scumm/players/player_v3m.cpp:129
msgid ""
@@ -4246,7 +4245,7 @@ msgstr "Transitions de scènes pixélisées"
#: engines/sherlock/detection.cpp:82
msgid "When changing scenes, a randomized pixel transition is done"
msgstr ""
-"Lors du changement de scène une transition avec des pixels aléatoires est "
+"Lors du changement de scène, une transition avec des pixels aléatoires est "
"utilisée"
#: engines/sherlock/detection.cpp:91
@@ -4321,7 +4320,7 @@ msgstr ""
#: engines/sword1/animation.cpp:568 engines/sword2/animation.cpp:470
#, c-format
msgid "Cutscene '%s' not found"
-msgstr "Séquence '%s' non trouvé"
+msgstr "Séquence '%s' non trouvée"
#: engines/sword1/control.cpp:863
msgid ""
@@ -4335,7 +4334,7 @@ msgid ""
msgstr ""
"ScummVM a trouvé des anciens fichiers de sauvegarde pour Broken Sword 1 qui "
"ont besoin d'être convertis.\n"
-"L'ancien format de sauvegarde n'est plus supporté, donc vous ne pourrez pas "
+"L'ancien format de sauvegarde n'est plus supporté, vous ne pourrez donc pas "
"les charger si vous ne les convertissez pas.\n"
"\n"
"Appuyer sur OK pour les convertir maintenant, sinon le même message "
@@ -4385,8 +4384,8 @@ msgstr "Utiliser les voix anglaises"
msgid ""
"Use English speech instead of German for every language other than German"
msgstr ""
-"Utilise les voix anglaises au lieu des voix allemandes pour tous les autres "
-"langages"
+"Utilise les voix anglaises au lieu des voix allemandes pour toutes les "
+"autres langues"
#: engines/teenagent/resources.cpp:118
msgid ""
@@ -4486,7 +4485,7 @@ msgid ""
"%d. You will need an updated version of the engine to use this saved game."
msgstr ""
"Ce fichier de sauvegarde est en version %u, mais ce moteur ne supporte que "
-"les versions %d ou inférieure. Vous devez utiliser une version plus récente "
+"les versions %d ou inférieures. Vous devez utiliser une version plus récente "
"de ScummVM pour pouvoir charger cette sauvegarde."
#~ msgid ""
diff --git a/po/gl_ES.po b/po/gl_ES.po
index 3a885d245f..c6b9dd9186 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.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
"PO-Revision-Date: 2016-11-28 15:51+0000\n"
"Last-Translator: Santiago G. Sanz <santiagogarciasanz@gmail.com>\n"
"Language-Team: Galician <https://translations.scummvm.org/projects/scummvm/"
@@ -1807,7 +1807,7 @@ msgstr "~V~olver ao Iniciador"
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1828,7 +1828,7 @@ msgstr "Gardar partida:"
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -2854,8 +2854,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2867,8 +2867,8 @@ msgstr "Restaurar xogo:"
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"
diff --git a/po/hu_HU.po b/po/hu_HU.po
index bce6b19d66..efe95cc03c 100644
--- a/po/hu_HU.po
+++ b/po/hu_HU.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
"PO-Revision-Date: 2017-01-08 06:09+0000\n"
"Last-Translator: George Kormendi <grubycza@hotmail.com>\n"
"Language-Team: Hungarian <https://translations.scummvm.org/projects/scummvm/"
@@ -1794,7 +1794,7 @@ msgstr "Visszatérés az indítóba"
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1815,7 +1815,7 @@ msgstr "Játék mentése:"
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -2837,8 +2837,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2850,8 +2850,8 @@ msgstr "Játékmenet visszaállítása:"
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"
diff --git a/po/it_IT.po b/po/it_IT.po
index 5e56e255c7..be28391b04 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.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
"PO-Revision-Date: 2017-01-06 21:05+0000\n"
"Last-Translator: Walter Agazzi <tag2015@gmail.com>\n"
"Language-Team: Italian <https://translations.scummvm.org/projects/scummvm/"
@@ -1814,7 +1814,7 @@ msgstr "~V~ai a elenco giochi"
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1835,7 +1835,7 @@ msgstr "Salva gioco:"
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -2864,8 +2864,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2877,8 +2877,8 @@ msgstr "Ripristina partita:"
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"
diff --git a/po/nb_NO.po b/po/nb_NO.po
index ad7aca7b8f..227186cfc9 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.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
"PO-Revision-Date: 2016-12-26 17:36+0000\n"
"Last-Translator: Einar Johan Trøan Sømåen <einarjohants@gmail.com>\n"
"Language-Team: Norwegian Bokmål <https://translations.scummvm.org/projects/"
@@ -1796,7 +1796,7 @@ msgstr "~T~ilbake til oppstarter"
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1817,7 +1817,7 @@ msgstr "Lagret spill:"
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -2840,8 +2840,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2853,8 +2853,8 @@ msgstr "Gjennopprett spill:"
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"
diff --git a/po/nl_NL.po b/po/nl_NL.po
index 015a027b3d..5791984059 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.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
"PO-Revision-Date: 2017-01-02 18:38+0000\n"
"Last-Translator: Ben Castricum <github@bencastricum.nl>\n"
"Language-Team: Dutch <https://translations.scummvm.org/projects/scummvm/"
@@ -1804,7 +1804,7 @@ msgstr "S~t~artmenu"
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1825,7 +1825,7 @@ msgstr "Spel opslaan:"
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -2859,8 +2859,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2872,8 +2872,8 @@ msgstr "Laad opgeslagen spel:"
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"
diff --git a/po/nn_NO.po b/po/nn_NO.po
index c170ca8bb6..f3bcf2039e 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.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
"PO-Revision-Date: 2016-12-18 18:23+0000\n"
"Last-Translator: Eugene Sandulenko <sev@scummvm.org>\n"
"Language-Team: Norwegian Nynorsk <https://translations.scummvm.org/projects/"
@@ -1793,7 +1793,7 @@ msgstr "Tilbake til Oppsta~r~tar"
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1814,7 +1814,7 @@ msgstr "Lagra spel:"
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -2836,8 +2836,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2849,8 +2849,8 @@ msgstr "Gjenopprett spel:"
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"
diff --git a/po/pl_PL.po b/po/pl_PL.po
index 94413b3ed7..2b4ab87ef8 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.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
"PO-Revision-Date: 2017-01-06 10:37+0000\n"
"Last-Translator: Rafa³ Rzepecki <divided.mind@gmail.com>\n"
"Language-Team: Polish <https://translations.scummvm.org/projects/scummvm/"
@@ -1797,7 +1797,7 @@ msgstr "~P~owrót do launchera"
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1818,7 +1818,7 @@ msgstr "Zapis:"
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -2840,8 +2840,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2853,8 +2853,8 @@ msgstr "Wznów grê:"
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"
diff --git a/po/pt_BR.po b/po/pt_BR.po
index e62fcadc67..ff9f0ab9ef 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.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
"PO-Revision-Date: 2016-12-22 21:50+0000\n"
"Last-Translator: Alexandre Folle de Menezes <afmenez@terra.com.br>\n"
"Language-Team: Portuguese (Brazil) <https://translations.scummvm.org/"
@@ -1830,7 +1830,7 @@ msgstr "~V~oltar ao menu"
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1851,7 +1851,7 @@ msgstr "Salvar jogo:"
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -2883,8 +2883,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2896,8 +2896,8 @@ msgstr "Restaurar jogo:"
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"
diff --git a/po/pt_PT.po b/po/pt_PT.po
index 5287fb3503..ec273ffdb5 100644
--- a/po/pt_PT.po
+++ b/po/pt_PT.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.10.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
"PO-Revision-Date: 2016-12-14 00:22+0000\n"
"Last-Translator: Fernando Sarmento <nando_sarmento@hotmail.com>\n"
"Language-Team: Portuguese (Portugal) <https://translations.scummvm.org/"
@@ -1787,7 +1787,7 @@ msgstr ""
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1808,7 +1808,7 @@ msgstr ""
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -2790,8 +2790,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2803,8 +2803,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"
diff --git a/po/ru_RU.po b/po/ru_RU.po
index c7a2e37a11..2f11211895 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.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
"PO-Revision-Date: 2016-12-31 21:04+0000\n"
"Last-Translator: Ivan Lukyanov <lid-gr@tut.by>\n"
"Language-Team: Russian <https://translations.scummvm.org/projects/scummvm/"
@@ -1805,7 +1805,7 @@ msgstr "~²~ ÓÛÐÒÝÞÕ ÜÕÝî"
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1826,7 +1826,7 @@ msgstr "ÁÞåàÐÝØâì ØÓàã:"
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -2854,8 +2854,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2867,8 +2867,8 @@ msgstr "²ÞááâÐÝÞÒØâì ØÓàã:"
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"
diff --git a/po/scummvm.pot b/po/scummvm.pot
index d7d707890c..d260bca125 100644
--- a/po/scummvm.pot
+++ b/po/scummvm.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.10.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -1755,7 +1755,7 @@ msgstr ""
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1776,7 +1776,7 @@ msgstr ""
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -2758,8 +2758,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2771,8 +2771,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"
diff --git a/po/sv_SE.po b/po/sv_SE.po
index e4cb850476..c788b0ee00 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.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
"PO-Revision-Date: 2017-01-06 09:18+0000\n"
"Last-Translator: Petter Sjölund <ignalina@mac.com>\n"
"Language-Team: Swedish <https://translations.scummvm.org/projects/scummvm/"
@@ -1805,7 +1805,7 @@ msgstr "Åte~r~vänd till launcher"
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1826,7 +1826,7 @@ msgstr "Spara spelet:"
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -2852,8 +2852,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2865,8 +2865,8 @@ msgstr "Ladda sparfil:"
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"
diff --git a/po/uk_UA.po b/po/uk_UA.po
index 748f457c21..1279fe90b7 100644
--- a/po/uk_UA.po
+++ b/po/uk_UA.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.9.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
"PO-Revision-Date: 2017-01-01 00:02+0000\n"
"Last-Translator: Eugene Sandulenko <sev@scummvm.org>\n"
"Language-Team: Ukrainian <https://translations.scummvm.org/projects/scummvm/"
@@ -1806,7 +1806,7 @@ msgstr "~¿~ÞÒÕà.Ò ÓÞÛÞÒÝÕ ÜÕÝî"
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1827,7 +1827,7 @@ msgstr "·ÑÕàÕÓâØ Óàã:"
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -2855,8 +2855,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2868,8 +2868,8 @@ msgstr "²öÔÝÞ񯉯 Óàã:"
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"
diff --git a/po/zh-Latn_CN.po b/po/zh-Latn_CN.po
index 3f86255ba9..c3cbc3d6be 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.scummvm.org\n"
-"POT-Creation-Date: 2017-01-12 10:39+0100\n"
+"POT-Creation-Date: 2017-01-16 19:19+0100\n"
"PO-Revision-Date: 2016-12-26 19:38+0000\n"
"Last-Translator: Eugene Sandulenko <sev@scummvm.org>\n"
"Language-Team: Chinese <https://translations.scummvm.org/projects/scummvm/"
@@ -1792,7 +1792,7 @@ msgstr "~R~Fanhui Qidongqi"
#: engines/gnap/menu.cpp:464 engines/hugo/file.cpp:298
#: engines/mads/nebular/dialogs_nebular.cpp:350 engines/mohawk/dialogs.cpp:104
#: engines/neverhood/menumodule.cpp:880 engines/pegasus/pegasus.cpp:377
-#: engines/sci/engine/kfile.cpp:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: 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
@@ -1813,7 +1813,7 @@ msgstr "Baocun Youxi:"
#: engines/hugo/file.cpp:298 engines/mads/nebular/dialogs_nebular.cpp:350
#: 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:899 engines/sci/engine/kfile.cpp:1175
+#: engines/sci/engine/kfile.cpp:900 engines/sci/engine/kfile.cpp:1176
#: engines/scumm/dialogs.cpp:184 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
@@ -2836,8 +2836,8 @@ msgstr ""
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore game:"
@@ -2849,8 +2849,8 @@ msgstr "Huifu Youxi:"
#: engines/dm/loadsave.cpp:184 engines/drascula/saveload.cpp:377
#: engines/dreamweb/saveload.cpp:170 engines/gnap/menu.cpp:473
#: engines/hugo/file.cpp:400 engines/mads/nebular/dialogs_nebular.cpp:377
-#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1018
-#: engines/sci/engine/kfile.cpp:1247 engines/sherlock/scalpel/scalpel.cpp:1263
+#: engines/neverhood/menumodule.cpp:893 engines/sci/engine/kfile.cpp:1019
+#: engines/sci/engine/kfile.cpp:1248 engines/sherlock/scalpel/scalpel.cpp:1263
#: engines/sherlock/tattoo/widget_files.cpp:94 engines/toltecs/menu.cpp:266
#: engines/toon/toon.cpp:3432 engines/zvision/file/save_manager.cpp:62
msgid "Restore"