aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS3
-rw-r--r--engines/adl/adl.cpp67
-rw-r--r--engines/adl/adl.h26
-rw-r--r--engines/adl/adl_v2.cpp70
-rw-r--r--engines/adl/adl_v2.h1
-rw-r--r--engines/adl/adl_v3.cpp14
-rw-r--r--engines/adl/adl_v3.h1
-rw-r--r--engines/adl/adl_v4.cpp420
-rw-r--r--engines/adl/adl_v4.h55
-rw-r--r--engines/adl/adl_v5.cpp246
-rw-r--r--engines/adl/adl_v5.h73
-rw-r--r--engines/adl/detection.cpp24
-rw-r--r--engines/adl/disk.cpp66
-rw-r--r--engines/adl/hires1.cpp4
-rw-r--r--engines/adl/hires2.cpp4
-rw-r--r--engines/adl/hires5.cpp252
-rw-r--r--engines/adl/hires6.cpp10
-rw-r--r--engines/adl/module.mk1
-rw-r--r--engines/cruise/font.cpp6
-rw-r--r--engines/drascula/animation.cpp2
-rw-r--r--engines/drascula/graphics.cpp2
-rw-r--r--engines/fullpipe/constants.h46
-rw-r--r--engines/fullpipe/detection.cpp23
-rw-r--r--engines/fullpipe/fullpipe.cpp15
-rw-r--r--engines/fullpipe/fullpipe.h7
-rw-r--r--engines/fullpipe/gameloader.cpp4
-rw-r--r--engines/fullpipe/gameloader.h2
-rw-r--r--engines/fullpipe/init.cpp5
-rw-r--r--engines/fullpipe/messagehandlers.cpp8
-rw-r--r--engines/fullpipe/modal.cpp720
-rw-r--r--engines/fullpipe/modal.h61
-rw-r--r--engines/fullpipe/module.mk1
-rw-r--r--engines/fullpipe/objectnames.h1
-rw-r--r--engines/fullpipe/scenes.cpp32
-rw-r--r--engines/fullpipe/scenes.h4
-rw-r--r--engines/fullpipe/scenes/scene04.cpp4
-rw-r--r--engines/fullpipe/scenes/scene06.cpp4
-rw-r--r--engines/fullpipe/scenes/scene08.cpp16
-rw-r--r--engines/fullpipe/scenes/scene09.cpp18
-rw-r--r--engines/fullpipe/scenes/scene11.cpp2
-rw-r--r--engines/fullpipe/scenes/scene13.cpp6
-rw-r--r--engines/fullpipe/scenes/scene14.cpp4
-rw-r--r--engines/fullpipe/scenes/scene18and19.cpp2
-rw-r--r--engines/fullpipe/scenes/scene21.cpp2
-rw-r--r--engines/fullpipe/scenes/scene22.cpp2
-rw-r--r--engines/fullpipe/scenes/scene26.cpp5
-rw-r--r--engines/fullpipe/scenes/scene27.cpp4
-rw-r--r--engines/fullpipe/scenes/scene28.cpp2
-rw-r--r--engines/fullpipe/scenes/scene32.cpp2
-rw-r--r--engines/fullpipe/scenes/scene33.cpp2
-rw-r--r--engines/fullpipe/scenes/scene34.cpp2
-rw-r--r--engines/fullpipe/scenes/scene35.cpp2
-rw-r--r--engines/fullpipe/scenes/scene37.cpp2
-rw-r--r--engines/fullpipe/scenes/sceneIntroDemo.cpp94
-rw-r--r--engines/fullpipe/stateloader.cpp18
-rw-r--r--engines/fullpipe/statics.cpp4
-rw-r--r--engines/mohawk/cursors.cpp9
-rw-r--r--engines/mohawk/myst.cpp19
-rw-r--r--engines/mohawk/myst.h1
-rw-r--r--engines/mohawk/myst_graphics.cpp11
-rw-r--r--engines/queen/display.cpp4
-rw-r--r--engines/sci/detection_tables.h29
-rw-r--r--engines/sci/engine/kernel.h1
-rw-r--r--engines/sci/engine/kernel_tables.h6
-rw-r--r--engines/sci/engine/klists.cpp115
-rw-r--r--engines/sci/engine/script_patches.cpp2
-rw-r--r--engines/sci/engine/scriptdebug.cpp20
-rw-r--r--engines/sci/engine/workarounds.cpp34
-rw-r--r--engines/sci/engine/workarounds.h2
-rw-r--r--engines/sci/graphics/picture.cpp24
-rw-r--r--engines/sci/graphics/transitions32.cpp20
-rw-r--r--engines/sci/graphics/transitions32.h19
-rw-r--r--engines/scumm/he/moonbase/distortion.cpp2
-rw-r--r--engines/sky/logic.cpp128
-rw-r--r--engines/sky/logic.h2
-rw-r--r--engines/titanic/core/background.cpp8
-rw-r--r--engines/titanic/core/background.h2
-rw-r--r--engines/titanic/core/game_object.cpp16
-rw-r--r--engines/titanic/core/game_object.h12
-rw-r--r--engines/titanic/core/turn_on_turn_off.cpp18
-rw-r--r--engines/titanic/core/turn_on_turn_off.h2
-rw-r--r--engines/titanic/game/cell_point_button.cpp70
-rw-r--r--engines/titanic/game/cell_point_button.h22
-rw-r--r--engines/titanic/game/parrot/player_meets_parrot.cpp2
-rw-r--r--engines/titanic/game/pet/pet_sounds.cpp2
-rw-r--r--engines/titanic/game/transport/lift.cpp14
-rw-r--r--engines/titanic/game_state.cpp6
-rw-r--r--engines/titanic/game_state.h14
-rw-r--r--engines/titanic/moves/enter_exit_first_class_state.cpp13
-rw-r--r--engines/titanic/moves/enter_exit_first_class_state.h2
-rw-r--r--engines/titanic/moves/enter_sec_class_state.cpp2
-rw-r--r--engines/titanic/npcs/parrot.cpp2
-rw-r--r--engines/titanic/pet_control/pet_control.cpp6
-rw-r--r--engines/titanic/pet_control/pet_control.h2
-rw-r--r--engines/titanic/pet_control/pet_conversations.cpp27
-rw-r--r--engines/titanic/pet_control/pet_conversations.h4
-rw-r--r--engines/titanic/pet_control/pet_remote_glyphs.cpp2
-rw-r--r--engines/titanic/pet_control/pet_text.cpp29
-rw-r--r--engines/titanic/room_flags.cpp2
-rw-r--r--engines/titanic/support/avi_surface.cpp24
-rw-r--r--engines/titanic/support/avi_surface.h5
-rw-r--r--engines/titanic/titanic.cpp14
-rw-r--r--engines/titanic/titanic.h1
-rw-r--r--engines/titanic/true_talk/tt_concept.cpp16
-rw-r--r--engines/titanic/true_talk/tt_npc_script.cpp8
-rw-r--r--engines/titanic/true_talk/tt_sentence.cpp4
-rw-r--r--engines/wage/detection_tables.h7
-rw-r--r--graphics/macgui/mactext.cpp125
-rw-r--r--graphics/macgui/mactext.h65
-rw-r--r--graphics/module.mk1
-rw-r--r--gui/themes/translations.datbin600528 -> 606710 bytes
-rw-r--r--po/da_DK.po37
-rw-r--r--po/de_DE.po15
-rw-r--r--po/es_ES.po146
-rw-r--r--po/fi_FI.po200
-rw-r--r--po/fr_FR.po6
-rw-r--r--po/hu_HU.po19
-rw-r--r--po/it_IT.po116
-rw-r--r--po/nb_NO.po67
-rw-r--r--po/nl_NL.po6
-rw-r--r--po/pl_PL.po40
-rw-r--r--po/pt_PT.po4277
-rw-r--r--po/ru_RU.po76
-rw-r--r--video/avi_decoder.cpp63
-rw-r--r--video/avi_decoder.h20
125 files changed, 7528 insertions, 1030 deletions
diff --git a/NEWS b/NEWS
index f1650f0b7e..812bf02d89 100644
--- a/NEWS
+++ b/NEWS
@@ -19,6 +19,9 @@ For a more comprehensive changelog of the latest experimental code, see:
- Added bilinear filtering option for SDL2 fullscreen mode.
- Fixed a bug that caused a crash in the options dialog of the GUI.
+ Drascula:
+ - Fixed bug that made it impossible to talk to the drunkard more than once in the inn.
+
Kyra:
- Fixed a buffer overflow in Lands of Lore.
diff --git a/engines/adl/adl.cpp b/engines/adl/adl.cpp
index 63b0937354..e3cd929b6d 100644
--- a/engines/adl/adl.cpp
+++ b/engines/adl/adl.cpp
@@ -428,6 +428,20 @@ void AdlEngine::bell(uint count) const {
_speaker->bell(count);
}
+const Region &AdlEngine::getRegion(uint i) const {
+ if (i < 1 || i > _state.regions.size())
+ error("Region %i out of range [1, %i]", i, _state.regions.size());
+
+ return _state.regions[i - 1];
+}
+
+Region &AdlEngine::getRegion(uint i) {
+ if (i < 1 || i > _state.regions.size())
+ error("Region %i out of range [1, %i]", i, _state.regions.size());
+
+ return _state.regions[i - 1];
+}
+
const Room &AdlEngine::getRoom(uint i) const {
if (i < 1 || i > _state.rooms.size())
error("Room %i out of range [1, %i]", i, _state.rooms.size());
@@ -442,6 +456,14 @@ Room &AdlEngine::getRoom(uint i) {
return _state.rooms[i - 1];
}
+const Region &AdlEngine::getCurRegion() const {
+ return getRegion(_state.region);
+}
+
+Region &AdlEngine::getCurRegion() {
+ return getRegion(_state.region);
+}
+
const Room &AdlEngine::getCurRoom() const {
return getRoom(_state.room);
}
@@ -488,26 +510,25 @@ void AdlEngine::takeItem(byte noun) {
Common::List<Item>::iterator item;
for (item = _state.items.begin(); item != _state.items.end(); ++item) {
- if (item->noun != noun || item->room != _state.room)
- continue;
-
- if (item->state == IDI_ITEM_DOESNT_MOVE) {
- printMessage(_messageIds.itemDoesntMove);
- return;
- }
-
- if (item->state == IDI_ITEM_DROPPED) {
- item->room = IDI_ANY;
- return;
- }
+ if (item->noun == noun && item->room == _state.room && item->region == _state.region) {
+ if (item->state == IDI_ITEM_DOESNT_MOVE) {
+ printMessage(_messageIds.itemDoesntMove);
+ return;
+ }
- Common::Array<byte>::const_iterator pic;
- for (pic = item->roomPictures.begin(); pic != item->roomPictures.end(); ++pic) {
- if (*pic == getCurRoom().curPicture) {
+ if (item->state == IDI_ITEM_DROPPED) {
item->room = IDI_ANY;
- item->state = IDI_ITEM_DROPPED;
return;
}
+
+ Common::Array<byte>::const_iterator pic;
+ for (pic = item->roomPictures.begin(); pic != item->roomPictures.end(); ++pic) {
+ if (*pic == getCurRoom().curPicture) {
+ item->room = IDI_ANY;
+ item->state = IDI_ITEM_DROPPED;
+ return;
+ }
+ }
}
}
@@ -518,12 +539,12 @@ void AdlEngine::dropItem(byte noun) {
Common::List<Item>::iterator item;
for (item = _state.items.begin(); item != _state.items.end(); ++item) {
- if (item->noun != noun || item->room != IDI_ANY)
- continue;
-
- item->room = _state.room;
- item->state = IDI_ITEM_DROPPED;
- return;
+ if (item->noun == noun && item->room == IDI_ANY) {
+ item->room = _state.room;
+ item->region = _state.region;
+ item->state = IDI_ITEM_DROPPED;
+ return;
+ }
}
printMessage(_messageIds.dontUnderstand);
@@ -1009,7 +1030,7 @@ int AdlEngine::o1_listInv(ScriptEnv &e) {
for (item = _state.items.begin(); item != _state.items.end(); ++item)
if (item->room == IDI_ANY)
- printMessage(item->description);
+ printString(getItemDescription(*item));
return 0;
}
diff --git a/engines/adl/adl.h b/engines/adl/adl.h
index fc696f074f..a825200587 100644
--- a/engines/adl/adl.h
+++ b/engines/adl/adl.h
@@ -143,6 +143,7 @@ enum {
struct Item {
byte id;
byte noun;
+ byte region;
byte room;
byte picture;
bool isLineArt;
@@ -159,18 +160,30 @@ struct Time {
Time() : hours(12), minutes(0) { }
};
+struct RoomState {
+ byte picture;
+ byte isFirstTime;
+};
+
+struct Region {
+ Common::Array<byte> vars;
+ Common::Array<RoomState> rooms;
+};
+
struct State {
+ Common::Array<Region> regions;
Common::Array<Room> rooms;
Common::List<Item> items;
Common::Array<byte> vars;
+ byte region, prevRegion;
byte room;
byte curPicture;
uint16 moves;
bool isDark;
Time time;
- State() : room(1), curPicture(0), moves(1), isDark(false) { }
+ State() : region(0), prevRegion(0), room(1), curPicture(0), moves(1), isDark(false) { }
};
typedef Common::List<Command> Commands;
@@ -288,8 +301,12 @@ protected:
void bell(uint count = 1) const;
// Game state functions
+ const Region &getRegion(uint i) const;
+ Region &getRegion(uint i);
const Room &getRoom(uint i) const;
Room &getRoom(uint i);
+ const Region &getCurRegion() const;
+ Region &getCurRegion();
const Room &getCurRoom() const;
Room &getCurRoom();
const Item &getItem(uint i) const;
@@ -297,7 +314,7 @@ protected:
byte getVar(uint i) const;
void setVar(uint i, byte value);
virtual void takeItem(byte noun);
- void dropItem(byte noun);
+ virtual void dropItem(byte noun);
bool matchCommand(ScriptEnv &env) const;
void doActions(ScriptEnv &env);
bool doOneCommand(const Commands &commands, byte verb, byte noun);
@@ -362,8 +379,10 @@ protected:
bool _isRestarting, _isRestoring, _isQuitting;
bool _skipOneCommand;
+ const AdlGameDescription *_gameDescription;
+
private:
- virtual void runIntro() const { }
+ virtual void runIntro() { }
virtual void init() = 0;
virtual void initGameState() = 0;
virtual void drawItems() = 0;
@@ -385,7 +404,6 @@ private:
Console *_console;
GUI::Debugger *getDebugger() { return _console; }
- const AdlGameDescription *_gameDescription;
byte _saveVerb, _saveNoun, _restoreVerb, _restoreNoun;
bool _canSaveNow, _canRestoreNow;
};
diff --git a/engines/adl/adl_v2.cpp b/engines/adl/adl_v2.cpp
index 45810d64ca..46bd6aa4d3 100644
--- a/engines/adl/adl_v2.cpp
+++ b/engines/adl/adl_v2.cpp
@@ -286,32 +286,34 @@ void AdlEngine_v2::showRoom() {
_linesPrinted = 0;
}
+// TODO: Merge this into AdlEngine?
void AdlEngine_v2::takeItem(byte noun) {
Common::List<Item>::iterator item;
for (item = _state.items.begin(); item != _state.items.end(); ++item) {
- if (item->noun != noun || item->room != _state.room)
- continue;
-
- if (item->state == IDI_ITEM_DOESNT_MOVE) {
- printMessage(_messageIds.itemDoesntMove);
- return;
- }
-
- if (item->state == IDI_ITEM_DROPPED) {
- item->room = IDI_ANY;
- _itemRemoved = true;
- return;
- }
+ if (item->noun == noun && item->room == _state.room && item->region == _state.region) {
+ if (item->state == IDI_ITEM_DOESNT_MOVE) {
+ printMessage(_messageIds.itemDoesntMove);
+ return;
+ }
- Common::Array<byte>::const_iterator pic;
- for (pic = item->roomPictures.begin(); pic != item->roomPictures.end(); ++pic) {
- if (*pic == getCurRoom().curPicture || *pic == IDI_ANY) {
+ if (item->state == IDI_ITEM_DROPPED) {
item->room = IDI_ANY;
_itemRemoved = true;
- item->state = IDI_ITEM_DROPPED;
return;
}
+
+ Common::Array<byte>::const_iterator pic;
+ for (pic = item->roomPictures.begin(); pic != item->roomPictures.end(); ++pic) {
+ if (*pic == getCurRoom().curPicture || *pic == IDI_ANY) {
+ if (!isInventoryFull()) {
+ item->room = IDI_ANY;
+ _itemRemoved = true;
+ item->state = IDI_ITEM_DROPPED;
+ }
+ return;
+ }
+ }
}
}
@@ -323,24 +325,20 @@ void AdlEngine_v2::drawItems() {
for (item = _state.items.begin(); item != _state.items.end(); ++item) {
// Skip items not in this room
- if (item->room != _state.room)
- continue;
-
- if (item->isOnScreen)
- continue;
-
- if (item->state == IDI_ITEM_DROPPED) {
- // Draw dropped item if in normal view
- if (getCurRoom().picture == getCurRoom().curPicture)
- drawItem(*item, _itemOffsets[_itemsOnScreen++]);
- } else {
- // Draw fixed item if current view is in the pic list
- Common::Array<byte>::const_iterator pic;
-
- for (pic = item->roomPictures.begin(); pic != item->roomPictures.end(); ++pic) {
- if (*pic == _state.curPicture || *pic == IDI_ANY) {
- drawItem(*item, item->position);
- break;
+ if (item->region == _state.region && item->room == _state.room && !item->isOnScreen) {
+ if (item->state == IDI_ITEM_DROPPED) {
+ // Draw dropped item if in normal view
+ if (getCurRoom().picture == getCurRoom().curPicture)
+ drawItem(*item, _itemOffsets[_itemsOnScreen++]);
+ } else {
+ // Draw fixed item if current view is in the pic list
+ Common::Array<byte>::const_iterator pic;
+
+ for (pic = item->roomPictures.begin(); pic != item->roomPictures.end(); ++pic) {
+ if (*pic == _state.curPicture || *pic == IDI_ANY) {
+ drawItem(*item, item->position);
+ break;
+ }
}
}
}
@@ -372,7 +370,7 @@ void AdlEngine_v2::loadItems(Common::ReadStream &stream) {
item.noun = stream.readByte();
item.room = stream.readByte();
item.picture = stream.readByte();
- item.isLineArt = stream.readByte(); // Disk number in later games
+ item.region = stream.readByte();
item.position.x = stream.readByte();
item.position.y = stream.readByte();
item.state = stream.readByte();
diff --git a/engines/adl/adl_v2.h b/engines/adl/adl_v2.h
index 8f36b5cdb8..fe0c781f44 100644
--- a/engines/adl/adl_v2.h
+++ b/engines/adl/adl_v2.h
@@ -58,6 +58,7 @@ protected:
void loadMessages(Common::ReadStream &stream, byte count);
void loadPictures(Common::ReadStream &stream);
void loadItemPictures(Common::ReadStream &stream, byte count);
+ virtual bool isInventoryFull() { return false; }
void checkTextOverflow(char c);
diff --git a/engines/adl/adl_v3.cpp b/engines/adl/adl_v3.cpp
index ba9e4a063e..46af211695 100644
--- a/engines/adl/adl_v3.cpp
+++ b/engines/adl/adl_v3.cpp
@@ -62,8 +62,6 @@ void AdlEngine_v3::setupOpcodeTables() {
AdlEngine_v2::setupOpcodeTables();
delete _condOpcodes[0x04];
_condOpcodes[0x04] = new OpcodeV3(this, &AdlEngine_v3::o3_isNounNotInRoom);
- delete _actOpcodes[0x04];
- _actOpcodes[0x04] = new OpcodeV3(this, &AdlEngine_v3::o3_listInv);
}
int AdlEngine_v3::o3_isNounNotInRoom(ScriptEnv &e) {
@@ -85,16 +83,4 @@ int AdlEngine_v3::o3_isNounNotInRoom(ScriptEnv &e) {
return (isAnItem ? 1 : -1);
}
-int AdlEngine_v3::o3_listInv(ScriptEnv &e) {
- OP_DEBUG_0("\tLIST_INVENTORY()");
-
- Common::List<Item>::const_iterator item;
-
- for (item = _state.items.begin(); item != _state.items.end(); ++item)
- if (item->room == IDI_ANY)
- printString(_itemDesc[item->description - 1]);
-
- return 0;
-}
-
} // End of namespace Adl
diff --git a/engines/adl/adl_v3.h b/engines/adl/adl_v3.h
index b0d40f3993..ab56d4e7d2 100644
--- a/engines/adl/adl_v3.h
+++ b/engines/adl/adl_v3.h
@@ -41,7 +41,6 @@ protected:
void loadItemDescriptions(Common::SeekableReadStream &stream, byte count);
int o3_isNounNotInRoom(ScriptEnv &e);
- int o3_listInv(ScriptEnv &e);
Common::Array<Common::String> _itemDesc;
};
diff --git a/engines/adl/adl_v4.cpp b/engines/adl/adl_v4.cpp
index ed20c82513..8b72923e8b 100644
--- a/engines/adl/adl_v4.cpp
+++ b/engines/adl/adl_v4.cpp
@@ -20,22 +20,24 @@
*
*/
-#include "common/random.h"
-#include "common/error.h"
-
#include "adl/adl_v4.h"
-#include "adl/display.h"
-#include "adl/graphics.h"
+#include "adl/detection.h"
namespace Adl {
AdlEngine_v4::AdlEngine_v4(OSystem *syst, const AdlGameDescription *gd) :
AdlEngine_v3(syst, gd),
- _curDisk(0) {
+ _currentVolume(0),
+ _itemPicIndex(nullptr) {
+
+}
+
+AdlEngine_v4::~AdlEngine_v4() {
+ delete _itemPicIndex;
}
Common::String AdlEngine_v4::loadMessage(uint idx) const {
- Common::String str = AdlEngine_v2::loadMessage(idx);
+ Common::String str = AdlEngine_v3::loadMessage(idx);
for (uint i = 0; i < str.size(); ++i) {
const char *xorStr = "AVISDURGAN";
@@ -49,114 +51,227 @@ Common::String AdlEngine_v4::getItemDescription(const Item &item) const {
return _itemDesc[item.id - 1];
}
-void AdlEngine_v4::applyDiskOffset(byte &track, byte &sector) const {
- sector += _diskOffsets[_curDisk].sector;
+DiskImage *AdlEngine_v4::loadDisk(byte volume) const {
+ const ADGameFileDescription *ag;
+
+ for (ag = _gameDescription->desc.filesDescriptions; ag->fileName; ag++) {
+ if (ag->fileType == volume) {
+ DiskImage *disk = new DiskImage();
+ if (!disk->open(ag->fileName))
+ error("Failed to open %s", ag->fileName);
+ return disk;
+ }
+ }
+
+ error("Disk volume %d not found", volume);
+}
+
+void AdlEngine_v4::insertDisk(byte volume) {
+ delete _disk;
+ _disk = loadDisk(volume);
+ _currentVolume = volume;
+}
+
+void AdlEngine_v4::loadRegionLocations(Common::ReadStream &stream, uint regions) {
+ for (uint r = 0; r < regions; ++r) {
+ RegionLocation loc;
+ loc.track = stream.readByte();
+ loc.sector = stream.readByte();
+
+ if (stream.eos() || stream.err())
+ error("Failed to read region locations");
+
+ _regionLocations.push_back(loc);
+ }
+}
+
+void AdlEngine_v4::loadRegionInitDataOffsets(Common::ReadStream &stream, uint regions) {
+ for (uint r = 0; r < regions; ++r) {
+ RegionInitDataOffset initOfs;
+ initOfs.track = stream.readByte();
+ initOfs.sector = stream.readByte();
+ initOfs.offset = stream.readByte();
+ initOfs.volume = stream.readByte();
+
+ if (stream.eos() || stream.err())
+ error("Failed to read region init data offsets");
+
+ _regionInitDataOffsets.push_back(initOfs);
+ }
+}
+
+void AdlEngine_v4::initRegions(const byte *roomsPerRegion, uint regions) {
+ _state.regions.resize(regions);
+
+ for (uint r = 0; r < regions; ++r) {
+ Region &regn = _state.regions[r];
+ // Each region has 24 variables
+ regn.vars.resize(24);
+
+ regn.rooms.resize(roomsPerRegion[r]);
+ for (uint rm = 0; rm < roomsPerRegion[r]; ++rm) {
+ // TODO: hires6 uses 0xff and has slightly different
+ // code working on these values
+ regn.rooms[rm].picture = 1;
+ regn.rooms[rm].isFirstTime = 1;
+ }
+ }
+}
+
+void AdlEngine_v4::fixupDiskOffset(byte &track, byte &sector) const {
+ if (_state.region == 0)
+ return;
+
+ sector += _regionLocations[_state.region - 1].sector;
if (sector >= 16) {
sector -= 16;
++track;
}
- track += _diskOffsets[_curDisk].track;
+ track += _regionLocations[_state.region - 1].track;
}
void AdlEngine_v4::adjustDataBlockPtr(byte &track, byte &sector, byte &offset, byte &size) const {
- applyDiskOffset(track, sector);
+ fixupDiskOffset(track, sector);
+}
+
+void AdlEngine_v4::loadRegion(byte region) {
+ if (_currentVolume != _regionInitDataOffsets[region - 1].volume) {
+ insertDisk(_regionInitDataOffsets[region - 1].volume);
+
+ // FIXME: This shouldn't be needed, but currently is, due to
+ // implementation choices made earlier on for DataBlockPtr and DiskImage.
+ _state.region = 0; // To avoid region offset being applied
+ _itemPics.clear();
+ loadItemPictures(*_itemPicIndex, _itemPicIndex->size() / 5);
+ }
+
+ _state.region = region;
+
+ byte track = _regionInitDataOffsets[region - 1].track;
+ byte sector = _regionInitDataOffsets[region - 1].sector;
+ uint offset = _regionInitDataOffsets[region - 1].offset;
+
+ fixupDiskOffset(track, sector);
+
+ for (uint block = 0; block < 7; ++block) {
+ StreamPtr stream(_disk->createReadStream(track, sector, offset, 1));
+
+ uint16 addr = stream->readUint16LE();
+ uint16 size = stream->readUint16LE();
+
+ stream.reset(_disk->createReadStream(track, sector, offset, size / 256 + 1));
+ stream->skip(4);
+
+ switch (addr) {
+ case 0x9000: {
+ // Messages
+ _messages.clear();
+ uint count = size / 4;
+ loadMessages(*stream, count);
+ break;
+ }
+ case 0x4a80: {
+ // Global pics
+ _pictures.clear();
+ loadPictures(*stream);
+ break;
+ }
+ case 0x4000:
+ // Verbs
+ loadWords(*stream, _verbs, _priVerbs);
+ break;
+ case 0x1800:
+ // Nouns
+ loadWords(*stream, _nouns, _priNouns);
+ break;
+ case 0x0e00: {
+ // Rooms
+ uint count = size / 14 - 1;
+ stream->skip(14); // Skip invalid room 0
+
+ _state.rooms.clear();
+ loadRooms(*stream, count);
+ break;
+ }
+ case 0x7b00:
+ // TODO: hires6 has global and room lists swapped
+ // Room commands
+ readCommands(*stream, _roomCommands);
+ break;
+ case 0x9500:
+ // Global commands
+ readCommands(*stream, _globalCommands);
+ break;
+ default:
+ error("Unknown data block found (addr %04x; size %04x)", addr, size);
+ }
+
+ offset += 4 + size;
+ while (offset >= 256) {
+ offset -= 256;
+ ++sector;
+ if (sector >= 16) {
+ sector = 0;
+ ++track;
+ }
+ }
+ }
+
+ restoreVars();
}
-typedef Common::Functor1Mem<ScriptEnv &, int, AdlEngine_v4> OpcodeV4;
-#define SetOpcodeTable(x) table = &x;
-#define Opcode(x) table->push_back(new OpcodeV4(this, &AdlEngine_v4::x))
-#define OpcodeUnImpl() table->push_back(new OpcodeV4(this, 0))
-
-void AdlEngine_v4::setupOpcodeTables() {
- Common::Array<const Opcode *> *table = 0;
-
- SetOpcodeTable(_condOpcodes);
- // 0x00
- OpcodeUnImpl();
- Opcode(o2_isFirstTime);
- Opcode(o2_isRandomGT);
- Opcode(o4_isItemInRoom);
- // 0x04
- Opcode(o4_isNounNotInRoom);
- Opcode(o1_isMovesGT);
- Opcode(o1_isVarEQ);
- Opcode(o2_isCarryingSomething);
- // 0x08
- Opcode(o4_isVarGT);
- Opcode(o1_isCurPicEQ);
- Opcode(o4_skipOneCommand);
-
- SetOpcodeTable(_actOpcodes);
- // 0x00
- OpcodeUnImpl();
- Opcode(o1_varAdd);
- Opcode(o1_varSub);
- Opcode(o1_varSet);
- // 0x04
- Opcode(o4_listInv);
- Opcode(o4_moveItem);
- Opcode(o1_setRoom);
- Opcode(o2_setCurPic);
- // 0x08
- Opcode(o2_setPic);
- Opcode(o1_printMsg);
- Opcode(o4_dummy);
- Opcode(o4_setTextMode);
- // 0x0c
- Opcode(o2_moveAllItems);
- Opcode(o1_quit);
- Opcode(o4_dummy);
- Opcode(o2_save);
- // 0x10
- Opcode(o2_restore);
- Opcode(o1_restart);
- Opcode(o4_setDisk);
- Opcode(o4_dummy);
- // 0x14
- Opcode(o1_resetPic);
- Opcode(o1_goDirection<IDI_DIR_NORTH>);
- Opcode(o1_goDirection<IDI_DIR_SOUTH>);
- Opcode(o1_goDirection<IDI_DIR_EAST>);
- // 0x18
- Opcode(o1_goDirection<IDI_DIR_WEST>);
- Opcode(o1_goDirection<IDI_DIR_UP>);
- Opcode(o1_goDirection<IDI_DIR_DOWN>);
- Opcode(o1_takeItem);
- // 0x1c
- Opcode(o1_dropItem);
- Opcode(o1_setRoomPic);
- Opcode(o4_sound);
- OpcodeUnImpl();
- // 0x20
- Opcode(o2_initDisk);
+void AdlEngine_v4::loadItemPicIndex(Common::ReadStream &stream, uint items) {
+ _itemPicIndex = stream.readStream(items * 5);
+
+ if (stream.eos() || stream.err())
+ error("Error reading item index");
}
-int AdlEngine_v4::o4_isVarGT(ScriptEnv &e) {
- OP_DEBUG_2("\t&& VARS[%d] > %d", e.arg(1), e.arg(2));
+void AdlEngine_v4::backupRoomState(byte room) {
+ RoomState &backup = getCurRegion().rooms[room - 1];
- if (getVar(e.arg(1)) > e.arg(2))
- return 2;
+ backup.isFirstTime = getRoom(room).isFirstTime;
+ backup.picture = getRoom(room).picture;
+}
- return -1;
+void AdlEngine_v4::restoreRoomState(byte room) {
+ const RoomState &backup = getCurRegion().rooms[room - 1];
+
+ getRoom(room).isFirstTime = backup.isFirstTime;
+ getRoom(room).picture = backup.picture;
}
-int AdlEngine_v4::o4_skipOneCommand(ScriptEnv &e) {
- OP_DEBUG_0("\t&& SKIP_ONE_COMMAND()");
+void AdlEngine_v4::backupVars() {
+ Region &region = getCurRegion();
- _skipOneCommand = true;
- setVar(2, 0);
+ for (uint i = 0; i < region.vars.size(); ++i)
+ region.vars[i] = getVar(i);
+}
- return -1;
+void AdlEngine_v4::restoreVars() {
+ const Region &region = getCurRegion();
+
+ for (uint i = 0; i < region.vars.size(); ++i)
+ setVar(i, region.vars[i]);
+}
+
+void AdlEngine_v4::switchRegion(byte region) {
+ backupVars();
+ backupRoomState(_state.room);
+ _state.prevRegion = _state.region;
+ _state.region = region;
+ loadRegion(region);
+ _state.room = 1;
+ _picOnScreen = _roomOnScreen = 0;
}
-// FIXME: Rename "isLineArt" and look at code duplication
int AdlEngine_v4::o4_isItemInRoom(ScriptEnv &e) {
OP_DEBUG_2("\t&& GET_ITEM_ROOM(%s) == %s", itemStr(e.arg(1)).c_str(), itemRoomStr(e.arg(2)).c_str());
const Item &item = getItem(e.arg(1));
- if (e.arg(2) != IDI_ANY && item.isLineArt != _curDisk)
+ if (e.arg(2) != IDI_ANY && item.region != _state.region)
return -1;
if (item.room == roomArg(e.arg(2)))
@@ -165,94 +280,101 @@ int AdlEngine_v4::o4_isItemInRoom(ScriptEnv &e) {
return -1;
}
-int AdlEngine_v4::o4_isNounNotInRoom(ScriptEnv &e) {
- OP_DEBUG_1("\t&& NO_SUCH_ITEMS_IN_ROOM(%s)", itemRoomStr(e.arg(1)).c_str());
+int AdlEngine_v4::o4_isVarGT(ScriptEnv &e) {
+ OP_DEBUG_2("\t&& VARS[%d] > %d", e.arg(1), e.arg(2));
- Common::List<Item>::const_iterator item;
+ if (getVar(e.arg(1)) > e.arg(2))
+ return 2;
- setVar(24, 0);
+ return -1;
+}
- for (item = _state.items.begin(); item != _state.items.end(); ++item)
- if (item->noun == e.getNoun()) {
- setVar(24, 1);
+int AdlEngine_v4::o4_moveItem(ScriptEnv &e) {
+ o2_moveItem(e);
+ getItem(e.arg(1)).region = _state.region;
+ return 2;
+}
- if (item->room == roomArg(e.arg(1)))
- return -1;
- }
+int AdlEngine_v4::o4_setRoom(ScriptEnv &e) {
+ OP_DEBUG_1("\tROOM = %d", e.arg(1));
+ getCurRoom().curPicture = getCurRoom().picture;
+ getCurRoom().isFirstTime = false;
+ backupRoomState(_state.room);
+ _state.room = e.arg(1);
+ restoreRoomState(_state.room);
return 1;
}
-int AdlEngine_v4::o4_listInv(ScriptEnv &e) {
- OP_DEBUG_0("\tLIST_INVENTORY()");
+int AdlEngine_v4::o4_setRegionToPrev(ScriptEnv &e) {
+ OP_DEBUG_0("\tREGION = PREV_REGION");
- Common::List<Item>::const_iterator item;
-
- for (item = _state.items.begin(); item != _state.items.end(); ++item)
- if (item->room == IDI_ANY)
- printString(_itemDesc[item->id - 1]);
-
- return 0;
+ switchRegion(_state.prevRegion);
+ // Long jump
+ _isRestarting = true;
+ return -1;
}
-int AdlEngine_v4::o4_moveItem(ScriptEnv &e) {
- OP_DEBUG_2("\tSET_ITEM_ROOM(%s, %s)", itemStr(e.arg(1)).c_str(), itemRoomStr(e.arg(2)).c_str());
-
- byte room = roomArg(e.arg(2));
+int AdlEngine_v4::o4_moveAllItems(ScriptEnv &e) {
+ OP_DEBUG_2("\tMOVE_ALL_ITEMS(%s, %s)", itemRoomStr(e.arg(1)).c_str(), itemRoomStr(e.arg(2)).c_str());
- Item &item = getItem(e.arg(1));
+ byte room1 = roomArg(e.arg(1));
- if (item.room == _roomOnScreen)
+ if (room1 == _state.room)
_picOnScreen = 0;
- // Set items that move from inventory to a room to state "dropped"
- if (item.room == IDI_ANY && room != IDI_VOID_ROOM)
- item.state = IDI_ITEM_DROPPED;
-
- item.room = room;
- item.isLineArt = _curDisk;
- return 2;
-}
+ byte room2 = roomArg(e.arg(2));
-int AdlEngine_v4::o4_dummy(ScriptEnv &e) {
- OP_DEBUG_0("\tDUMMY()");
+ Common::List<Item>::iterator item;
- return 0;
-}
+ for (item = _state.items.begin(); item != _state.items.end(); ++item) {
+ if (room1 != item->room)
+ continue;
-int AdlEngine_v4::o4_setTextMode(ScriptEnv &e) {
- OP_DEBUG_1("\tSET_TEXT_MODE(%d)", e.arg(1));
+ if (room1 != IDI_ANY) {
+ if (_state.region != item->region)
+ continue;
+ if (room2 == IDI_ANY) {
+ if (isInventoryFull())
+ break;
+ if (item->state == IDI_ITEM_DOESNT_MOVE)
+ continue;
+ }
+ }
- // TODO
- // 1: 4-line mode
- // 2: 24-line mode
+ item->room = room2;
+ item->region = _state.region;
- switch (e.arg(1)) {
- case 3:
- // We re-use the restarting flag here, to simulate a long jump
- _isRestarting = true;
- return -1;
+ if (room1 == IDI_ANY)
+ item->state = IDI_ITEM_DROPPED;
}
- return 1;
+ return 2;
}
-int AdlEngine_v4::o4_setDisk(ScriptEnv &e) {
- OP_DEBUG_2("\tSET_DISK(%d, %d)", e.arg(1), e.arg(2));
-
- // TODO
- // Arg 1: disk
- // Arg 2: room
+int AdlEngine_v4::o4_setRegion(ScriptEnv &e) {
+ OP_DEBUG_1("\tREGION = %d", e.arg(1));
- return 2;
+ switchRegion(e.arg(1));
+ // Long jump
+ _isRestarting = true;
+ return -1;
}
-int AdlEngine_v4::o4_sound(ScriptEnv &e) {
- OP_DEBUG_0("\tSOUND()");
+int AdlEngine_v4::o4_setRegionRoom(ScriptEnv &e) {
+ OP_DEBUG_2("\tSET_REGION_ROOM(%d, %d)", e.arg(1), e.arg(2));
- // TODO
+ switchRegion(e.arg(1));
+ _state.room = e.arg(2);
+ // Long jump
+ _isRestarting = true;
+ return -1;
+}
- return 0;
+int AdlEngine_v4::o4_setRoomPic(ScriptEnv &e) {
+ o1_setRoomPic(e);
+ backupRoomState(e.arg(1));
+ return 2;
}
} // End of namespace Adl
diff --git a/engines/adl/adl_v4.h b/engines/adl/adl_v4.h
index 79aa824d92..1bc7664d58 100644
--- a/engines/adl/adl_v4.h
+++ b/engines/adl/adl_v4.h
@@ -25,47 +25,64 @@
#include "adl/adl_v3.h"
-namespace Common {
-class RandomSource;
-}
+namespace Adl {
-struct DiskOffset {
+// Base track/sector for a region
+struct RegionLocation {
byte track;
byte sector;
};
-namespace Adl {
+// Location of the 7 initial data blocks, relative to RegionLocation
+struct RegionInitDataOffset {
+ byte track;
+ byte sector;
+ byte offset;
+ byte volume;
+};
class AdlEngine_v4 : public AdlEngine_v3 {
public:
- virtual ~AdlEngine_v4() { }
+ virtual ~AdlEngine_v4();
protected:
AdlEngine_v4(OSystem *syst, const AdlGameDescription *gd);
// AdlEngine
- virtual void setupOpcodeTables();
virtual Common::String loadMessage(uint idx) const;
- Common::String getItemDescription(const Item &item) const;
+ virtual Common::String getItemDescription(const Item &item) const;
// AdlEngine_v2
virtual void adjustDataBlockPtr(byte &track, byte &sector, byte &offset, byte &size) const;
- void applyDiskOffset(byte &track, byte &sector) const;
+ DiskImage *loadDisk(byte volume) const;
+ void insertDisk(byte volume);
+ void loadRegionLocations(Common::ReadStream &stream, uint regions);
+ void loadRegionInitDataOffsets(Common::ReadStream &stream, uint regions);
+ void initRegions(const byte *roomsPerRegion, uint regions);
+ void fixupDiskOffset(byte &track, byte &sector) const;
+ void loadRegion(byte region);
+ void loadItemPicIndex(Common::ReadStream &stream, uint items);
+ void backupRoomState(byte room);
+ void restoreRoomState(byte room);
+ void backupVars();
+ void restoreVars();
+ void switchRegion(byte region);
- int o4_isVarGT(ScriptEnv &e);
int o4_isItemInRoom(ScriptEnv &e);
- int o4_isNounNotInRoom(ScriptEnv &e);
- int o4_skipOneCommand(ScriptEnv &e);
- int o4_listInv(ScriptEnv &e);
+ int o4_isVarGT(ScriptEnv &e);
int o4_moveItem(ScriptEnv &e);
- int o4_dummy(ScriptEnv &e);
- int o4_setTextMode(ScriptEnv &e);
- int o4_setDisk(ScriptEnv &e);
- int o4_sound(ScriptEnv &e);
+ int o4_setRoom(ScriptEnv &e);
+ int o4_setRegionToPrev(ScriptEnv &e);
+ int o4_moveAllItems(ScriptEnv &e);
+ int o4_setRegion(ScriptEnv &e);
+ int o4_setRegionRoom(ScriptEnv &e);
+ int o4_setRoomPic(ScriptEnv &e);
- byte _curDisk;
- Common::Array<DiskOffset> _diskOffsets;
+ byte _currentVolume;
+ Common::Array<RegionLocation> _regionLocations;
+ Common::Array<RegionInitDataOffset> _regionInitDataOffsets;
+ Common::SeekableReadStream *_itemPicIndex;
};
} // End of namespace Adl
diff --git a/engines/adl/adl_v5.cpp b/engines/adl/adl_v5.cpp
new file mode 100644
index 0000000000..7e7c6e40ac
--- /dev/null
+++ b/engines/adl/adl_v5.cpp
@@ -0,0 +1,246 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/random.h"
+#include "common/error.h"
+
+#include "adl/adl_v5.h"
+#include "adl/display.h"
+#include "adl/graphics.h"
+
+namespace Adl {
+
+AdlEngine_v5::AdlEngine_v5(OSystem *syst, const AdlGameDescription *gd) :
+ AdlEngine_v3(syst, gd),
+ _curDisk(0) {
+}
+
+Common::String AdlEngine_v5::loadMessage(uint idx) const {
+ Common::String str = AdlEngine_v2::loadMessage(idx);
+
+ for (uint i = 0; i < str.size(); ++i) {
+ const char *xorStr = "AVISDURGAN";
+ str.setChar(str[i] ^ xorStr[i % strlen(xorStr)], i);
+ }
+
+ return str;
+}
+
+Common::String AdlEngine_v5::getItemDescription(const Item &item) const {
+ return _itemDesc[item.id - 1];
+}
+
+void AdlEngine_v5::applyDiskOffset(byte &track, byte &sector) const {
+ sector += _diskOffsets[_curDisk].sector;
+ if (sector >= 16) {
+ sector -= 16;
+ ++track;
+ }
+
+ track += _diskOffsets[_curDisk].track;
+}
+
+void AdlEngine_v5::adjustDataBlockPtr(byte &track, byte &sector, byte &offset, byte &size) const {
+ applyDiskOffset(track, sector);
+}
+
+typedef Common::Functor1Mem<ScriptEnv &, int, AdlEngine_v5> OpcodeV4;
+#define SetOpcodeTable(x) table = &x;
+#define Opcode(x) table->push_back(new OpcodeV4(this, &AdlEngine_v5::x))
+#define OpcodeUnImpl() table->push_back(new OpcodeV4(this, 0))
+
+void AdlEngine_v5::setupOpcodeTables() {
+ Common::Array<const Opcode *> *table = 0;
+
+ SetOpcodeTable(_condOpcodes);
+ // 0x00
+ OpcodeUnImpl();
+ Opcode(o2_isFirstTime);
+ Opcode(o2_isRandomGT);
+ Opcode(o5_isItemInRoom);
+ // 0x04
+ Opcode(o5_isNounNotInRoom);
+ Opcode(o1_isMovesGT);
+ Opcode(o1_isVarEQ);
+ Opcode(o2_isCarryingSomething);
+ // 0x08
+ Opcode(o5_isVarGT);
+ Opcode(o1_isCurPicEQ);
+ Opcode(o5_skipOneCommand);
+
+ SetOpcodeTable(_actOpcodes);
+ // 0x00
+ OpcodeUnImpl();
+ Opcode(o1_varAdd);
+ Opcode(o1_varSub);
+ Opcode(o1_varSet);
+ // 0x04
+ Opcode(o1_listInv);
+ Opcode(o5_moveItem);
+ Opcode(o1_setRoom);
+ Opcode(o2_setCurPic);
+ // 0x08
+ Opcode(o2_setPic);
+ Opcode(o1_printMsg);
+ Opcode(o5_dummy);
+ Opcode(o5_setTextMode);
+ // 0x0c
+ Opcode(o2_moveAllItems);
+ Opcode(o1_quit);
+ Opcode(o5_dummy);
+ Opcode(o2_save);
+ // 0x10
+ Opcode(o2_restore);
+ Opcode(o1_restart);
+ Opcode(o5_setDisk);
+ Opcode(o5_dummy);
+ // 0x14
+ Opcode(o1_resetPic);
+ Opcode(o1_goDirection<IDI_DIR_NORTH>);
+ Opcode(o1_goDirection<IDI_DIR_SOUTH>);
+ Opcode(o1_goDirection<IDI_DIR_EAST>);
+ // 0x18
+ Opcode(o1_goDirection<IDI_DIR_WEST>);
+ Opcode(o1_goDirection<IDI_DIR_UP>);
+ Opcode(o1_goDirection<IDI_DIR_DOWN>);
+ Opcode(o1_takeItem);
+ // 0x1c
+ Opcode(o1_dropItem);
+ Opcode(o1_setRoomPic);
+ Opcode(o5_sound);
+ OpcodeUnImpl();
+ // 0x20
+ Opcode(o2_initDisk);
+}
+
+int AdlEngine_v5::o5_isVarGT(ScriptEnv &e) {
+ OP_DEBUG_2("\t&& VARS[%d] > %d", e.arg(1), e.arg(2));
+
+ if (getVar(e.arg(1)) > e.arg(2))
+ return 2;
+
+ return -1;
+}
+
+int AdlEngine_v5::o5_skipOneCommand(ScriptEnv &e) {
+ OP_DEBUG_0("\t&& SKIP_ONE_COMMAND()");
+
+ _skipOneCommand = true;
+ setVar(2, 0);
+
+ return -1;
+}
+
+// FIXME: Rename "isLineArt" and look at code duplication
+int AdlEngine_v5::o5_isItemInRoom(ScriptEnv &e) {
+ OP_DEBUG_2("\t&& GET_ITEM_ROOM(%s) == %s", itemStr(e.arg(1)).c_str(), itemRoomStr(e.arg(2)).c_str());
+
+ const Item &item = getItem(e.arg(1));
+
+ if (e.arg(2) != IDI_ANY && item.isLineArt != _curDisk)
+ return -1;
+
+ if (item.room == roomArg(e.arg(2)))
+ return 2;
+
+ return -1;
+}
+
+int AdlEngine_v5::o5_isNounNotInRoom(ScriptEnv &e) {
+ OP_DEBUG_1("\t&& NO_SUCH_ITEMS_IN_ROOM(%s)", itemRoomStr(e.arg(1)).c_str());
+
+ Common::List<Item>::const_iterator item;
+
+ setVar(24, 0);
+
+ for (item = _state.items.begin(); item != _state.items.end(); ++item)
+ if (item->noun == e.getNoun()) {
+ setVar(24, 1);
+
+ if (item->room == roomArg(e.arg(1)))
+ return -1;
+ }
+
+ return 1;
+}
+
+int AdlEngine_v5::o5_moveItem(ScriptEnv &e) {
+ OP_DEBUG_2("\tSET_ITEM_ROOM(%s, %s)", itemStr(e.arg(1)).c_str(), itemRoomStr(e.arg(2)).c_str());
+
+ byte room = roomArg(e.arg(2));
+
+ Item &item = getItem(e.arg(1));
+
+ if (item.room == _roomOnScreen)
+ _picOnScreen = 0;
+
+ // Set items that move from inventory to a room to state "dropped"
+ if (item.room == IDI_ANY && room != IDI_VOID_ROOM)
+ item.state = IDI_ITEM_DROPPED;
+
+ item.room = room;
+ item.isLineArt = _curDisk;
+ return 2;
+}
+
+int AdlEngine_v5::o5_dummy(ScriptEnv &e) {
+ OP_DEBUG_0("\tDUMMY()");
+
+ return 0;
+}
+
+int AdlEngine_v5::o5_setTextMode(ScriptEnv &e) {
+ OP_DEBUG_1("\tSET_TEXT_MODE(%d)", e.arg(1));
+
+ // TODO
+ // 1: 4-line mode
+ // 2: 24-line mode
+
+ switch (e.arg(1)) {
+ case 3:
+ // We re-use the restarting flag here, to simulate a long jump
+ _isRestarting = true;
+ return -1;
+ }
+
+ return 1;
+}
+
+int AdlEngine_v5::o5_setDisk(ScriptEnv &e) {
+ OP_DEBUG_2("\tSET_DISK(%d, %d)", e.arg(1), e.arg(2));
+
+ // TODO
+ // Arg 1: disk
+ // Arg 2: room
+
+ return 2;
+}
+
+int AdlEngine_v5::o5_sound(ScriptEnv &e) {
+ OP_DEBUG_0("\tSOUND()");
+
+ // TODO
+
+ return 0;
+}
+
+} // End of namespace Adl
diff --git a/engines/adl/adl_v5.h b/engines/adl/adl_v5.h
new file mode 100644
index 0000000000..377fe45e20
--- /dev/null
+++ b/engines/adl/adl_v5.h
@@ -0,0 +1,73 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef ADL_ADL_V5_H
+#define ADL_ADL_V5_H
+
+#include "adl/adl_v3.h"
+
+namespace Common {
+class RandomSource;
+}
+
+struct DiskOffset {
+ byte track;
+ byte sector;
+};
+
+namespace Adl {
+
+// FIXME: Subclass _v4 when it is done
+class AdlEngine_v5 : public AdlEngine_v3 {
+public:
+ virtual ~AdlEngine_v5() { }
+
+protected:
+ AdlEngine_v5(OSystem *syst, const AdlGameDescription *gd);
+
+ // AdlEngine
+ virtual void setupOpcodeTables();
+ virtual Common::String loadMessage(uint idx) const;
+ Common::String getItemDescription(const Item &item) const;
+
+ // AdlEngine_v2
+ virtual void adjustDataBlockPtr(byte &track, byte &sector, byte &offset, byte &size) const;
+
+ void applyDiskOffset(byte &track, byte &sector) const;
+
+ int o5_isVarGT(ScriptEnv &e);
+ int o5_isItemInRoom(ScriptEnv &e);
+ int o5_isNounNotInRoom(ScriptEnv &e);
+ int o5_skipOneCommand(ScriptEnv &e);
+ int o5_moveItem(ScriptEnv &e);
+ int o5_dummy(ScriptEnv &e);
+ int o5_setTextMode(ScriptEnv &e);
+ int o5_setDisk(ScriptEnv &e);
+ int o5_sound(ScriptEnv &e);
+
+ byte _curDisk;
+ Common::Array<DiskOffset> _diskOffsets;
+};
+
+} // End of namespace Adl
+
+#endif
diff --git a/engines/adl/detection.cpp b/engines/adl/detection.cpp
index 6c1085a127..cba66faca9 100644
--- a/engines/adl/detection.cpp
+++ b/engines/adl/detection.cpp
@@ -162,18 +162,18 @@ static const AdlGameDescription gameDescriptions[] = {
{
"hires5", 0,
{
- { "TZONE1A.NIB", 0, "475dedb7396fdcea81c1a2a4046caebe", 232960 },
- { "TZONE1B.NIB", 0, "f8aaea094ebbe41cf4354d9fe2c30d9a", 232960 },
- { "TZONE2C.NIB", 0, "b351a367dc48e776bf08e42a3f50ae74", 232960 },
- { "TZONE2D.NIB", 0, "9583b287a5c95960f5335878102bb8b1", 232960 },
- { "TZONE3E.NIB", 0, "502e42a0cb69ffe4a48cd51c1ff210cf", 232960 },
- { "TZONE3F.NIB", 0, "3d6e0aae15f590b72b6759535b6b7d3c", 232960 },
- { "TZONE4G.NIB", 0, "ede4113a9c9e17745faf71d099808a18", 232960 },
- { "TZONE4H.NIB", 0, "f95dae4aae1155a27f7120230464d4e1", 232960 },
- { "TZONE5I.NIB", 0, "92b3b376877f81a7b7ae426bf1e65456", 232960 },
- { "TZONE5J.NIB", 0, "c9ef796fa596548dbf8f085901f0bac3", 232960 },
- { "TZONE6K.NIB", 0, "2e5323be637002efce1d4c813ae20a3f", 232960 },
- { "TZONE6L.NIB", 0, "7c9268f0ea2d02120c77a46337b3d975", 232960 },
+ { "TZONE1A.NIB", 2, "475dedb7396fdcea81c1a2a4046caebe", 232960 },
+ { "TZONE1B.NIB", 3, "f8aaea094ebbe41cf4354d9fe2c30d9a", 232960 },
+ { "TZONE2C.NIB", 4, "b351a367dc48e776bf08e42a3f50ae74", 232960 },
+ { "TZONE2D.NIB", 5, "9583b287a5c95960f5335878102bb8b1", 232960 },
+ { "TZONE3E.NIB", 6, "502e42a0cb69ffe4a48cd51c1ff210cf", 232960 },
+ { "TZONE3F.NIB", 7, "3d6e0aae15f590b72b6759535b6b7d3c", 232960 },
+ { "TZONE4G.NIB", 8, "ede4113a9c9e17745faf71d099808a18", 232960 },
+ { "TZONE4H.NIB", 9, "f95dae4aae1155a27f7120230464d4e1", 232960 },
+ { "TZONE5I.NIB", 10, "92b3b376877f81a7b7ae426bf1e65456", 232960 },
+ { "TZONE5J.NIB", 11, "c9ef796fa596548dbf8f085901f0bac3", 232960 },
+ { "TZONE6K.NIB", 12, "2e5323be637002efce1d4c813ae20a3f", 232960 },
+ { "TZONE6L.NIB", 13, "7c9268f0ea2d02120c77a46337b3d975", 232960 },
AD_LISTEND
},
Common::EN_ANY,
diff --git a/engines/adl/disk.cpp b/engines/adl/disk.cpp
index d429556670..0de740eaec 100644
--- a/engines/adl/disk.cpp
+++ b/engines/adl/disk.cpp
@@ -39,11 +39,13 @@ static Common::SeekableReadStream *readImage(const Common::String &filename) {
return f;
}
+const uint trackLen = 256 * 26;
+
// 4-and-4 encoding (odd-even)
-static uint8 read44(Common::SeekableReadStream &f) {
+static uint8 read44(byte *buffer, uint &pos) {
// 1s in the other fields, so we can just AND
- uint8 ret = f.readByte();
- return ((ret << 1) | 1) & f.readByte();
+ uint8 ret = buffer[pos++ % trackLen];
+ return ((ret << 1) | 1) & buffer[pos++ % trackLen];
}
static Common::SeekableReadStream *readImage_NIB(const Common::String &filename) {
@@ -70,15 +72,27 @@ static Common::SeekableReadStream *readImage_NIB(const Common::String &filename)
uint8 volNo, track, sector;
bool newStyle;
- while (f.pos() < f.size()) {
+ byte buffer[trackLen];
+ uint firstGoodTrackPos = 0;
+ uint pos = trackLen; // force read
+
+ while (true) {
+ if (pos >= trackLen+firstGoodTrackPos) {
+ if (f.pos() == f.size())
+ break;
+ f.read(buffer, sizeof(buffer));
+ firstGoodTrackPos = 0;
+ pos = 0;
+ sawAddress = false;
+ }
+
// Read until we find two sync bytes.
- if (f.readByte() != 0xd5 || f.readByte() != 0xaa)
+ if (buffer[pos++ % trackLen] != 0xd5 || buffer[pos++ % trackLen] != 0xaa)
continue;
- byte prologue = f.readByte();
+ byte prologue = buffer[pos++ % trackLen];
if (sawAddress && (prologue == 0xb5 || prologue == 0x96)) {
- warning("NIB: data for %02x/%02x/%02x missing", volNo, track, sector);
sawAddress = false;
}
@@ -91,18 +105,24 @@ static Common::SeekableReadStream *readImage_NIB(const Common::String &filename)
// Accept a DOS 3.3(?) header at the start.
if (prologue == 0x96) {
newStyle = true;
+ } else if (prologue == 0xad || prologue == 0xfd) {
+ sawAddress = false;
+ continue;
} else {
error("unknown NIB field prologue %02x", prologue);
}
}
- volNo = read44(f);
- track = read44(f);
- sector = read44(f);
- uint8 checksum = read44(f);
+ volNo = read44(buffer, pos);
+ track = read44(buffer, pos);
+ sector = read44(buffer, pos);
+ uint8 checksum = read44(buffer, pos);
if ((volNo ^ track ^ sector) != checksum)
error("invalid NIB checksum");
+ if (!firstGoodTrackPos)
+ firstGoodTrackPos = pos;
+
// Epilogue is de/aa plus a gap, but we don't care.
continue;
}
@@ -121,7 +141,13 @@ static Common::SeekableReadStream *readImage_NIB(const Common::String &filename)
// 6-and-2 uses 342 on-disk bytes
byte inbuffer[342];
- f.read(inbuffer, 342);
+ uint z = trackLen - (pos % trackLen);
+ if (z < 342) {
+ memcpy(inbuffer, buffer + (pos % trackLen), z);
+ memcpy(inbuffer + z, buffer, 342 - z);
+ } else
+ memcpy(inbuffer, buffer + (pos % trackLen), 342);
+ pos += 342;
byte oldVal = 0;
for (uint n = 0; n < 342; ++n) {
@@ -136,7 +162,7 @@ static Common::SeekableReadStream *readImage_NIB(const Common::String &filename)
inbuffer[n] = oldVal;
}
- byte checksum = f.readByte();
+ byte checksum = buffer[pos++ % trackLen];
if (checksum < 0x96 || oldVal != c_6and2_lookup[checksum - 0x96])
warning("NIB: checksum mismatch @ (%x, %x)", track, sector);
@@ -156,7 +182,13 @@ static Common::SeekableReadStream *readImage_NIB(const Common::String &filename)
} else {
// 5-and-3 uses 410 on-disk bytes, decoding to just over 256 bytes
byte inbuffer[410];
- f.read(inbuffer, 410);
+ uint z = trackLen - (pos % trackLen);
+ if (z < 410) {
+ memcpy(inbuffer, buffer + (pos % trackLen), z);
+ memcpy(inbuffer + z, buffer, 410 - z);
+ } else
+ memcpy(inbuffer, buffer + (pos % trackLen), 410);
+ pos += 410;
bool truncated = false;
byte oldVal = 0;
@@ -166,7 +198,7 @@ static Common::SeekableReadStream *readImage_NIB(const Common::String &filename)
if (inbuffer[n] == 0xd5) {
// Early end of block.
truncated = true;
- f.seek(-(410 - n), SEEK_CUR);
+ pos -= (410 - n);
warning("NIB: early end of block @ 0x%x (%x, %x)", f.pos(), track, sector);
break;
}
@@ -175,7 +207,7 @@ static Common::SeekableReadStream *readImage_NIB(const Common::String &filename)
// Badly-encoded nibbles, stop trying to decode here.
truncated = true;
warning("NIB: bad nibble %02x @ 0x%x (%x, %x)", inbuffer[n], f.pos(), track, sector);
- f.seek(-(410 - n), SEEK_CUR);
+ pos -= (410 - n);
break;
}
// undo checksum
@@ -183,7 +215,7 @@ static Common::SeekableReadStream *readImage_NIB(const Common::String &filename)
inbuffer[n] = oldVal;
}
if (!truncated) {
- byte checksum = f.readByte();
+ byte checksum = buffer[pos++ % trackLen];
if (checksum < 0xaa || oldVal != c_5and3_lookup[checksum - 0xaa])
warning("NIB: checksum mismatch @ (%x, %x)", track, sector);
}
diff --git a/engines/adl/hires1.cpp b/engines/adl/hires1.cpp
index 217a9013ba..8bd49c75b4 100644
--- a/engines/adl/hires1.cpp
+++ b/engines/adl/hires1.cpp
@@ -98,7 +98,7 @@ public:
private:
// AdlEngine
- void runIntro() const;
+ void runIntro();
void init();
void initGameState();
void restartGame();
@@ -126,7 +126,7 @@ private:
} _gameStrings;
};
-void HiRes1Engine::runIntro() const {
+void HiRes1Engine::runIntro() {
StreamPtr stream(_files->createReadStream(IDS_HR1_EXE_0));
stream->seek(IDI_HR1_OFS_LOGO_0);
diff --git a/engines/adl/hires2.cpp b/engines/adl/hires2.cpp
index 199f457b4f..9562095ec9 100644
--- a/engines/adl/hires2.cpp
+++ b/engines/adl/hires2.cpp
@@ -54,12 +54,12 @@ public:
private:
// AdlEngine
- void runIntro() const;
+ void runIntro();
void init();
void initGameState();
};
-void HiRes2Engine::runIntro() const {
+void HiRes2Engine::runIntro() {
// This only works for the 16-sector re-release. The original
// release is not supported at this time, because we don't have
// access to it.
diff --git a/engines/adl/hires5.cpp b/engines/adl/hires5.cpp
index e7ee224754..f298cecf55 100644
--- a/engines/adl/hires5.cpp
+++ b/engines/adl/hires5.cpp
@@ -26,7 +26,7 @@
#include "common/file.h"
#include "common/stream.h"
-#include "adl/adl_v3.h"
+#include "adl/adl_v4.h"
#include "adl/detection.h"
#include "adl/display.h"
#include "adl/graphics.h"
@@ -34,21 +34,267 @@
namespace Adl {
-class HiRes5Engine : public AdlEngine_v3 {
+class HiRes5Engine : public AdlEngine_v4 {
public:
- HiRes5Engine(OSystem *syst, const AdlGameDescription *gd) : AdlEngine_v3(syst, gd) { }
+ HiRes5Engine(OSystem *syst, const AdlGameDescription *gd) :
+ AdlEngine_v4(syst, gd) { }
private:
// AdlEngine
+ void setupOpcodeTables();
+ void runIntro();
void init();
void initGameState();
+
+ // AdlEngine_v4
+ bool isInventoryFull();
+
+ int o_checkItemTimeLimits(ScriptEnv &e);
+ int o_startAnimation(ScriptEnv &e);
+ int o_winGame(ScriptEnv &e);
+
+ static const uint kRegions = 41;
+ static const uint kItems = 69;
+
+ Common::Array<byte> _itemTimeLimits;
+ Common::String _itemTimeLimitMsg;
+
+ struct {
+ Common::String itemTimeLimit;
+ Common::String carryingTooMuch;
+ } _gameStrings;
};
+typedef Common::Functor1Mem<ScriptEnv &, int, HiRes5Engine> OpcodeH5;
+#define SetOpcodeTable(x) table = &x;
+#define Opcode(x) table->push_back(new OpcodeH5(this, &HiRes5Engine::x))
+#define OpcodeUnImpl() table->push_back(new OpcodeH5(this, 0))
+
+void HiRes5Engine::setupOpcodeTables() {
+ Common::Array<const Opcode *> *table = 0;
+
+ SetOpcodeTable(_condOpcodes);
+ // 0x00
+ OpcodeUnImpl();
+ Opcode(o2_isFirstTime);
+ Opcode(o2_isRandomGT);
+ Opcode(o4_isItemInRoom);
+ // 0x04
+ Opcode(o3_isNounNotInRoom);
+ Opcode(o1_isMovesGT);
+ Opcode(o1_isVarEQ);
+ Opcode(o2_isCarryingSomething);
+ // 0x08
+ Opcode(o4_isVarGT);
+ Opcode(o1_isCurPicEQ);
+ OpcodeUnImpl();
+
+ SetOpcodeTable(_actOpcodes);
+ // 0x00
+ OpcodeUnImpl();
+ Opcode(o1_varAdd);
+ Opcode(o1_varSub);
+ Opcode(o1_varSet);
+ // 0x04
+ Opcode(o1_listInv);
+ Opcode(o4_moveItem);
+ Opcode(o4_setRoom);
+ Opcode(o2_setCurPic);
+ // 0x08
+ Opcode(o2_setPic);
+ Opcode(o1_printMsg);
+ Opcode(o4_setRegionToPrev);
+ Opcode(o_checkItemTimeLimits);
+ // 0x0c
+ Opcode(o4_moveAllItems);
+ Opcode(o1_quit);
+ Opcode(o4_setRegion);
+ Opcode(o2_save); // TODO
+ // 0x10
+ Opcode(o2_restore); // TODO
+ Opcode(o1_restart); // TODO
+ Opcode(o4_setRegionRoom);
+ Opcode(o_startAnimation);
+ // 0x14
+ Opcode(o1_resetPic);
+ Opcode(o1_goDirection<IDI_DIR_NORTH>);
+ Opcode(o1_goDirection<IDI_DIR_SOUTH>);
+ Opcode(o1_goDirection<IDI_DIR_EAST>);
+ // 0x18
+ Opcode(o1_goDirection<IDI_DIR_WEST>);
+ Opcode(o1_goDirection<IDI_DIR_UP>);
+ Opcode(o1_goDirection<IDI_DIR_DOWN>);
+ Opcode(o1_takeItem);
+ // 0x1c
+ Opcode(o1_dropItem);
+ Opcode(o4_setRoomPic);
+ Opcode(o_winGame);
+ OpcodeUnImpl();
+ // 0x20
+ Opcode(o2_initDisk);
+}
+
+bool HiRes5Engine::isInventoryFull() {
+ Common::List<Item>::const_iterator item;
+ byte weight = 0;
+
+ for (item = _state.items.begin(); item != _state.items.end(); ++item) {
+ if (item->room == IDI_ANY)
+ weight += item->description;
+ }
+
+ if (weight >= 100) {
+ printString(_gameStrings.carryingTooMuch);
+ inputString();
+ return true;
+ }
+
+ return false;
+}
+
+int HiRes5Engine::o_checkItemTimeLimits(ScriptEnv &e) {
+ OP_DEBUG_1("\tCHECK_ITEM_TIME_LIMITS(VARS[%d])", e.arg(1));
+
+ bool lostAnItem = false;
+ Common::List<Item>::iterator item;
+
+ for (item = _state.items.begin(); item != _state.items.end(); ++item) {
+ const byte room = item->room;
+ const byte region = item->region;
+
+ if (room == IDI_ANY || room == IDI_CUR_ROOM || (room == _state.room && region == _state.region)) {
+ if (getVar(e.arg(1)) < _itemTimeLimits[item->id - 1]) {
+ item->room = IDI_VOID_ROOM;
+ lostAnItem = true;
+ }
+ }
+ }
+
+ if (lostAnItem) {
+ printString(_gameStrings.itemTimeLimit);
+ inputString();
+ }
+
+ return 1;
+}
+
+int HiRes5Engine::o_startAnimation(ScriptEnv &e) {
+ OP_DEBUG_0("\tSTART_ANIMATION()");
+
+ // TODO: sets a flag that triggers an animation
+
+ return 0;
+}
+
+int HiRes5Engine::o_winGame(ScriptEnv &e) {
+ OP_DEBUG_0("\tWIN_GAME()");
+
+ // TODO: draws room and plays music
+
+ return o1_quit(e);
+}
+
+void HiRes5Engine::runIntro() {
+ insertDisk(2);
+
+ StreamPtr stream(_disk->createReadStream(0x10, 0x0, 0x00, 31));
+
+ _display->setMode(DISPLAY_MODE_HIRES);
+ _display->loadFrameBuffer(*stream);
+ _display->updateHiResScreen();
+
+ inputKey();
+
+ _display->home();
+ _display->setMode(DISPLAY_MODE_TEXT);
+
+ stream.reset(_disk->createReadStream(0x03, 0xc, 0x34, 1));
+ Common::String menu(readString(*stream));
+
+ while (!g_engine->shouldQuit()) {
+ _display->home();
+ _display->printString(menu);
+
+ Common::String cmd(inputString());
+
+ // We ignore the backup and format menu options
+ if (!cmd.empty() && cmd[0] == APPLECHAR('1'))
+ break;
+ };
+}
+
void HiRes5Engine::init() {
_graphics = new Graphics_v2(*_display);
+
+ insertDisk(2);
+
+ StreamPtr stream(_disk->createReadStream(0x5, 0x0, 0x02));
+ loadRegionLocations(*stream, kRegions);
+
+ stream.reset(_disk->createReadStream(0xd, 0x2, 0x04));
+ loadRegionInitDataOffsets(*stream, kRegions);
+
+ stream.reset(_disk->createReadStream(0x7, 0xe));
+ _strings.verbError = readStringAt(*stream, 0x4f);
+ _strings.nounError = readStringAt(*stream, 0x8e);
+ _strings.enterCommand = readStringAt(*stream, 0xbc);
+
+ stream.reset(_disk->createReadStream(0x7, 0xc));
+ _strings.lineFeeds = readString(*stream);
+
+ // TODO: opcode strings
+
+ _messageIds.cantGoThere = 110;
+ _messageIds.dontUnderstand = 112;
+ _messageIds.itemDoesntMove = 114;
+ _messageIds.itemNotHere = 115;
+ _messageIds.thanksForPlaying = 113;
+
+ stream.reset(_disk->createReadStream(0xe, 0x1, 0x13, 4));
+ loadItemDescriptions(*stream, kItems);
+
+ stream.reset(_disk->createReadStream(0x8, 0xd, 0xfd, 1));
+ loadDroppedItemOffsets(*stream, 16);
+
+ stream.reset(_disk->createReadStream(0xb, 0xa, 0x05, 1));
+ loadItemPicIndex(*stream, kItems);
+
+ stream.reset(_disk->createReadStream(0x7, 0x8, 0x01));
+ for (uint i = 0; i < kItems; ++i)
+ _itemTimeLimits.push_back(stream->readByte());
+
+ if (stream->eos() || stream->err())
+ error("Failed to read item time limits");
+
+ stream.reset(_disk->createReadStream(0x8, 0x2, 0x2d));
+ _gameStrings.itemTimeLimit = readString(*stream);
+
+ stream.reset(_disk->createReadStream(0x8, 0x7, 0x02));
+ _gameStrings.carryingTooMuch = readString(*stream);
}
void HiRes5Engine::initGameState() {
+ _state.vars.resize(40);
+
+ insertDisk(2);
+
+ StreamPtr stream(_disk->createReadStream(0x5, 0x1, 0x00, 3));
+ loadItems(*stream);
+
+ // A combined total of 1213 rooms
+ static const byte rooms[kRegions] = {
+ 6, 16, 24, 57, 40, 30, 76, 40,
+ 54, 38, 44, 21, 26, 42, 49, 32,
+ 59, 69, 1, 1, 1, 1, 1, 18,
+ 25, 13, 28, 28, 11, 23, 9, 31,
+ 6, 29, 29, 34, 9, 10, 95, 86,
+ 1
+ };
+
+ initRegions(rooms, kRegions);
+
+ loadRegion(1);
+ _state.room = 5;
}
Engine *HiRes5Engine_create(OSystem *syst, const AdlGameDescription *gd) {
diff --git a/engines/adl/hires6.cpp b/engines/adl/hires6.cpp
index a1fea05f19..c07493f5bd 100644
--- a/engines/adl/hires6.cpp
+++ b/engines/adl/hires6.cpp
@@ -27,7 +27,7 @@
#include "common/stream.h"
#include "common/memstream.h"
-#include "adl/adl_v4.h"
+#include "adl/adl_v5.h"
#include "adl/display.h"
#include "adl/graphics.h"
#include "adl/disk.h"
@@ -55,10 +55,10 @@ struct DiskDataDesc {
byte volume;
};
-class HiRes6Engine : public AdlEngine_v4 {
+class HiRes6Engine : public AdlEngine_v5 {
public:
HiRes6Engine(OSystem *syst, const AdlGameDescription *gd) :
- AdlEngine_v4(syst, gd),
+ AdlEngine_v5(syst, gd),
_boot(nullptr),
_currVerb(0),
_currNoun(0) {
@@ -68,7 +68,7 @@ public:
private:
// AdlEngine
- void runIntro() const;
+ void runIntro();
void init();
void initGameState();
void printRoomDescription();
@@ -120,7 +120,7 @@ static Common::MemoryReadStream *loadSectors(DiskImage *disk, byte track, byte s
return new Common::MemoryReadStream(buf, bufSize, DisposeAfterUse::YES);
}
-void HiRes6Engine::runIntro() const {
+void HiRes6Engine::runIntro() {
DiskImage *boot(new DiskImage());
if (!boot->open(disks[0]))
diff --git a/engines/adl/module.mk b/engines/adl/module.mk
index 0654caa142..df9dd2d232 100644
--- a/engines/adl/module.mk
+++ b/engines/adl/module.mk
@@ -5,6 +5,7 @@ MODULE_OBJS := \
adl_v2.o \
adl_v3.o \
adl_v4.o \
+ adl_v5.o \
console.o \
detection.o \
disk.o \
diff --git a/engines/cruise/font.cpp b/engines/cruise/font.cpp
index 43fbf8c79b..3a4e0d6d78 100644
--- a/engines/cruise/font.cpp
+++ b/engines/cruise/font.cpp
@@ -30,7 +30,7 @@
namespace Cruise {
-const int SPACE_WIDTH = 4;
+const int SPACE_WIDTH = 5;
/**
* Determines the line size by finding the highest character in the given font set
@@ -200,7 +200,9 @@ void renderWord(const uint8 *fontPtr_Data, uint8 *outBufferPtr, int xOffset, int
fontPtr_Data2 += sizeof(uint16);
for (int j = 0; j < charWidth; j++) {
- *outBufferPtr = ((bitSet1 >> 15) & 1) | ((bitSet2 >> 14) & 2);
+ if (((bitSet1 >> 15) & 1)) {
+ *outBufferPtr = ((bitSet2 >> 15) & 1) + 1;
+ }
outBufferPtr++;
bitSet1 <<= 1;
diff --git a/engines/drascula/animation.cpp b/engines/drascula/animation.cpp
index 8b3299aaa9..792b2720a9 100644
--- a/engines/drascula/animation.cpp
+++ b/engines/drascula/animation.cpp
@@ -1836,6 +1836,8 @@ void DrasculaEngine::animation_13_2() {
if (flags[41] == 0) {
playTalkSequence(13); // sequence 13, chapter 2
+ } else {
+ converse(2);
}
loadPic(964, frontSurface);
diff --git a/engines/drascula/graphics.cpp b/engines/drascula/graphics.cpp
index 8634b6c586..09ff3c6429 100644
--- a/engines/drascula/graphics.cpp
+++ b/engines/drascula/graphics.cpp
@@ -154,7 +154,7 @@ void DrasculaEngine::showFrame(Common::SeekableReadStream *stream, bool firstFra
}
void DrasculaEngine::copyBackground(int xorg, int yorg, int xdes, int ydes, int width, int height, byte *src, byte *dest) {
- debug(1, "DrasculaEngine::copyBackground(xorg:%d, yorg:%d, xdes:%d, ydes:%d width:%d height:%d, src, dest)", xorg, yorg, xdes, ydes, width,height);
+ debug(5, "DrasculaEngine::copyBackground(xorg:%d, yorg:%d, xdes:%d, ydes:%d width:%d height:%d, src, dest)", xorg, yorg, xdes, ydes, width,height);
dest += xdes + ydes * 320;
src += xorg + yorg * 320;
/* Unoptimized code
diff --git a/engines/fullpipe/constants.h b/engines/fullpipe/constants.h
index 2818397ced..da80ef3c5f 100644
--- a/engines/fullpipe/constants.h
+++ b/engines/fullpipe/constants.h
@@ -104,6 +104,7 @@ namespace Fullpipe {
#define PIC_MAP_A14 5276
#define PIC_MAP_I01 5295
#define PIC_MAP_I02 5296
+#define PIC_MAP_I03 5395
#define PIC_MAP_P01 5277
#define PIC_MAP_P02 5278
#define PIC_MAP_P03 5279
@@ -162,6 +163,44 @@ namespace Fullpipe {
#define PIC_MAP_S36 5260
#define PIC_MAP_S37 5261
#define PIC_MAP_S38 5262
+#define PIC_MAP_H01 5357
+#define PIC_MAP_H02 5358
+#define PIC_MAP_H03 5359
+#define PIC_MAP_H04 5360
+#define PIC_MAP_H05 5361
+#define PIC_MAP_H06 5362
+#define PIC_MAP_H07 5363
+#define PIC_MAP_H08 5364
+#define PIC_MAP_H09 5365
+#define PIC_MAP_H10 5366
+#define PIC_MAP_H11 5367
+#define PIC_MAP_H12 5368
+#define PIC_MAP_H13 5369
+#define PIC_MAP_H14 5370
+#define PIC_MAP_H15 5371
+#define PIC_MAP_H16 5372
+#define PIC_MAP_H17 5373
+#define PIC_MAP_H18 5394
+#define PIC_MAP_H19 5393
+#define PIC_MAP_H20 5374
+#define PIC_MAP_H21 5375
+#define PIC_MAP_H22 5376
+#define PIC_MAP_H23 5377
+#define PIC_MAP_H24 5378
+#define PIC_MAP_H25 5379
+#define PIC_MAP_H26 5380
+#define PIC_MAP_H27 5381
+#define PIC_MAP_H28 5382
+#define PIC_MAP_H29 5383
+#define PIC_MAP_H30 5384
+#define PIC_MAP_H31 5385
+#define PIC_MAP_H32 5386
+#define PIC_MAP_H33 5387
+#define PIC_MAP_H34 5388
+#define PIC_MAP_H35 5389
+#define PIC_MAP_H36 5390
+#define PIC_MAP_H37 5391
+#define PIC_MAP_H38 5392
#define PIC_TTL_CREDITS 5172
#define QU_INTR_STARTINTRO 5133
#define SC_1 301
@@ -220,6 +259,7 @@ namespace Fullpipe {
#define SND_CMN_032 3517
#define SND_CMN_054 4762
#define SND_CMN_055 4763
+#define SND_CMN_056 4772
#define SND_CMN_060 4921
#define SND_CMN_061 4922
#define SND_CMN_070 5199
@@ -328,6 +368,12 @@ namespace Fullpipe {
#define PIC_MSV_SPACE_D 5190
#define PIC_MSV_SPACE_L 5191
+// Demo screen
+#define PIC_POST_BGR 5396
+#define PIC_POST_TEXT 5397
+#define PIC_POST_BUTTON 5398
+#define SND_CMN_069 4969
+
// Intro
#define ANI_IN1MAN 5110
#define MSG_INTR_ENDINTRO 5139
diff --git a/engines/fullpipe/detection.cpp b/engines/fullpipe/detection.cpp
index e85e75e232..8f4de11e79 100644
--- a/engines/fullpipe/detection.cpp
+++ b/engines/fullpipe/detection.cpp
@@ -31,8 +31,16 @@
namespace Fullpipe {
-const char *FullpipeEngine::getGameId() const {
- return _gameDescription->gameId;
+uint32 FullpipeEngine::getFeatures() const {
+ return _gameDescription->flags;
+}
+
+bool FullpipeEngine::isDemo() {
+ return _gameDescription->flags & ADGF_DEMO;
+}
+
+Common::Language FullpipeEngine::getLanguage() const {
+ return _gameDescription->language;
}
}
@@ -79,6 +87,17 @@ static const ADGameDescription gameDescriptions[] = {
GUIO1(GUIO_NONE)
},
+ // Full Pipe English version
+ {
+ "fullpipe",
+ 0,
+ AD_ENTRY1s("4620.sc2", "bffea807345fece14089768fc141af83", 510),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_DROPPLATFORM,
+ GUIO1(GUIO_NONE)
+ },
+
// Full Pipe Russian Demo version
{
"fullpipe",
diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 8a9b323761..10c1744dd9 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -271,6 +271,7 @@ Common::Error FullpipeEngine::loadGameState(int slot) {
else
return Common::kUnknownError;
}
+
Common::Error FullpipeEngine::saveGameState(int slot, const Common::String &description) {
if (_gameLoader->writeSavegame(_currentScene, getSavegameFile(slot)))
return Common::kNoError;
@@ -603,5 +604,19 @@ void FullpipeEngine::disableSaves(ExCommand *ex) {
}
}
+bool FullpipeEngine::isSaveAllowed() {
+ if (!g_fp->_isSaveAllowed)
+ return false;
+
+ bool allowed = true;
+
+ for (Common::Array<MessageQueue *>::iterator s = g_fp->_globalMessageQueueList->begin(); s != g_fp->_globalMessageQueueList->end(); ++s) {
+ if (!(*s)->_isFinished && ((*s)->getFlags() & 1))
+ allowed = false;
+ }
+
+ return allowed;
+}
+
} // End of namespace Fullpipe
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index f6a8e00219..b00da629fe 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -112,8 +112,9 @@ public:
// Detection related functions
const ADGameDescription *_gameDescription;
- const char *getGameId() const;
- Common::Platform getPlatform() const;
+ uint32 getFeatures() const;
+ bool isDemo();
+ Common::Language getLanguage() const;
Common::RandomSource *_rnd;
@@ -235,6 +236,7 @@ public:
void enableSaves() { _isSaveAllowed = true; }
void disableSaves(ExCommand *ex);
+ bool isSaveAllowed();
void initObjectStates();
void setLevelStates();
@@ -276,6 +278,7 @@ public:
void setObjectState(const char *name, int state);
int getObjectEnumState(const char *name, const char *state);
+ void sceneAutoScrolling();
bool sceneSwitcher(EntranceInfo *entrance);
Scene *accessScene(int sceneId);
void setSceneMusicParameters(GameVar *var);
diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
index 57bde97d9d..aebf73dbe4 100644
--- a/engines/fullpipe/gameloader.cpp
+++ b/engines/fullpipe/gameloader.cpp
@@ -355,6 +355,10 @@ bool preloadCallback(PreloadItem &pre, int flag) {
return true;
}
+void GameLoader::addPreloadItem(PreloadItem *item) {
+ _preloadItems.push_back(new PreloadItem(*item));
+}
+
bool GameLoader::preloadScene(int sceneId, int entranceId) {
debugC(0, kDebugLoading, "preloadScene(%d, %d), ", sceneId, entranceId);
diff --git a/engines/fullpipe/gameloader.h b/engines/fullpipe/gameloader.h
index 6c41e1bd07..a6c2416aae 100644
--- a/engines/fullpipe/gameloader.h
+++ b/engines/fullpipe/gameloader.h
@@ -105,6 +105,8 @@ class GameLoader : public CObject {
bool preloadScene(int sceneId, int entranceId);
bool unloadScene(int sceneId);
+ void addPreloadItem(PreloadItem *item);
+
void updateSystems(int counterdiff);
int getSceneTagBySceneId(int sceneId, SceneTag **st);
diff --git a/engines/fullpipe/init.cpp b/engines/fullpipe/init.cpp
index 9602803010..db95cd88b8 100644
--- a/engines/fullpipe/init.cpp
+++ b/engines/fullpipe/init.cpp
@@ -57,7 +57,10 @@ void FullpipeEngine::initObjectStates() {
setObjectState(sO_FriesPit, getObjectEnumState(sO_FriesPit, sO_WithApple));
setObjectState(sO_Jug, getObjectEnumState(sO_Jug, sO_Blocked));
setObjectState(sO_RightStairs_9, getObjectEnumState(sO_RightStairs_9, sO_IsClosed));
- setObjectState(sO_Pipe_9, getObjectEnumState(sO_Pipe_9, sO_WithJug));
+ if (isDemo() && getLanguage() == Common::RU_RUS)
+ setObjectState(sO_Pipe_9, getObjectEnumState(sO_Pipe_9, sO_WithoutJug));
+ else
+ setObjectState(sO_Pipe_9, getObjectEnumState(sO_Pipe_9, sO_WithJug));
setObjectState(sO_Inflater, getObjectEnumState(sO_Inflater, sO_WithGum));
setObjectState(sO_Swingie, getObjectEnumState(sO_Swingie, sO_IsSwinging));
setObjectState(sO_DudeHasJumped, getObjectEnumState(sO_DudeHasJumped, sO_No));
diff --git a/engines/fullpipe/messagehandlers.cpp b/engines/fullpipe/messagehandlers.cpp
index 947caadbcc..f53a705ea9 100644
--- a/engines/fullpipe/messagehandlers.cpp
+++ b/engines/fullpipe/messagehandlers.cpp
@@ -188,11 +188,15 @@ int global_messageHandler1(ExCommand *cmd) {
}
break;
case '\t':
+ // Demo has no map
+ if (g_fp->isDemo() && g_fp->getLanguage() == Common::RU_RUS)
+ break;
+
if (g_fp->_flgCanOpenMap)
g_fp->openMap();
cmd->_messageKind = 0;
break;
- case 'p':
+ case Common::KEYCODE_F1:
if (g_fp->_flgCanOpenMap)
g_fp->openHelp();
cmd->_messageKind = 0;
@@ -308,7 +312,7 @@ int global_messageHandler2(ExCommand *cmd) {
ani->_callback2 = staticANIObjectCallback;
} else {
ani->setFlags40(false);
- ani->_callback2 = 0;
+ ani->_callback2 = 0; // Really NULL
}
}
break;
diff --git a/engines/fullpipe/modal.cpp b/engines/fullpipe/modal.cpp
index 9c7c0f74f0..41c1ba368b 100644
--- a/engines/fullpipe/modal.cpp
+++ b/engines/fullpipe/modal.cpp
@@ -30,11 +30,13 @@
#include "fullpipe/modal.h"
#include "fullpipe/constants.h"
+#include "fullpipe/objectnames.h"
#include "graphics/palette.h"
#include "video/avi_decoder.h"
#include "engines/savestate.h"
+#include "engines/advancedDetector.h"
namespace Fullpipe {
@@ -225,6 +227,134 @@ void ModalIntro::update() {
void ModalIntro::finish() {
g_fp->_gameLoader->unloadScene(SC_INTRO2);
+
+ g_fp->_currentScene = g_fp->accessScene(SC_INTRO1);
+ g_fp->_gameLoader->preloadScene(SC_INTRO1, TrubaDown);
+
+ if (g_fp->_currentScene)
+ g_fp->_gameLoader->updateSystems(42);
+}
+
+ModalIntroDemo::ModalIntroDemo() {
+ _field_8 = 0;
+ _countDown = 50;
+ _stillRunning = 0;
+ _introFlags = 9;
+ g_vars->sceneIntro_skipIntro = false;
+ _sfxVolume = g_fp->_sfxVolume;
+}
+
+ModalIntroDemo::~ModalIntroDemo() {
+ g_fp->stopAllSounds();
+ g_fp->_sfxVolume = _sfxVolume;
+}
+
+bool ModalIntroDemo::handleMessage(ExCommand *message) {
+ if (message->_messageKind != 17)
+ return false;
+
+ if (message->_messageNum != 36)
+ return false;
+
+ if (message->_param != 13 && message->_param != 27 && message->_param != 32)
+ return false;
+
+ if (_introFlags & 0x8) {
+ _countDown = 0;
+ g_vars->sceneIntro_needBlackout = true;
+ return true;
+ } else if (_stillRunning) {
+ g_vars->sceneIntro_playing = false;
+ g_vars->sceneIntro_needBlackout = true;
+ }
+
+ return true;
+}
+
+bool ModalIntroDemo::init(int counterdiff) {
+ if (!g_vars->sceneIntro_playing) {
+ if (!_stillRunning) {
+ finish();
+ return false;
+ }
+
+ if (_introFlags & 0x10)
+ g_fp->_gameLoader->updateSystems(42);
+
+ _introFlags |= 2;
+
+ return true;
+ }
+
+ if (_introFlags & 8) {
+ _countDown--;
+
+ if (_countDown > 0)
+ return true;
+
+ if (_stillRunning > 0) {
+ _introFlags |= 2;
+ return true;
+ }
+
+ _countDown = 150;
+ _introFlags = (_introFlags & 0xf7) | 0x21;
+ g_fp->accessScene(SC_INTRO1)->getPictureObjectById(522, 0)->_flags &= 0xfffb;
+ } else {
+ if (!(_introFlags & 0x20))
+ return true;
+
+ _countDown--;
+
+ if (_countDown > 0)
+ return true;
+
+ if (_stillRunning > 0) {
+ _introFlags |= 2;
+ return true;
+ }
+
+ _introFlags &= 0xDF;
+
+ g_vars->sceneIntro_playing = false;
+ _stillRunning = 0;
+ }
+
+ return true;
+}
+
+void ModalIntroDemo::update() {
+ if (g_fp->_currentScene) {
+ if (_introFlags & 1) {
+ if (g_vars->sceneIntro_needBlackout) {
+ g_fp->drawAlphaRectangle(0, 0, 800, 600, 0);
+ g_vars->sceneIntro_needBlackout = 0;
+ } else {
+ g_fp->sceneFade(g_fp->_currentScene, true);
+ }
+ _stillRunning = 255;
+ _introFlags &= 0xfe;
+
+ if (_introFlags & 0x20)
+ g_fp->playSound(SND_INTR_019, 0);
+ } else if (_introFlags & 2) {
+ if (g_vars->sceneIntro_needBlackout) {
+ g_fp->drawAlphaRectangle(0, 0, 800, 600, 0);
+ g_vars->sceneIntro_needBlackout = 0;
+ _stillRunning = 0;
+ _introFlags &= 0xfd;
+ } else {
+ g_fp->sceneFade(g_fp->_currentScene, false);
+ _stillRunning = 0;
+ _introFlags &= 0xfd;
+ }
+ } else if (_stillRunning) {
+ g_fp->_currentScene->draw();
+ }
+ }
+}
+
+void ModalIntroDemo::finish() {
g_fp->_currentScene = g_fp->accessScene(SC_INTRO1);
g_fp->_gameLoader->preloadScene(SC_INTRO1, TrubaDown);
@@ -248,7 +378,11 @@ void ModalVideoPlayer::play(const char *filename) {
if (aviDecoder->needsUpdate()) {
const Graphics::Surface *frame = aviDecoder->decodeNextFrame();
if (frame) {
- g_fp->_system->copyRectToScreen(frame->getPixels(), frame->pitch, x, y, frame->w, frame->h);
+ Graphics::Surface *frameCopy = frame->convertTo(g_system->getScreenFormat());
+ g_fp->_system->copyRectToScreen(frameCopy->getPixels(), frameCopy->pitch,
+ x, y, frameCopy->w, frameCopy->h);
+ frameCopy->free();
+ delete frameCopy;
if (aviDecoder->hasDirtyPalette())
g_fp->_system->getPaletteManager()->setPalette(aviDecoder->getPalette(), 0, 256);
@@ -272,7 +406,9 @@ void ModalVideoPlayer::play(const char *filename) {
ModalMap::ModalMap() {
_mapScene = 0;
- _pic = 0;
+ _pic = NULL;
+ _picI03 = NULL;
+ _highlightedPic = NULL;
_isRunning = false;
_rect1 = g_fp->_sceneRect;
_x = g_fp->_currentScene->_x;
@@ -280,9 +416,9 @@ ModalMap::ModalMap() {
_flag = 0;
_mouseX = 0;
_mouseY = 0;
- _field_38 = 0;
- _field_3C = 0;
- _field_40 = 12;
+ _dragX = 0;
+ _dragY = 0;
+ _hotSpotDelay = 12;
_rect2.top = 0;
_rect2.left = 0;
_rect2.bottom = 600;
@@ -299,11 +435,14 @@ ModalMap::~ModalMap() {
}
bool ModalMap::init(int counterdiff) {
+ if (_picI03)
+ return init2(counterdiff);
+
g_fp->setCursor(PIC_CSR_ITN);
if (_flag) {
- _rect2.left = _mouseX + _field_38 - g_fp->_mouseScreenPos.x;
- _rect2.top = _mouseY + _field_3C - g_fp->_mouseScreenPos.y;
+ _rect2.left = _mouseX + _dragX - g_fp->_mouseScreenPos.x;
+ _rect2.top = _mouseY + _dragY - g_fp->_mouseScreenPos.y;
_rect2.right = _rect2.left + 800;
_rect2.bottom = _rect2.top + 600;
@@ -314,10 +453,10 @@ bool ModalMap::init(int counterdiff) {
_rect2 = g_fp->_sceneRect;
}
- _field_40--;
+ _hotSpotDelay--;
- if (_field_40 <= 0) {
- _field_40 = 12;
+ if (_hotSpotDelay <= 0) {
+ _hotSpotDelay = 12;
if (_pic)
_pic->_flags ^= 4;
@@ -326,6 +465,105 @@ bool ModalMap::init(int counterdiff) {
return _isRunning;
}
+bool ModalMap::init2(int counterdiff) {
+ g_fp->setCursor(PIC_CSR_DEFAULT);
+
+ _dragX = (int)((double)_dragX * 0.6666666666666666);
+ _dragY = (int)((double)_dragY * 0.6666666666666666);
+
+ if (800 - g_fp->_mouseScreenPos.x < 67) {
+ g_fp->setCursor(PIC_CSR_GOR);
+
+ _dragX = g_fp->_mouseScreenPos.x - 733;
+ _dragY = (int)((double)_dragY * 0.6666666666666666);
+ }
+
+ if (g_fp->_mouseScreenPos.x < 67) {
+ g_fp->setCursor(PIC_CSR_GOL);
+
+ this->_dragX = g_fp->_mouseScreenPos.x - 67;
+ this->_dragY = (int)((double)_dragY * 0.6666666666666666);
+ }
+
+ if (g_fp->_mouseScreenPos.y < 67) {
+ g_fp->setCursor(PIC_CSR_GOU);
+
+ _dragX = (int)((double)_dragX * 0.6666666666666666);
+ _dragY = g_fp->_mouseScreenPos.y - 67;
+ }
+
+ if (600 - g_fp->_mouseScreenPos.y < 87) {
+ g_fp->setCursor(PIC_CSR_GOD);
+
+ _dragX = (int)((double)_dragX * 0.6666666666666666);
+ _dragY = g_fp->_mouseScreenPos.y - 513;
+ }
+
+ g_fp->_sceneRect.translate(_dragX, _dragY);
+ _mapScene->updateScrolling2();
+ _rect2 = g_fp->_sceneRect;
+
+ PictureObject *hpic = getSceneHPicture(_mapScene->getPictureObjectAtPos(g_fp->_mouseVirtX, g_fp->_mouseVirtY));
+
+ if (hpic != _highlightedPic) {
+ if (_highlightedPic) {
+ _highlightedPic->_flags &= 0xFFFB;
+ _picI03->_flags &= 0xFFFB;
+ }
+
+ _highlightedPic = hpic;
+
+ if (hpic) {
+ PreloadItem pitem;
+
+ pitem.preloadId1 = g_fp->_currentScene->_sceneId;
+ pitem.sceneId = findMapSceneId(hpic->_id);
+
+ if (pitem.preloadId1 == pitem.sceneId || checkScenePass(&pitem)) {
+ _highlightedPic->_flags |= 4;
+
+ g_fp->playSound(SND_CMN_070, 0);
+ } else {
+ Common::Point p1, p2;
+
+ _picI03->getDimensions(&p1);
+ _highlightedPic->getDimensions(&p2);
+
+ _picI03->setOXY(_highlightedPic->_ox + p2.x / 2 - p1.x / 2, _highlightedPic->_oy + p2.y / 2 - p1.y / 2);
+ _picI03->_flags |= 4;
+ }
+ }
+ }
+
+ if (this->_highlightedPic) {
+ g_fp->setCursor(PIC_CSR_ITN);
+
+ _hotSpotDelay--;
+
+ if (_hotSpotDelay <= 0) {
+ _hotSpotDelay = 12;
+
+ if (_pic)
+ _pic->_flags ^= 4;
+ }
+ }
+
+ return _isRunning;
+}
+
+int ModalMap::findMapSceneId(int picId) {
+ for (uint i = 0; i < g_fp->_gameLoader->_preloadItems.size(); i++) {
+ PreloadItem *pitem = g_fp->_gameLoader->_preloadItems[i];
+
+ if (pitem->preloadId1 == SC_MAP && pitem->preloadId2 == picId) {
+ return pitem->sceneId;
+ }
+ }
+
+ return 0;
+}
+
+
void ModalMap::update() {
g_fp->_sceneRect = _rect2;
@@ -340,16 +578,26 @@ bool ModalMap::handleMessage(ExCommand *cmd) {
switch (cmd->_messageNum) {
case 29:
+ if (_picI03) {
+ if (_highlightedPic)
+ clickButton(_highlightedPic);
+
+ return false;
+ }
+
_flag = 1;
_mouseX = g_fp->_mouseScreenPos.x;
_mouseY = g_fp->_mouseScreenPos.y;
- _field_38 = _rect2.left;
- _field_3C = _rect2.top;
+ _dragX = _rect2.left;
+ _dragY = _rect2.top;
return false;
case 30:
+ if (_picI03)
+ return false;
+
_flag = 0;
return false;
@@ -393,7 +641,7 @@ void ModalMap::initMap() {
pic->_flags &= 0xfffb;
}
- pic = getScenePicture();
+ pic = getScenePicture(g_fp->_currentScene->_sceneId);
Common::Point point;
Common::Point point2;
@@ -406,6 +654,8 @@ void ModalMap::initMap() {
_rect2.right = _rect2.left + 800;
_rect2.bottom = _rect2.top + 600;
+ g_fp->_sceneRect = _rect2;
+
_mapScene->updateScrolling2();
_pic = _mapScene->getPictureObjectById(PIC_MAP_I02, 0);
@@ -421,13 +671,74 @@ void ModalMap::initMap() {
_pic->_flags |= 4;
}
+ _picI03 = _mapScene->getPictureObjectById(PIC_MAP_I03, 0);
+
+ if (_picI03) {
+ _picI03->_flags &= 0xFFFB;
+ }
+
+ g_system->warpMouse(400, 300);
+ g_fp->_mouseScreenPos.x = 400;
+ g_fp->_mouseScreenPos.y = 300;
+
g_fp->setArcadeOverlay(PIC_CSR_MAP);
}
-PictureObject *ModalMap::getScenePicture() {
+void ModalMap::clickButton(PictureObject *pic) {
+ if (g_fp->_currentScene == g_fp->_loaderScene) {
+ _isRunning = 0;
+ return;
+ }
+
+ PreloadItem *pitem = 0;
+
+ for (uint i = 0; i < g_fp->_gameLoader->_preloadItems.size(); i++)
+ if (g_fp->_gameLoader->_preloadItems[i]->preloadId2 == SC_MAP) {
+ pitem = g_fp->_gameLoader->_preloadItems[i];
+ break;
+ }
+
+ if (!pitem) {
+ PreloadItem preload;
+
+ preload.preloadId2 = SC_MAP;
+ g_fp->_gameLoader->addPreloadItem(&preload);
+ pitem = g_fp->_gameLoader->_preloadItems[g_fp->_gameLoader->_preloadItems.size() - 1];
+ }
+
+ PreloadItem *pitem2 = 0;
+
+ for (uint i = 0; i < g_fp->_gameLoader->_preloadItems.size(); i++)
+ if (g_fp->_gameLoader->_preloadItems[i]->preloadId1 == SC_MAP &&
+ g_fp->_gameLoader->_preloadItems[i]->preloadId2 == pic->_id) {
+ pitem2 = g_fp->_gameLoader->_preloadItems[i];
+ break;
+ }
+
+ if (pitem && pitem2) {
+ pitem->preloadId1 = g_fp->_currentScene->_sceneId;
+ pitem->sceneId = pitem2->sceneId;
+ pitem->param = pitem2->param;
+
+ if (pitem->preloadId1 == pitem2->sceneId) {
+ _isRunning = 0;
+ } else if (checkScenePass(pitem)) {
+ _isRunning = 0;
+
+ if (!g_fp->isSaveAllowed()) {
+ //g_fp->_gameLoader->loadAndDecryptSave("savetmp.sav");
+ }
+ g_fp->_gameLoader->preloadScene(pitem->preloadId1, SC_MAP);
+ } else {
+ g_fp->playSound(SND_CMN_056, 0);
+ }
+ }
+}
+
+PictureObject *ModalMap::getScenePicture(int sceneId) {
int picId = 0;
- switch (g_fp->_currentScene->_sceneId) {
+ switch (sceneId) {
case SC_1:
picId = PIC_MAP_S01;
break;
@@ -551,6 +862,169 @@ PictureObject *ModalMap::getScenePicture() {
error("ModalMap::getScenePicture(): Unknown scene id: %d", g_fp->_currentScene->_sceneId);
}
+PictureObject *ModalMap::getSceneHPicture(PictureObject *obj) {
+ if (!obj)
+ return NULL;
+
+ switch (obj->_id) {
+ case PIC_MAP_S01:
+ return _mapScene->getPictureObjectById(PIC_MAP_H01, 0);
+ case PIC_MAP_S02:
+ return _mapScene->getPictureObjectById(PIC_MAP_H02, 0);
+ case PIC_MAP_S03:
+ return _mapScene->getPictureObjectById(PIC_MAP_H03, 0);
+ case PIC_MAP_S04:
+ return _mapScene->getPictureObjectById(PIC_MAP_H04, 0);
+ case PIC_MAP_S05:
+ return _mapScene->getPictureObjectById(PIC_MAP_H05, 0);
+ case PIC_MAP_S06:
+ return _mapScene->getPictureObjectById(PIC_MAP_H06, 0);
+ case PIC_MAP_S07:
+ return _mapScene->getPictureObjectById(PIC_MAP_H07, 0);
+ case PIC_MAP_S09:
+ return _mapScene->getPictureObjectById(PIC_MAP_H09, 0);
+ case PIC_MAP_S08:
+ return _mapScene->getPictureObjectById(PIC_MAP_H08, 0);
+ case PIC_MAP_S10:
+ return _mapScene->getPictureObjectById(PIC_MAP_H10, 0);
+ case PIC_MAP_S11:
+ return _mapScene->getPictureObjectById(PIC_MAP_H11, 0);
+ case PIC_MAP_S12:
+ return _mapScene->getPictureObjectById(PIC_MAP_H12, 0);
+ case PIC_MAP_S13:
+ return _mapScene->getPictureObjectById(PIC_MAP_H13, 0);
+ case PIC_MAP_S14:
+ return _mapScene->getPictureObjectById(PIC_MAP_H14, 0);
+ case PIC_MAP_S15:
+ return _mapScene->getPictureObjectById(PIC_MAP_H15, 0);
+ case PIC_MAP_S16:
+ return _mapScene->getPictureObjectById(PIC_MAP_H16, 0);
+ case PIC_MAP_S17:
+ return _mapScene->getPictureObjectById(PIC_MAP_H17, 0);
+ case PIC_MAP_S1819:
+ return _mapScene->getPictureObjectById(PIC_MAP_H18, 0);
+ case PIC_MAP_S20:
+ return _mapScene->getPictureObjectById(PIC_MAP_H20, 0);
+ case PIC_MAP_S21:
+ return _mapScene->getPictureObjectById(PIC_MAP_H21, 0);
+ case PIC_MAP_S22:
+ return _mapScene->getPictureObjectById(PIC_MAP_H22, 0);
+ case PIC_MAP_S23_1:
+ case PIC_MAP_S23_2:
+ return _mapScene->getPictureObjectById(PIC_MAP_H23, 0);
+ case PIC_MAP_S24:
+ return _mapScene->getPictureObjectById(PIC_MAP_H24, 0);
+ case PIC_MAP_S25:
+ return _mapScene->getPictureObjectById(PIC_MAP_H25, 0);
+ case PIC_MAP_S26:
+ return _mapScene->getPictureObjectById(PIC_MAP_H26, 0);
+ case PIC_MAP_S27:
+ return _mapScene->getPictureObjectById(PIC_MAP_H27, 0);
+ case PIC_MAP_S28:
+ return _mapScene->getPictureObjectById(PIC_MAP_H28, 0);
+ case PIC_MAP_S29:
+ return _mapScene->getPictureObjectById(PIC_MAP_H29, 0);
+ case PIC_MAP_S30:
+ return _mapScene->getPictureObjectById(PIC_MAP_H30, 0);
+ case PIC_MAP_S31_1:
+ case PIC_MAP_S31_2:
+ return _mapScene->getPictureObjectById(PIC_MAP_H31, 0);
+ case PIC_MAP_S32_1:
+ case PIC_MAP_S32_2:
+ return _mapScene->getPictureObjectById(PIC_MAP_H32, 0);
+ case PIC_MAP_S33:
+ return _mapScene->getPictureObjectById(PIC_MAP_H33, 0);
+ case PIC_MAP_S34:
+ return _mapScene->getPictureObjectById(PIC_MAP_H34, 0);
+ case PIC_MAP_S35:
+ return _mapScene->getPictureObjectById(PIC_MAP_H35, 0);
+ case PIC_MAP_S36:
+ return _mapScene->getPictureObjectById(PIC_MAP_H36, 0);
+ case PIC_MAP_S37:
+ return _mapScene->getPictureObjectById(PIC_MAP_H37, 0);
+ case PIC_MAP_S38:
+ return _mapScene->getPictureObjectById(PIC_MAP_H38, 0);
+ default:
+ return NULL;
+ }
+}
+
+bool ModalMap::isSceneEnabled(int sceneId) {
+ int id = getScenePicture(sceneId)->_id;
+
+ for (int i = 0; i < 200; i++) {
+ int mapPic = g_fp->_mapTable[i] >> 16;
+ if (!mapPic)
+ return false;
+
+ if (mapPic == id)
+ return (g_fp->_mapTable[i] & 0xffff) == 1;
+ }
+
+ return false;
+}
+
+bool ModalMap::checkScenePass(PreloadItem *item) {
+ bool res = true;
+
+ switch (item->preloadId1) {
+ case SC_13:
+ if (!isSceneEnabled(SC_14))
+ res = false;
+ break;
+
+ case SC_27:
+ if (item->sceneId == SC_25) {
+ item->param = TrubaRight;
+ } else {
+ res = false;
+ }
+ break;
+
+ case SC_25:
+ if (g_fp->getObjectState(sO_Board_25) != g_fp->getObjectEnumState(sO_Board_25, sO_NearDudesStairs)) {
+ res = false;
+ }
+ }
+
+ switch (item->sceneId) {
+ case SC_13:
+ if (isSceneEnabled(SC_14)) {
+ item->param = TrubaLeft;
+ break;
+ }
+ item->param = TrubaUp;
+ break;
+
+ case SC_27:
+ res = false;
+ break;
+
+ case SC_25:
+ if (g_fp->getObjectState(sO_Pool) != g_fp->getObjectEnumState(sO_Pool, sO_Empty)) {
+ if (g_fp->getObjectState(sO_Pool) != g_fp->getObjectEnumState(sO_Pool, sO_HalfFull))
+ res = false;
+ }
+ break;
+
+ case SC_29:
+ if (isSceneEnabled(SC_30)) {
+ item->param = TrubaLeft;
+ break;
+ }
+ item->param = TrubaUp;
+ break;
+ }
+
+ if ((item->sceneId != SC_37 && item->preloadId1 != SC_37)
+ || (g_fp->getObjectState(sO_Jawcrucnher) != g_fp->getObjectEnumState(sO_Jawcrucnher, sO_WithoutCarpet))) {
+ return res;
+ } else {
+ res = false;
+ }
+ return res;
+}
+
void FullpipeEngine::openMap() {
if (!_modalObject) {
ModalMap *map = new ModalMap;
@@ -1312,7 +1786,10 @@ void ModalHelp::launch() {
_mainMenuScene = g_fp->accessScene(SC_MAINMENU);
if (_mainMenuScene) {
- _bg = _mainMenuScene->getPictureObjectById(PIC_HLP_BGR, 0)->_picture;
+ if (g_fp->isDemo() && g_fp->getLanguage() == Common::RU_RUS)
+ _bg = _mainMenuScene->getPictureObjectById(364, 0)->_picture;
+ else
+ _bg = _mainMenuScene->getPictureObjectById(PIC_HLP_BGR, 0)->_picture;
_isRunning = 1;
}
}
@@ -1332,6 +1809,28 @@ ModalQuery::~ModalQuery() {
}
bool ModalQuery::create(Scene *sc, Scene *bgScene, int id) {
+ if (g_fp->isDemo() && g_fp->getLanguage() == Common::RU_RUS) {
+ _bg = sc->getPictureObjectById(386, 0);
+
+ if (!_bg)
+ return false;
+
+ _okBtn = sc->getPictureObjectById(392, 0);
+
+ if (!_okBtn)
+ return false;
+
+ _cancelBtn = sc->getPictureObjectById(396, 0);
+
+ if (!_cancelBtn)
+ return 0;
+
+ _queryResult = -1;
+ _bgScene = bgScene;
+
+ return true;
+ }
+
if (id == PIC_MEX_BGR) {
_bg = sc->getPictureObjectById(PIC_MEX_BGR, 0);
@@ -1346,7 +1845,7 @@ bool ModalQuery::create(Scene *sc, Scene *bgScene, int id) {
_cancelBtn = sc->getPictureObjectById(PIC_MEX_CANCEL, 0);
if (!_cancelBtn)
- return 0;
+ return false;
} else {
if (id != PIC_MOV_BGR)
return false;
@@ -1421,6 +1920,18 @@ bool ModalQuery::init(int counterdiff) {
if (_queryResult == -1) {
return true;
} else {
+ if (g_fp->isDemo() && g_fp->getLanguage() == Common::RU_RUS) {
+ if (!_queryResult)
+ return false;
+
+ ModalDemo *demo = new ModalDemo;
+ demo->launch();
+
+ g_fp->_modalObject = demo;
+
+ return true;
+ }
+
if (_bg->_id == PIC_MEX_BGR) {
_cancelBtn->_flags &= 0xFFFB;
_okBtn->_flags &= 0xFFFB;
@@ -1793,6 +2304,170 @@ void ModalSaveGame::saveload() {
}
}
+ModalDemo::ModalDemo() {
+ _bg = 0;
+ _button = 0;
+ _text = 0;
+
+ if (g_fp->getLanguage() == Common::RU_RUS) {
+ _clickedQuit = 0;
+ _countdown = -10;
+ } else {
+ _clickedQuit = -1;
+ _countdown = 1000;
+ }
+ _scene = 0;
+}
+
+ModalDemo::~ModalDemo() {
+ if (_bg)
+ _bg->_flags &= 0xFFFB;
+
+ _button->_flags &= 0xFFFB;
+ _text->_flags &= 0xFFFB;
+}
+
+bool ModalDemo::launch() {
+ Scene *sc = g_fp->accessScene(SC_MAINMENU);
+
+ if (g_fp->getLanguage() == Common::RU_RUS) {
+ _scene = sc;
+
+ for (uint i = 1; i < sc->_picObjList.size(); i++) {
+ if (((PictureObject *)sc->_picObjList[i])->_id == 399)
+ sc->_picObjList[i]->_flags |= 4;
+ else
+ sc->_picObjList[i]->_flags &= 0xFFFB;
+ }
+
+ _button = sc->getPictureObjectById(443, 0);
+ _text = sc->getPictureObjectById(402, 0);
+
+ _countdown = -10;
+
+ return true;
+ }
+
+ _bg = sc->getPictureObjectById(PIC_POST_BGR, 0);
+
+ if (!_bg)
+ return false;
+
+ _button = sc->getPictureObjectById(PIC_POST_BUTTON, 0);
+ _text = sc->getPictureObjectById(PIC_POST_TEXT, 0);
+
+ _clickedQuit = -1;
+
+ // fadeout
+ warning("STUB: ModelDemo: fadeout");
+ update();
+
+ g_fp->stopAllSoundStreams();
+ g_fp->stopAllSounds();
+ g_fp->playSound(SND_CMN_056, 0);
+ g_fp->playSound(SND_CMN_069, 1);
+
+ return true;
+}
+
+bool ModalDemo::init(int counterDiff) {
+ if (g_fp->getLanguage() == Common::RU_RUS)
+ return init2(counterDiff);
+
+ g_fp->_cursorId = PIC_CSR_DEFAULT;
+
+ if (_button->isPointInside(g_fp->_mouseScreenPos.x, g_fp->_mouseScreenPos.y)) {
+ if (!(_button->_flags & 4))
+ g_fp->playSound(SND_CMN_070, 0);
+
+ _button->_flags |= 4;
+
+ g_fp->_cursorId = PIC_CSR_ITN;
+ } else {
+ _button->_flags &= 0xFFFB;
+ }
+
+ g_fp->setCursor(g_fp->_cursorId);
+
+ _countdown -= counterDiff;
+
+ if (_countdown <= 0)
+ _countdown = 1000;
+
+ if (_clickedQuit == -1)
+ return true;
+
+ // open URL
+ // http://www.amazon.de/EuroVideo-Bildprogramm-GmbH-Full-Pipe/dp/B003TO51YE/ref=sr_1_1?ie=UTF8&s=videogames&qid=1279207213&sr=8-1
+
+ g_fp->_gameContinue = false;
+
+ return false;
+}
+
+bool ModalDemo::init2(int counterDiff) {
+ if (_clickedQuit) {
+ // open URL
+ // http://pipestudio.ru/fullpipe/
+
+ g_fp->_gameContinue = false;
+
+ return false;
+ }
+
+ if (_countdown > 0) {
+ _countdown--;
+ } else {
+ _text->_flags ^= 4;
+ _countdown = 24;
+ }
+
+ if (_button->isPointInside(g_fp->_mouseScreenPos.x, g_fp->_mouseScreenPos.y)) {
+ _button->_flags |= 4;
+
+ g_fp->_cursorId = PIC_CSR_ITN;
+ } else {
+ _button->_flags &= 0xFFFB;
+
+ g_fp->_cursorId = PIC_CSR_DEFAULT;
+ }
+
+ return true;
+}
+
+void ModalDemo::update() {
+ if (g_fp->getLanguage() == Common::RU_RUS) {
+ if (_countdown == -10)
+ g_fp->sceneFade(_scene, true);
+
+ _scene->draw();
+
+ return;
+ }
+
+ _bg->draw();
+
+ if (_button->_flags & 4)
+ _button->draw();
+
+ if (_text->_flags & 4)
+ _text->draw();
+}
+
+bool ModalDemo::handleMessage(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return false;
+
+ if (cmd->_messageNum == 29) {
+ if (_button->isPointInside(g_fp->_mouseScreenPos.x, g_fp->_mouseScreenPos.y))
+ _clickedQuit = 1;
+ } else if (cmd->_messageNum == 36 && (cmd->_param == 27 || g_fp->getLanguage() == Common::RU_RUS)) {
+ _clickedQuit = 1;
+ }
+
+ return false;
+}
+
void FullpipeEngine::openHelp() {
if (!_modalObject) {
ModalHelp *help = new ModalHelp;
@@ -1804,6 +2479,17 @@ void FullpipeEngine::openHelp() {
}
void FullpipeEngine::openMainMenu() {
+ if (isDemo() && getLanguage() == Common::RU_RUS) {
+ ModalQuery *q = new ModalQuery;
+
+ Scene *sc = accessScene(SC_MAINMENU);
+
+ q->create(sc, 0, 0);
+
+ g_fp->_modalObject = q;
+
+ return;
+ }
ModalMainMenu *menu = new ModalMainMenu;
menu->_parentObj = g_fp->_modalObject;
diff --git a/engines/fullpipe/modal.h b/engines/fullpipe/modal.h
index a08cb3bce2..ba8880827d 100644
--- a/engines/fullpipe/modal.h
+++ b/engines/fullpipe/modal.h
@@ -78,6 +78,26 @@ class ModalIntro : public BaseModalObject {
void finish();
};
+class ModalIntroDemo : public BaseModalObject {
+ int _field_8;
+ int _introFlags;
+ int _countDown;
+ int _stillRunning;
+ int _sfxVolume;
+
+ public:
+ ModalIntroDemo();
+ virtual ~ModalIntroDemo();
+
+ virtual bool pollEvent() { return true; }
+ virtual bool handleMessage(ExCommand *message);
+ virtual bool init(int counterdiff);
+ virtual void update();
+ virtual void saveload() {}
+
+ void finish();
+};
+
class ModalVideoPlayer : public BaseModalObject {
public:
@@ -93,6 +113,8 @@ public:
class ModalMap : public BaseModalObject {
Scene *_mapScene;
PictureObject *_pic;
+ PictureObject *_picI03;
+ PictureObject *_highlightedPic;
bool _isRunning;
Common::Rect _rect1;
int _x;
@@ -100,9 +122,9 @@ class ModalMap : public BaseModalObject {
int _flag;
int _mouseX;
int _mouseY;
- int _field_38;
- int _field_3C;
- int _field_40;
+ int _dragX;
+ int _dragY;
+ int _hotSpotDelay;
Common::Rect _rect2;
public:
@@ -112,11 +134,20 @@ class ModalMap : public BaseModalObject {
virtual bool pollEvent() { return true; }
virtual bool handleMessage(ExCommand *message);
virtual bool init(int counterdiff);
+ virtual bool init2(int counterdiff);
virtual void update();
virtual void saveload() {}
void initMap();
- PictureObject *getScenePicture();
+
+private:
+ PictureObject *getScenePicture(int sceneId);
+ PictureObject *getSceneHPicture(PictureObject *obj);
+ bool checkScenePass(PreloadItem *item);
+ bool isSceneEnabled(int sceneId);
+
+ int findMapSceneId(int picId);
+ void clickButton(PictureObject *pic);
};
class ModalFinal : public BaseModalObject {
@@ -289,6 +320,28 @@ public:
int _queryRes;
};
+class ModalDemo : public BaseModalObject {
+ PictureObject *_bg;
+ PictureObject *_button;
+ PictureObject *_text;
+ int _clickedQuit;
+ int _countdown;
+ Scene *_scene;
+
+ public:
+ ModalDemo();
+ virtual ~ModalDemo();
+
+ bool launch();
+
+ virtual bool pollEvent() { return true; }
+ virtual bool handleMessage(ExCommand *message);
+ virtual bool init(int counterdiff);
+ bool init2(int counterdiff);
+ virtual void update();
+ virtual void saveload() {}
+};
+
} // End of namespace Fullpipe
diff --git a/engines/fullpipe/module.mk b/engines/fullpipe/module.mk
index 62f9c5f77a..5dc6bb82c9 100644
--- a/engines/fullpipe/module.mk
+++ b/engines/fullpipe/module.mk
@@ -27,6 +27,7 @@ MODULE_OBJS = \
statics.o \
utils.o \
scenes/sceneIntro.o \
+ scenes/sceneIntroDemo.o \
scenes/scene01.o \
scenes/scene02.o \
scenes/scene03.o \
diff --git a/engines/fullpipe/objectnames.h b/engines/fullpipe/objectnames.h
index 0baf83b175..7af82ff62c 100644
--- a/engines/fullpipe/objectnames.h
+++ b/engines/fullpipe/objectnames.h
@@ -32,6 +32,7 @@ namespace Fullpipe {
#define sO_Pool "\xc1\xe0\xf1\xf1\xe5\xe9\xed" // "а‘аАббаЕаЙаН"
#define sO_TummyTrampie "\xc1\xe0\xf2\xf3\xf2\xe0" // "а‘аАб‚бƒб‚аА"
#define sO_WithoutBoot "\xc1\xe5\xe7 \xe1\xee\xf2\xe8\xed\xea\xe0" // "а‘аЕаЗ аБаОб‚аИаНаКаА"
+#define sO_WithoutJug "\xc1\xe5\xe7 \xe3\xee\xf0\xf8\xea\xe0" // "а‘аЕаЗ аГаОб€бˆаКаА"
#define sO_WithoutJugs "\xc1\xe5\xe7 \xe3\xee\xf0\xf8\xea\xee\xe2" // "а‘аЕаЗ аГаОб€бˆаКаОаВ"
#define sO_WithoutCarpet "\xc1\xe5\xe7 \xea\xee\xe2\xf0\xe8\xea\xe0" // "а‘аЕаЗ аКаОаВб€аИаКаА"
#define sO_WithoutCoin "\xc1\xe5\xe7 \xec\xee\xed\xe5\xf2\xfb" // "а‘аЕаЗ аМаОаНаЕб‚б‹"
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index 4b50763e8c..bb141d98c4 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -519,6 +519,17 @@ int FullpipeEngine::getSceneFromTag(int tag) {
return 1;
}
+void FullpipeEngine::sceneAutoScrolling() {
+ if (_aniMan2 == _aniMan && _currentScene && !_currentScene->_messageQueueId) {
+ if (800 - _mouseScreenPos.x >= 47 || _sceneRect.right >= _sceneWidth - 1 || _aniMan->_ox <= _sceneRect.left + 230) {
+ if (_mouseScreenPos.x < 47 && _sceneRect.left > 0 && _aniMan->_ox < _sceneRect.right - 230)
+ _currentScene->_x = -10;
+ } else {
+ _currentScene->_x = 10;
+ }
+ }
+}
+
bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
GameVar *sceneVar;
Common::Point sceneDim;
@@ -542,8 +553,8 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
_aniMan->setOXY(0, 0);
_aniMan->clearFlags();
- _aniMan->_callback1 = 0;
- _aniMan->_callback2 = 0;
+ _aniMan->_callback1 = 0; // Really NULL
+ _aniMan->_callback2 = 0; // Really NULL
_aniMan->_shadowsOn = 1;
_scrollSpeed = 8;
@@ -605,12 +616,23 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
case SC_INTRO1:
sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_INTRO1");
scene->preloadMovements(sceneVar);
- sceneIntro_initScene(scene);
+
+ if (!(g_fp->isDemo() && g_fp->getLanguage() == Common::RU_RUS))
+ sceneIntro_initScene(scene);
+ else
+ sceneIntroDemo_initScene(scene);
+
_behaviorManager->initBehavior(scene, sceneVar);
scene->initObjectCursors("SC_INTRO1");
setSceneMusicParameters(sceneVar);
- addMessageHandler(sceneHandlerIntro, 2);
- _updateCursorCallback = sceneIntro_updateCursor;
+
+ if (!(g_fp->isDemo() && g_fp->getLanguage() == Common::RU_RUS)) {
+ addMessageHandler(sceneHandlerIntro, 2);
+ _updateCursorCallback = sceneIntro_updateCursor;
+ } else {
+ addMessageHandler(sceneHandlerIntroDemo, 2);
+ _updateCursorCallback = sceneIntroDemo_updateCursor;
+ }
break;
case SC_1:
diff --git a/engines/fullpipe/scenes.h b/engines/fullpipe/scenes.h
index 2d30f54d52..1d54aef441 100644
--- a/engines/fullpipe/scenes.h
+++ b/engines/fullpipe/scenes.h
@@ -41,6 +41,10 @@ int sceneIntro_updateCursor();
void sceneIntro_initScene(Scene *sc);
int sceneHandlerIntro(ExCommand *cmd);
+int sceneIntroDemo_updateCursor();
+void sceneIntroDemo_initScene(Scene *sc);
+int sceneHandlerIntroDemo(ExCommand *cmd);
+
void scene01_fixEntrance();
void scene01_initScene(Scene *sc, int entrance);
int sceneHandler01(ExCommand *cmd);
diff --git a/engines/fullpipe/scenes/scene04.cpp b/engines/fullpipe/scenes/scene04.cpp
index d349783c10..0e5040097c 100644
--- a/engines/fullpipe/scenes/scene04.cpp
+++ b/engines/fullpipe/scenes/scene04.cpp
@@ -1447,7 +1447,11 @@ int sceneHandler04(ExCommand *ex) {
}
res = 1;
+ }
+
+ g_fp->sceneAutoScrolling();
+ if (g_fp->_aniMan2) {
if (g_vars->scene04_soundPlaying) {
if (g_fp->_aniMan->_movement) {
if (g_fp->_aniMan->_movement->_id == MV_MAN_TOLADDER) {
diff --git a/engines/fullpipe/scenes/scene06.cpp b/engines/fullpipe/scenes/scene06.cpp
index 5fab4b5862..a6d93b69bd 100644
--- a/engines/fullpipe/scenes/scene06.cpp
+++ b/engines/fullpipe/scenes/scene06.cpp
@@ -82,7 +82,7 @@ void sceneHandler06_winArcade() {
g_fp->setObjectState(sO_ClockAxis, g_fp->getObjectEnumState(sO_ClockAxis, sO_WithoutHandle));
if (g_vars->scene06_arcadeEnabled) {
- g_fp->_aniMan->_callback2 = 0;
+ g_fp->_aniMan->_callback2 = 0; // Really NULL
g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT | 0x4000);
@@ -707,6 +707,8 @@ int sceneHandler06(ExCommand *ex) {
}
res = 1;
+
+ g_fp->sceneAutoScrolling();
}
if (g_vars->scene06_arcadeEnabled) {
if (g_vars->scene06_mumsyPos > -3)
diff --git a/engines/fullpipe/scenes/scene08.cpp b/engines/fullpipe/scenes/scene08.cpp
index b9aaabe1af..24b23c1506 100644
--- a/engines/fullpipe/scenes/scene08.cpp
+++ b/engines/fullpipe/scenes/scene08.cpp
@@ -33,9 +33,14 @@
#include "fullpipe/gameloader.h"
#include "fullpipe/behavior.h"
#include "fullpipe/interaction.h"
+#include "fullpipe/modal.h"
namespace Fullpipe {
+void scene08_clockCallback(int *phase) {
+ // do nothing
+}
+
void scene08_initScene(Scene *sc) {
g_vars->scene08_inArcade = false;
g_vars->scene08_inAir = false;
@@ -80,7 +85,7 @@ void scene08_initScene(Scene *sc) {
g_vars->scene08_snoringCountdown = 71;
}
- g_vars->scene08_clock->_callback2 = 0;
+ g_vars->scene08_clock->_callback2 = scene08_clockCallback;
if (g_fp->getObjectState(sO_StairsUp_8) == g_fp->getObjectEnumState(sO_StairsUp_8, sO_Broken)) {
g_vars->scene08_stairsVisible = false;
@@ -405,6 +410,15 @@ void sceneHandler08_checkEndArcade() {
if (y < 80) {
sceneHandler08_finishArcade();
+ if (g_fp->isDemo() && g_fp->getLanguage() == Common::DE_DEU) {
+ ModalDemo *demo = new ModalDemo;
+ demo->launch();
+
+ g_fp->_modalObject = demo;
+
+ return;
+ }
+
ExCommand *ex = new ExCommand(SC_8, 17, 0, 0, 0, 0, 1, 0, 0, 0);
ex->_messageNum = 61;
ex->_excFlags |= 2;
diff --git a/engines/fullpipe/scenes/scene09.cpp b/engines/fullpipe/scenes/scene09.cpp
index 3a8b937f24..169d06c331 100644
--- a/engines/fullpipe/scenes/scene09.cpp
+++ b/engines/fullpipe/scenes/scene09.cpp
@@ -33,7 +33,6 @@
#include "fullpipe/interaction.h"
#include "fullpipe/behavior.h"
-
namespace Fullpipe {
struct Hanger {
@@ -416,6 +415,10 @@ void sceneHandler09_hangerStartCycle() {
}
}
+void scene09_visCallback(int *phase) {
+ // do nothing
+}
+
int sceneHandler09(ExCommand *cmd) {
if (cmd->_messageKind != 17)
return 0;
@@ -459,6 +462,13 @@ int sceneHandler09(ExCommand *cmd) {
sceneHandler09_showBall();
break;
+ case 367:
+ if (g_fp->isDemo() && g_fp->getLanguage() == Common::RU_RUS) {
+ g_fp->_needRestart = true;
+ return 0;
+ }
+ break;
+
case 33:
{
int res = 0;
@@ -475,6 +485,8 @@ int sceneHandler09(ExCommand *cmd) {
g_fp->_currentScene->_x = x - g_fp->_sceneRect.right + 300;
res = 1;
+
+ g_fp->sceneAutoScrolling();
} else {
if (g_fp->_aniMan->_movement && g_fp->_aniMan->_movement->_id != MV_MAN9_SHOOT)
g_fp->_aniMan2 = g_fp->_aniMan;
@@ -497,7 +509,7 @@ int sceneHandler09(ExCommand *cmd) {
case 30:
if (g_vars->scene09_interactingHanger >= 0) {
if (ABS(g_vars->scene09_hangers[g_vars->scene09_interactingHanger]->phase) < 15) {
- g_vars->scene09_hangers[g_vars->scene09_interactingHanger]->ani->_callback2 = 0;
+ g_vars->scene09_hangers[g_vars->scene09_interactingHanger]->ani->_callback2 = 0; // Really NULL
g_vars->scene09_hangers[g_vars->scene09_interactingHanger]->ani->changeStatics2(ST_VSN_NORMAL);
}
}
@@ -538,7 +550,7 @@ int sceneHandler09(ExCommand *cmd) {
if (!g_vars->scene09_hangers[hng]->ani->_movement || g_vars->scene09_hangers[hng]->ani->_movement->_id != MV_VSN_CYCLE2) {
g_vars->scene09_hangers[hng]->ani->changeStatics2(ST_VSN_NORMAL);
g_vars->scene09_hangers[hng]->ani->startAnim(MV_VSN_CYCLE2, 0, -1);
- g_vars->scene09_hangers[hng]->ani->_callback2 = 0;
+ g_vars->scene09_hangers[hng]->ani->_callback2 = scene09_visCallback;
}
ExCommand *ex = new ExCommand(0, 35, SND_9_018, 0, 0, 0, 1, 0, 0, 0);
diff --git a/engines/fullpipe/scenes/scene11.cpp b/engines/fullpipe/scenes/scene11.cpp
index 8c3de9e11e..72af59aacf 100644
--- a/engines/fullpipe/scenes/scene11.cpp
+++ b/engines/fullpipe/scenes/scene11.cpp
@@ -671,6 +671,8 @@ int sceneHandler11(ExCommand *cmd) {
if (x >= 940)
g_vars->scene11_scrollIsMaximized = true;
+
+ g_fp->sceneAutoScrolling();
}
res = 1;
}
diff --git a/engines/fullpipe/scenes/scene13.cpp b/engines/fullpipe/scenes/scene13.cpp
index 12fe1dd35d..7b38442603 100644
--- a/engines/fullpipe/scenes/scene13.cpp
+++ b/engines/fullpipe/scenes/scene13.cpp
@@ -60,7 +60,7 @@ void scene13_initScene(Scene *sc) {
g_fp->playSound(SND_13_018, 1);
- g_vars->scene13_whirlgig->_callback2 = 0;
+ g_vars->scene13_whirlgig->_callback2 = 0; // Really NULL
} else {
g_vars->scene13_bridge->changeStatics2(ST_BDG_OPEN2);
@@ -167,7 +167,7 @@ void sceneHandler13_stopWhirlgig() {
}
void sceneHandler13_startWhirlgig() {
- g_vars->scene13_whirlgig->_callback2 = 0;
+ g_vars->scene13_whirlgig->_callback2 = 0; // Really NULL
g_fp->playSound(SND_13_018, 1);
g_fp->playSound(SND_13_034, 0);
@@ -348,6 +348,8 @@ int sceneHandler13(ExCommand *cmd) {
g_fp->_currentScene->_x = x - g_fp->_sceneRect.right + 300;
res = 1;
+
+ g_fp->sceneAutoScrolling();
} else {
x = g_vars->scene13_dudeX;
}
diff --git a/engines/fullpipe/scenes/scene14.cpp b/engines/fullpipe/scenes/scene14.cpp
index 977f3d95ac..d5070bb17b 100644
--- a/engines/fullpipe/scenes/scene14.cpp
+++ b/engines/fullpipe/scenes/scene14.cpp
@@ -380,7 +380,7 @@ void sceneHandler14_startArcade() {
}
void sceneHandler14_clearCallback() {
- g_fp->_aniMan->_callback2 = 0;
+ g_fp->_aniMan->_callback2 = 0; // Really NULL
g_vars->scene14_dudeIsKicking = false;
}
@@ -788,6 +788,8 @@ int sceneHandler14(ExCommand *cmd) {
if (x > g_fp->_sceneRect.right - g_vars->scene14_sceneDeltaX)
g_fp->_currentScene->_x = x + g_vars->scene14_sceneDiffX - g_fp->_sceneRect.right;
+
+ g_fp->sceneAutoScrolling();
}
if (g_vars->scene14_ballIsFlying)
diff --git a/engines/fullpipe/scenes/scene18and19.cpp b/engines/fullpipe/scenes/scene18and19.cpp
index a6f77a33fd..eb338ead88 100644
--- a/engines/fullpipe/scenes/scene18and19.cpp
+++ b/engines/fullpipe/scenes/scene18and19.cpp
@@ -774,6 +774,8 @@ int sceneHandler18(ExCommand *cmd) {
if (x > g_fp->_sceneRect.right - 200)
g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+
+ g_fp->sceneAutoScrolling();
}
if (g_vars->scene18_manIsReady && g_fp->_aniMan->_movement)
diff --git a/engines/fullpipe/scenes/scene21.cpp b/engines/fullpipe/scenes/scene21.cpp
index 1b232e1aee..7a61e4862d 100644
--- a/engines/fullpipe/scenes/scene21.cpp
+++ b/engines/fullpipe/scenes/scene21.cpp
@@ -129,6 +129,8 @@ int sceneHandler21(ExCommand *cmd) {
if (x > g_fp->_sceneRect.right - 200)
g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+
+ g_fp->sceneAutoScrolling();
}
if (g_vars->scene21_pipeIsOpen && !g_vars->scene21_wiggleTrigger)
diff --git a/engines/fullpipe/scenes/scene22.cpp b/engines/fullpipe/scenes/scene22.cpp
index 3af8bad456..5b9b091f36 100644
--- a/engines/fullpipe/scenes/scene22.cpp
+++ b/engines/fullpipe/scenes/scene22.cpp
@@ -381,6 +381,8 @@ int sceneHandler22(ExCommand *cmd) {
if (x > g_fp->_sceneRect.right - 200)
g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+ g_fp->sceneAutoScrolling();
+
g_fp->_behaviorManager->updateBehaviors();
g_fp->startSceneTrack();
diff --git a/engines/fullpipe/scenes/scene26.cpp b/engines/fullpipe/scenes/scene26.cpp
index 9706bd5927..0efabaeda8 100644
--- a/engines/fullpipe/scenes/scene26.cpp
+++ b/engines/fullpipe/scenes/scene26.cpp
@@ -69,6 +69,11 @@ int scene26_updateCursor() {
if (g_fp->_objectIdAtCursor != ANI_VENT || g_fp->_cursorId != PIC_CSR_DEFAULT) {
if (g_fp->_cursorId == PIC_CSR_ITN && g_fp->_objectIdAtCursor == PIC_SC26_LTRUBA)
g_fp->_cursorId = PIC_CSR_GOL;
+
+ // WORKAROUND: Fixing cursor
+ if (g_fp->_objectIdAtCursor == PIC_SC26_LTRUBA &&
+ (g_fp->_cursorId == PIC_CSR_GOU || g_fp->_cursorId == PIC_CSR_GOD || g_fp->_cursorId == PIC_CSR_GOR))
+ g_fp->_cursorId = PIC_CSR_GOL;
} else {
g_fp->_cursorId = PIC_CSR_ITN;
}
diff --git a/engines/fullpipe/scenes/scene27.cpp b/engines/fullpipe/scenes/scene27.cpp
index a6ddbab5e3..aaf7fab852 100644
--- a/engines/fullpipe/scenes/scene27.cpp
+++ b/engines/fullpipe/scenes/scene27.cpp
@@ -124,7 +124,7 @@ void sceneHandler27_winArcade() {
if (g_fp->getObjectState(sO_Driver) == g_fp->getObjectEnumState(sO_Driver, sO_WithSteering)) {
g_vars->scene27_dudeIsAiming = false;
- g_fp->_aniMan->_callback2 = 0;
+ g_fp->_aniMan->_callback2 = 0; // Really NULL
g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT);
sceneHandler27_driverGiveVent();
@@ -248,7 +248,7 @@ void sceneHandler27_startAiming() {
g_vars->scene27_dudeIsAiming = false;
g_vars->scene27_maxPhaseReached = false;
- g_fp->_aniMan->_callback2 = 0;
+ g_fp->_aniMan->_callback2 = 0; // Really NULL
g_vars->scene27_launchPhase = g_fp->_aniMan->_movement->_currDynamicPhaseIndex - 6;
diff --git a/engines/fullpipe/scenes/scene28.cpp b/engines/fullpipe/scenes/scene28.cpp
index 8d829d7b98..275c78802f 100644
--- a/engines/fullpipe/scenes/scene28.cpp
+++ b/engines/fullpipe/scenes/scene28.cpp
@@ -440,6 +440,8 @@ int sceneHandler28(ExCommand *cmd) {
if (x > g_fp->_sceneRect.right - 200)
g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+
+ g_fp->sceneAutoScrolling();
}
if (g_vars->scene28_darkeningObject) {
diff --git a/engines/fullpipe/scenes/scene32.cpp b/engines/fullpipe/scenes/scene32.cpp
index 9cd79d8115..593f7b446c 100644
--- a/engines/fullpipe/scenes/scene32.cpp
+++ b/engines/fullpipe/scenes/scene32.cpp
@@ -355,6 +355,8 @@ int sceneHandler32(ExCommand *cmd) {
if (x > g_fp->_sceneRect.right - 200)
g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+
+ g_fp->sceneAutoScrolling();
}
if (!g_vars->scene32_flag->_movement) {
diff --git a/engines/fullpipe/scenes/scene33.cpp b/engines/fullpipe/scenes/scene33.cpp
index 6a58cdf694..717e9f6572 100644
--- a/engines/fullpipe/scenes/scene33.cpp
+++ b/engines/fullpipe/scenes/scene33.cpp
@@ -296,6 +296,8 @@ int sceneHandler33(ExCommand *cmd) {
if (x > g_fp->_sceneRect.right - 200)
g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+
+ g_fp->sceneAutoScrolling();
}
if (g_vars->scene33_cube)
diff --git a/engines/fullpipe/scenes/scene34.cpp b/engines/fullpipe/scenes/scene34.cpp
index bc4ff18bae..69f3cd5293 100644
--- a/engines/fullpipe/scenes/scene34.cpp
+++ b/engines/fullpipe/scenes/scene34.cpp
@@ -457,6 +457,8 @@ int sceneHandler34(ExCommand *cmd) {
if (x > g_fp->_sceneRect.right - 200)
g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+
+ g_fp->sceneAutoScrolling();
}
--g_vars->scene34_fliesCountdown;
diff --git a/engines/fullpipe/scenes/scene35.cpp b/engines/fullpipe/scenes/scene35.cpp
index 3cdbb42c1e..e8b08b2614 100644
--- a/engines/fullpipe/scenes/scene35.cpp
+++ b/engines/fullpipe/scenes/scene35.cpp
@@ -236,6 +236,8 @@ int sceneHandler35(ExCommand *cmd) {
if (x > g_fp->_sceneRect.right - 200)
g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+
+ g_fp->sceneAutoScrolling();
}
if (g_vars->scene35_flowCounter > 0) {
diff --git a/engines/fullpipe/scenes/scene37.cpp b/engines/fullpipe/scenes/scene37.cpp
index ba181642df..bce28ef382 100644
--- a/engines/fullpipe/scenes/scene37.cpp
+++ b/engines/fullpipe/scenes/scene37.cpp
@@ -280,6 +280,8 @@ int sceneHandler37(ExCommand *cmd) {
if (x > g_fp->_sceneRect.right - 200)
g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+
+ g_fp->sceneAutoScrolling();
}
sceneHandler37_setRingsState();
diff --git a/engines/fullpipe/scenes/sceneIntroDemo.cpp b/engines/fullpipe/scenes/sceneIntroDemo.cpp
new file mode 100644
index 0000000000..ea3c469ffd
--- /dev/null
+++ b/engines/fullpipe/scenes/sceneIntroDemo.cpp
@@ -0,0 +1,94 @@
+/* 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/constants.h"
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/modal.h"
+#include "fullpipe/statics.h"
+
+namespace Fullpipe {
+
+int sceneIntroDemo_updateCursor() {
+ g_fp->_cursorId = 0;
+
+ return 0;
+}
+
+void sceneIntroDemo_initScene(Scene *sc) {
+ g_vars->sceneIntro_needSleep = true;
+ g_vars->sceneIntro_needGetup = false;
+ g_vars->sceneIntro_playing = true;
+ g_vars->sceneIntro_needBlackout = false;
+
+ if (g_fp->_recordEvents || g_fp->_inputArFlag)
+ g_vars->sceneIntro_skipIntro = false;
+
+ g_fp->_modalObject = new ModalIntroDemo;
+}
+
+void sceneHandlerIntroDemo_part1() {
+ g_fp->_currentScene = g_fp->accessScene(SC_INTRO1);
+ chainQueue(QU_INTR_FINISH, 0);
+}
+
+void sceneHandlerIntroDemo_part2() {
+ chainQueue(QU_IN2_DO, 0);
+}
+
+int sceneHandlerIntroDemo(ExCommand *ex) {
+ if (ex->_messageKind != 17)
+ return 0;
+
+ switch (ex->_messageNum) {
+ case MSG_INTR_ENDINTRO:
+ g_vars->sceneIntro_playing = 0;
+ return 0;
+
+ case MSG_INTR_SWITCHTO1:
+ sceneHandlerIntroDemo_part1();
+ return 0;
+
+ case MSG_INTR_GETUPMAN:
+ g_vars->sceneIntro_needSleep = 0;
+ g_vars->sceneIntro_needGetup = 1;
+ return 0;
+
+ case MSG_INTR_SWITCHTO2:
+ sceneHandlerIntroDemo_part2();
+ return 0;
+
+ case 33:
+ g_fp->startSceneTrack();
+ break;
+
+ default:
+ return 0;
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 4861699f7e..adc4fe3731 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -288,8 +288,13 @@ bool FullpipeEngine::loadGam(const char *fname, int scene) {
addMessageHandlerByIndex(global_messageHandler1, 0, 4);
_inventory = getGameLoaderInventory();
- _inventory->setItemFlags(ANI_INV_MAP, 0x10003);
- _inventory->addItem(ANI_INV_MAP, 1);
+
+ if (isDemo() && getLanguage() == Common::RU_RUS) {
+ _inventory->addItem(ANI_INV_HAMMER, 1);
+ } else {
+ _inventory->setItemFlags(ANI_INV_MAP, 0x10003);
+ _inventory->addItem(ANI_INV_MAP, 1);
+ }
_inventory->rebuildItemRects();
@@ -333,8 +338,13 @@ bool FullpipeEngine::loadGam(const char *fname, int scene) {
_gameLoader->loadScene(SC_INTRO1);
_gameLoader->gotoScene(SC_INTRO1, TrubaUp);
} else {
- _gameLoader->loadScene(SC_1);
- _gameLoader->gotoScene(SC_1, TrubaLeft);
+ if (g_fp->isDemo() && g_fp->getLanguage() == Common::RU_RUS) {
+ _gameLoader->loadScene(SC_9);
+ _gameLoader->gotoScene(SC_9, TrubaDown);
+ } else {
+ _gameLoader->loadScene(SC_1);
+ _gameLoader->gotoScene(SC_1, TrubaLeft);
+ }
}
}
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index bf769e2f61..ece4f43e9f 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -137,8 +137,8 @@ StaticANIObject::StaticANIObject() {
_movement = 0;
_statics = 0;
_flags = 0;
- _callback1 = 0;
- _callback2 = 0;
+ _callback1 = 0; // Really NULL
+ _callback2 = 0; // Really NULL
_sceneId = -1;
_someDynamicPhaseIndex = -1;
diff --git a/engines/mohawk/cursors.cpp b/engines/mohawk/cursors.cpp
index abc1322340..b78f71a71d 100644
--- a/engines/mohawk/cursors.cpp
+++ b/engines/mohawk/cursors.cpp
@@ -122,8 +122,13 @@ void MystCursorManager::setCursor(uint16 id) {
if (surface->format.bytesPerPixel == 1) {
// The transparent color is almost always 255, except for the main cursor (100)
// in the D'ni archive, where it is 0.
- // Using the color of the first pixel as the transparent color seems to always work.
- byte transparentColor = ((byte *)surface->getPixels())[0];
+ // Using the color of the first pixel as the transparent color for the main cursor always works.
+ byte transparentColor;
+ if (id == kDefaultMystCursor) {
+ transparentColor = ((byte *)surface->getPixels())[0];
+ } else {
+ transparentColor = 255;
+ }
CursorMan.replaceCursor(surface->getPixels(), surface->w, surface->h, hotspotX, hotspotY, transparentColor);
// We're using the screen palette for the original game, but we need
diff --git a/engines/mohawk/myst.cpp b/engines/mohawk/myst.cpp
index 6b91e74bb2..e887436e98 100644
--- a/engines/mohawk/myst.cpp
+++ b/engines/mohawk/myst.cpp
@@ -401,6 +401,25 @@ bool MohawkEngine_Myst::skippableWait(uint32 duration) {
return skipped;
}
+void MohawkEngine_Myst::pollAndDiscardEvents() {
+ // Poll the events to update the mouse cursor position
+ Common::Event event;
+ while (_system->getEventManager()->pollEvent(event)) {
+ switch (event.type) {
+ case Common::EVENT_KEYDOWN:
+ switch (event.kbd.keycode) {
+ case Common::KEYCODE_SPACE:
+ pauseGame();
+ break;
+ default:
+ break;
+ }
+ default:
+ break;
+ }
+ }
+}
+
void MohawkEngine_Myst::changeToStack(uint16 stack, uint16 card, uint16 linkSrcSound, uint16 linkDstSound) {
debug(2, "changeToStack(%d)", stack);
diff --git a/engines/mohawk/myst.h b/engines/mohawk/myst.h
index 0491e853b6..2414b71cb1 100644
--- a/engines/mohawk/myst.h
+++ b/engines/mohawk/myst.h
@@ -187,6 +187,7 @@ public:
uint16 getMainCursor() { return _mainCursor; }
void checkCursorHints();
MystArea *updateCurrentResource();
+ void pollAndDiscardEvents();
bool skippableWait(uint32 duration);
MystSoundBlock readSoundBlock(Common::ReadStream *stream) const;
diff --git a/engines/mohawk/myst_graphics.cpp b/engines/mohawk/myst_graphics.cpp
index 427fba4d22..333da402fa 100644
--- a/engines/mohawk/myst_graphics.cpp
+++ b/engines/mohawk/myst_graphics.cpp
@@ -243,6 +243,7 @@ void MystGraphics::runTransition(TransitionType type, Common::Rect rect, uint16
area.right = area.left + step;
_vm->_system->delayMillis(delay);
+ _vm->pollAndDiscardEvents();
copyBackBufferToScreen(area);
_vm->_system->updateScreen();
@@ -266,6 +267,7 @@ void MystGraphics::runTransition(TransitionType type, Common::Rect rect, uint16
area.left = area.right - step;
_vm->_system->delayMillis(delay);
+ _vm->pollAndDiscardEvents();
copyBackBufferToScreen(area);
_vm->_system->updateScreen();
@@ -309,6 +311,7 @@ void MystGraphics::runTransition(TransitionType type, Common::Rect rect, uint16
area.bottom = area.top + step;
_vm->_system->delayMillis(delay);
+ _vm->pollAndDiscardEvents();
copyBackBufferToScreen(area);
_vm->_system->updateScreen();
@@ -332,6 +335,7 @@ void MystGraphics::runTransition(TransitionType type, Common::Rect rect, uint16
area.top = area.bottom - step;
_vm->_system->delayMillis(delay);
+ _vm->pollAndDiscardEvents();
copyBackBufferToScreen(area);
_vm->_system->updateScreen();
@@ -456,6 +460,7 @@ void MystGraphics::transitionDissolve(Common::Rect rect, uint step) {
}
_vm->_system->unlockScreen();
+ _vm->pollAndDiscardEvents();
_vm->_system->updateScreen();
}
@@ -475,6 +480,7 @@ void MystGraphics::transitionSlideToLeft(Common::Rect rect, uint16 steps, uint16
simulatePreviousDrawDelay(dstRect);
_vm->_system->copyRectToScreen(_backBuffer->getBasePtr(dstRect.left, dstRect.top),
_backBuffer->pitch, srcRect.left, srcRect.top, srcRect.width(), srcRect.height());
+ _vm->pollAndDiscardEvents();
_vm->_system->updateScreen();
}
@@ -500,6 +506,7 @@ void MystGraphics::transitionSlideToRight(Common::Rect rect, uint16 steps, uint1
simulatePreviousDrawDelay(dstRect);
_vm->_system->copyRectToScreen(_backBuffer->getBasePtr(dstRect.left, dstRect.top),
_backBuffer->pitch, srcRect.left, srcRect.top, srcRect.width(), srcRect.height());
+ _vm->pollAndDiscardEvents();
_vm->_system->updateScreen();
}
@@ -525,6 +532,7 @@ void MystGraphics::transitionSlideToTop(Common::Rect rect, uint16 steps, uint16
simulatePreviousDrawDelay(dstRect);
_vm->_system->copyRectToScreen(_backBuffer->getBasePtr(dstRect.left, dstRect.top),
_backBuffer->pitch, srcRect.left, srcRect.top, srcRect.width(), srcRect.height());
+ _vm->pollAndDiscardEvents();
_vm->_system->updateScreen();
}
@@ -551,6 +559,7 @@ void MystGraphics::transitionSlideToBottom(Common::Rect rect, uint16 steps, uint
simulatePreviousDrawDelay(dstRect);
_vm->_system->copyRectToScreen(_backBuffer->getBasePtr(dstRect.left, dstRect.top),
_backBuffer->pitch, srcRect.left, srcRect.top, srcRect.width(), srcRect.height());
+ _vm->pollAndDiscardEvents();
_vm->_system->updateScreen();
}
@@ -575,6 +584,7 @@ void MystGraphics::transitionPartialToRight(Common::Rect rect, uint32 width, uin
simulatePreviousDrawDelay(dstRect);
_vm->_system->copyRectToScreen(_backBuffer->getBasePtr(dstRect.left, dstRect.top),
_backBuffer->pitch, srcRect.left, srcRect.top, srcRect.width(), srcRect.height());
+ _vm->pollAndDiscardEvents();
_vm->_system->updateScreen();
}
@@ -596,6 +606,7 @@ void MystGraphics::transitionPartialToLeft(Common::Rect rect, uint32 width, uint
simulatePreviousDrawDelay(dstRect);
_vm->_system->copyRectToScreen(_backBuffer->getBasePtr(dstRect.left, dstRect.top),
_backBuffer->pitch, srcRect.left, srcRect.top, srcRect.width(), srcRect.height());
+ _vm->pollAndDiscardEvents();
_vm->_system->updateScreen();
}
diff --git a/engines/queen/display.cpp b/engines/queen/display.cpp
index b2213f7fee..0611381547 100644
--- a/engines/queen/display.cpp
+++ b/engines/queen/display.cpp
@@ -1625,7 +1625,7 @@ const uint8 Display::_fontRussian[] = {
0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xee, 0xc6, 0xfe, 0xfe, 0x00,
0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0xfc, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xfc, 0x00,
0xfc, 0xc6, 0xc6, 0xfc, 0xc6, 0xc6, 0xfc, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00,
- 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xfc, 0x00, 0xfe, 0xc0, 0xc0, 0xf8, 0xc0, 0xc0, 0xfe, 0x00,
+ 0x1e, 0x26, 0x66, 0x66, 0x66, 0x66, 0xff, 0x00, 0xfe, 0xc0, 0xc0, 0xf8, 0xc0, 0xc0, 0xfe, 0x00,
0xd6, 0xd6, 0xd6, 0x7c, 0xd6, 0xd6, 0xd6, 0x00, 0x7c, 0xc6, 0x06, 0x1c, 0x06, 0xc6, 0x7c, 0x00,
0xc6, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0x00, 0xd6, 0xd6, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0x00,
0xc6, 0xcc, 0xd8, 0xf0, 0xd8, 0xcc, 0xc6, 0x00, 0x3c, 0x66, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00,
@@ -1633,7 +1633,7 @@ const uint8 Display::_fontRussian[] = {
0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00,
0xfc, 0xc6, 0xc6, 0xc6, 0xfc, 0xc0, 0xc0, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c, 0x00,
0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x7c, 0x00,
- 0x10, 0x7c, 0xd6, 0xd6, 0xd6, 0x7c, 0x10, 0x00, 0xc6, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0xc6, 0x00,
+ 0x7c, 0xd6, 0xd6, 0xd6, 0x7c, 0x10, 0x10, 0x00, 0xc6, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0xc6, 0x00,
0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xff, 0x00, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x00,
0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xfe, 0x00, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xff, 0x01,
0xe0, 0x60, 0x60, 0x7c, 0x66, 0x66, 0x7c, 0x00, 0xc6, 0xc6, 0xc6, 0xf6, 0xde, 0xde, 0xf6, 0x00,
diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h
index 4a3d13cbed..68dad834ac 100644
--- a/engines/sci/detection_tables.h
+++ b/engines/sci/detection_tables.h
@@ -1561,6 +1561,21 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ // King's Quest 5 - English DOS Floppy (from telanus, bug report Trac#9624)
+ // Game version 0.000.062
+ {"kq5", "", {
+ {"resource.map", 0, "86a4ae3fafb1bbcc81b78cf427e45ba0", 8184},
+ {"resource.001", 0, "51797b784eccab97d1d4b1f8dc3ef671", 1099768},
+ {"resource.002", 0, "93c6f0fc7682fda52a632f34bcc1c975", 1060941},
+ {"resource.003", 0, "44388574401a25938f660dca90bdd040", 1109594},
+ {"resource.000", 0, "a591bd4b879fc832b8095c0b3befe9e2", 276351},
+ {"resource.007", 0, "a4cb2eba783a7b05f5b005d47bd94936", 1133814},
+ {"resource.004", 0, "464109fa0fd76f722fff73fd26e98271", 1153791},
+ {"resource.005", 0, "3c292d392c3cc3b532e9063d0d1fb7aa", 1032802},
+ {"resource.006", 0, "0380ee8181b39a8d7b66daf61a5b7d51", 921308},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+
// King's Quest V DOS 0.000.062 EGA (5 x 5.25" disks)
// Supplied by ssburnout in bug report #3046780
{"kq5", "EGA", {
@@ -4077,6 +4092,20 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ // Space Quest 3 - English DOS (from telanus, bug report Trac#9626)
+ // Game version 1.0P 1989-03-22
+ // SCI interpreter version 0.000.453
+ {"sq3", "", {
+ {"resource.map", 0, "6dd8f59dd8a0c8131f34b159044e645e", 5598},
+ {"resource.001", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 170496},
+ {"resource.002", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 312537},
+ {"resource.003", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 325576},
+ {"resource.004", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 321377},
+ {"resource.005", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 328162},
+ {"resource.006", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 356560},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+
// Space Quest 3 - English DOS (from abevi, bug report #2612718)
{"sq3", "", {
{"resource.map", 0, "eca165515c6b62b05fa86b7d8f727660", 5598},
diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h
index 03c8a673a8..5fb1ab6c66 100644
--- a/engines/sci/engine/kernel.h
+++ b/engines/sci/engine/kernel.h
@@ -591,6 +591,7 @@ reg_t kListIndexOf(EngineState *s, int argc, reg_t *argv);
reg_t kListEachElementDo(EngineState *s, int argc, reg_t *argv);
reg_t kListFirstTrue(EngineState *s, int argc, reg_t *argv);
reg_t kListAllTrue(EngineState *s, int argc, reg_t *argv);
+reg_t kListSort(EngineState *s, int argc, reg_t *argv);
reg_t kEditText(EngineState *s, int argc, reg_t *argv);
reg_t kSetScroll(EngineState *s, int argc, reg_t *argv);
diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h
index 8093147cb4..2db3c59e64 100644
--- a/engines/sci/engine/kernel_tables.h
+++ b/engines/sci/engine/kernel_tables.h
@@ -429,12 +429,12 @@ static const SciKernelMapSubEntry kList_subops[] = {
{ SIG_SINCE_SCI21, 14, MAP_CALL(MoveToEnd), "ln", NULL },
{ SIG_SINCE_SCI21, 15, MAP_CALL(FindKey), "l.", NULL },
{ SIG_SINCE_SCI21, 16, MAP_CALL(DeleteKey), "l.", NULL },
- { SIG_SINCE_SCI21, 17, MAP_CALL(ListAt), "li", NULL },
+ { SIG_SINCE_SCI21, 17, MAP_CALL(ListAt), "li", kListAt_workarounds },
{ SIG_SINCE_SCI21, 18, MAP_CALL(ListIndexOf) , "l[io]", NULL },
{ SIG_SINCE_SCI21, 19, MAP_CALL(ListEachElementDo), "li(.*)", NULL },
{ SIG_SINCE_SCI21, 20, MAP_CALL(ListFirstTrue), "li(.*)", NULL },
{ SIG_SINCE_SCI21, 21, MAP_CALL(ListAllTrue), "li(.*)", NULL },
- { SIG_SINCE_SCI21, 22, MAP_CALL(Sort), "ooo", NULL },
+ { SIG_SINCE_SCI21, 22, MAP_CALL(ListSort), "li(i)", NULL },
SCI_SUBOPENTRY_TERMINATOR
};
@@ -743,7 +743,7 @@ static SciKernelMapEntry s_kernelMap[] = {
{ MAP_CALL(Platform), SIG_SCI16, SIGFOR_ALL, "(.*)", NULL, NULL },
#ifdef ENABLE_SCI32
{ "Platform", kPlatform32, SIG_SCI32, SIGFOR_MAC, "(.*)", NULL, NULL },
- { "Platform", kPlatform32, SIG_SCI32, SIGFOR_ALL, "(i)", NULL, NULL },
+ { "Platform", kPlatform32, SIG_SCI32, SIGFOR_ALL, "(i)", NULL, kPlatform32_workarounds },
#endif
{ MAP_CALL(Portrait), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop
{ MAP_CALL(PrevNode), SIG_EVERYWHERE, "n", NULL, NULL },
diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp
index 16ce2363d7..de5d7f1536 100644
--- a/engines/sci/engine/klists.cpp
+++ b/engines/sci/engine/klists.cpp
@@ -302,14 +302,14 @@ reg_t kAddToEnd(EngineState *s, int argc, reg_t *argv) {
reg_t kAddAfter(EngineState *s, int argc, reg_t *argv) {
List *list = s->_segMan->lookupList(argv[0]);
- Node *firstnode = argv[1].isNull() ? NULL : s->_segMan->lookupNode(argv[1]);
- Node *newnode = s->_segMan->lookupNode(argv[2]);
+ Node *firstNode = s->_segMan->lookupNode(argv[1]);
+ Node *newNode = s->_segMan->lookupNode(argv[2]);
#ifdef CHECK_LISTS
checkListPointer(s->_segMan, argv[0]);
#endif
- if (!newnode) {
+ if (!newNode) {
error("New 'node' %04x:%04x is not a node", PRINT_REG(argv[2]));
return NULL_REG;
}
@@ -320,22 +320,64 @@ reg_t kAddAfter(EngineState *s, int argc, reg_t *argv) {
}
if (argc == 4)
- newnode->key = argv[3];
+ newNode->key = argv[3];
- if (firstnode) { // We're really appending after
- reg_t oldnext = firstnode->succ;
+ if (firstNode) { // We're really appending after
+ const reg_t oldNext = firstNode->succ;
- newnode->pred = argv[1];
- firstnode->succ = argv[2];
- newnode->succ = oldnext;
+ newNode->pred = argv[1];
+ firstNode->succ = argv[2];
+ newNode->succ = oldNext;
- if (oldnext.isNull()) // Appended after last node?
+ if (oldNext.isNull()) // Appended after last node?
// Set new node as last list node
list->last = argv[2];
else
- s->_segMan->lookupNode(oldnext)->pred = argv[2];
+ s->_segMan->lookupNode(oldNext)->pred = argv[2];
- } else { // !firstnode
+ } else {
+ addToFront(s, argv[0], argv[2]); // Set as initial list node
+ }
+
+ return s->r_acc;
+}
+
+reg_t kAddBefore(EngineState *s, int argc, reg_t *argv) {
+ List *list = s->_segMan->lookupList(argv[0]);
+ Node *firstNode = s->_segMan->lookupNode(argv[1]);
+ Node *newNode = s->_segMan->lookupNode(argv[2]);
+
+#ifdef CHECK_LISTS
+ checkListPointer(s->_segMan, argv[0]);
+#endif
+
+ if (!newNode) {
+ error("New 'node' %04x:%04x is not a node", PRINT_REG(argv[2]));
+ return NULL_REG;
+ }
+
+ if (argc != 3 && argc != 4) {
+ error("kAddBefore: Haven't got 3 or 4 arguments, aborting");
+ return NULL_REG;
+ }
+
+ if (argc == 4)
+ newNode->key = argv[3];
+
+ if (firstNode) { // We're really appending before
+ const reg_t oldPred = firstNode->pred;
+
+ newNode->succ = argv[1];
+ firstNode->pred = argv[2];
+ newNode->pred = oldPred;
+
+ if (oldPred.isNull()) // Appended before first node?
+ // Set new node as first list node
+ list->first = argv[2];
+ else
+ s->_segMan->lookupNode(oldPred)->succ = argv[2];
+
+ } else {
addToFront(s, argv[0], argv[2]); // Set as initial list node
}
@@ -686,17 +728,56 @@ reg_t kListAllTrue(EngineState *s, int argc, reg_t *argv) {
return s->r_acc;
}
+reg_t kListSort(EngineState *s, int argc, reg_t *argv) {
+ List *list = s->_segMan->lookupList(argv[0]);
+ const int16 selector = argv[1].toSint16();
+ const bool isDescending = argc > 2 ? (bool)argv[2].toUint16() : false;
+
+ reg_t firstNode = list->first;
+ for (reg_t node = firstNode; node != NULL_REG; node = s->_segMan->lookupNode(firstNode)->succ) {
+
+ reg_t a;
+ if (selector == -1) {
+ a = s->_segMan->lookupNode(node)->value;
+ } else {
+ a = readSelector(s->_segMan, s->_segMan->lookupNode(node)->value, selector);
+ }
+
+ firstNode = node;
+ for (reg_t newNode = s->_segMan->lookupNode(node)->succ; newNode != NULL_REG; newNode = s->_segMan->lookupNode(newNode)->succ) {
+ reg_t b;
+ if (selector == -1) {
+ b = s->_segMan->lookupNode(newNode)->value;
+ } else {
+ b = readSelector(s->_segMan, s->_segMan->lookupNode(newNode)->value, selector);
+ }
+
+ if ((!isDescending && b < a) || (isDescending && a < b)) {
+ firstNode = newNode;
+ a = b;
+ }
+ }
+
+ if (firstNode != node) {
+ reg_t buf[4] = { argv[0], s->_segMan->lookupNode(firstNode)->key };
+ kDeleteKey(s, 2, buf);
+
+ buf[1] = node;
+ buf[2] = firstNode;
+ buf[3] = s->_segMan->lookupNode(firstNode)->value;
+ kAddBefore(s, 4, buf);
+ }
+ }
+
+ return s->r_acc;
+}
+
reg_t kList(EngineState *s, int argc, reg_t *argv) {
if (!s)
return make_reg(0, getSciVersion());
error("not supposed to call this");
}
-reg_t kAddBefore(EngineState *s, int argc, reg_t *argv) {
- error("Unimplemented function kAddBefore called");
- return s->r_acc;
-}
-
reg_t kMoveToFront(EngineState *s, int argc, reg_t *argv) {
error("Unimplemented function kMoveToFront called");
return s->r_acc;
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp
index dbc351d8f2..dcefa219f7 100644
--- a/engines/sci/engine/script_patches.cpp
+++ b/engines/sci/engine/script_patches.cpp
@@ -4601,7 +4601,7 @@ static const uint16 sq6SlowTransitionSignature1[] = {
};
static const uint16 sq6SlowTransitionPatch1[] = {
- 0x38, SIG_UINT16(180), // pushi 180
+ 0x38, SIG_UINT16(500), // pushi 500
PATCH_END
};
diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp
index 9ed97723d0..54b925a1b6 100644
--- a/engines/sci/engine/scriptdebug.cpp
+++ b/engines/sci/engine/scriptdebug.cpp
@@ -99,17 +99,6 @@ reg_t disassemble(EngineState *s, reg32_t pos, reg_t objAddr, bool printBWTag, b
debugN("%04x:%04x: ", PRINT_REG(pos));
- if (opcode == op_pushSelf) { // 0x3e (62)
- if ((opsize & 1) && g_sci->getGameId() != GID_FANMADE) {
- // Debug opcode op_file
- debugN("file \"%s\"\n", scr + pos.getOffset() + 1); // +1: op_pushSelf size
- retval.incOffset(bytecount - 1);
- return retval;
- }
- }
-
- opsize &= 1; // byte if true, word if false
-
if (printBytecode) {
if (pos.getOffset() + bytecount > scr_size) {
warning("Operation arguments extend beyond end of script");
@@ -123,9 +112,18 @@ reg_t disassemble(EngineState *s, reg32_t pos, reg_t objAddr, bool printBWTag, b
debugN(" ");
}
+ opsize &= 1; // byte if true, word if false
+
if (printBWTag)
debugN("[%c] ", opsize ? 'B' : 'W');
+ if (opcode == op_pushSelf && opsize && g_sci->getGameId() != GID_FANMADE) { // 0x3e (62)
+ // Debug opcode op_file
+ debugN("file \"%s\"\n", scr + pos.getOffset() + 1); // +1: op_pushSelf size
+ retval.incOffset(bytecount - 1);
+ return retval;
+ }
+
#ifndef REDUCE_MEMORY_USAGE
debugN("%-5s", opcodeNames[opcode]);
#endif
diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp
index 4e9c59b225..0c8ff2714b 100644
--- a/engines/sci/engine/workarounds.cpp
+++ b/engines/sci/engine/workarounds.cpp
@@ -125,6 +125,23 @@ static const uint16 sig_uninitread_hoyle4_1[] = {
SIG_END
};
+// Game: Hoyle 5
+// Calling method: export 2
+// Subroutine offset: 0x2fb2 (script 300)
+// Applies to at least: English PC demo
+static const uint16 sig_uninitread_hoyle5_1[] = {
+
+ 0x7e, SIG_ADDTOOFFSET(2), // line N
+ 0x7d, 0x68, 0x65, 0x61, 0x72,
+ 0x74, 0x73, 0x2e, 0x73,
+ 0x63, 0x00, // file "hearts.sc"
+ 0x3f, 0x01, // link 01
+ 0x7e, SIG_ADDTOOFFSET(2), // line N
+ 0x39, 0x4b, // pushi 4bh
+ 0x78, // push1
+ SIG_END
+};
+
// Game: Jones in the fast lane
// Calling method: weekendText::draw
// Subroutine offset: 0x03d3 (script 232)
@@ -280,6 +297,10 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = {
{ GID_HOYLE4, 500, 17, 1, "Character", "say", NULL, 504, { WORKAROUND_FAKE, 0 } }, // sometimes while playing Cribbage (e.g. when the opponent says "Last Card") - bug #5662
{ GID_HOYLE4, 800, 870, 0, "EuchreStrategy", "thinkLead", NULL, 0, { WORKAROUND_FAKE, 0 } }, // while playing Euchre, happens at least on 2nd or 3rd turn - bug #6602
{ GID_HOYLE4, -1, 937, 0, "IconBar", "dispatchEvent", NULL, 408, { WORKAROUND_FAKE, 0 } }, // pressing ENTER on scoreboard while mouse is not on OK button, may not happen all the time - bug #6603
+ { GID_HOYLE5, -1, 14, -1, NULL, "select", NULL, 1, { WORKAROUND_FAKE, 0 } }, // dragging the sliders in game settings
+ { GID_HOYLE5, -1, 64937, -1, NULL, "select", NULL, 7, { WORKAROUND_FAKE, 0 } }, // clicking the "control" and "options" buttons in the icon bar
+ { GID_HOYLE5, -1, 64937, -1, "IconBar", "handleEvent", NULL, 0, { WORKAROUND_FAKE, 0 } }, // clicking on any button in the icon bar
+ { GID_HOYLE5, 300, 300, 0, "", "export 2", sig_uninitread_hoyle5_1, 0, { WORKAROUND_FAKE, 0 } }, // after passing around cards in hearts
{ GID_ISLANDBRAIN, 100, 937, 0, "IconBar", "dispatchEvent", NULL, 58, { WORKAROUND_FAKE, 0 } }, // when using ENTER at the startup menu - bug #5241
{ GID_ISLANDBRAIN, 140, 140, 0, "piece", "init", NULL, 3, { WORKAROUND_FAKE, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0
{ GID_ISLANDBRAIN, 200, 268, 0, "anElement", "select", NULL, 0, { WORKAROUND_FAKE, 0 } }, // elements puzzle, gets used before super TextIcon
@@ -530,6 +551,7 @@ 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
{ GID_PQ4, -1, 64989, 0, NULL, "play", NULL, 0, { WORKAROUND_STILLCALL, 0 } }, // always passes an extra null argument
+ { GID_KQ7, -1, 64989, 0, NULL, "play", NULL, 0, { WORKAROUND_STILLCALL, 0 } }, // always passes an extra null argument
{ GID_GK1, -1, 64989, 0, NULL, "play", NULL, 0, { WORKAROUND_STILLCALL, 0 } }, // Mac version always passes an extra null argument
SCI_WORKAROUNDENTRY_TERMINATOR
};
@@ -665,6 +687,12 @@ const SciWorkaroundEntry kIsObject_workarounds[] = {
SCI_WORKAROUNDENTRY_TERMINATOR
};
+// gameID, room,script,lvl, object-name, method-name, local-call-signature, index, workaround
+const SciWorkaroundEntry kListAt_workarounds[] = {
+ { GID_HOYLE5, 100, 64999, 0, "theHands", "at", NULL, 0, { WORKAROUND_FAKE, 0 } }, // After the first hand is dealt in Crazy Eights game in demo, an object is passed instead of a number
+ SCI_WORKAROUNDENTRY_TERMINATOR
+};
+
// gameID, room,script,lvl, object-name, method-name, local-call-signature, index, workaround
const SciWorkaroundEntry kMemory_workarounds[] = {
{ GID_LAURABOW2, -1, 999, 0, "", "export 6", NULL, 0, { WORKAROUND_FAKE, 0 } }, // during the intro, when exiting the train (room 160), talking to Mr. Augustini, etc. - bug #4944
@@ -691,6 +719,12 @@ const SciWorkaroundEntry kPalVarySetPercent_workarounds[] = {
};
// gameID, room,script,lvl, object-name, method-name, local-call-signature, index, workaround
+const SciWorkaroundEntry kPlatform32_workarounds[] = {
+ { GID_HOYLE5, -1, 0, 0, "hoyle4", "newRoom", NULL, 0, { WORKAROUND_FAKE, 1 } }, // at the start of the game, incorrectly uses SCI16 calling convention for kPlatform
+ SCI_WORKAROUNDENTRY_TERMINATOR
+};
+
+// gameID, room,script,lvl, object-name, method-name, local-call-signature, index, workaround
const SciWorkaroundEntry kRandom_workarounds[] = {
{ GID_TORIN, 51400,64928, 0, "Blink", "init", NULL, 0, { WORKAROUND_STILLCALL, 0 } }, // when Lycentia knocks Torin out after he removes her collar
{ GID_TORIN, 51400,64928, 0, "Blink", "cycleDone", NULL, 0, { WORKAROUND_STILLCALL, 0 } }, // when Lycentia knocks Torin out after he removes her collar
diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h
index 2d72ae5811..86b4ee2902 100644
--- a/engines/sci/engine/workarounds.h
+++ b/engines/sci/engine/workarounds.h
@@ -82,10 +82,12 @@ extern const SciWorkaroundEntry kGraphFillBoxForeground_workarounds[];
extern const SciWorkaroundEntry kGraphFillBoxAny_workarounds[];
extern const SciWorkaroundEntry kGraphRedrawBox_workarounds[];
extern const SciWorkaroundEntry kIsObject_workarounds[];
+extern const SciWorkaroundEntry kListAt_workarounds[];
extern const SciWorkaroundEntry kMemory_workarounds[];
extern const SciWorkaroundEntry kMoveCursor_workarounds[];
extern const SciWorkaroundEntry kNewWindow_workarounds[];
extern const SciWorkaroundEntry kPalVarySetPercent_workarounds[];
+extern const SciWorkaroundEntry kPlatform32_workarounds[];
extern const SciWorkaroundEntry kRandom_workarounds[];
extern const SciWorkaroundEntry kReadNumber_workarounds[];
extern const SciWorkaroundEntry kResCheck_workarounds[];
diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp
index 75a885da57..864327feaa 100644
--- a/engines/sci/graphics/picture.cpp
+++ b/engines/sci/graphics/picture.cpp
@@ -1212,6 +1212,7 @@ void GfxPicture::vectorPatternTexturedBox(Common::Rect box, byte color, byte pri
void GfxPicture::vectorPatternCircle(Common::Rect box, byte size, byte color, byte prio, byte control) {
byte flag = _screen->getDrawingMask(color, prio, control);
+ assert(size < ARRAYSIZE(vectorPatternCircles));
const byte *circleData = vectorPatternCircles[size];
byte bitmap = *circleData;
byte bitNo = 0;
@@ -1219,21 +1220,23 @@ void GfxPicture::vectorPatternCircle(Common::Rect box, byte size, byte color, by
for (y = box.top; y < box.bottom; y++) {
for (x = box.left; x < box.right; x++) {
+ if (bitNo == 8) {
+ circleData++;
+ bitmap = *circleData;
+ bitNo = 0;
+ }
if (bitmap & 1) {
_screen->vectorPutPixel(x, y, flag, color, prio, control);
}
bitNo++;
- if (bitNo == 8) {
- circleData++; bitmap = *circleData; bitNo = 0;
- } else {
- bitmap = bitmap >> 1;
- }
+ bitmap >>= 1;
}
}
}
void GfxPicture::vectorPatternTexturedCircle(Common::Rect box, byte size, byte color, byte prio, byte control, byte texture) {
byte flag = _screen->getDrawingMask(color, prio, control);
+ assert(size < ARRAYSIZE(vectorPatternCircles));
const byte *circleData = vectorPatternCircles[size];
byte bitmap = *circleData;
byte bitNo = 0;
@@ -1242,6 +1245,11 @@ void GfxPicture::vectorPatternTexturedCircle(Common::Rect box, byte size, byte c
for (y = box.top; y < box.bottom; y++) {
for (x = box.left; x < box.right; x++) {
+ if (bitNo == 8) {
+ circleData++;
+ bitmap = *circleData;
+ bitNo = 0;
+ }
if (bitmap & 1) {
if (*textureData) {
_screen->vectorPutPixel(x, y, flag, color, prio, control);
@@ -1249,11 +1257,7 @@ void GfxPicture::vectorPatternTexturedCircle(Common::Rect box, byte size, byte c
textureData++;
}
bitNo++;
- if (bitNo == 8) {
- circleData++; bitmap = *circleData; bitNo = 0;
- } else {
- bitmap = bitmap >> 1;
- }
+ bitmap >>= 1;
}
}
}
diff --git a/engines/sci/graphics/transitions32.cpp b/engines/sci/graphics/transitions32.cpp
index bad0185179..a1ae352b6c 100644
--- a/engines/sci/graphics/transitions32.cpp
+++ b/engines/sci/graphics/transitions32.cpp
@@ -41,8 +41,7 @@ static int16 divisionsDefaults[2][16] = {
};
GfxTransitions32::GfxTransitions32(SegManager *segMan) :
- _segMan(segMan),
- _throttleState(0) {
+ _segMan(segMan) {
for (int i = 0; i < 236; i += 2) {
_styleRanges[i] = 0;
_styleRanges[i + 1] = -1;
@@ -67,17 +66,8 @@ GfxTransitions32::~GfxTransitions32() {
_scrolls.clear();
}
-void GfxTransitions32::throttle() {
- uint8 throttleTime;
- if (_throttleState == 2) {
- throttleTime = 34;
- _throttleState = 0;
- } else {
- throttleTime = 33;
- ++_throttleState;
- }
-
- g_sci->getEngineState()->speedThrottler(throttleTime);
+void GfxTransitions32::throttle(const uint32 ms) {
+ g_sci->getEngineState()->speedThrottler(ms);
g_sci->getEngineState()->_throttleTrigger = true;
}
@@ -936,7 +926,7 @@ void GfxTransitions32::processScrolls() {
}
}
- throttle();
+ throttle(33);
}
void GfxTransitions32::kernelSetScroll(const reg_t planeId, const int16 deltaX, const int16 deltaY, const GuiResourceId pictureId, const bool animate, const bool mirrorX) {
@@ -1005,7 +995,7 @@ void GfxTransitions32::kernelSetScroll(const reg_t planeId, const int16 deltaX,
while (!finished && !g_engine->shouldQuit()) {
finished = processScroll(*scroll);
g_sci->_gfxFrameout->frameOut(true);
- throttle();
+ throttle(33);
}
}
diff --git a/engines/sci/graphics/transitions32.h b/engines/sci/graphics/transitions32.h
index 12e0d64ec7..0c828a20f7 100644
--- a/engines/sci/graphics/transitions32.h
+++ b/engines/sci/graphics/transitions32.h
@@ -239,11 +239,20 @@ private:
SegManager *_segMan;
/**
- * Throttles transition playback to prevent transitions from being instant
- * on fast computers.
- */
- void throttle();
- int8 _throttleState;
+ * Throttles transition playback to prevent transitions from being
+ * instantaneous on modern computers.
+ *
+ * kSetShowStyle transitions are throttled at 10ms intervals, under the
+ * assumption that the default fade transition of 101 divisions was designed
+ * to finish in one second. Empirically, this seems to roughly match the
+ * speed of DOSBox, and feels reasonable.
+ *
+ * Transitions using kSetScroll (used in the LSL6hires intro) need to be
+ * slower, so they get throttled at 33ms instead of 10ms. This value was
+ * chosen by gut feel, as these scrolling transitions are instantaneous in
+ * DOSBox.
+ */
+ void throttle(const uint32 ms = 10);
void clearShowRects();
void addShowRect(const Common::Rect &rect);
diff --git a/engines/scumm/he/moonbase/distortion.cpp b/engines/scumm/he/moonbase/distortion.cpp
index 7aaec0ec64..f9a6670f19 100644
--- a/engines/scumm/he/moonbase/distortion.cpp
+++ b/engines/scumm/he/moonbase/distortion.cpp
@@ -48,7 +48,7 @@ static void blitDistortionCore(
if (!clipRect.intersects(*optionalclipRectPtr))
return;
- clipRect.clip(*optionalclipRectPtr);
+ clipRect.clip(*optionalclipRectPtr);
}
Common::Rect distortionRect(distortionBitmap->w, distortionBitmap->h);
diff --git a/engines/sky/logic.cpp b/engines/sky/logic.cpp
index ad656ac8df..207db3b497 100644
--- a/engines/sky/logic.cpp
+++ b/engines/sky/logic.cpp
@@ -245,7 +245,7 @@ void Logic::arAnim() {
// fine because the later collision will almost certainly
// take longer to clear than the earlier one.
- if (collide(_skyCompact->fetchCpt(_compact->waitingFor))) {
+ if (isCollision(_skyCompact->fetchCpt(_compact->waitingFor))) {
stopAndWait();
return;
}
@@ -280,7 +280,7 @@ void Logic::arAnim() {
if (cpt->screen != _compact->screen) // is it on our screen?
continue;
- if (collide(cpt)) { // check for a hit
+ if (isCollision(cpt)) { // check for a hit
// ok, we've hit a mega
// is it moving... or something else?
@@ -627,7 +627,7 @@ void Logic::stopped() {
Compact *cpt = _skyCompact->fetchCpt(_compact->waitingFor);
if (cpt)
- if (!cpt->mood && collide(cpt))
+ if (!cpt->mood && isCollision(cpt))
return;
// we are free, continue processing the script
@@ -720,88 +720,56 @@ void Logic::simpleAnim() {
logicScript();
}
-bool Logic::collide(Compact *cpt) {
- MegaSet *m1 = SkyCompact::getMegaSet(_compact);
- MegaSet *m2 = SkyCompact::getMegaSet(cpt);
+/** Checks if the currently processed object in _compact collides
+ with the one given as parameter */
+bool Logic::isCollision(Compact *other) {
+ MegaSet *thisMegaSet = SkyCompact::getMegaSet(_compact);
+ MegaSet *otherMegaSet = SkyCompact::getMegaSet(other);
// target's base coordinates
- uint16 x = cpt->xcood & 0xfff8;
- uint16 y = cpt->ycood & 0xfff8;
-
- // The collision is direction dependent
- switch (_compact->dir) {
- case 0: // looking up
- x -= m1->colOffset; // compensate for inner x offsets
- x += m2->colOffset;
-
- if ((x + m2->colWidth) < _compact->xcood) // their rightmost
- return false;
-
- x -= m1->colWidth; // our left, their right
- if (x >= _compact->xcood)
- return false;
-
- y += 8; // bring them down a line
- if (y == _compact->ycood)
- return true;
-
- y += 8; // bring them down a line
- if (y == _compact->ycood)
- return true;
-
- return false;
- case 1: // looking down
- x -= m1->colOffset; // compensate for inner x offsets
- x += m2->colOffset;
-
- if ((x + m2->colWidth) < _compact->xcood) // their rightmoast
- return false;
-
- x -= m1->colWidth; // our left, their right
- if (x >= _compact->xcood)
- return false;
-
- y -= 8; // bring them up a line
- if (y == _compact->ycood)
- return true;
-
- y -= 8; // bring them up a line
- if (y == _compact->ycood)
- return true;
-
- return false;
- case 2: // looking left
-
- if (y != _compact->ycood)
- return false;
-
- x += m2->lastChr;
- if (x == _compact->xcood)
- return true;
-
- x -= 8; // out another one
- if (x == _compact->xcood)
- return true;
-
- return false;
- case 3: // looking right
- case 4: // talking (not sure if this makes sense...)
-
- if (y != _compact->ycood)
- return false;
-
- x -= m1->lastChr; // last block
- if (x == _compact->xcood)
- return true;
+ uint16 otherX = other->xcood & ~7;
+ uint16 otherY = other->ycood & ~7;
+ if ((_compact->dir == UPY) || (_compact->dir == DOWNY)) { // If we're looking up or down...
+ otherX -= thisMegaSet->colOffset; // ...then compensate inner otherX offsets
+ otherX += otherMegaSet->colOffset;
+ }
- x -= 8; // out another block
- if (x != _compact->xcood)
+ if ((_compact->dir == UPY) || (_compact->dir == DOWNY)) {
+ // Check X coordinate, same for facing up or down
+ if (otherX + otherMegaSet->colWidth < _compact->xcood) // their rightmost
+ return false; // other is left of us
+
+ if (otherX - thisMegaSet->colWidth >= _compact->xcood) // our left, their right
+ return false; // other is right of us
+ // Check Y coordinate according to actual direction
+ if (_compact->dir == UPY) {
+ if (otherY + 8 == _compact->ycood)
+ return true;
+ if (otherY + 16 == _compact->ycood)
+ return true;
+ } else {
+ if (otherY - 8 == _compact->ycood)
+ return true;
+ if (otherY - 16 == _compact->ycood)
+ return true;
+ }
+ } else {
+ // Facing left, right (or talking, which probably never happens)
+ if (otherY != _compact->ycood)
return false;
-
- return true;
- default:
- error("Unknown Direction: %d", _compact->dir);
+ if (_compact->dir == LEFTY) { // looking left
+ if (otherX + otherMegaSet->lastChr == _compact->xcood)
+ return true;
+ if (otherX + otherMegaSet->lastChr - 8 == _compact->xcood)
+ return true;
+ } else {
+ if (otherX - thisMegaSet->lastChr == _compact->xcood)
+ return true;
+ if (otherX - thisMegaSet->lastChr - 8 == _compact->xcood)
+ return true;
+ }
}
+ return false;
}
void Logic::runGetOff() {
diff --git a/engines/sky/logic.h b/engines/sky/logic.h
index 8507fe7398..cd83e1a5f8 100644
--- a/engines/sky/logic.h
+++ b/engines/sky/logic.h
@@ -164,7 +164,7 @@ protected:
void push(uint32);
uint32 pop();
void checkModuleLoaded(uint16 moduleNo);
- bool collide(Compact *cpt);
+ bool isCollision(Compact *cpt);
void initScriptVariables();
void mainAnim();
void runGetOff();
diff --git a/engines/titanic/core/background.cpp b/engines/titanic/core/background.cpp
index 792cd28346..e9e8aa0bdf 100644
--- a/engines/titanic/core/background.cpp
+++ b/engines/titanic/core/background.cpp
@@ -30,7 +30,7 @@ BEGIN_MESSAGE_MAP(CBackground, CGameObject)
ON_MESSAGE(VisibleMsg)
END_MESSAGE_MAP()
-CBackground::CBackground() : CGameObject(), _startFrame(0), _endFrame(0), _fieldDC(0) {
+CBackground::CBackground() : CGameObject(), _startFrame(0), _endFrame(0), _isBlocking(false) {
}
void CBackground::save(SimpleFile *file, int indent) {
@@ -39,7 +39,7 @@ void CBackground::save(SimpleFile *file, int indent) {
file->writeNumberLine(_endFrame, indent);
file->writeQuotedLine(_string1, indent);
file->writeQuotedLine(_string2, indent);
- file->writeNumberLine(_fieldDC, indent);
+ file->writeNumberLine(_isBlocking, indent);
CGameObject::save(file, indent);
}
@@ -50,14 +50,14 @@ void CBackground::load(SimpleFile *file) {
_endFrame = file->readNumber();
_string1 = file->readString();
_string2 = file->readString();
- _fieldDC = file->readNumber();
+ _isBlocking = file->readNumber();
CGameObject::load(file);
}
bool CBackground::StatusChangeMsg(CStatusChangeMsg *msg) {
setVisible(true);
- if (_fieldDC) {
+ if (_isBlocking) {
playMovie(_startFrame, _endFrame, MOVIE_GAMESTATE);
} else {
playMovie(_startFrame, _endFrame, 0);
diff --git a/engines/titanic/core/background.h b/engines/titanic/core/background.h
index b7f160db28..6a1e4fd103 100644
--- a/engines/titanic/core/background.h
+++ b/engines/titanic/core/background.h
@@ -38,7 +38,7 @@ protected:
int _endFrame;
CString _string1;
CString _string2;
- int _fieldDC;
+ bool _isBlocking;
public:
CLASSDEF;
CBackground();
diff --git a/engines/titanic/core/game_object.cpp b/engines/titanic/core/game_object.cpp
index 3a5f6567a6..19cae3f330 100644
--- a/engines/titanic/core/game_object.cpp
+++ b/engines/titanic/core/game_object.cpp
@@ -867,10 +867,10 @@ CViewItem *CGameObject::parseView(const CString &viewString) {
// Ensure we have the specified room
if (project) {
- if (room->getName() != roomName) {
+ if (room->getName().compareToIgnoreCase(roomName)) {
// Scan for the correct room
for (room = project->findFirstRoom();
- room && room->getName() != roomName;
+ room && room->getName().compareToIgnoreCase(roomName);
room = project->findNextRoom(room)) ;
}
}
@@ -879,13 +879,13 @@ CViewItem *CGameObject::parseView(const CString &viewString) {
// Find the designated node within the room
CNodeItem *node = dynamic_cast<CNodeItem *>(room->findChildInstanceOf(CNodeItem::_type));
- while (node && node->getName() != nodeName)
+ while (node && node->getName().compareToIgnoreCase(nodeName))
node = dynamic_cast<CNodeItem *>(room->findNextInstanceOf(CNodeItem::_type, node));
if (!node)
return nullptr;
CViewItem *view = dynamic_cast<CViewItem *>(node->findChildInstanceOf(CViewItem::_type));
- while (view && view->getName() != viewName)
+ while (view && view->getName().compareToIgnoreCase(viewName))
view = dynamic_cast<CViewItem *>(node->findNextInstanceOf(CViewItem::_type, view));
if (!view)
return nullptr;
@@ -1046,12 +1046,12 @@ Season CGameObject::stateGetSeason() const {
return getGameManager()->_gameState._seasonNum;
}
-void CGameObject::stateSet24() {
- getGameManager()->_gameState.set24(1);
+void CGameObject::stateSetParrotMet() {
+ getGameManager()->_gameState.setParrotMet(true);
}
-int CGameObject::stateGet24() const {
- return getGameManager()->_gameState.get24();
+bool CGameObject::stateGetParrotMet() const {
+ return getGameManager()->_gameState.getParrotMet();
}
void CGameObject::stateInc38() {
diff --git a/engines/titanic/core/game_object.h b/engines/titanic/core/game_object.h
index 9417fd7aa3..744887a04b 100644
--- a/engines/titanic/core/game_object.h
+++ b/engines/titanic/core/game_object.h
@@ -991,8 +991,16 @@ public:
*/
Season stateGetSeason() const;
- void stateSet24();
- int stateGet24() const;
+ /**
+ * Sets the flag for the parrot having been met
+ */
+ void stateSetParrotMet();
+
+ /**
+ * Returns whether the parrot has been met
+ */
+ bool stateGetParrotMet() const;
+
void stateInc38();
int stateGet38() const;
diff --git a/engines/titanic/core/turn_on_turn_off.cpp b/engines/titanic/core/turn_on_turn_off.cpp
index 6498c226a0..191f7050c9 100644
--- a/engines/titanic/core/turn_on_turn_off.cpp
+++ b/engines/titanic/core/turn_on_turn_off.cpp
@@ -30,7 +30,7 @@ BEGIN_MESSAGE_MAP(CTurnOnTurnOff, CBackground)
END_MESSAGE_MAP()
CTurnOnTurnOff::CTurnOnTurnOff() : CBackground(), _startFrameOn(0),
- _endFrameOn(0), _startFrameOff(0), _endFrameOff(0), _fieldF0(false) {
+ _endFrameOn(0), _startFrameOff(0), _endFrameOff(0), _isOn(false) {
}
void CTurnOnTurnOff::save(SimpleFile *file, int indent) {
@@ -39,7 +39,7 @@ void CTurnOnTurnOff::save(SimpleFile *file, int indent) {
file->writeNumberLine(_endFrameOn, indent);
file->writeNumberLine(_startFrameOff, indent);
file->writeNumberLine(_endFrameOff, indent);
- file->writeNumberLine(_fieldF0, indent);
+ file->writeNumberLine(_isOn, indent);
CBackground::save(file, indent);
}
@@ -50,30 +50,30 @@ void CTurnOnTurnOff::load(SimpleFile *file) {
_endFrameOn = file->readNumber();
_startFrameOff = file->readNumber();
_endFrameOff = file->readNumber();
- _fieldF0 = file->readNumber();
+ _isOn = file->readNumber();
CBackground::load(file);
}
bool CTurnOnTurnOff::TurnOn(CTurnOn *msg) {
- if (!_fieldF0) {
- if (_fieldDC)
+ if (!_isOn) {
+ if (_isBlocking)
playMovie(_startFrameOn, _endFrameOn, MOVIE_GAMESTATE);
else
playMovie(_startFrameOn, _endFrameOn, MOVIE_NOTIFY_OBJECT);
- _fieldF0 = true;
+ _isOn = true;
}
return true;
}
bool CTurnOnTurnOff::TurnOff(CTurnOff *msg) {
- if (!_fieldF0) {
- if (_fieldDC)
+ if (!_isOn) {
+ if (_isBlocking)
playMovie(_startFrameOff, _endFrameOff, MOVIE_GAMESTATE);
else
playMovie(_startFrameOff, _endFrameOff, MOVIE_NOTIFY_OBJECT);
- _fieldF0 = true;
+ _isOn = false;
}
return true;
diff --git a/engines/titanic/core/turn_on_turn_off.h b/engines/titanic/core/turn_on_turn_off.h
index c09f0e0d7d..1749394819 100644
--- a/engines/titanic/core/turn_on_turn_off.h
+++ b/engines/titanic/core/turn_on_turn_off.h
@@ -36,7 +36,7 @@ private:
int _endFrameOn;
int _startFrameOff;
int _endFrameOff;
- bool _fieldF0;
+ bool _isOn;
public:
CLASSDEF;
CTurnOnTurnOff();
diff --git a/engines/titanic/game/cell_point_button.cpp b/engines/titanic/game/cell_point_button.cpp
index 207dd73543..2afcf39f48 100644
--- a/engines/titanic/game/cell_point_button.cpp
+++ b/engines/titanic/game/cell_point_button.cpp
@@ -30,33 +30,33 @@ BEGIN_MESSAGE_MAP(CCellPointButton, CBackground)
END_MESSAGE_MAP()
CCellPointButton::CCellPointButton() : CBackground() {
- _fieldE0 = 0;
- _fieldE4 = 0;
- _fieldE8 = 0;
- _fieldEC = 0;
+ _unused1 = 0;
+ _unused2 = 0;
+ _unused3 = 0;
+ _unused4 = 0;
_regionNum = 0;
- _fieldF4 = 0;
- _fieldF8 = 0;
- _fieldFC = 0;
- _field100 = 0;
- _field104 = 0;
- _field108 = 1;
+ _unused5 = 0;
+ _unused6 = 0;
+ _unused7 = 0;
+ _unused8 = 0;
+ _unused9 = 0;
+ _unused10 = 1;
}
void CCellPointButton::save(SimpleFile *file, int indent) {
file->writeNumberLine(1, indent);
- file->writeNumberLine(_fieldE0, indent);
- file->writeNumberLine(_fieldE4, indent);
- file->writeNumberLine(_fieldE8, indent);
- file->writeNumberLine(_fieldEC, indent);
+ file->writeNumberLine(_unused1, indent);
+ file->writeNumberLine(_unused2, indent);
+ file->writeNumberLine(_unused3, indent);
+ file->writeNumberLine(_unused4, indent);
file->writeNumberLine(_regionNum, indent);
- file->writeNumberLine(_fieldF4, indent);
- file->writeNumberLine(_fieldF8, indent);
- file->writeNumberLine(_fieldFC, indent);
- file->writeNumberLine(_field100, indent);
- file->writeNumberLine(_field104, indent);
- file->writeNumberLine(_field108, indent);
- file->writeQuotedLine(_string3, indent);
+ file->writeNumberLine(_unused5, indent);
+ file->writeNumberLine(_unused6, indent);
+ file->writeNumberLine(_unused7, indent);
+ file->writeNumberLine(_unused8, indent);
+ file->writeNumberLine(_unused9, indent);
+ file->writeNumberLine(_unused10, indent);
+ file->writeQuotedLine(_npcName, indent);
file->writeNumberLine(_dialNum, indent);
CBackground::save(file, indent);
@@ -64,18 +64,18 @@ void CCellPointButton::save(SimpleFile *file, int indent) {
void CCellPointButton::load(SimpleFile *file) {
file->readNumber();
- _fieldE0 = file->readNumber();
- _fieldE4 = file->readNumber();
- _fieldE8 = file->readNumber();
- _fieldEC = file->readNumber();
+ _unused1 = file->readNumber();
+ _unused2 = file->readNumber();
+ _unused3 = file->readNumber();
+ _unused4 = file->readNumber();
_regionNum = file->readNumber();
- _fieldF4 = file->readNumber();
- _fieldF8 = file->readNumber();
- _fieldFC = file->readNumber();
- _field100 = file->readNumber();
- _field104 = file->readNumber();
- _field108 = file->readNumber();
- _string3 = file->readString();
+ _unused5 = file->readNumber();
+ _unused6 = file->readNumber();
+ _unused7 = file->readNumber();
+ _unused8 = file->readNumber();
+ _unused9 = file->readNumber();
+ _unused10 = file->readNumber();
+ _npcName = file->readString();
_dialNum = file->readNumber();
CBackground::load(file);
@@ -83,20 +83,20 @@ void CCellPointButton::load(SimpleFile *file) {
bool CCellPointButton::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
if (getRandomNumber(2) == 0) {
- CParrotSpeakMsg speakMsg("Cellpoints", _string3);
+ CParrotSpeakMsg speakMsg("Cellpoints", _npcName);
speakMsg.execute("PerchedParrot");
}
playMovie(0);
_regionNum = _regionNum ? 0 : 1;
playSound("z#425.wav");
- talkSetDialRegion(_string3, _dialNum, _regionNum);
+ talkSetDialRegion(_npcName, _dialNum, _regionNum);
return true;
}
bool CCellPointButton::EnterViewMsg(CEnterViewMsg *msg) {
- _regionNum = talkGetDialRegion(_string3, _dialNum);
+ _regionNum = talkGetDialRegion(_npcName, _dialNum);
return true;
}
diff --git a/engines/titanic/game/cell_point_button.h b/engines/titanic/game/cell_point_button.h
index 33f58cbb83..bee73441a8 100644
--- a/engines/titanic/game/cell_point_button.h
+++ b/engines/titanic/game/cell_point_button.h
@@ -32,18 +32,18 @@ class CCellPointButton : public CBackground {
bool MouseButtonDownMsg(CMouseButtonDownMsg *msg);
bool EnterViewMsg(CEnterViewMsg *msg);
public:
- int _fieldE0;
- int _fieldE4;
- int _fieldE8;
- int _fieldEC;
+ int _unused1;
+ int _unused2;
+ int _unused3;
+ int _unused4;
int _regionNum;
- int _fieldF4;
- int _fieldF8;
- int _fieldFC;
- int _field100;
- int _field104;
- int _field108;
- CString _string3;
+ int _unused5;
+ int _unused6;
+ int _unused7;
+ int _unused8;
+ int _unused9;
+ int _unused10;
+ CString _npcName;
int _dialNum;
public:
CLASSDEF;
diff --git a/engines/titanic/game/parrot/player_meets_parrot.cpp b/engines/titanic/game/parrot/player_meets_parrot.cpp
index cdb14516bf..e573ba41c9 100644
--- a/engines/titanic/game/parrot/player_meets_parrot.cpp
+++ b/engines/titanic/game/parrot/player_meets_parrot.cpp
@@ -39,7 +39,7 @@ void CPlayerMeetsParrot::load(SimpleFile *file) {
}
bool CPlayerMeetsParrot::EnterRoomMsg(CEnterRoomMsg *msg) {
- stateSet24();
+ stateSetParrotMet();
return true;
}
diff --git a/engines/titanic/game/pet/pet_sounds.cpp b/engines/titanic/game/pet/pet_sounds.cpp
index c7f3cd3bf8..b2c9902cc8 100644
--- a/engines/titanic/game/pet/pet_sounds.cpp
+++ b/engines/titanic/game/pet/pet_sounds.cpp
@@ -44,7 +44,7 @@ void CPETSounds::load(SimpleFile *file) {
bool CPETSounds::PETPlaySoundMsg(CPETPlaySoundMsg *msg) {
if (msg->_soundNum == 1) {
playSound("z#65.wav");
- } else if (msg->_soundNum == 2 && stateGet24()) {
+ } else if (msg->_soundNum == 2 && stateGetParrotMet()) {
uint ticks = getTicksCount();
if (!_ticks || ticks > (_ticks + 12000)) {
playSound("z#36.wav");
diff --git a/engines/titanic/game/transport/lift.cpp b/engines/titanic/game/transport/lift.cpp
index 114e840007..52c33c7843 100644
--- a/engines/titanic/game/transport/lift.cpp
+++ b/engines/titanic/game/transport/lift.cpp
@@ -76,15 +76,15 @@ bool CLift::StatusChangeMsg(CStatusChangeMsg *msg) {
int oldFloorNum = msg->_oldStatus;
int floorNum = msg->_newStatus;
- int oldClass = 0, newClass = 0;
- if (oldFloorNum == 19)
- oldClass = 2;
- if (oldFloorNum == 27)
+ int oldClass = 1, newClass = 1;
+ if (oldFloorNum > 27)
oldClass = 3;
- if (floorNum == 19)
- newClass = 2;
- if (floorNum == 27)
+ else if (oldFloorNum > 19)
+ oldClass = 2;
+ if (floorNum > 27)
newClass = 3;
+ else if (floorNum > 19)
+ newClass = 2;
static const int UP_FRAME_NUMBERS[40] = {
0, 8, 13, 18, 23, 28, 33, 38, 43, 48, 53, 58,
diff --git a/engines/titanic/game_state.cpp b/engines/titanic/game_state.cpp
index e75f0975c3..26a4297358 100644
--- a/engines/titanic/game_state.cpp
+++ b/engines/titanic/game_state.cpp
@@ -46,7 +46,7 @@ bool CGameStateMovieList::empty() {
CGameState::CGameState(CGameManager *gameManager) :
_gameManager(gameManager), _gameLocation(this), _passengerClass(NO_CLASS),
_priorClass(NO_CLASS), _mode(GSMODE_NONE), _seasonNum(SEASON_SUMMER),
- _petActive(false), _field1C(false), _quitGame(false), _field24(0),
+ _petActive(false), _field1C(false), _quitGame(false), _parrotMet(false),
_nodeChangeCtr(0), _nodeEnterTicks(0), _field38(0) {
}
@@ -55,7 +55,7 @@ void CGameState::save(SimpleFile *file) const {
file->writeNumber(_passengerClass);
file->writeNumber(_priorClass);
file->writeNumber(_seasonNum);
- file->writeNumber(_field24);
+ file->writeNumber(_parrotMet);
file->writeNumber(_field38);
_gameLocation.save(file);
file->writeNumber(_field1C);
@@ -66,7 +66,7 @@ void CGameState::load(SimpleFile *file) {
_passengerClass = (PassengerClass)file->readNumber();
_priorClass = (PassengerClass)file->readNumber();
_seasonNum = (Season)file->readNumber();
- _field24 = file->readNumber();
+ _parrotMet = file->readNumber();
_field38 = file->readNumber();
_gameLocation.load(file);
diff --git a/engines/titanic/game_state.h b/engines/titanic/game_state.h
index 965735026c..5d0f67c02c 100644
--- a/engines/titanic/game_state.h
+++ b/engines/titanic/game_state.h
@@ -71,7 +71,7 @@ public:
bool _petActive;
bool _field1C;
bool _quitGame;
- int _field24;
+ bool _parrotMet;
uint _nodeChangeCtr;
uint32 _nodeEnterTicks;
Point _mousePos;
@@ -141,8 +141,16 @@ public:
_seasonNum = (Season)(((int)_seasonNum + 1) & 3);
}
- void set24(int v) { _field24 = v; }
- int get24() const { return _field24; }
+ /**
+ * Sets whether the parrot has been met
+ */
+ void setParrotMet(bool flag) { _parrotMet = flag; }
+
+ /**
+ * Gets whether the parrot has been met
+ */
+ bool getParrotMet() const { return _parrotMet; }
+
int getNodeChangedCtr() const { return _nodeChangeCtr; }
uint32 getNodeEnterTicks() const { return _nodeEnterTicks; }
void inc38() { ++_field38; }
diff --git a/engines/titanic/moves/enter_exit_first_class_state.cpp b/engines/titanic/moves/enter_exit_first_class_state.cpp
index efdead533a..4b58c1b86d 100644
--- a/engines/titanic/moves/enter_exit_first_class_state.cpp
+++ b/engines/titanic/moves/enter_exit_first_class_state.cpp
@@ -21,6 +21,7 @@
*/
#include "titanic/moves/enter_exit_first_class_state.h"
+#include "titanic/titanic.h"
namespace Titanic {
@@ -30,13 +31,13 @@ END_MESSAGE_MAP()
void CEnterExitFirstClassState::save(SimpleFile *file, int indent) {
file->writeNumberLine(1, indent);
- file->writeQuotedLine(_viewName, indent);
+ file->writeQuotedLine(g_vm->_stateRoomExitView, indent);
CGameObject::save(file, indent);
}
void CEnterExitFirstClassState::load(SimpleFile *file) {
file->readNumber();
- _viewName = file->readString();
+ g_vm->_stateRoomExitView = file->readString();
CGameObject::load(file);
}
@@ -44,10 +45,12 @@ bool CEnterExitFirstClassState::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
switch (getPassengerClass()) {
case 1:
if (compareRoomNameTo("1stClassLobby")) {
- _viewName = getRoomNodeName() + ".E";
- changeView(_viewName);
+ // Entering room, so save where you were and change to stateroom
+ g_vm->_stateRoomExitView = getRoomNodeName() + ".E";
+ changeView("1stClassState.Node 1.S");
} else if (compareRoomNameTo("1stClassState")) {
- changeView(_viewName);
+ // Return to where you entered room from
+ changeView(g_vm->_stateRoomExitView);
}
break;
diff --git a/engines/titanic/moves/enter_exit_first_class_state.h b/engines/titanic/moves/enter_exit_first_class_state.h
index fe63e553de..ea5c52a35e 100644
--- a/engines/titanic/moves/enter_exit_first_class_state.h
+++ b/engines/titanic/moves/enter_exit_first_class_state.h
@@ -30,8 +30,6 @@ namespace Titanic {
class CEnterExitFirstClassState : public CGameObject {
DECLARE_MESSAGE_MAP;
bool MouseButtonDownMsg(CMouseButtonDownMsg *msg);
-private:
- CString _viewName;
public:
CLASSDEF;
diff --git a/engines/titanic/moves/enter_sec_class_state.cpp b/engines/titanic/moves/enter_sec_class_state.cpp
index 853a00d590..af2bc4ac00 100644
--- a/engines/titanic/moves/enter_sec_class_state.cpp
+++ b/engines/titanic/moves/enter_sec_class_state.cpp
@@ -52,7 +52,7 @@ bool CEnterSecClassState::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
playSound("b#105.wav");
petDisplayMessage(1, CLASS_NOT_PERMITTED_IN_AREA);
} else if (!compareRoomNameTo("SecClassLittleLift") || _mode == 2) {
- CActMsg actMsg(getFullViewName().deleteRight(3) + ".S");
+ CActMsg actMsg(getFullViewName().deleteRight(2) + ".S");
actMsg.execute("SecClassRoomLeaver");
changeView("secClassState.Node 01.N");
}
diff --git a/engines/titanic/npcs/parrot.cpp b/engines/titanic/npcs/parrot.cpp
index c3702e17d4..37710e50bf 100644
--- a/engines/titanic/npcs/parrot.cpp
+++ b/engines/titanic/npcs/parrot.cpp
@@ -415,7 +415,7 @@ bool CParrot::ParrotSpeakMsg(CParrotSpeakMsg *msg) {
"Lift", "ServiceElevator", "Dome", "Home", "MoonEmbLobby", nullptr
};
- if (!stateGet24() || _v4 == 3 || compareViewNameTo("Titania.Node 18.N"))
+ if (!stateGetParrotMet() || _v4 == 3 || compareViewNameTo("Titania.Node 18.N"))
return true;
// Check for rooms not to speak in
diff --git a/engines/titanic/pet_control/pet_control.cpp b/engines/titanic/pet_control/pet_control.cpp
index 423f87cd8c..b7fece7569 100644
--- a/engines/titanic/pet_control/pet_control.cpp
+++ b/engines/titanic/pet_control/pet_control.cpp
@@ -212,7 +212,7 @@ void CPetControl::resetActiveNPC() {
}
PetArea CPetControl::setArea(PetArea newArea, bool forceChange) {
- if ((!forceChange && newArea == _currentArea) || !isAreaActive())
+ if ((!forceChange && newArea == _currentArea) || !isAreaUnlocked())
return _currentArea;
// Signal the currently active area that it's being left
@@ -271,7 +271,7 @@ bool CPetControl::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
return false;
bool result = false;
- if (isAreaActive())
+ if (isAreaUnlocked())
result = _frame.MouseButtonDownMsg(msg);
if (!result) {
@@ -302,7 +302,7 @@ bool CPetControl::MouseButtonUpMsg(CMouseButtonUpMsg *msg) {
return false;
bool result = false;
- if (isAreaActive())
+ if (isAreaUnlocked())
result = _frame.MouseButtonUpMsg(msg);
if (!result)
diff --git a/engines/titanic/pet_control/pet_control.h b/engines/titanic/pet_control/pet_control.h
index 34d1330b52..af5ceb0a2a 100644
--- a/engines/titanic/pet_control/pet_control.h
+++ b/engines/titanic/pet_control/pet_control.h
@@ -354,7 +354,7 @@ public:
/**
* Returns true if the PET is currently unlocked
*/
- bool isAreaActive() const { return _areaLockCount == 0; }
+ bool isAreaUnlocked() const { return _areaLockCount == 0; }
/**
* Increment the number of PET area (tab) locks
diff --git a/engines/titanic/pet_control/pet_conversations.cpp b/engines/titanic/pet_control/pet_conversations.cpp
index 8f317ed279..f7cfedf8c4 100644
--- a/engines/titanic/pet_control/pet_conversations.cpp
+++ b/engines/titanic/pet_control/pet_conversations.cpp
@@ -265,7 +265,7 @@ void CPetConversations::leave() {
}
void CPetConversations::timerExpired(int val) {
- if (val == 1) {
+ if (val != 1) {
CPetSection::timerExpired(val);
} else {
CString name = _field418 ? _npcName : getActiveNPCName();
@@ -532,30 +532,31 @@ void CPetConversations::updateDial(uint dialNum, const CString &npcName) {
_npcLevels[dialNum] = newLevel;
}
-uint CPetConversations::getDialLevel(uint dialNum, TTnpcScript *script, int v) {
- bool flag = v != 0;
-
+uint CPetConversations::getDialLevel(uint dialNum, TTnpcScript *script, bool flag) {
if (!script)
return 0;
else
return MAX(script->getDialLevel(dialNum, flag), 15);
}
-void CPetConversations::npcDialChange(uint dialNum, int oldLevel, int newLevel) {
- const uint range1[2] = { 0, 21 };
- const uint range2[2] = { 22, 43 };
+void CPetConversations::npcDialChange(uint dialNum, uint oldLevel, uint newLevel) {
+ const uint ascending[2] = { 0, 21 };
+ const uint descending[2] = { 43, 22 };
+ assert(oldLevel <= 100 && newLevel <= 100);
if (newLevel != oldLevel) {
- uint src = range1[0], dest = range1[1];
- if (oldLevel < newLevel) {
- src = range2[0];
- dest = range2[1];
+ debugC(ERROR_DETAILED, kDebugScripts, "Dial %d change from %d to %d",
+ dialNum, oldLevel, newLevel);
+ uint src = ascending[0], dest = ascending[1];
+ if (newLevel < oldLevel) {
+ src = descending[0];
+ dest = descending[1];
}
- int64 val1 = (oldLevel * dest) + (100 - oldLevel) * src;
+ uint val1 = (oldLevel * dest) + (100 - oldLevel) * src;
uint startFrame = val1 / 100;
- int64 val2 = (newLevel * dest) + (100 - newLevel) * src;
+ uint val2 = (newLevel * dest) + (100 - newLevel) * src;
uint endFrame = val2 / 100;
if (startFrame != endFrame)
diff --git a/engines/titanic/pet_control/pet_conversations.h b/engines/titanic/pet_control/pet_conversations.h
index 1837e5df2a..c3508f62a8 100644
--- a/engines/titanic/pet_control/pet_conversations.h
+++ b/engines/titanic/pet_control/pet_conversations.h
@@ -122,12 +122,12 @@ private:
/**
* Get a dial level
*/
- uint getDialLevel(uint dialNum, TTnpcScript *script, int v = 1);
+ uint getDialLevel(uint dialNum, TTnpcScript *script, bool flag = true);
/**
* Called when the dial for an NPC is being changed
*/
- void npcDialChange(uint dialNum, int oldLevel, int newLevel);
+ void npcDialChange(uint dialNum, uint oldLevel, uint newLevel);
public:
CPetConversations();
virtual ~CPetConversations() {}
diff --git a/engines/titanic/pet_control/pet_remote_glyphs.cpp b/engines/titanic/pet_control/pet_remote_glyphs.cpp
index 0116aa9156..a9c471a29c 100644
--- a/engines/titanic/pet_control/pet_remote_glyphs.cpp
+++ b/engines/titanic/pet_control/pet_remote_glyphs.cpp
@@ -172,7 +172,7 @@ bool CTelevisionControlGlyph::setup(CPetControl *petControl, CPetGlyphs *owner)
if (owner) {
_up = getElement(1);
_down = getElement(2);
- _onOff = getElement(4);
+ _onOff = getElement(0);
}
return true;
diff --git a/engines/titanic/pet_control/pet_text.cpp b/engines/titanic/pet_control/pet_text.cpp
index 7bb0bad16e..05038d2fd0 100644
--- a/engines/titanic/pet_control/pet_text.cpp
+++ b/engines/titanic/pet_control/pet_text.cpp
@@ -249,20 +249,21 @@ void CPetText::setColor(byte r, byte g, byte b) {
}
void CPetText::remapColors(uint count, uint *srcColors, uint *destColors) {
- if (_lineCount >= 0) {
- for (int lineNum = 0; lineNum <= _lineCount; ++lineNum) {
- // Get the rgb values
- uint r = _array[lineNum]._rgb[1];
- uint g = _array[lineNum]._rgb[2];
- uint b = _array[lineNum]._rgb[3];
- uint color = r | (g << 8) | (b << 16);
-
- for (uint index = 0; index < count; ++index) {
- if (color == srcColors[index]) {
- // Found a match, so replace the color
- setLineColor(lineNum, destColors[lineNum]);
- break;
- }
+ for (int lineNum = 0; lineNum <= _lineCount; ++lineNum) {
+ if (_array[lineNum]._rgb.empty())
+ continue;
+
+ // Get the rgb values
+ uint r = _array[lineNum]._rgb[1];
+ uint g = _array[lineNum]._rgb[2];
+ uint b = _array[lineNum]._rgb[3];
+ uint color = r | (g << 8) | (b << 16);
+
+ for (uint index = 0; index < count; ++index) {
+ if (color == srcColors[index]) {
+ // Found a match, so replace the color
+ setLineColor(lineNum, destColors[lineNum]);
+ break;
}
}
}
diff --git a/engines/titanic/room_flags.cpp b/engines/titanic/room_flags.cpp
index be9acb9627..25c604ba93 100644
--- a/engines/titanic/room_flags.cpp
+++ b/engines/titanic/room_flags.cpp
@@ -301,8 +301,10 @@ void CRoomFlags::setFloorNum(uint floorNum) {
break;
case 1:
base = 0xD0;
+ break;
case 2:
base = 0xE0;
+ break;
case 3:
base = 0xF0;
break;
diff --git a/engines/titanic/support/avi_surface.cpp b/engines/titanic/support/avi_surface.cpp
index 9d6ece0bbb..de7b9abe3e 100644
--- a/engines/titanic/support/avi_surface.cpp
+++ b/engines/titanic/support/avi_surface.cpp
@@ -132,28 +132,35 @@ bool AVISurface::startAtFrame(int frameNumber) {
if (frameNumber == -1)
// Default to starting frame of first movie range
frameNumber = _movieRangeInfo.front()->_startFrame;
-
- // Get the initial frame
- seekToFrame(frameNumber);
- renderFrame();
+ if (_isReversed && frameNumber == (int)_decoder->getFrameCount())
+ --frameNumber;
// Start the playback
_decoder->start();
+ // Seek to the starting frame
+ seekToFrame(frameNumber);
+
+ // If we're in reverse playback, set the decoder to play in reverse
+ if (_isReversed)
+ _decoder->setRate(-1.0);
+
+ renderFrame();
+
return true;
}
void AVISurface::seekToFrame(uint frameNumber) {
+ if (_isReversed && frameNumber == _decoder->getFrameCount())
+ --frameNumber;
+
if ((int)frameNumber != getFrame()) {
_decoder->seekToFrame(frameNumber);
_currentFrame = (int)frameNumber;
}
-
- renderFrame();
}
void AVISurface::setReversed(bool isReversed) {
- _decoder->setReverse(isReversed);
_isReversed = isReversed;
}
@@ -189,8 +196,8 @@ bool AVISurface::handleEvents(CMovieEventList &events) {
if (isPlaying()) {
if (newFrame != getFrame()) {
// The frame has been changed, so move to new position
- setReversed(info->_isReversed);
seekToFrame(newFrame);
+ renderFrame();
}
// Get any events for the given position
@@ -378,6 +385,7 @@ bool AVISurface::renderFrame() {
// since the blitting method we're using doesn't support palettes
Graphics::Surface *s = frameSurface.convertTo(g_system->getScreenFormat(),
_decoder->getPalette());
+
_videoSurface->getRawSurface()->blitFrom(*s);
s->free();
delete s;
diff --git a/engines/titanic/support/avi_surface.h b/engines/titanic/support/avi_surface.h
index 4ee6cc6e0b..216d4f8837 100644
--- a/engines/titanic/support/avi_surface.h
+++ b/engines/titanic/support/avi_surface.h
@@ -179,6 +179,11 @@ public:
int getFrame() const { return _currentFrame; }
/**
+ * Returns true if the surface is playing in reverse
+ */
+ bool isReversed() const { return _isReversed; }
+
+ /**
* Add a movie event
*/
bool addEvent(int frameNumber, CGameObject *obj);
diff --git a/engines/titanic/titanic.cpp b/engines/titanic/titanic.cpp
index e80dc54bcb..48feab5aa4 100644
--- a/engines/titanic/titanic.cpp
+++ b/engines/titanic/titanic.cpp
@@ -41,6 +41,7 @@
#include "titanic/moves/enter_exit_first_class_state.h"
#include "titanic/moves/enter_exit_sec_class_mini_lift.h"
#include "titanic/moves/exit_pellerator.h"
+#include "titanic/pet_control/pet_control.h"
#include "titanic/support/simple_file.h"
#include "titanic/true_talk/tt_npc_script.h"
@@ -169,11 +170,20 @@ void TitanicEngine::setRoomNames() {
bool TitanicEngine::canLoadGameStateCurrently() {
- return _window->_inputAllowed;
+ if (!_window->_inputAllowed)
+ return false;
+ CProjectItem *project = _window->_gameManager->_project;
+ if (project) {
+ CPetControl *pet = project->getPetControl();
+ if (pet && !pet->isAreaUnlocked())
+ return false;
+ }
+
+ return true;
}
bool TitanicEngine::canSaveGameStateCurrently() {
- return _window->_inputAllowed;
+ return canLoadGameStateCurrently();
}
Common::Error TitanicEngine::loadGameState(int slot) {
diff --git a/engines/titanic/titanic.h b/engines/titanic/titanic.h
index d8e0f880f7..43f3fa07f3 100644
--- a/engines/titanic/titanic.h
+++ b/engines/titanic/titanic.h
@@ -123,6 +123,7 @@ public:
StringArray _itemIds;
StringArray _roomNames;
Strings _strings;
+ CString _stateRoomExitView;
public:
TitanicEngine(OSystem *syst, const TitanicGameDescription *gameDesc);
virtual ~TitanicEngine();
diff --git a/engines/titanic/true_talk/tt_concept.cpp b/engines/titanic/true_talk/tt_concept.cpp
index cd24d7cc36..5d538606e4 100644
--- a/engines/titanic/true_talk/tt_concept.cpp
+++ b/engines/titanic/true_talk/tt_concept.cpp
@@ -28,7 +28,8 @@
namespace Titanic {
TTconcept::TTconcept() : _string1(" "), _string2(" "),
- _scriptP(nullptr), _wordP(nullptr), _status(SS_VALID) {
+ _nextP(nullptr), _scriptP(nullptr), _wordP(nullptr), _status(SS_VALID),
+ _scriptType(ST_UNKNOWN_SCRIPT), _field14(0), _field20(0), _field34(0) {
if (setStatus())
setScriptType(ST_UNKNOWN_SCRIPT);
else
@@ -36,8 +37,8 @@ TTconcept::TTconcept() : _string1(" "), _string2(" "),
}
TTconcept::TTconcept(TTscriptBase *script, ScriptType scriptType) :
- _string1(" "), _string2(" "), _wordP(nullptr), _scriptP(nullptr),
- _status(SS_VALID) {
+ _string1(" "), _string2(" "), _nextP(nullptr), _wordP(nullptr), _scriptP(nullptr),
+ _status(SS_VALID), _scriptType(ST_UNKNOWN_SCRIPT), _field14(0), _field20(0), _field34(0) {
if (!script->getStatus()) {
setScriptType(scriptType);
_scriptP = script;
@@ -51,8 +52,8 @@ TTconcept::TTconcept(TTscriptBase *script, ScriptType scriptType) :
}
TTconcept::TTconcept(TTword *word, ScriptType scriptType) :
- _string1(" "), _string2(" "), _wordP(nullptr), _scriptP(nullptr),
- _status(SS_VALID) {
+ _string1(" "), _string2(" "), _nextP(nullptr), _wordP(nullptr), _scriptP(nullptr),
+ _status(SS_VALID), _scriptType(ST_UNKNOWN_SCRIPT), _field14(0), _field20(0), _field34(0) {
if (!word || !setStatus() || word->getStatus()) {
_status = SS_5;
} else {
@@ -66,8 +67,9 @@ TTconcept::TTconcept(TTword *word, ScriptType scriptType) :
}
TTconcept::TTconcept(TTconcept &src) :
- _string1(src._string1), _string2(src._string2),
- _wordP(nullptr), _scriptP(nullptr), _status(SS_VALID) {
+ _string1(src._string1), _string2(src._string2), _nextP(nullptr),
+ _wordP(nullptr), _scriptP(nullptr), _status(SS_VALID),
+ _scriptType(ST_UNKNOWN_SCRIPT), _field14(0), _field20(0), _field34(0) {
if (src.getStatus()) {
_status = SS_5;
} else {
diff --git a/engines/titanic/true_talk/tt_npc_script.cpp b/engines/titanic/true_talk/tt_npc_script.cpp
index 527e33f14c..2a5c155421 100644
--- a/engines/titanic/true_talk/tt_npc_script.cpp
+++ b/engines/titanic/true_talk/tt_npc_script.cpp
@@ -406,9 +406,10 @@ void TTnpcScript::save(SimpleFile *file) {
file->writeNumber(_dialDelta);
file->writeNumber(_field7C);
+ // Write out the dial values
file->writeNumber(10);
for (int idx = 0; idx < 10; ++idx)
- file->writeNumber(_data[idx]);
+ file->writeNumber(_dialValues[idx]);
}
void TTnpcScript::load(SimpleFile *file) {
@@ -423,11 +424,12 @@ void TTnpcScript::load(SimpleFile *file) {
for (int idx = count; idx > 4; --idx)
file->readNumber();
+ // Read in the dial values
count = file->readNumber();
for (int idx = 0; idx < count; ++idx) {
int v = file->readNumber();
if (idx < 10)
- _data[idx] = v;
+ _dialValues[idx] = v;
}
}
@@ -705,7 +707,7 @@ int TTnpcScript::processEntries(const TTsentenceEntries *entries, uint entryCoun
for (uint loopCtr = 0; loopCtr < 2; ++loopCtr) {
for (uint entryCtr = 0; entryCtr < entryCount; ++entryCtr) {
const TTsentenceEntry &entry = (*entries)[entryCtr];
- if (entry._category != categoryNum && (loopCtr == 0 || entry._category))
+ if (entry._category == categoryNum && (loopCtr == 0 || entry._category))
continue;
bool flag;
diff --git a/engines/titanic/true_talk/tt_sentence.cpp b/engines/titanic/true_talk/tt_sentence.cpp
index 451582383d..8d897aaa38 100644
--- a/engines/titanic/true_talk/tt_sentence.cpp
+++ b/engines/titanic/true_talk/tt_sentence.cpp
@@ -212,7 +212,7 @@ bool TTsentence::fn2(int slotIndex, const TTstring &str, const TTconceptNode *no
if (g_vm->_exeResources._owner->_concept1P && (slotIndex == 0 ||
slotIndex == 2 || slotIndex == 3 || slotIndex == 4 || slotIndex == 5)) {
- if (str == g_vm->_exeResources._owner->_concept2P->getText() &&
+ if (str == g_vm->_exeResources._owner->_concept1P->getText() &&
(conceptText == "it" || conceptText == "that" || conceptText == "he" ||
conceptText == "she" || conceptText == "him" || conceptText == "her" ||
conceptText == "them" || conceptText == "they" || conceptText == "those" ||
@@ -221,7 +221,7 @@ bool TTsentence::fn2(int slotIndex, const TTstring &str, const TTconceptNode *no
}
if (g_vm->_exeResources._owner->_concept1P && (slotIndex == 0 || slotIndex == 2)) {
- if (conceptText == "?" && str == g_vm->_exeResources._owner->_concept2P->getText()) {
+ if (conceptText == "?" && str == g_vm->_exeResources._owner->_concept1P->getText()) {
delete concept;
concept = getFrameSlot(5, node);
conceptText = concept->getText();
diff --git a/engines/wage/detection_tables.h b/engines/wage/detection_tables.h
index 836a3f14d2..c4262cd40d 100644
--- a/engines/wage/detection_tables.h
+++ b/engines/wage/detection_tables.h
@@ -78,9 +78,9 @@ static const ADGameDescription gameDescriptions[] = {
FANGAME("Find the Heart", "a6834cb230cea1953f5bf1f8f7aacabd", 105871), // Standalone
FANGAMEN("Fortune Teller", "Fortune Teller 1.1", "7d2628eeea67b33379e01c0aef8dd196", 73931),
FANGAMEN("Haunted House", "Haunted House 1.5", "5db2f95c7abaa9d060b94271a5bc57f8", 177500),
- // Cropped graphics on first scene
+ // Cropped graphics on first scene, cannot pass to in-game
FANGAME("Intro to Gothic", "6f732eaad6e3b85795f8ee6c6a40d837", 208067),
- // No Next button in intro
+ // Lots of unhandled comparisons
FANGAME("Jamie the Demon Slayer", "fa0ca9618c18425b6d9bf913f762d91b", 232789),
FANGAMEN("Journey", "The Journey 1.6.2 US", "e66f37472e1414a088eb5d5acc4df794", 820572),
FANGAMEN("Jumble", "LSJUMBLE", "7c46851d2f90c7da9efe40b1688869c2", 647339), // Original file name is "LSJUMBLEт€  "
@@ -89,7 +89,6 @@ static const ADGameDescription gameDescriptions[] = {
FANGAME("Karth of the Jungle II", "32161b27de894fd9e3f054afc4013f34", 201053),
FANGAMEN("Little Pythagoras", "Little Pythagoras 1.1.1", "75906fa955de695ac3e8164e7d88ac7b", 628821),
FANGAME("Lost Crystal", "d5e27a83f2884a24c6ec26c6cb776fe9", 771072),
- // Crash in design drawing on startup
FANGAMEN("Lost In Kookyville", "Lost In Kookyville 1.2.4", "5ab6259706b33230dbfba05618c2c5c9", 721569),
FANGAME("Magic Rings", "450e986694b96f3b9e6cc64e57b753dc", 109044),
// No way to click on the house
@@ -123,13 +122,11 @@ static const ADGameDescription gameDescriptions[] = {
FANGAMEN("Pyramid of Ert", "Pyramid of Ert V1.2", "fb931cd35440a66864a434c773b496da", 315783),
FANGAME("Queen Quest", "8273e29afe64a984eb0ce7b43fdf3a59", 57039), // alt version
FANGAME("Quest for T-Rex", "f16f2cd525c9aeb4733295d8d842b902", 592584),
- // Crash in console rendering on the initial scene
FANGAME("Quest for the Dark Sword", "4815d9a770904b26c463b7e4fcd121c7", 572576),
FANGAME("Radical Castle", "09b70763c7a48a76240bd0e42737caaa", 355601),
FANGAME("Radical Castle 1.0", "8ae2e29ffeca52a5c7fae66dec4764a3", 347278),
BIGGAME("raysmaze", "v1.5", "Ray's Maze1.5", "521583e59bdc1d611f963cef1dc25869", 1408516),
BIGGAME("raysmaze", "v1.5/alt", "Ray's Maze1.5", "120e65bec953b981b2e0aed45ad45d70", 1408516),
- // Next button is not visible
FANGAME("Ray's World Builder Demo", "d252ee8e38c9abc50455d071a367d031", 116056),
// Unhandled comparison case
FANGAME("Sands of Time", "b00ea866cb04cd87124e5720bc2c84c7", 122672), // Original file name "Sands of Timeт€ "
diff --git a/graphics/macgui/mactext.cpp b/graphics/macgui/mactext.cpp
new file mode 100644
index 0000000000..b674532890
--- /dev/null
+++ b/graphics/macgui/mactext.cpp
@@ -0,0 +1,125 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "graphics/macgui/mactext.h"
+#include "graphics/font.h"
+
+namespace Graphics {
+
+MacText::MacText(Common::String s, Graphics::Font *font, int fgcolor, int bgcolor, int maxWidth) {
+ _str = s;
+ _font = font;
+ _fgcolor = fgcolor;
+ _bgcolor = bgcolor;
+ _maxWidth = maxWidth;
+
+ _interLinear = 0; // 0 pixels between the lines by default
+
+ if (_maxWidth == -1)
+ _textMaxWidth = 1000000; // Some big value
+ else
+ _textMaxWidth = -1;
+
+ splitString(_str);
+
+ _fullRefresh = true;
+}
+
+void MacText::splitString(Common::String &str) {
+ const char *s = str.c_str();
+
+ Common::String tmp;
+ bool prevCR;
+
+ while (*s) {
+ if (*s == '\n' && prevCR) { // trean \r\n as one
+ prevCR = false;
+ continue;
+ }
+
+ if (*s == '\r')
+ prevCR = true;
+
+ if (*s == '\r' || *s == '\n') {
+ _maxWidth = MIN(_font->wordWrapText(tmp, _maxWidth, _text), _maxWidth);
+
+ tmp.clear();
+
+ continue;
+ }
+
+ tmp += *s;
+ }
+
+ if (_text.size())
+ _maxWidth = MIN(_font->wordWrapText(tmp, _maxWidth, _text), _maxWidth);
+}
+
+void MacText::reallocSurface() {
+ int lineHeight = _font->getFontHeight() + _interLinear;
+ int requiredHeight = (_text.size() + (_text.size() * 10 + 9) / 10) * lineHeight;
+
+ if (_surface.w < requiredHeight) {
+ // realloc surface
+ _surface.create(_maxWidth == -1 ? _textMaxWidth : _maxWidth, requiredHeight);
+ }
+}
+
+void MacText::render() {
+ if (_fullRefresh) {
+ reallocSurface();
+
+ _surface.clear(_bgcolor);
+
+ int y = 0;
+
+ for (uint i = 0; i < _text.size(); i++) {
+ _font->drawString(&_surface, _text[i], 0, y, _textMaxWidth, _fgcolor);
+
+ y += _font->getFontHeight() + _interLinear;
+ }
+
+ _fullRefresh = false;
+ }
+}
+
+void MacText::draw(ManagedSurface *g, int x, int y, int w, int h, int xoff, int yoff) {
+ render();
+
+ if (x + w < _surface.w || y + h < _surface.h) {
+ g->fillRect(Common::Rect(x, y, x + w, y + w), _bgcolor);
+ }
+
+ g->blitFrom(_surface, Common::Rect(MIN<int>(_surface.w, x), MIN<int>(_surface.h, y),
+ MIN<int>(_surface.w, x + w), MIN<int>(_surface.w, y + w)), Common::Point(xoff, yoff));
+}
+
+void MacText::appendText(Common::String str) {
+ //int oldLen = _text.size();
+
+ splitString(str);
+
+ reallocSurface();
+
+ //render(oldLen + 1, _text.size());
+}
+
+} // End of namespace Graphics
diff --git a/graphics/macgui/mactext.h b/graphics/macgui/mactext.h
new file mode 100644
index 0000000000..65e93ca5c3
--- /dev/null
+++ b/graphics/macgui/mactext.h
@@ -0,0 +1,65 @@
+/* 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_MACGUI_MACTEXT_H
+#define GRAPHICS_MACGUI_MACTEXT_H
+
+#include "graphics/fontman.h"
+#include "graphics/managed_surface.h"
+
+namespace Graphics {
+
+class MacText {
+public:
+ MacText(Common::String s, Graphics::Font *font, int fgcolor, int bgcolor, int maxWidth = -1);
+
+ void setInterLinear(int interLinear) { _interLinear = interLinear; }
+
+ void draw(ManagedSurface *g, int x, int y, int w, int h, int xoff, int yoff);
+ void appendText(Common::String str);
+
+
+private:
+ void splitString(Common::String &s);
+ void render();
+ void calcMaxWidth();
+ void reallocSurface();
+
+private:
+ Common::String _str;
+ Graphics::Font *_font;
+ int _fgcolor, _bgcolor;
+
+ int _maxWidth;
+ int _interLinear;
+
+ Common::Array<Common::String> _text;
+
+ int _textMaxWidth;
+
+ Graphics::ManagedSurface _surface;
+ bool _fullRefresh;
+};
+
+} // End of namespace Graphics
+
+#endif
diff --git a/graphics/module.mk b/graphics/module.mk
index b6e704bc29..51e2ef7f2d 100644
--- a/graphics/module.mk
+++ b/graphics/module.mk
@@ -14,6 +14,7 @@ MODULE_OBJS := \
maccursor.o \
macgui/macfontmanager.o \
macgui/macmenu.o \
+ macgui/mactext.o \
macgui/macwindow.o \
macgui/macwindowborder.o \
macgui/macwindowmanager.o \
diff --git a/gui/themes/translations.dat b/gui/themes/translations.dat
index b5df7f4e32..ca87e66f64 100644
--- a/gui/themes/translations.dat
+++ b/gui/themes/translations.dat
Binary files differ
diff --git a/po/da_DK.po b/po/da_DK.po
index 8be21a27fe..7ece82934b 100644
--- a/po/da_DK.po
+++ b/po/da_DK.po
@@ -8,15 +8,16 @@ msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.scummvm.org\n"
"POT-Creation-Date: 2016-11-29 23:17+0100\n"
-"PO-Revision-Date: 2016-02-25 21:08+0100\n"
-"Last-Translator: Steffen Nyeland <steffen@nyeland.dk>\n"
-"Language-Team: Steffen Nyeland <steffen@nyeland.dk>\n"
-"Language: Dansk\n"
+"PO-Revision-Date: 2016-12-06 22:20+0000\n"
+"Last-Translator: Eugene Sandulenko <sev@scummvm.org>\n"
+"Language-Team: Danish "
+"<https://translations.scummvm.org/projects/scummvm/scummvm/da/>\n"
+"Language: da_DK\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 1.6.6\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.9\n"
"X-Language-name: Dansk\n"
#: gui/about.cpp:94
@@ -1440,15 +1441,15 @@ msgstr "Vil du virkelig slette denne gemmer?"
#: gui/saveload-dialog.cpp:554 gui/saveload-dialog.cpp:1060
msgid "Date: "
-msgstr "Dato:"
+msgstr "Dato: "
#: gui/saveload-dialog.cpp:558 gui/saveload-dialog.cpp:1066
msgid "Time: "
-msgstr "Tid:"
+msgstr "Tid: "
#: gui/saveload-dialog.cpp:564 gui/saveload-dialog.cpp:1074
msgid "Playtime: "
-msgstr "Spilletid:"
+msgstr "Spilletid: "
#: gui/saveload-dialog.cpp:577 gui/saveload-dialog.cpp:665
#, fuzzy
@@ -1473,7 +1474,7 @@ msgstr "Opret en ny gemmer"
#: gui/saveload-dialog.cpp:1053
msgid "Name: "
-msgstr "Navn:"
+msgstr "Navn: "
#: gui/saveload-dialog.cpp:1131
#, c-format
@@ -2228,7 +2229,7 @@ msgstr " (Aktiv)"
#: backends/keymapper/remap-dialog.cpp:107
msgid " (Blocked)"
-msgstr "(Blokeret)"
+msgstr " (Blokeret)"
#: backends/keymapper/remap-dialog.cpp:120
msgid " (Global)"
@@ -2253,7 +2254,7 @@ msgstr "ScummVM Hovedmenu"
#: backends/platform/ds/arm9/source/dsoptions.cpp:63
msgid "~L~eft handed mode"
-msgstr "~V~enstrehхndstilstand "
+msgstr "~V~enstrehхndstilstand"
#: backends/platform/ds/arm9/source/dsoptions.cpp:64
msgid "~I~ndy fight controls"
@@ -2293,7 +2294,7 @@ msgstr "Skalering af јverste skцrm ved opstart:"
#: backends/platform/ds/arm9/source/dsoptions.cpp:105
msgid "Main screen scaling:"
-msgstr "Hovedskцrm skalering"
+msgstr "Hovedskцrm skalering:"
#: backends/platform/ds/arm9/source/dsoptions.cpp:107
msgid "Hardware scale (fast, but low quality)"
@@ -2688,11 +2689,11 @@ msgstr "Drej"
#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "Using SDL driver "
-msgstr "Brug SDL driver"
+msgstr "Brug SDL driver "
#: backends/platform/wince/CELauncherDialog.cpp:60
msgid "Display "
-msgstr "Vis"
+msgstr "Vis "
#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Do you want to perform an automatic scan ?"
@@ -3968,7 +3969,7 @@ msgstr "Gem / Indlцs / Indstillinger"
#: engines/scumm/help.cpp:256
msgid "Other game controls:"
-msgstr "Andre spil kontroller"
+msgstr "Andre spil kontroller:"
#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:268
msgid "Inventory:"
@@ -4020,7 +4021,7 @@ msgstr "Tredie barn"
#: engines/scumm/help.cpp:292
msgid "Toggle Inventory/IQ Points display"
-msgstr "Skift Inventory/IQ Points display "
+msgstr "Skift Inventory/IQ Points display"
#: engines/scumm/help.cpp:293
msgid "Toggle Keyboard/Mouse Fighting (*)"
@@ -4077,7 +4078,7 @@ msgstr "Mavepuster"
#: engines/scumm/help.cpp:318
msgid "These are for Indy on left."
-msgstr "Disse er for Indy til venstre"
+msgstr "Disse er for Indy til venstre."
#: engines/scumm/help.cpp:319
msgid "When Indy is on the right,"
diff --git a/po/de_DE.po b/po/de_DE.po
index c2567a7627..913eb90731 100644
--- a/po/de_DE.po
+++ b/po/de_DE.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: ScummVM 1.10.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.scummvm.org\n"
"POT-Creation-Date: 2016-11-29 23:17+0100\n"
-"PO-Revision-Date: 2016-12-04 14:29+0000\n"
+"PO-Revision-Date: 2016-12-11 10:03+0000\n"
"Last-Translator: Lothar Serra Mari <rootfather@scummvm.org>\n"
"Language-Team: German "
"<https://translations.scummvm.org/projects/scummvm/scummvm/de/>\n"
@@ -40,7 +40,7 @@ msgstr "Versteckte Dateien anzeigen"
#: gui/browser.cpp:68
msgid "Show files marked with the hidden attribute"
msgstr ""
-"Dateien anzeigen, die mit dem \"Versteckt-Attribut\" gekennzeichnet sind"
+"Dateien anzeigen, die mit dem Attribut \"versteckt\" gekennzeichnet sind"
#: gui/browser.cpp:72 gui/remotebrowser.cpp:56
msgid "Go up"
@@ -1015,8 +1015,8 @@ msgid ""
"Check if you want to enable patch mappings to emulate an MT-32 on a Roland "
"GS device"
msgstr ""
-"Wфhlen Sie dies aus, wenn Sie ausbessernde Instrumentzuweisungen aktivieren "
-"mіchten, um MT-32 auf einem Roland-GS-Gerфt zu emulieren"
+"Auswфhlen, wenn Sie ausbessernde Instrumentzuweisungen aktivieren mіchten, "
+"um MT-32 auf einem Roland-GS-Gerфt zu emulieren"
#: gui/options.cpp:974
msgid "Don't use Roland MT-32 music"
@@ -1560,7 +1560,7 @@ msgstr "Fehler in Feld %s."
#: gui/storagewizarddialog.cpp:184
#, c-format
msgid "Fields %s have mistakes in them."
-msgstr "Fehler in den Feldern %s."
+msgstr "Die Felder %s enthalten fehlerhafte Eingaben."
#: gui/storagewizarddialog.cpp:199
msgid "All OK!"
@@ -4415,7 +4415,7 @@ msgstr "Spiel in Speicherplatz #%d gespeichert "
#: engines/toon/toon.cpp:226
#, c-format
msgid "Could not quick save into slot #%d"
-msgstr "Speichern des Spielstandes in Position #%d nicht mіglich"
+msgstr "Speichern im Schnellspeicherplatz #%d fehlgeschlagen"
#: engines/toon/toon.cpp:239
#, c-format
@@ -4494,7 +4494,8 @@ msgstr "Nutze hochauflіsende MPEG-Filme"
#: engines/zvision/detection_tables.h:92
msgid "Use MPEG video from the DVD version instead of lower resolution AVI"
msgstr ""
-"Verwende hochauflіsende MPEG-Filme der DVD-Version anstelle der AVI-Filme"
+"Verwende die hochauflіsendenden MPEG-Filme der DVD-Version anstelle der "
+"niedriger aufgelіsten AVI-Filme"
#: engines/zvision/file/save_manager.cpp:220
#, c-format
diff --git a/po/es_ES.po b/po/es_ES.po
index 58b49de867..bbf2f8610b 100644
--- a/po/es_ES.po
+++ b/po/es_ES.po
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: ScummVM 1.4.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.scummvm.org\n"
"POT-Creation-Date: 2016-11-29 23:17+0100\n"
-"PO-Revision-Date: 2016-12-04 22:49+0000\n"
-"Last-Translator: Timofonic <timofonic@gmail.com>\n"
+"PO-Revision-Date: 2016-12-06 22:15+0000\n"
+"Last-Translator: Eugene Sandulenko <sev@scummvm.org>\n"
"Language-Team: Spanish "
"<https://translations.scummvm.org/projects/scummvm/scummvm/es/>\n"
"Language: es_ES\n"
@@ -766,11 +766,13 @@ msgstr "Se ha buscado en %d directorios..."
#: gui/massadd.cpp:269
#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
-msgstr "%d juegos nuevos encontrados. %d juegos ignorados (ya aёadidos)..."
+msgstr ""
+"%d juegos nuevos encontrados. Se han ignorado %d juegos, anteriormente ya "
+"aёadidos..."
#: gui/onscreendialog.cpp:101 gui/onscreendialog.cpp:103
msgid "Stop"
-msgstr "Detener"
+msgstr "Parar"
#: gui/onscreendialog.cpp:106
msgid "Edit record description"
@@ -873,15 +875,15 @@ msgstr "Filtros de grсficos"
#: gui/options.cpp:838
msgid "Use linear filtering when scaling graphics"
-msgstr "Usar filtrado linear cuando se escalan graficos"
+msgstr "Usar filtrado lineal para escalar grсficos"
#: gui/options.cpp:841
msgid "Aspect ratio correction"
-msgstr "Correcciѓn de aspecto"
+msgstr "Correcciѓn de la relaciѓn de aspecto"
#: gui/options.cpp:841
msgid "Correct aspect ratio for 320x200 games"
-msgstr "Corregir relaciѓn de aspecto en juegos 320x200"
+msgstr "Corregir relaciѓn de aspecto en juegos de 320x200"
#: gui/options.cpp:849
msgid "Preferred Device:"
@@ -894,8 +896,8 @@ msgstr "Disp. de mњsica:"
#: gui/options.cpp:849 gui/options.cpp:851
msgid "Specifies preferred sound device or sound card emulator"
msgstr ""
-"Especifica quщ dispositivo de sonido o emulador de tarjeta de sonido "
-"prefieres"
+"Especifica el dispositivo de sonido o emulador de tarjeta de sonido "
+"prefierido"
#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852
msgid "Specifies output sound device or sound card emulator"
@@ -918,7 +920,7 @@ msgstr "Emul. de AdLib:"
#: gui/options.cpp:878 gui/options.cpp:879
msgid "AdLib is used for music in many games"
-msgstr "AdLib se usa para la mњsica en muchos juegos"
+msgstr "AdLib es usado para la mњsica en muchos juegos"
#: gui/options.cpp:889
msgid "Output rate:"
@@ -929,8 +931,8 @@ msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
msgstr ""
-"Los valores mсs altos ofrecen mayor calidad, pero puede que tu tarjeta de "
-"sonido no sea compatible"
+"Los valores mсs altos ofrecen mayor calidad, pero puede que la tarjeta de "
+"sonido no lo soporte"
#: gui/options.cpp:900
msgid "GM Device:"
@@ -938,7 +940,9 @@ msgstr "Dispositivo GM:"
#: gui/options.cpp:900
msgid "Specifies default sound device for General MIDI output"
-msgstr "Especifica el dispositivo de salida General MIDI por defecto"
+msgstr ""
+"Especifique el dispositivo de salidapor defecto para la salida de General "
+"MIDI"
#: gui/options.cpp:911
msgid "Don't use General MIDI music"
@@ -1764,6 +1768,9 @@ msgid ""
"Please, report the following data to the ScummVM team along with name\n"
"of the game you tried to add and its version, language, etc.:"
msgstr ""
+"El juego en '%s' parece ser desconocido.\n"
+"Porfavor, informe de ello al equipo de ScummVM junto al nombre\n"
+"del juego que ha intentado aёadir y su versiѓn, lenguaje, etc.:"
#: engines/dialogs.cpp:85
msgid "~R~esume"
@@ -1846,14 +1853,13 @@ msgstr ""
"obtener mсs ayuda."
#: engines/dialogs.cpp:234 engines/pegasus/pegasus.cpp:393
-#, fuzzy, c-format
+#, c-format
msgid ""
"Failed to save game (%s)! Please consult the README for basic information, "
"and for instructions on how to obtain further assistance."
msgstr ""
-"Ha habido un fallo al guardar la partida (%s). Consulta el archivo README "
-"para encontrar informaciѓn bсsica e instrucciones sobre cѓmo obtener mсs "
-"ayuda."
+"Ha habido un fallo al guardar la partida (%s). Consulte el archivo README "
+"con informaciѓn bсsica y como obtener mсs ayuda."
#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
#: engines/tsage/dialogs.cpp:112
@@ -1918,14 +1924,13 @@ msgstr ""
"Consulta el archivo README para mсs detalles."
#: engines/engine.cpp:542
-#, fuzzy, c-format
+#, c-format
msgid ""
"Failed to load saved game (%s)! Please consult the README for basic "
"information, and for instructions on how to obtain further assistance."
msgstr ""
-"Ha habido un fallo al cargar la partida (%s). Consulta el archivo README "
-"para encontrar informaciѓn bсsica e instrucciones sobre cѓmo obtener mсs "
-"ayuda."
+"Hubo un fallo al cargar la partida (%s). Consulte el archivo README para "
+"informaciѓn bсsica y cѓmo obtener mсs ayuda."
#: engines/engine.cpp:555
msgid ""
@@ -2775,10 +2780,8 @@ msgstr "Usar pantallas de guardar/cargar originales"
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:431
#: engines/sherlock/detection.cpp:72 engines/toltecs/detection.cpp:201
-#, fuzzy
msgid "Use the original save/load screens instead of the ScummVM ones"
-msgstr ""
-"Utilizar las pantallas de guardar/cargar originales, en vez de las de ScummVM"
+msgstr "Usar los menњs originales de guardar/cargar en vez de los de ScummVM"
#: engines/agi/detection.cpp:157
msgid "Use an alternative palette"
@@ -2850,25 +2853,24 @@ msgid "Restore"
msgstr "Cargar"
#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2436
-#, fuzzy, c-format
+#, c-format
msgid ""
"Failed to load saved game from file:\n"
"\n"
"%s"
msgstr ""
-"Fallo al cargar desde el archivo:\n"
+"Fallѓ la carga de partida guardada desde el archivo:\n"
"\n"
"%s"
#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2429
-#, fuzzy, c-format
+#, c-format
msgid ""
"Failed to save game to file:\n"
"\n"
"%s"
msgstr ""
-"Fallo al guardar en el archivo:\n"
-"\n"
+"Fallo al guardar la partida al archivo:\n"
"%s"
#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2447
@@ -2896,7 +2898,6 @@ msgid "Enable Color Blind Mode by default"
msgstr "Activar por defecto el modo para daltѓnicos"
#: engines/drascula/saveload.cpp:47
-#, fuzzy
msgid ""
"ScummVM found that you have old saved games for Drascula that should be "
"converted.\n"
@@ -2906,13 +2907,13 @@ msgid ""
"Press OK to convert them now, otherwise you will be asked again the next "
"time you start the game.\n"
msgstr ""
-"ScummVM ha detectado que tienes partidas guardadas antiguas de Drascula, que "
-"deben ser actualizadas.\n"
-"El formato antiguo ya no es compatible, asэ que no podrсs cargar tus "
-"partidos si no las actualizas.\n"
+"ScummVM ha detectado partidas guardadas antiguas de Drascula que deben "
+"actualizarse.\n"
+"El formato antiguo ya no es compatible, no podrсn cargarse hasta "
+"actualizarlas.\n"
"\n"
-"Pulsa Aceptar para actualizarlas, si no lo haces este mensaje volverс a "
-"aparecer la prѓxima vez.\n"
+"Pulse Aceptar para actualizarlas. Si no lo hace, el mensaje aparecerс cada "
+"vez que se inicie el juego.\n"
#: engines/dreamweb/detection.cpp:58
msgid "Use bright palette mode"
@@ -2924,15 +2925,13 @@ msgstr "Utilizar los niveles de brillo originales del juego"
#: engines/gob/inter_playtoons.cpp:255 engines/gob/inter_v2.cpp:1467
#: engines/gob/inter_geisha.cpp:232 engines/tinsel/saveload.cpp:532
-#, fuzzy
msgid "Failed to load saved game from file."
-msgstr "Fallo al cargar el estado del juego desde el archivo."
+msgstr "Fallѓ al cargar partida guardada desde el archivo."
#: engines/gob/inter_v2.cpp:1537 engines/gob/inter_geisha.cpp:263
#: engines/tinsel/saveload.cpp:545
-#, fuzzy
msgid "Failed to save game to file."
-msgstr "Fallo al guardar el estado del juego en el archivo."
+msgstr "Fallo al guardar partida en el archivo."
#: engines/gob/inter_v5.cpp:107
msgid "Failed to delete file."
@@ -3052,7 +3051,7 @@ msgstr "Intercambiar pantalla de Inventario/Personaje"
#: engines/kyra/eobcommon.cpp:339
msgid "Camp"
-msgstr ""
+msgstr "Acampar"
#: engines/kyra/eobcommon.cpp:340
msgid "Cast Spell"
@@ -3155,7 +3154,7 @@ msgstr ""
"\n"
#: engines/kyra/saveload_eob.cpp:623
-#, fuzzy, c-format
+#, c-format
msgid ""
"%d original saved games have been successfully imported into\n"
"ScummVM. If you want to manually import original saved game later you will\n"
@@ -3163,10 +3162,9 @@ msgid ""
"'import_savefile'.\n"
"\n"
msgstr ""
-"Se han importado %d partidas guardadas originales.\n"
-"Si mсs adelante quieres importar manualmente mсs partidas guardadas\n"
-"originales, tendrсs que abrir la consola de ScummVM y usar el comando "
-"'import_savefile'.\n"
+"Se han logrado importar %d partidas guardadas originales a ScummVM. \n"
+"Para hacerlo manualmente, tendrс que abrir la consola debug y usar el "
+"comando \"import_savefile\"\n"
"\n"
#: engines/mads/detection.cpp:91
@@ -3183,7 +3181,7 @@ msgstr "Objetos del inventario animados"
#: engines/mads/detection.cpp:111 engines/mads/detection.cpp:112
msgid "Animated game interface"
-msgstr ""
+msgstr "Interfaz de juego animada"
#: engines/mads/detection.cpp:121 engines/mads/detection.cpp:122
msgid "Naughty game mode"
@@ -3317,7 +3315,6 @@ msgid "Saving game..."
msgstr "Guardando partida..."
#: engines/parallaction/saveload.cpp:269
-#, fuzzy
msgid ""
"ScummVM found that you have old saved games for Nippon Safes that should be "
"renamed.\n"
@@ -3326,13 +3323,13 @@ msgid ""
"\n"
"Press OK to convert them now, otherwise you will be asked next time.\n"
msgstr ""
-"ScummVM ha detectado que tienes partidas guardadas de Nippon Safes que hay "
-"que renombrar.\n"
-"Los nombres antiguos ya no son compatibles, asэ que no podrсs cargar tus "
-"partidas hasta que los actualices.\n"
-"\n"
-"Pulsa Aceptar para actualizarlos, si no lo haces este mensaje volverс a "
-"aparecer la prѓxima vez.\n"
+"ScummVM ha detectado partidas guardadas de Nippon Safes que deben "
+"renombrarse,\n"
+" ya que los nomhres antiguos no son compatibles.\n"
+"Los nombres antiguos ya no son compatibles, las partidas no se podrсn cargar "
+"hasta que se conviertan.\n"
+"Pulse Aceptar para convertirlos. En caso contrario, este mensaje aparecerс "
+"cada vez que inicies el juego.\n"
#: engines/parallaction/saveload.cpp:316
#, fuzzy
@@ -3352,9 +3349,8 @@ msgstr ""
"Por favor, contacta con el equipo."
#: engines/pegasus/pegasus.cpp:714
-#, fuzzy
msgid "Invalid file name for saving"
-msgstr "Escribir el nombre del archivo"
+msgstr "Nombre del archivo de partida invсlido"
#: engines/pegasus/pegasus.cpp:2507
msgid "Up/Zoom In/Move Forward/Open Doors"
@@ -3466,11 +3462,11 @@ msgid "Use silver cursors"
msgstr "Usar cursores plateados"
#: engines/sci/detection.cpp:474
-#, fuzzy
msgid ""
"Use the alternate set of silver cursors instead of the normal golden ones"
msgstr ""
-"Usar los cursores plateados alternativos, en vez de los dorados normales"
+"Usar el set alternativo de colores plateados en lugar de los dorados, usados "
+"normalmente"
#: engines/scumm/detection.cpp:1120
msgid ""
@@ -3480,6 +3476,12 @@ msgid ""
"tried\n"
"to add and its version, language, etc.:\n"
msgstr ""
+"La versiѓn del juego parece ser desconocida. Si *NO ES* una versiѓn "
+"modificada\n"
+"por fans, como particularmente una traducciѓn: \n"
+"Por favor, informe de ello al equipo ScummVM junto con el nombre del juego "
+"que\n"
+"se intentѓ aёadir y su versiѓn, lenguaje, etc.:\n"
#: engines/scumm/detection.cpp:1138
msgid ""
@@ -4296,7 +4298,6 @@ msgid "Cutscene '%s' not found"
msgstr "No se ha encontrado el vэdeo '%s'"
#: engines/sword1/control.cpp:863
-#, fuzzy
msgid ""
"ScummVM found that you have old saved games for Broken Sword 1 that should "
"be converted.\n"
@@ -4306,13 +4307,13 @@ msgid ""
"Press OK to convert them now, otherwise you will be asked again the next "
"time you start the game.\n"
msgstr ""
-"ScummVM ha detectado que tienes partidas guardadas antiguas de Broken Sword "
-"1, que deben ser actualizadas.\n"
-"El formato antiguo ya no es compatible, asэ que no podrсs cargar tus "
-"partidos si no las actualizas.\n"
+"ScummVM ha detectado partidas guardadas antiguas de Broken Sword 1, "
+"requieren convertirse al nuevo formato,\n"
+"El formato antiguo ya no es compatible, no podrсn cargarse hasta que se "
+"conviertan.\n"
"\n"
-"Pulsa Aceptar para actualizarlas, si no lo haces este mensaje volverс a "
-"aparecer la prѓxima vez.\n"
+"Pulse Aceptar para la conversiѓn. En caso contrario, se volverс a preguntar "
+"la prѓxima vez que inicies el juego.\n"
#: engines/sword1/control.cpp:1232
#, c-format
@@ -4387,16 +4388,14 @@ msgid "Could not quick save into slot #%d"
msgstr "No se pudo hacer un quick save en el slot #%d"
#: engines/toon/toon.cpp:239
-#, fuzzy, c-format
+#, c-format
msgid "Saved game #%d quick loaded"
-msgstr ""
-"No se puede guardar en la ranura %i\n"
-"\n"
+msgstr "Se cargѓ la partida guardada rсpida #%d"
#: engines/toon/toon.cpp:243
-#, fuzzy, c-format
+#, c-format
msgid "Could not quick load the saved game #%d"
-msgstr "ПQuieres cargar la partida guardada?"
+msgstr "No es posible cargar la partida guardada rсpida #%d"
#: engines/toon/toon.cpp:4917
msgid "You're missing the 'toon.dat' file. Get it from the ScummVM website"
@@ -4470,6 +4469,9 @@ msgid ""
"This saved game uses version %u, but this engine only supports up to version "
"%d. You will need an updated version of the engine to use this saved game."
msgstr ""
+"Esta partida guardada usa la versiѓn %u, pero este motor soporta hasta la "
+"versiѓn %d. Serс necesaria una versiѓn atualizada del motor para poder "
+"usarla."
#~ msgid "Invalid save file name"
#~ msgstr "Nombre no vсlido para la partida"
diff --git a/po/fi_FI.po b/po/fi_FI.po
index 952ecf1767..efe56f51f8 100644
--- a/po/fi_FI.po
+++ b/po/fi_FI.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: ScummVM 1.6.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.scummvm.org\n"
"POT-Creation-Date: 2016-11-29 23:17+0100\n"
-"PO-Revision-Date: 2016-12-04 15:56+0000\n"
+"PO-Revision-Date: 2016-12-12 00:10+0000\n"
"Last-Translator: Eugene Sandulenko <sev@scummvm.org>\n"
"Language-Team: Finnish "
"<https://translations.scummvm.org/projects/scummvm/scummvm/fi/>\n"
@@ -34,13 +34,12 @@ msgid "Available engines:"
msgstr "Tuetut pelimoottorit:"
#: gui/browser.cpp:68 gui/browser_osx.mm:104
-#, fuzzy
msgid "Show hidden files"
-msgstr "Nфytф / piilota konsoli"
+msgstr "Nфytф piilotetut tiedostot"
#: gui/browser.cpp:68
msgid "Show files marked with the hidden attribute"
-msgstr ""
+msgstr "Nфytф piilotetuksi merkatut tiedostot"
#: gui/browser.cpp:72 gui/remotebrowser.cpp:56
msgid "Go up"
@@ -98,16 +97,16 @@ msgstr ""
#: gui/downloaddialog.cpp:63
msgid "Cancel download"
-msgstr ""
+msgstr "Peruuta lataus"
#: gui/downloaddialog.cpp:65
msgctxt "lowres"
msgid "Cancel download"
-msgstr ""
+msgstr "Peruuta lataus"
#: gui/downloaddialog.cpp:67
msgid "Hide"
-msgstr ""
+msgstr "Piilota"
#: gui/downloaddialog.cpp:117
msgid ""
@@ -184,9 +183,9 @@ msgid "Downloaded %s %s / %s %s"
msgstr ""
#: gui/downloaddialog.cpp:258
-#, fuzzy, c-format
+#, c-format
msgid "Download speed: %s %s"
-msgstr "Skannaus on valmis!"
+msgstr "Latausnopeus: %s %s"
#: gui/editgamedialog.cpp:132
msgid "Game"
@@ -430,7 +429,7 @@ msgstr ""
#: gui/editrecorddialog.cpp:68 gui/predictivedialog.cpp:74
msgid "Ok"
-msgstr ""
+msgstr "Ok"
#: gui/filebrowser-dialog.cpp:49
msgid "Choose file for loading"
@@ -441,14 +440,12 @@ msgid "Enter filename for saving"
msgstr ""
#: gui/filebrowser-dialog.cpp:132
-#, fuzzy
msgid "Do you really want to overwrite the file?"
-msgstr "Haluatko varmasti poistaa tфmфn pelitallennuksen?"
+msgstr "Haluatko varmasti ylikirjoitaa tiedoston?"
#: gui/fluidsynth-dialog.cpp:68
-#, fuzzy
msgid "Reverb"
-msgstr "Ei koskaan"
+msgstr "Kaiku"
#: gui/fluidsynth-dialog.cpp:70 gui/fluidsynth-dialog.cpp:102
#, fuzzy
@@ -457,7 +454,7 @@ msgstr " (Aktiivinen)"
#: gui/fluidsynth-dialog.cpp:72
msgid "Room:"
-msgstr ""
+msgstr "Huone:"
#: gui/fluidsynth-dialog.cpp:79
msgid "Damp:"
@@ -465,7 +462,7 @@ msgstr ""
#: gui/fluidsynth-dialog.cpp:86
msgid "Width:"
-msgstr ""
+msgstr "Leveys:"
#: gui/fluidsynth-dialog.cpp:93 gui/fluidsynth-dialog.cpp:111
msgid "Level:"
@@ -480,21 +477,20 @@ msgid "N:"
msgstr ""
#: gui/fluidsynth-dialog.cpp:118
-#, fuzzy
msgid "Speed:"
-msgstr "Puhe"
+msgstr "Nopeus:"
#: gui/fluidsynth-dialog.cpp:125
msgid "Depth:"
-msgstr ""
+msgstr "Syvyys:"
#: gui/fluidsynth-dialog.cpp:132
msgid "Type:"
-msgstr ""
+msgstr "Tyyppi:"
#: gui/fluidsynth-dialog.cpp:135
msgid "Sine"
-msgstr ""
+msgstr "Sini"
#: gui/fluidsynth-dialog.cpp:136
msgid "Triangle"
@@ -506,23 +502,23 @@ msgstr "Muut"
#: gui/fluidsynth-dialog.cpp:140
msgid "Interpolation:"
-msgstr ""
+msgstr "Interpolaatio:"
#: gui/fluidsynth-dialog.cpp:143
msgid "None (fastest)"
-msgstr ""
+msgstr "ei pффllф (nopein)"
#: gui/fluidsynth-dialog.cpp:144
msgid "Linear"
-msgstr ""
+msgstr "Lineaarinen"
#: gui/fluidsynth-dialog.cpp:145
msgid "Fourth-order"
-msgstr ""
+msgstr "Neljфnnen asteen"
#: gui/fluidsynth-dialog.cpp:146
msgid "Seventh-order"
-msgstr ""
+msgstr "Seitsemфnnen asteen"
#: gui/fluidsynth-dialog.cpp:150
msgid "Reset"
@@ -533,10 +529,9 @@ msgid "Reset all FluidSynth settings to their default values."
msgstr ""
#: gui/fluidsynth-dialog.cpp:217
-#, fuzzy
msgid ""
"Do you really want to reset all FluidSynth settings to their default values?"
-msgstr "Haluatko varmasti palata pelivalitsimeen?"
+msgstr "Haluatko varmasti palauttaa FluidSynth vakioasetukset?"
#: gui/gui-manager.cpp:119 backends/keymapper/remap-dialog.cpp:53
#: engines/scumm/help.cpp:126 engines/scumm/help.cpp:141
@@ -712,9 +707,8 @@ msgid "Do you really want to remove this game configuration?"
msgstr "Haluatko varmasti poistaa pelin asetuksineen listalta?"
#: gui/launcher.cpp:473
-#, fuzzy
msgid "Do you want to load saved game?"
-msgstr "Haluatko tallentaa vai ladata pelin?"
+msgstr "Haluatko ladata tallennetun pelin?"
#: gui/launcher.cpp:522
msgid "This game does not support loading games from the launcher."
@@ -1100,7 +1094,7 @@ msgstr "Puhe:"
#: gui/options.cpp:1257
msgid "FluidSynth Settings"
-msgstr ""
+msgstr "FluidSynth asetukset"
#: gui/options.cpp:1288
msgid "Theme Path:"
@@ -1174,12 +1168,12 @@ msgstr ""
#: gui/options.cpp:1401
msgid "Cloud"
-msgstr ""
+msgstr "Pilvi"
#: gui/options.cpp:1403
msgctxt "lowres"
msgid "Cloud"
-msgstr ""
+msgstr "Pilvi"
#: gui/options.cpp:1408
msgid "Storage:"
@@ -1203,7 +1197,7 @@ msgstr ""
#: gui/options.cpp:1422
msgid "Used space:"
-msgstr ""
+msgstr "Kфytetty tila:"
#: gui/options.cpp:1422
msgid "Space used by ScummVM's saved games on this storage"
@@ -1234,9 +1228,8 @@ msgid "Refresh current cloud storage information (username and usage)"
msgstr ""
#: gui/options.cpp:1430
-#, fuzzy
msgid "Download"
-msgstr "Alas"
+msgstr "Lataa"
#: gui/options.cpp:1430
msgid "Open downloads manager dialog"
@@ -1272,9 +1265,8 @@ msgid "/root/ Path:"
msgstr "Lisфkansio:"
#: gui/options.cpp:1449
-#, fuzzy
msgid "Server's port:"
-msgstr "Palvelin:"
+msgstr "Palvelimen portti:"
#: gui/options.cpp:1449
msgid ""
@@ -1331,7 +1323,7 @@ msgstr ""
#: gui/options.cpp:1987
msgid "<right now>"
-msgstr ""
+msgstr "<nyt>"
#: gui/options.cpp:1989
#, fuzzy
@@ -1339,9 +1331,8 @@ msgid "<never>"
msgstr "Ei koskaan"
#: gui/options.cpp:2073
-#, fuzzy
msgid "Stop server"
-msgstr "Palvelin:"
+msgstr "Pysфytф palvelin"
#: gui/options.cpp:2074
msgid "Stop local webserver"
@@ -1356,11 +1347,11 @@ msgstr ""
#. I18N: You must leave "#" as is, only word 'next' is translatable
#: gui/predictivedialog.cpp:86
msgid "# next"
-msgstr ""
+msgstr "# seuraava"
#: gui/predictivedialog.cpp:87
msgid "add"
-msgstr ""
+msgstr "lisфф"
#: gui/predictivedialog.cpp:92 gui/predictivedialog.cpp:167
#, fuzzy
@@ -1369,22 +1360,22 @@ msgstr "Poista"
#: gui/predictivedialog.cpp:97 gui/predictivedialog.cpp:171
msgid "<"
-msgstr ""
+msgstr "<"
#. I18N: Pre means 'Predictive', leave '*' as is
#: gui/predictivedialog.cpp:99 gui/predictivedialog.cpp:575
msgid "* Pre"
-msgstr ""
+msgstr "* Ennakoiva"
#. I18N: 'Num' means Numbers
#: gui/predictivedialog.cpp:578
msgid "* Num"
-msgstr ""
+msgstr "* 123"
#. I18N: 'Abc' means Latin alphabet input
#: gui/predictivedialog.cpp:581
msgid "* Abc"
-msgstr ""
+msgstr "* Abc"
#: gui/recorderdialog.cpp:63
msgid "Recorder or Playback Gameplay"
@@ -1406,7 +1397,7 @@ msgstr "Pelaa"
#: gui/recorderdialog.cpp:73
msgid "Edit"
-msgstr ""
+msgstr "Muokkaa"
#: gui/recorderdialog.cpp:85 gui/recorderdialog.cpp:242
#: gui/recorderdialog.cpp:252
@@ -1517,13 +1508,12 @@ msgid "in the following field and press 'Connect':"
msgstr ""
#: gui/storagewizarddialog.cpp:69
-#, fuzzy
msgid "Open URL"
-msgstr "Avaa"
+msgstr "Avaa osoite"
#: gui/storagewizarddialog.cpp:70
msgid "Paste"
-msgstr ""
+msgstr "Liitф"
#: gui/storagewizarddialog.cpp:70
msgid "Pastes clipboard contents into fields"
@@ -1557,11 +1547,11 @@ msgstr ""
#: gui/storagewizarddialog.cpp:199
msgid "All OK!"
-msgstr ""
+msgstr "Kaikki kunnossa!"
#: gui/storagewizarddialog.cpp:201
msgid "Invalid code"
-msgstr ""
+msgstr "Viallinen koodi"
#: gui/storagewizarddialog.cpp:209
msgid ""
@@ -1614,13 +1604,12 @@ msgid "(You can always enable it in the options dialog on the Misc tab)"
msgstr ""
#: gui/updates-dialog.cpp:92
-#, fuzzy
msgid "Check for updates automatically"
-msgstr "Tarkista pфivitykset..."
+msgstr "Tarkista pфivitykset automaattisesti"
#: gui/updates-dialog.cpp:111
msgid "Proceed"
-msgstr ""
+msgstr "Jatka"
#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
@@ -1734,11 +1723,11 @@ msgstr ""
#: common/rendermode.cpp:42
msgid "PC-9821 (256 Colors)"
-msgstr ""
+msgstr "PC-9821 (256 Vфriф)"
#: common/rendermode.cpp:43
msgid "PC-9801 (16 Colors)"
-msgstr ""
+msgstr "PC-9801 (16 Vфriф)"
#: common/rendermode.cpp:73
msgctxt "lowres"
@@ -1752,15 +1741,15 @@ msgstr ""
#: common/updates.cpp:58
msgid "Daily"
-msgstr ""
+msgstr "Pфivittфin"
#: common/updates.cpp:60
msgid "Weekly"
-msgstr ""
+msgstr "Viikoittain"
#: common/updates.cpp:62
msgid "Monthly"
-msgstr ""
+msgstr "Kuukausittain"
#: common/updates.cpp:64
#, fuzzy
@@ -1961,7 +1950,7 @@ msgstr "DOSBox OPL emulaattori"
#: audio/fmopl.cpp:67
msgid "ALSA Direct FM"
-msgstr ""
+msgstr "ALSA Direct FM"
#: audio/mididrv.cpp:209
#, c-format
@@ -2018,16 +2007,15 @@ msgstr "Apple II GS emulaattori (EI TOTEUTETTU)"
#: audio/softsynth/cms.cpp:350
msgid "Creative Music System Emulator"
-msgstr ""
+msgstr "Creative Music System-emulaattori"
#: audio/softsynth/fmtowns_pc98/towns_pc98_plugins.cpp:33
msgid "FM-Towns Audio"
msgstr ""
#: audio/softsynth/fmtowns_pc98/towns_pc98_plugins.cpp:58
-#, fuzzy
msgid "PC-98 Audio"
-msgstr "Ффni"
+msgstr "PC-98 Ффni"
#: audio/softsynth/mt32.cpp:197
msgid "Initializing MT-32 Emulator"
@@ -2050,9 +2038,8 @@ msgid "C64 Audio Emulator"
msgstr "C64 Audio emulaattori"
#: backends/cloud/storage.cpp:211
-#, fuzzy
msgid "Saved games sync complete."
-msgstr "Skannaus on valmis!"
+msgstr "Tallennuksien synkronointi valmis."
#: backends/cloud/storage.cpp:222
msgid "Saved games sync was cancelled."
@@ -2072,14 +2059,12 @@ msgid ""
msgstr ""
#: backends/cloud/storage.cpp:330
-#, fuzzy
msgid "Download complete."
-msgstr "Skannaus on valmis!"
+msgstr "Lataus valmis."
#: backends/cloud/storage.cpp:340
-#, fuzzy
msgid "Download failed."
-msgstr "Lataa peli:"
+msgstr "Lataus epфonnistui."
#: backends/events/default/default-events.cpp:196
msgid "Do you really want to return to the Launcher?"
@@ -2185,9 +2170,8 @@ msgid "Swipe three fingers to the right to toggle."
msgstr ""
#: backends/graphics/opengl/opengl-graphics.cpp:146
-#, fuzzy
msgid "OpenGL"
-msgstr "Avaa"
+msgstr "OpenGL"
#: backends/graphics/openglsdl/openglsdl-graphics.cpp:617
#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2462
@@ -2197,7 +2181,7 @@ msgstr "Ikkunoitu tila"
#: backends/graphics/openglsdl/openglsdl-graphics.cpp:710
#, c-format
msgid "Resolution: %dx%d"
-msgstr ""
+msgstr "Resoluutio: %dx%d"
#: backends/graphics/openglsdl/openglsdl-graphics.cpp:731
#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2338
@@ -2211,15 +2195,13 @@ msgstr "Kuvasuhteen korjaus pois pффltф"
#: backends/graphics/openglsdl/openglsdl-graphics.cpp:753
#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2362
-#, fuzzy
msgid "Filtering enabled"
-msgstr "Klikkaus pффllф"
+msgstr "Suodatus pффllф"
#: backends/graphics/openglsdl/openglsdl-graphics.cpp:755
#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2364
-#, fuzzy
msgid "Filtering disabled"
-msgstr "Klikkaus pois pффltф"
+msgstr "Suodatus pois pффltф"
#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:47
#: backends/graphics/wincesdl/wincesdl-graphics.cpp:88
@@ -2434,7 +2416,7 @@ msgstr "Oikea"
#: backends/platform/symbian/src/SymbianActions.cpp:46
#: backends/platform/wince/CEActionsSmartphone.cpp:47
msgid "Zone"
-msgstr ""
+msgstr "Alue"
#: backends/platform/symbian/src/SymbianActions.cpp:47
#: backends/platform/wince/CEActionsPocket.cpp:54
@@ -2496,19 +2478,19 @@ msgstr "Ohjaa hiirtф"
#: backends/platform/tizen/fs.cpp:259
msgid "[ Data ]"
-msgstr ""
+msgstr "[ Data ]"
#: backends/platform/tizen/fs.cpp:263
msgid "[ Resources ]"
-msgstr ""
+msgstr "[ Resurssit ]"
#: backends/platform/tizen/fs.cpp:267
msgid "[ SDCard ]"
-msgstr ""
+msgstr "[ SD-kortti ]"
#: backends/platform/tizen/fs.cpp:271
msgid "[ Media ]"
-msgstr ""
+msgstr "[ Media ]"
#: backends/platform/tizen/fs.cpp:275
#, fuzzy
@@ -2763,9 +2745,8 @@ msgid "Check for Updates..."
msgstr "Tarkista pфivitykset..."
#: engines/adl/detection.cpp:45 engines/adl/detection.cpp:55
-#, fuzzy
msgid "Color mode"
-msgstr "Klikkaus moodi"
+msgstr "Vфrimoodi"
#: engines/adl/detection.cpp:46 engines/adl/detection.cpp:56
msgid "Use color graphics"
@@ -2773,12 +2754,11 @@ msgstr ""
#: engines/adl/detection.cpp:65
msgid "Scanlines"
-msgstr ""
+msgstr "Vaakajuovat"
#: engines/adl/detection.cpp:66
-#, fuzzy
msgid "Show scanlines"
-msgstr "Nфytф esineiden tiedot"
+msgstr "Nфytф vaakajuovat"
#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
@@ -2792,14 +2772,12 @@ msgstr "Kфytф alkuperфisiф tallenna/lataa valikkoja"
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:431
#: engines/sherlock/detection.cpp:72 engines/toltecs/detection.cpp:201
-#, fuzzy
msgid "Use the original save/load screens instead of the ScummVM ones"
-msgstr "Kфytф alkuperфisiф tallenna/lataa valikkoja, ScummVM valikoiden sijaan"
+msgstr "Kфytф alkuperфisiф tallenna/lataa valikkoja ScummVM valikoiden sijaan"
#: engines/agi/detection.cpp:157
-#, fuzzy
msgid "Use an alternative palette"
-msgstr "Kфytф vaihtoehtoista pelin introa (vain CD versiossa)"
+msgstr "Kфytф vaihtoehtoista palettia"
#: engines/agi/detection.cpp:158
msgid ""
@@ -2909,7 +2887,6 @@ msgid "Enable Color Blind Mode by default"
msgstr ""
#: engines/drascula/saveload.cpp:47
-#, fuzzy
msgid ""
"ScummVM found that you have old saved games for Drascula that should be "
"converted.\n"
@@ -2919,8 +2896,8 @@ msgid ""
"Press OK to convert them now, otherwise you will be asked again the next "
"time you start the game.\n"
msgstr ""
-"Broken Sword 1:n pelitallennukset ovat vanhassa formaatissa. Tallennukset "
-"tulee muuntaa,\n"
+"Drascula:n pelitallennukset ovat vanhassa formaatissa. Tallennukset tulee "
+"muuntaa,\n"
"jotta niitф voi kфyttфф ScummVM:ssф. Paina 'Hyvфksy' muuntaaksesi tiedostot. "
"Mikфli et halua muuntaa tiedostoja nyt\n"
"ScummVM kysyy asiaa seuraavan kerran kun kфynnistфt pelin.\n"
@@ -2964,7 +2941,7 @@ msgstr "Pelin tallentaminen epфonnistui"
#: engines/hopkins/detection.cpp:76 engines/hopkins/detection.cpp:86
msgid "Gore Mode"
-msgstr ""
+msgstr "Hurmemoodi"
#: engines/hopkins/detection.cpp:77 engines/hopkins/detection.cpp:87
msgid "Enable Gore Mode when available"
@@ -3189,7 +3166,7 @@ msgstr ""
#: engines/mads/detection.cpp:121 engines/mads/detection.cpp:122
msgid "Naughty game mode"
-msgstr ""
+msgstr "Tuhma pelimoodi"
#: engines/mohawk/detection.cpp:169
msgid "Play the Myst fly by movie"
@@ -4227,11 +4204,11 @@ msgstr ""
#: engines/sherlock/detection.cpp:121
msgid "Transparent windows"
-msgstr ""
+msgstr "Lфpinфkyvфt ikkunat"
#: engines/sherlock/detection.cpp:122
msgid "Show windows with a partially transparent background"
-msgstr ""
+msgstr "Nфytф ikkunat osittain lфpinфkyvфllф taustalla"
#: engines/sky/compact.cpp:130
msgid ""
@@ -4268,11 +4245,11 @@ msgstr ""
"DXA videotiedostoja lіydettiin mutta ScummVM on kффnnetty ilman zlib-tukea"
#: engines/sword1/animation.cpp:561 engines/sword2/animation.cpp:461
-#, fuzzy
msgid ""
"MPEG-2 cutscenes found but ScummVM has been built without MPEG-2 support"
msgstr ""
-"DXA videotiedostoja lіydettiin mutta ScummVM on kффnnetty ilman zlib-tukea"
+"MPEG-2 videotiedostoja lіydettiin mutta ScummVM on kффnnetty ilman "
+"MPEG-2-tukea"
#: engines/sword1/animation.cpp:568 engines/sword2/animation.cpp:470
#, c-format
@@ -4332,12 +4309,14 @@ msgstr "Nфytф esineiden kuvaus kohdistaessasi kursorin esineen ylle"
#: engines/sword25/detection.cpp:46
msgid "Use English speech"
-msgstr ""
+msgstr "Kфytф englanninkielistф puhetta"
#: engines/sword25/detection.cpp:47
msgid ""
"Use English speech instead of German for every language other than German"
msgstr ""
+"Kфytф englanninkielistф puhetta saksankielisen sijaan kaikille muille "
+"kielille paitsi saksalle"
#: engines/teenagent/resources.cpp:96
msgid ""
@@ -4374,16 +4353,14 @@ msgstr ""
"\n"
#: engines/toon/toon.cpp:243
-#, fuzzy, c-format
+#, c-format
msgid "Could not quick load the saved game #%d"
-msgstr "Haluatko tallentaa vai ladata pelin?"
+msgstr "Tallennuksen #%d pikalataus epфonnistui"
#: engines/toon/toon.cpp:4917
-#, fuzzy
msgid "You're missing the 'toon.dat' file. Get it from the ScummVM website"
msgstr ""
-"Asennuksestasi puuttuu 'teenagent.dat' tiedosto. Hae se ScummVM:n "
-"nettisivuilta"
+"Asennuksestasi puuttuu 'toon.dat' tiedosto. Hae se ScummVM:n nettisivuilta"
#: engines/toon/toon.cpp:4929
#, fuzzy
@@ -4414,7 +4391,7 @@ msgstr "Kфytф alkuperфisiф tallenna/lataa valikkoja, ScummVM valikoiden sijaan"
#: engines/zvision/detection_tables.h:61
msgid "Double FPS"
-msgstr ""
+msgstr "Tupla FPS"
#: engines/zvision/detection_tables.h:62
msgid "Increase framerate from 30 to 60 FPS"
@@ -4440,12 +4417,13 @@ msgstr ""
#: engines/zvision/detection_tables.h:91
msgid "Use high resolution MPEG video"
-msgstr ""
+msgstr "Kфytф korkearesoluutioista MPEG-videota"
#: engines/zvision/detection_tables.h:92
-#, fuzzy
msgid "Use MPEG video from the DVD version instead of lower resolution AVI"
-msgstr "Kфytф vaihtoehtoisia hopeisia kursoreita normaalien kultaisten sijaan"
+msgstr ""
+"Kфytф DVD-version MPEG videoita matalampiresoluutioisten AVI-tiedostojen "
+"sijaan"
#: engines/zvision/file/save_manager.cpp:220
#, c-format
diff --git a/po/fr_FR.po b/po/fr_FR.po
index d8775816cb..f1a9008db1 100644
--- a/po/fr_FR.po
+++ b/po/fr_FR.po
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: ScummVM 1.8.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.scummvm.org\n"
"POT-Creation-Date: 2016-11-29 23:17+0100\n"
-"PO-Revision-Date: 2016-11-29 23:07+0000\n"
-"Last-Translator: Thierry Crozat <criezy@scummvm.org>\n"
+"PO-Revision-Date: 2016-12-16 21:50+0000\n"
+"Last-Translator: Gilles <draky@draky.net>\n"
"Language-Team: French "
"<https://translations.scummvm.org/projects/scummvm/scummvm/fr/>\n"
"Language: fr_FR\n"
@@ -885,7 +885,7 @@ msgstr "Correction du rapport d'aspect"
#: gui/options.cpp:841
msgid "Correct aspect ratio for 320x200 games"
-msgstr "Corrige le rapport d'aspect pour les jeu 320x200"
+msgstr "Corrige le rapport d'aspect pour les jeux en 320x200"
#: gui/options.cpp:849
msgid "Preferred Device:"
diff --git a/po/hu_HU.po b/po/hu_HU.po
index 405156e007..cd830dee57 100644
--- a/po/hu_HU.po
+++ b/po/hu_HU.po
@@ -7,8 +7,8 @@ msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.scummvm.org\n"
"POT-Creation-Date: 2016-11-29 23:17+0100\n"
-"PO-Revision-Date: 2016-12-04 13:00+0000\n"
-"Last-Translator: Eugene Sandulenko <sev@scummvm.org>\n"
+"PO-Revision-Date: 2016-12-13 20:02+0000\n"
+"Last-Translator: George Kormendi <grubycza@hotmail.com>\n"
"Language-Team: Hungarian "
"<https://translations.scummvm.org/projects/scummvm/scummvm/hu/>\n"
"Language: hu_HU\n"
@@ -2253,7 +2253,7 @@ msgstr "~B~alkezes mѓd"
#: backends/platform/ds/arm9/source/dsoptions.cpp:64
msgid "~I~ndy fight controls"
-msgstr "~I~ndy fight controls"
+msgstr ""
#: backends/platform/ds/arm9/source/dsoptions.cpp:65
msgid "Show mouse cursor"
@@ -4011,7 +4011,7 @@ msgstr "* Harc billentyћzetrѕl mindэg aktэv,"
#: engines/scumm/help.cpp:296
msgid " so despite the in-game message this"
-msgstr " so despite the in-game message this"
+msgstr ""
#: engines/scumm/help.cpp:297
msgid " actually toggles Mouse Fighting Off/On"
@@ -4223,6 +4223,7 @@ msgstr ""
"Tіltsd le a www.scummvm.org oldalсrѓl"
#: engines/sky/detection.cpp:44
+#, fuzzy
msgid "Floppy intro"
msgstr "Floppy intro"
@@ -4349,14 +4350,12 @@ msgid "Could not quick load the saved game #%d"
msgstr "Akarod hogy betіltщsem a jсtщkсllсst?"
#: engines/toon/toon.cpp:4917
-#, fuzzy
msgid "You're missing the 'toon.dat' file. Get it from the ScummVM website"
-msgstr "Hiсnyzik a 'teenagent.dat' fсjl. Szerezd be a ScummVM website-rѓl"
+msgstr "Hiсnyzik a 'toon.dat' fсjl. Szerezd be a ScummVM honlapjсrѓl"
#: engines/toon/toon.cpp:4929
-#, fuzzy
msgid "File 'toon.dat' is corrupt. Get it from the ScummVM website"
-msgstr "Hiсnyzik a 'teenagent.dat' fсjl. Szerezd be a ScummVM website-rѓl"
+msgstr "A 'toon.dat' fсjl hibсs. Szerezd be a ScummVM honlapjсrѓl"
#: engines/toon/toon.cpp:4939
#, c-format
@@ -4407,9 +4406,9 @@ msgid "Use high resolution MPEG video"
msgstr "Nagyfelbontсsњ MPEG videѓ hasznсlat"
#: engines/zvision/detection_tables.h:92
-#, fuzzy
msgid "Use MPEG video from the DVD version instead of lower resolution AVI"
-msgstr "MPEG videѓt hasznсl DVD verziѓnсl, a kisebb felbontсsњ AVI helyett"
+msgstr ""
+"A DVD verziѓ MPEG videѓjсnak hasznсlata, a kisebb felbontсsњ AVI helyett"
#: engines/zvision/file/save_manager.cpp:220
#, c-format
diff --git a/po/it_IT.po b/po/it_IT.po
index 2b09b976cb..46b5b493e4 100644
--- a/po/it_IT.po
+++ b/po/it_IT.po
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.scummvm.org\n"
"POT-Creation-Date: 2016-11-29 23:17+0100\n"
-"PO-Revision-Date: 2016-12-04 16:38+0000\n"
-"Last-Translator: Paolo Bossi <pbossi86@gmail.com>\n"
+"PO-Revision-Date: 2016-12-13 19:58+0000\n"
+"Last-Translator: Eugene Sandulenko <sev@scummvm.org>\n"
"Language-Team: Italian "
"<https://translations.scummvm.org/projects/scummvm/scummvm/it/>\n"
"Language: it_IT\n"
@@ -92,7 +92,7 @@ msgstr "Da: "
#: gui/downloaddialog.cpp:52 gui/downloaddialog.cpp:264
msgid "To: "
-msgstr "A:"
+msgstr "A: "
#: gui/downloaddialog.cpp:63
msgid "Cancel download"
@@ -180,7 +180,7 @@ msgid ""
"Do you really want to download files into that directory?"
msgstr ""
"%s esiste giр nella cartella selezionata.\n"
-"Sei sicuro di voler scaricare i file in questa cartella? "
+"Sei sicuro di voler scaricare i file in questa cartella?"
#: gui/downloaddialog.cpp:251
#, c-format
@@ -344,7 +344,7 @@ msgstr "Percorsi"
#: gui/editgamedialog.cpp:257 gui/options.cpp:1272
msgctxt "lowres"
msgid "Paths"
-msgstr "Perc."
+msgstr "Perc"
#: gui/editgamedialog.cpp:264
msgid "Game Path:"
@@ -420,7 +420,7 @@ msgid ""
msgstr ""
"La funzionalitр di sincronizzazione dei salvataggi non funziona con i "
"percorsi personalizzati. Per sinconizzare i salvataggi, usa la cartella "
-"predefinita. "
+"predefinita."
#: gui/editgamedialog.cpp:534
msgid "This game ID is already taken. Please choose another one."
@@ -428,11 +428,11 @@ msgstr "Questo ID di gioco ш giр in uso. Si prega di sceglierne un'altro."
#: gui/editrecorddialog.cpp:58
msgid "Author:"
-msgstr "Autore: "
+msgstr "Autore:"
#: gui/editrecorddialog.cpp:60
msgid "Notes:"
-msgstr "Note: "
+msgstr "Note:"
#: gui/editrecorddialog.cpp:68 gui/predictivedialog.cpp:74
msgid "Ok"
@@ -746,7 +746,7 @@ msgstr "Agg. in massa..."
#: gui/launcher.cpp:710
msgid "Record..."
-msgstr "Registra"
+msgstr "Registra..."
#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
@@ -835,7 +835,7 @@ msgstr "Nessuno"
#: gui/options.cpp:456
msgid "Failed to apply some of the graphic options changes:"
-msgstr "Impossibile applicare alcuni dei cambiamenti nelle opzioni grafiche."
+msgstr "Impossibile applicare alcuni dei cambiamenti nelle opzioni grafiche:"
#: gui/options.cpp:468
msgid "the video mode could not be changed."
@@ -872,11 +872,11 @@ msgstr "Modalitр a schermo intero"
#: gui/options.cpp:838
msgid "Filter graphics"
-msgstr "Applica filtro grafico "
+msgstr "Applica filtro grafico"
#: gui/options.cpp:838
msgid "Use linear filtering when scaling graphics"
-msgstr "Usa filtro bilineare per lo scaling della grafica "
+msgstr "Usa filtro lineare per lo scaling della grafica"
#: gui/options.cpp:841
msgid "Aspect ratio correction"
@@ -884,7 +884,7 @@ msgstr "Correzione proporzioni"
#: gui/options.cpp:841
msgid "Correct aspect ratio for 320x200 games"
-msgstr "Corregge le proporzioni dei giochi 320x200"
+msgstr "Corregge le proporzioni dei giochi con risoluzione a 320x200"
#: gui/options.cpp:849
msgid "Preferred Device:"
@@ -1162,7 +1162,7 @@ msgstr "Lingua dell'interfaccia grafica di ScummVM"
#: gui/options.cpp:1381
msgid "Update check:"
-msgstr "Controlla la presenza di aggiornarmenti: "
+msgstr "Controlla la presenza di aggiornarmenti:"
#: gui/options.cpp:1381
msgid "How often to check ScummVM updates"
@@ -1242,7 +1242,7 @@ msgstr "Scarica"
#: gui/options.cpp:1430
msgid "Open downloads manager dialog"
-msgstr "Apri finestra di gestione dei download "
+msgstr "Apri finestra di gestione dei download"
#: gui/options.cpp:1432
msgid "Run server"
@@ -1254,7 +1254,7 @@ msgstr "Avvia webserver locale"
#: gui/options.cpp:1433 gui/options.cpp:2082
msgid "Not running"
-msgstr "Errore nell'avvio del gioco:"
+msgstr ""
#: gui/options.cpp:1437
msgid "/root/ Path:"
@@ -1262,7 +1262,7 @@ msgstr "Percorso base:"
#: gui/options.cpp:1437 gui/options.cpp:1439 gui/options.cpp:1440
msgid "Specifies which directory the Files Manager can access"
-msgstr "Specifica quali cartelle sono accessibili dal File Manager "
+msgstr "Specifica quali cartelle sono accessibili dal File Manager"
#: gui/options.cpp:1439
msgctxt "lowres"
@@ -1287,11 +1287,11 @@ msgstr "Applica"
#: gui/options.cpp:1628
msgid "Failed to change cloud storage!"
-msgstr "Impossibile cambiare dispositivo di archiviazione Cloud"
+msgstr "Impossibile cambiare dispositivo di archiviazione Cloud!"
#: gui/options.cpp:1631
msgid "Another cloud storage is already active."
-msgstr "Un altro servizio di archiviazione cloud ш giр attivo. "
+msgstr "Un altro servizio di archiviazione cloud ш giр attivo."
#: gui/options.cpp:1667
msgid ""
@@ -1336,7 +1336,7 @@ msgstr "<mai>"
#: gui/options.cpp:2073
msgid "Stop server"
-msgstr "Arresta server:"
+msgstr "Arresta server"
#: gui/options.cpp:2074
msgid "Stop local webserver"
@@ -1348,7 +1348,7 @@ msgid ""
"Check your Internet connection."
msgstr ""
"Richiesta fallita\n"
-"Verifica il funzionamento della connessione Internet"
+"Verifica il funzionamento della connessione Internet."
#. I18N: You must leave "#" as is, only word 'next' is translatable
#: gui/predictivedialog.cpp:86
@@ -1375,16 +1375,16 @@ msgstr "*Prш"
#. I18N: 'Num' means Numbers
#: gui/predictivedialog.cpp:578
msgid "* Num"
-msgstr ""
+msgstr "*Numero"
#. I18N: 'Abc' means Latin alphabet input
#: gui/predictivedialog.cpp:581
msgid "* Abc"
-msgstr ""
+msgstr "* Abc"
#: gui/recorderdialog.cpp:63
msgid "Recorder or Playback Gameplay"
-msgstr ""
+msgstr "Registra/riproduci Gameplay"
#: gui/recorderdialog.cpp:68 gui/recorderdialog.cpp:155
#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:443
@@ -1393,25 +1393,25 @@ msgstr "Elimina"
#: gui/recorderdialog.cpp:70
msgid "Record"
-msgstr ""
+msgstr "Registra"
#: gui/recorderdialog.cpp:71
msgid "Playback"
-msgstr "Riproduzione "
+msgstr "Riproduzione"
#: gui/recorderdialog.cpp:73
msgid "Edit"
-msgstr ""
+msgstr "Modifica"
#: gui/recorderdialog.cpp:85 gui/recorderdialog.cpp:242
#: gui/recorderdialog.cpp:252
msgid "Author: "
-msgstr ""
+msgstr "Autore: "
#: gui/recorderdialog.cpp:86 gui/recorderdialog.cpp:243
#: gui/recorderdialog.cpp:253
msgid "Notes: "
-msgstr ""
+msgstr "Note: "
#: gui/recorderdialog.cpp:154
msgid "Do you really want to delete this record?"
@@ -1493,19 +1493,19 @@ msgstr "Inserisci una descrizione per la posizione %d:"
#: gui/storagewizarddialog.cpp:55
#, c-format
msgid "%s Storage Connection Wizard"
-msgstr ""
+msgstr "Assistente di connessione per %s"
#: gui/storagewizarddialog.cpp:58
msgid "Navigate to the following URL:"
-msgstr ""
+msgstr "Accedi alla seguente URL:"
#: gui/storagewizarddialog.cpp:61
msgid "Obtain the code from the storage, enter it"
-msgstr ""
+msgstr "Ottieni il codice dallo spazio di archiviazione, immettilo"
#: gui/storagewizarddialog.cpp:62
msgid "in the following field and press 'Connect':"
-msgstr ""
+msgstr "nel campo seguente e premi \"Connetti\":"
#: gui/storagewizarddialog.cpp:69
msgid "Open URL"
@@ -1513,41 +1513,41 @@ msgstr "Apri URL"
#: gui/storagewizarddialog.cpp:70
msgid "Paste"
-msgstr ""
+msgstr "Incolla"
#: gui/storagewizarddialog.cpp:70
msgid "Pastes clipboard contents into fields"
-msgstr ""
+msgstr "Incolla il contenuto degli appunti nei campi di testo"
#: gui/storagewizarddialog.cpp:78
msgid "You will be directed to ScummVM's page where"
-msgstr ""
+msgstr "Sarai reindirizzato alla pagina di ScummVM dove"
#: gui/storagewizarddialog.cpp:79
msgid "you should allow it to access your storage."
-msgstr ""
+msgstr "si dovrebbe autorizzarlo ad accedere al vostro spazio di archiviazione."
#: gui/storagewizarddialog.cpp:112
msgid "Another Storage is active. Do you want to interrupt it?"
-msgstr ""
+msgstr "Un altro spazio di archiviazione ш attivo. Vuoi interromperlo?"
#: gui/storagewizarddialog.cpp:121
msgid "Wait until current Storage finishes up and try again."
-msgstr ""
+msgstr "Aspetta che il Cloud abbia terminato l'operazione e prova di nuovo."
#: gui/storagewizarddialog.cpp:182
#, c-format
msgid "Field %s has a mistake in it."
-msgstr ""
+msgstr "Errore nel campo %s."
#: gui/storagewizarddialog.cpp:184
#, c-format
msgid "Fields %s have mistakes in them."
-msgstr ""
+msgstr "Errori nel campi %s."
#: gui/storagewizarddialog.cpp:199
msgid "All OK!"
-msgstr ""
+msgstr "Tutto OK!"
#: gui/storagewizarddialog.cpp:201
msgid "Invalid code"
@@ -1558,6 +1558,8 @@ msgid ""
"Failed to open URL!\n"
"Please navigate to this page manually."
msgstr ""
+"Errore nell'apertura dell'URL!\n"
+"Accedere a questa pagina manualmente."
#: gui/themebrowser.cpp:45
msgid "Select a Theme"
@@ -1595,10 +1597,16 @@ msgid ""
"\n"
"Would you like to enable this feature?"
msgstr ""
+"ScummVM supporta la verifica automatica degli aggiornamenti.\n"
+"E' richiesto l'accesso a Internet.\n"
+"\n"
+"Desideri abilitare questa funzionalitр?"
#: gui/updates-dialog.cpp:55
msgid "(You can always enable it in the options dialog on the Misc tab)"
msgstr ""
+"(E' possibile attivarla in qualsiasi momento tramite la scheda \"Varie\" "
+"della finestra Opzioni)"
#: gui/updates-dialog.cpp:92
msgid "Check for updates automatically"
@@ -1606,7 +1614,7 @@ msgstr "Controlla aggiornamenti automaticamente"
#: gui/updates-dialog.cpp:111
msgid "Proceed"
-msgstr ""
+msgstr "Procedi"
#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
msgid "Clear value"
@@ -1698,9 +1706,8 @@ msgid "Could not find suitable engine plugin"
msgstr "Impossibile trovare un plugin idoneo"
#: common/error.cpp:68
-#, fuzzy
msgid "Engine plugin does not support saved games"
-msgstr "Il plugin del motore non supporta i salvataggi"
+msgstr "Il plugin del motore di gioco non supporta i salvataggi"
#: common/error.cpp:71
msgid "User canceled"
@@ -1713,7 +1720,7 @@ msgstr "Errore sconosciuto"
#. I18N: Hercules is graphics card name
#: common/rendermode.cpp:35
msgid "Hercules Green"
-msgstr "Hercules verde"
+msgstr "Hercules Green"
#: common/rendermode.cpp:36
msgid "Hercules Amber"
@@ -1721,11 +1728,11 @@ msgstr "Hercules ambra"
#: common/rendermode.cpp:42
msgid "PC-9821 (256 Colors)"
-msgstr ""
+msgstr "PC-9821 (256 colori)"
#: common/rendermode.cpp:43
msgid "PC-9801 (16 Colors)"
-msgstr ""
+msgstr "PC-9801 (16 colori)"
#: common/rendermode.cpp:73
msgctxt "lowres"
@@ -1739,20 +1746,19 @@ msgstr "Hercules ambra"
#: common/updates.cpp:58
msgid "Daily"
-msgstr ""
+msgstr "Una volta al giorno"
#: common/updates.cpp:60
msgid "Weekly"
-msgstr ""
+msgstr "Una volta a settimana"
#: common/updates.cpp:62
msgid "Monthly"
-msgstr ""
+msgstr "Una volta al mese"
#: common/updates.cpp:64
-#, fuzzy
msgid "<Bad value>"
-msgstr "Cancella"
+msgstr "<Valore non valido>"
#: engines/advancedDetector.cpp:335
#, c-format
@@ -1876,7 +1882,7 @@ msgstr "Impossibile cambiare la modalitр video: '"
#: engines/engine.cpp:363
msgid "Could not apply aspect ratio setting."
-msgstr "Impossibile applicare l'impostazione proporzioni"
+msgstr "Impossibile applicare l'impostazione proporzioni."
#: engines/engine.cpp:368
msgid "Could not apply fullscreen setting."
@@ -4083,7 +4089,7 @@ msgstr ""
#: engines/scumm/help.cpp:318
msgid "These are for Indy on left."
-msgstr "Questi sono i controlli quando"
+msgstr ""
#: engines/scumm/help.cpp:319
msgid "When Indy is on the right,"
diff --git a/po/nb_NO.po b/po/nb_NO.po
index f649335058..b521900308 100644
--- a/po/nb_NO.po
+++ b/po/nb_NO.po
@@ -8,16 +8,17 @@ msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.scummvm.org\n"
"POT-Creation-Date: 2016-11-29 23:17+0100\n"
-"PO-Revision-Date: 2016-10-05 23:47+0200\n"
-"Last-Translator: Einar Johan Trјan Sјmхen <einarjohants@gmail.com>\n"
-"Language-Team: somaen <einarjohants@gmail.com>\n"
-"Language: Norsk (bokmaal)\n"
+"PO-Revision-Date: 2016-12-17 11:35+0000\n"
+"Last-Translator: Eugene Sandulenko <sev@scummvm.org>\n"
+"Language-Team: Norwegian Bokmхl "
+"<https://translations.scummvm.org/projects/scummvm/scummvm/nb_NO/>\n"
+"Language: nb_NO\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.9\n"
"X-Poedit-SourceCharset: iso-8859-1\n"
-"X-Generator: Poedit 1.8.9\n"
"X-Language-name: Norsk (bokmaal)\n"
#: gui/about.cpp:94
@@ -532,7 +533,7 @@ msgstr "Nullstill"
#: gui/fluidsynth-dialog.cpp:150
msgid "Reset all FluidSynth settings to their default values."
-msgstr "Nullstill alle FluidSynth-instillinger til standardverdier"
+msgstr "Nullstill alle FluidSynth-instillinger til standardverdier."
#: gui/fluidsynth-dialog.cpp:217
msgid ""
@@ -928,7 +929,7 @@ msgid ""
"soundcard"
msgstr ""
"Hјyere verdier gir bedre lydkvalitet, men stјttes kanskje ikke av ditt "
-"lydkort "
+"lydkort"
#: gui/options.cpp:900
msgid "GM Device:"
@@ -989,7 +990,7 @@ msgid ""
"connected to your computer"
msgstr ""
"Velg hvis du har et ekte Roland-kompatible lydkort tilkoblet maskinen, og "
-"vil bruke dette."
+"vil bruke dette"
#: gui/options.cpp:962
msgctxt "lowres"
@@ -1205,11 +1206,11 @@ msgstr "Plass brukt av ScummVM's lagrede spill pх denne lagringsmхten"
#: gui/options.cpp:1425
msgid "Last sync time:"
-msgstr "Forrige synctidspunkt"
+msgstr "Forrige synctidspunkt:"
#: gui/options.cpp:1425
msgid "When the last saved games sync for this storage occured"
-msgstr "Nхr forrige sync av lagrede spill til denne lagringsmхten skjedde."
+msgstr "Nхr forrige sync av lagrede spill til denne lagringsmхten skjedde"
#: gui/options.cpp:1428 gui/storagewizarddialog.cpp:71
msgid "Connect"
@@ -1282,7 +1283,7 @@ msgstr "Klarte ikke х kontakte skylagring!"
#: gui/options.cpp:1631
msgid "Another cloud storage is already active."
-msgstr "En annen skylagring er allerede aktiv"
+msgstr "En annen skylagring er allerede aktiv."
#: gui/options.cpp:1667
msgid ""
@@ -1471,11 +1472,11 @@ msgstr "Nytt lagret spill"
#: gui/saveload-dialog.cpp:924
msgid "Create a new saved game"
-msgstr "Opprett ett nytt lagret spill."
+msgstr "Opprett ett nytt lagret spill"
#: gui/saveload-dialog.cpp:1053
msgid "Name: "
-msgstr "Navn:"
+msgstr "Navn: "
#: gui/saveload-dialog.cpp:1131
#, c-format
@@ -1497,7 +1498,7 @@ msgstr "Skaff koden fra lagringsmхten, skriv den inn"
#: gui/storagewizarddialog.cpp:62
msgid "in the following field and press 'Connect':"
-msgstr "i fјlgende felt og trykk 'Koble til'"
+msgstr "i fјlgende felt og trykk 'Koble til':"
#: gui/storagewizarddialog.cpp:69
msgid "Open URL"
@@ -1530,7 +1531,7 @@ msgstr "Vent til gjeldende lagringsmхte fullfјrer og prјv igjen."
#: gui/storagewizarddialog.cpp:182
#, c-format
msgid "Field %s has a mistake in it."
-msgstr "Felt %s har en feil"
+msgstr "Felt %s har en feil."
#: gui/storagewizarddialog.cpp:184
#, c-format
@@ -2036,7 +2037,7 @@ msgstr "C64 Lydemulator"
#: backends/cloud/storage.cpp:211
msgid "Saved games sync complete."
-msgstr "Sync av lagrede spill fullfјrt"
+msgstr "Sync av lagrede spill fullfјrt."
#: backends/cloud/storage.cpp:222
msgid "Saved games sync was cancelled."
@@ -2061,11 +2062,11 @@ msgstr ""
#: backends/cloud/storage.cpp:330
msgid "Download complete."
-msgstr "Nedlasting fullfјrt"
+msgstr "Nedlasting fullfјrt."
#: backends/cloud/storage.cpp:340
msgid "Download failed."
-msgstr "Nedlasting feilet"
+msgstr "Nedlasting feilet."
#: backends/events/default/default-events.cpp:196
msgid "Do you really want to return to the Launcher?"
@@ -2157,7 +2158,7 @@ msgstr "AV"
#: backends/events/webossdl/webossdl-events.cpp:315
msgid "Swipe two fingers to the right to toggle."
-msgstr "Sveip to fingre til hјyre for х slх av/pх"
+msgstr "Sveip to fingre til hјyre for х slх av/pх."
#. I18N: Auto-drag toggle status.
#: backends/events/webossdl/webossdl-events.cpp:335
@@ -2166,7 +2167,7 @@ msgstr "Auto-dramodus er nх"
#: backends/events/webossdl/webossdl-events.cpp:342
msgid "Swipe three fingers to the right to toggle."
-msgstr "Sveip tre fingre til hјyre for х veksle"
+msgstr "Sveip tre fingre til hјyre for х veksle."
#: backends/graphics/opengl/opengl-graphics.cpp:146
msgid "OpenGL"
@@ -2681,7 +2682,7 @@ msgstr "Vil du хpne eller lagre spillet?"
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
msgid " Are you sure you want to quit ? "
-msgstr " Er du sikker pх at du vil avslutte ?"
+msgstr " Er du sikker pх at du vil avslutte ? "
#: backends/platform/wince/CEActionsSmartphone.cpp:50
msgid "Keyboard"
@@ -2693,11 +2694,11 @@ msgstr "Roter"
#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "Using SDL driver "
-msgstr "Bruk SDL-driver"
+msgstr "Bruk SDL-driver "
#: backends/platform/wince/CELauncherDialog.cpp:60
msgid "Display "
-msgstr "Skjerm"
+msgstr "Skjerm "
#: backends/platform/wince/CELauncherDialog.cpp:83
msgid "Do you want to perform an automatic scan ?"
@@ -2938,7 +2939,7 @@ msgstr "Spill filmer med јkt hastighet"
#: engines/groovie/script.cpp:407
msgid "Failed to save game"
-msgstr "Klarte ikke х lagre spill."
+msgstr "Klarte ikke х lagre spill"
#: engines/hopkins/detection.cpp:76 engines/hopkins/detection.cpp:86
msgid "Gore Mode"
@@ -3257,11 +3258,11 @@ msgstr "Spillet er satt pх pause. Trykk en tast for х fortsette."
#: engines/neverhood/detection.cpp:184
msgid "Skip the Hall of Records storyboard scenes"
-msgstr "Hopp over Hall of Records storyboard scenene."
+msgstr "Hopp over Hall of Records storyboard scenene"
#: engines/neverhood/detection.cpp:185
msgid "Allows the player to skip past the Hall of Records storyboard scenes"
-msgstr "Tillater spilleren х hoppe forbi Hall of Records storyboard scener. "
+msgstr "Tillater spilleren х hoppe forbi Hall of Records storyboard scener"
#: engines/neverhood/detection.cpp:191
msgid "Scale the making of videos to full screen"
@@ -3269,7 +3270,7 @@ msgstr "Skaler Ћmaking ofЛ-videoer til fullskjerm"
#: engines/neverhood/detection.cpp:192
msgid "Scale the making of videos, so that they use the whole screen"
-msgstr "Skaler Ћmaking ofЛ-videoene, slik at de bruker hele skjermen."
+msgstr "Skaler Ћmaking ofЛ-videoene, slik at de bruker hele skjermen"
#: engines/parallaction/saveload.cpp:130
#, c-format
@@ -3574,7 +3575,7 @@ msgstr "Tekst & Tale"
#: engines/scumm/dialogs.cpp:654
msgid "Select a Proficiency Level."
-msgstr "Velg ferdighetsnivх"
+msgstr "Velg ferdighetsnivх."
#: engines/scumm/dialogs.cpp:656
msgid "Refer to your Loom(TM) manual for help."
@@ -3960,7 +3961,7 @@ msgstr "Lagre / Хpne / Valg"
#: engines/scumm/help.cpp:256
msgid "Other game controls:"
-msgstr "Andre spillkontroller"
+msgstr "Andre spillkontroller:"
#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:268
msgid "Inventory:"
@@ -4032,7 +4033,7 @@ msgstr " dette faktisk slх musslхssing av/pх"
#: engines/scumm/help.cpp:304
msgid "Fighting controls (numpad):"
-msgstr "Kampkontroller (talltastatur)"
+msgstr "Kampkontroller (talltastatur):"
#: engines/scumm/help.cpp:305 engines/scumm/help.cpp:306
#: engines/scumm/help.cpp:307
@@ -4085,7 +4086,7 @@ msgstr "henholdsvis 9, 6, og 3."
#: engines/scumm/help.cpp:328
msgid "Biplane controls (numpad):"
-msgstr "Flykontroller (talltastatur)"
+msgstr "Flykontroller (talltastatur):"
#: engines/scumm/help.cpp:329
msgid "Fly to upper left"
@@ -4321,7 +4322,7 @@ msgstr "Bruk engelsk tale"
#: engines/sword25/detection.cpp:47
msgid ""
"Use English speech instead of German for every language other than German"
-msgstr "Bruk engelsk tale istedenfor tysk for alle andre sprхk enn tysk."
+msgstr "Bruk engelsk tale istedenfor tysk for alle andre sprхk enn tysk"
#: engines/teenagent/resources.cpp:96
msgid ""
diff --git a/po/nl_NL.po b/po/nl_NL.po
index 28e2d2f64f..976d377be6 100644
--- a/po/nl_NL.po
+++ b/po/nl_NL.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: ScummVM 1.9.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.scummvm.org\n"
"POT-Creation-Date: 2016-11-29 23:17+0100\n"
-"PO-Revision-Date: 2016-11-30 08:33+0000\n"
+"PO-Revision-Date: 2016-12-05 06:41+0000\n"
"Last-Translator: Ben Castricum <github@bencastricum.nl>\n"
"Language-Team: Dutch "
"<https://translations.scummvm.org/projects/scummvm/scummvm/nl/>\n"
@@ -36,11 +36,11 @@ msgstr "Beschikbare engines:"
#: gui/browser.cpp:68 gui/browser_osx.mm:104
msgid "Show hidden files"
-msgstr "Toon verborgen bestanden"
+msgstr "Verborgen bestanden weergeven"
#: gui/browser.cpp:68
msgid "Show files marked with the hidden attribute"
-msgstr "Toon bestanden die het verborgen kenmerk hebben"
+msgstr "Bestanden die zijn gemarkeerd met het kenmerk verborgen weergeven"
#: gui/browser.cpp:72 gui/remotebrowser.cpp:56
msgid "Go up"
diff --git a/po/pl_PL.po b/po/pl_PL.po
index bdcfb85ee7..04bba98f2f 100644
--- a/po/pl_PL.po
+++ b/po/pl_PL.po
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: ScummVM 1.3.0\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.scummvm.org\n"
"POT-Creation-Date: 2016-11-29 23:17+0100\n"
-"PO-Revision-Date: 2016-11-29 23:23+0000\n"
-"Last-Translator: Eugene Sandulenko <sev@scummvm.org>\n"
+"PO-Revision-Date: 2016-12-12 08:18+0000\n"
+"Last-Translator: RafaГ Rzepecki <divided.mind@gmail.com>\n"
"Language-Team: Polish "
"<https://translations.scummvm.org/projects/scummvm/scummvm/pl/>\n"
"Language: pl_PL\n"
@@ -93,15 +93,15 @@ msgstr "Wybierz katalog z plikami gry"
#: gui/downloaddialog.cpp:51 gui/downloaddialog.cpp:263
msgid "From: "
-msgstr ""
+msgstr "ЌrѓdГo: "
#: gui/downloaddialog.cpp:52 gui/downloaddialog.cpp:264
msgid "To: "
-msgstr ""
+msgstr "Cel: "
#: gui/downloaddialog.cpp:63
msgid "Cancel download"
-msgstr ""
+msgstr "Przerwij pobieranie"
#: gui/downloaddialog.cpp:65
msgctxt "lowres"
@@ -184,6 +184,8 @@ msgid ""
"The \"%s\" already exists in the specified directory.\n"
"Do you really want to download files into that directory?"
msgstr ""
+"Katalog \"%s\" juП istnieje w wybranej ЖcieПce.\n"
+"Czy na pewno pobraц pliki do tego katalogu?"
#: gui/downloaddialog.cpp:251
#, c-format
@@ -420,6 +422,8 @@ msgid ""
"Saved games sync feature doesn't work with non-default directories. If you "
"want your saved games to sync, use default directory."
msgstr ""
+"Synchronizacja zapisanych stanѓw dziaГa wyГБcznie przy standardowych "
+"ЖcieПkach. Aby z niej korzystaц naleПy uПywaц domyЖlnych katalogѓw."
#: gui/editgamedialog.cpp:534
msgid "This game ID is already taken. Please choose another one."
@@ -705,7 +709,7 @@ msgstr ""
#: gui/launcher.cpp:365
msgid "This directory cannot be used yet, it is being downloaded into!"
-msgstr ""
+msgstr "Z tego katalogu nie moПna jeszcze korzystaц, trwa pobieranie!"
#: gui/launcher.cpp:415
msgid "Do you really want to remove this game configuration?"
@@ -841,9 +845,8 @@ msgid "the fullscreen setting could not be changed"
msgstr "nie udaГo siъ zmieniц trybu peГnoekranowego"
#: gui/options.cpp:486
-#, fuzzy
msgid "the filtering setting could not be changed"
-msgstr "nie udaГo siъ zmieniц trybu peГnoekranowego"
+msgstr "nie udaГo siъ zmieniц trybu filtrowania"
#: gui/options.cpp:809
msgid "Graphics mode:"
@@ -863,13 +866,12 @@ msgid "Fullscreen mode"
msgstr "PeГny ekran"
#: gui/options.cpp:838
-#, fuzzy
msgid "Filter graphics"
-msgstr "Grafika"
+msgstr "Filtrowanie obrazu"
#: gui/options.cpp:838
msgid "Use linear filtering when scaling graphics"
-msgstr ""
+msgstr "UПywa filtrowania dwuliniowego przy skalowaniu obrazu"
#: gui/options.cpp:841
msgid "Aspect ratio correction"
@@ -1154,36 +1156,36 @@ msgstr "Jъzyk interfejsu ScummVM"
#: gui/options.cpp:1381
msgid "Update check:"
-msgstr ""
+msgstr "SprawdМ aktualizacje:"
#: gui/options.cpp:1381
msgid "How often to check ScummVM updates"
-msgstr ""
+msgstr "CzъstotliwoЖц automatycznego wyszukiwania aktualizacji ScummVM"
#: gui/options.cpp:1393
msgid "Check now"
-msgstr ""
+msgstr "SprawdМ teraz"
#: gui/options.cpp:1401
msgid "Cloud"
-msgstr ""
+msgstr "Chmura"
#: gui/options.cpp:1403
msgctxt "lowres"
msgid "Cloud"
-msgstr ""
+msgstr "Chmura"
#: gui/options.cpp:1408
msgid "Storage:"
-msgstr ""
+msgstr "Dostawca:"
#: gui/options.cpp:1408
msgid "Active cloud storage"
-msgstr ""
+msgstr "Wybrany dostawca przechowywania w chmurze"
#: gui/options.cpp:1415 gui/options.cpp:1972
msgid "<none>"
-msgstr ""
+msgstr "<brak>"
#: gui/options.cpp:1419 backends/platform/wii/options.cpp:114
msgid "Username:"
diff --git a/po/pt_PT.po b/po/pt_PT.po
new file mode 100644
index 0000000000..f306640ede
--- /dev/null
+++ b/po/pt_PT.po
@@ -0,0 +1,4277 @@
+# LANGUAGE translation for ScummVM.
+# Copyright (C) YEAR ScummVM Team
+# This file is distributed under the same license as the ScummVM package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ScummVM 1.10.0git\n"
+"Report-Msgid-Bugs-To: scummvm-devel@lists.scummvm.org\n"
+"POT-Creation-Date: 2016-11-29 23:17+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/projects/scummvm/scummvm/pt_PT/>\n"
+"Language: pt_PT\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 2.9\n"
+"X-Language-name: Portugues (Portugal)\n"
+
+#: gui/about.cpp:94
+#, c-format
+msgid "(built on %s)"
+msgstr "(desenvolvido em %s)"
+
+#: gui/about.cpp:101
+msgid "Features compiled in:"
+msgstr "Recursos compilados em:"
+
+#: gui/about.cpp:110
+msgid "Available engines:"
+msgstr "Motores de jogo disponэveis:"
+
+#: gui/browser.cpp:68 gui/browser_osx.mm:104
+msgid "Show hidden files"
+msgstr "Mostrar ficheiros ocultos"
+
+#: gui/browser.cpp:68
+msgid "Show files marked with the hidden attribute"
+msgstr "Mostrar ficheiros marcados como ocultos"
+
+#: gui/browser.cpp:72 gui/remotebrowser.cpp:56
+msgid "Go up"
+msgstr "Acima"
+
+#: gui/browser.cpp:72 gui/browser.cpp:74 gui/remotebrowser.cpp:56
+#: gui/remotebrowser.cpp:58
+msgid "Go to previous directory level"
+msgstr "Ir para a directoria anterior"
+
+#: gui/browser.cpp:74 gui/remotebrowser.cpp:58
+msgctxt "lowres"
+msgid "Go up"
+msgstr "Acima"
+
+#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/editgamedialog.cpp:292
+#: gui/editrecorddialog.cpp:67 gui/filebrowser-dialog.cpp:64
+#: gui/fluidsynth-dialog.cpp:152 gui/KeysDialog.cpp:43 gui/massadd.cpp:95
+#: gui/options.cpp:1461 gui/predictivedialog.cpp:73 gui/recorderdialog.cpp:69
+#: gui/recorderdialog.cpp:155 gui/remotebrowser.cpp:59
+#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:443
+#: gui/saveload-dialog.cpp:717 gui/saveload-dialog.cpp:1111
+#: gui/storagewizarddialog.cpp:68 gui/themebrowser.cpp:55
+#: gui/updates-dialog.cpp:113 engines/engine.cpp:558
+#: backends/events/default/default-events.cpp:196
+#: backends/events/default/default-events.cpp:218
+#: backends/platform/wii/options.cpp:48 engines/drascula/saveload.cpp:49
+#: engines/parallaction/saveload.cpp:271 engines/scumm/dialogs.cpp:187
+#: engines/sword1/control.cpp:865
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: gui/browser.cpp:76 gui/browser_osx.mm:103 gui/chooser.cpp:47
+#: gui/filebrowser-dialog.cpp:65 gui/remotebrowser.cpp:60
+#: gui/themebrowser.cpp:56
+msgid "Choose"
+msgstr "Escolher"
+
+#: gui/downloaddialog.cpp:48
+msgid "Select directory where to download game data"
+msgstr "Seleccione a directoria de descarga dos arquivos do jogo"
+
+#: gui/downloaddialog.cpp:49 gui/editgamedialog.cpp:470 gui/launcher.cpp:197
+msgid "Select directory with game data"
+msgstr "Seleccione a directoria com os arquivos do jogo"
+
+#: gui/downloaddialog.cpp:51 gui/downloaddialog.cpp:263
+msgid "From: "
+msgstr "De: "
+
+#: gui/downloaddialog.cpp:52 gui/downloaddialog.cpp:264
+msgid "To: "
+msgstr "Para: "
+
+#: gui/downloaddialog.cpp:63
+msgid "Cancel download"
+msgstr "Cancelar descarga"
+
+#: gui/downloaddialog.cpp:65
+msgctxt "lowres"
+msgid "Cancel download"
+msgstr "Cancelar descarga"
+
+#: gui/downloaddialog.cpp:67
+msgid "Hide"
+msgstr "Esconder"
+
+#: gui/downloaddialog.cpp:117
+msgid ""
+"It looks like your connection is limited. Do you really want to download "
+"files with it?"
+msgstr ""
+"Parece que a sua conexуo щ limitada. Deseja mesmo assim fazer a descarga dos "
+"ficheiros?"
+
+#: gui/downloaddialog.cpp:118 gui/downloaddialog.cpp:152
+#: gui/filebrowser-dialog.cpp:132 gui/fluidsynth-dialog.cpp:217
+#: gui/launcher.cpp:307 gui/launcher.cpp:415 gui/launcher.cpp:474
+#: gui/storagewizarddialog.cpp:112
+#: backends/events/symbiansdl/symbiansdl-events.cpp:186
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
+#: engines/kyra/saveload_eob.cpp:557 engines/kyra/saveload_eob.cpp:590
+#: engines/sci/graphics/controls32.cpp:827
+msgid "Yes"
+msgstr "Sim"
+
+#: gui/downloaddialog.cpp:118 gui/downloaddialog.cpp:153
+#: gui/filebrowser-dialog.cpp:132 gui/fluidsynth-dialog.cpp:217
+#: gui/launcher.cpp:307 gui/launcher.cpp:415 gui/launcher.cpp:474
+#: gui/storagewizarddialog.cpp:112
+#: backends/events/symbiansdl/symbiansdl-events.cpp:186
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+#: backends/platform/wince/CELauncherDialog.cpp:83
+#: engines/kyra/saveload_eob.cpp:557 engines/kyra/saveload_eob.cpp:590
+#: engines/sci/graphics/controls32.cpp:827
+msgid "No"
+msgstr "Nуo"
+
+#: gui/downloaddialog.cpp:136 gui/launcher.cpp:565
+msgid "ScummVM couldn't open the specified directory!"
+msgstr "ScummVM nуo conseguiu abrir a directoria especificada!"
+
+#: gui/downloaddialog.cpp:146
+msgid ""
+"Cannot create a directory to download - the specified directory has a file "
+"with the same name."
+msgstr ""
+"Nуo щ possэvel criar uma directoria para a descarga - a directoria "
+"especificada possui um arquivo com o mesmo nome."
+
+#: gui/downloaddialog.cpp:146 gui/editgamedialog.cpp:293
+#: gui/fluidsynth-dialog.cpp:153 gui/KeysDialog.cpp:42 gui/launcher.cpp:522
+#: gui/launcher.cpp:526 gui/massadd.cpp:92 gui/options.cpp:1463
+#: gui/saveload-dialog.cpp:1112 engines/engine.cpp:477 engines/engine.cpp:488
+#: backends/platform/wii/options.cpp:47
+#: backends/platform/wince/CELauncherDialog.cpp:54
+#: engines/agos/animation.cpp:559 engines/drascula/saveload.cpp:49
+#: engines/groovie/script.cpp:407 engines/parallaction/saveload.cpp:271
+#: engines/sci/graphics/controls32.cpp:824 engines/scumm/dialogs.cpp:189
+#: engines/scumm/scumm.cpp:1882 engines/scumm/players/player_v3m.cpp:130
+#: engines/scumm/players/player_v5m.cpp:108 engines/sky/compact.cpp:131
+#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:524
+#: engines/sword1/animation.cpp:545 engines/sword1/animation.cpp:561
+#: engines/sword1/animation.cpp:569 engines/sword1/control.cpp:865
+#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:425
+#: engines/sword2/animation.cpp:445 engines/sword2/animation.cpp:461
+#: engines/sword2/animation.cpp:471 engines/zvision/file/save_manager.cpp:224
+msgid "OK"
+msgstr "OK"
+
+#: gui/downloaddialog.cpp:151
+#, c-format
+msgid ""
+"The \"%s\" already exists in the specified directory.\n"
+"Do you really want to download files into that directory?"
+msgstr ""
+"O \"%s\" jс existe na directoria especificada.\n"
+"Deseja mesmo descarregar ficheiros nessa directoria?"
+
+#: gui/downloaddialog.cpp:251
+#, c-format
+msgid "Downloaded %s %s / %s %s"
+msgstr "Descarregado %s %s / %s %s"
+
+#: gui/downloaddialog.cpp:258
+#, c-format
+msgid "Download speed: %s %s"
+msgstr "Velocidade de descarga: %s %s"
+
+#: gui/editgamedialog.cpp:132
+msgid "Game"
+msgstr "Jogo"
+
+#: gui/editgamedialog.cpp:136
+msgid "ID:"
+msgstr "Cѓdigo:"
+
+#: gui/editgamedialog.cpp:136 gui/editgamedialog.cpp:138
+#: gui/editgamedialog.cpp:139
+msgid ""
+"Short game identifier used for referring to saved games and running the game "
+"from the command line"
+msgstr ""
+"Cѓdigo usado para identificar os jogos salvos e para executar o jogo a "
+"partir da linha de comandos"
+
+#: gui/editgamedialog.cpp:138
+msgctxt "lowres"
+msgid "ID:"
+msgstr "Cѓdigo:"
+
+#: gui/editgamedialog.cpp:143 gui/editrecorddialog.cpp:59
+msgid "Name:"
+msgstr "Nome:"
+
+#: gui/editgamedialog.cpp:143 gui/editgamedialog.cpp:145
+#: gui/editgamedialog.cpp:146
+msgid "Full title of the game"
+msgstr "Tэtulo completo do jogo"
+
+#: gui/editgamedialog.cpp:145
+msgctxt "lowres"
+msgid "Name:"
+msgstr "Nome:"
+
+#: gui/editgamedialog.cpp:149
+msgid "Language:"
+msgstr "Idioma:"
+
+#: gui/editgamedialog.cpp:149 gui/editgamedialog.cpp:150
+msgid ""
+"Language of the game. This will not turn your Spanish game version into "
+"English"
+msgstr ""
+"Idioma do jogo. Esta opчуo nуo muda a sua versуo do jogo de Portuguъs para "
+"Inglъs"
+
+#: gui/editgamedialog.cpp:151 gui/editgamedialog.cpp:165 gui/options.cpp:121
+#: gui/options.cpp:812 gui/options.cpp:825 gui/options.cpp:1356
+#: audio/null.cpp:41
+msgid "<default>"
+msgstr "<padrуo>"
+
+#: gui/editgamedialog.cpp:161
+msgid "Platform:"
+msgstr "Plataforma:"
+
+#: gui/editgamedialog.cpp:161 gui/editgamedialog.cpp:163
+#: gui/editgamedialog.cpp:164
+msgid "Platform the game was originally designed for"
+msgstr "Plataforma para a qual o jogo foi originalmente desenvolvido"
+
+#: gui/editgamedialog.cpp:163
+msgctxt "lowres"
+msgid "Platform:"
+msgstr "Plataforma:"
+
+#: gui/editgamedialog.cpp:176
+msgid "Engine"
+msgstr "Recursos"
+
+#: gui/editgamedialog.cpp:184 gui/options.cpp:1147 gui/options.cpp:1232
+msgid "Graphics"
+msgstr "Grсficos"
+
+#: gui/editgamedialog.cpp:184 gui/options.cpp:1147 gui/options.cpp:1232
+msgid "GFX"
+msgstr "GFX"
+
+#: gui/editgamedialog.cpp:187
+msgid "Override global graphic settings"
+msgstr "Substituir configuraчѕes gerais de grсficos"
+
+#: gui/editgamedialog.cpp:189
+msgctxt "lowres"
+msgid "Override global graphic settings"
+msgstr "Substituir configuraчѕes gerais de grсficos"
+
+#: gui/editgamedialog.cpp:196 gui/options.cpp:1238
+msgid "Audio"
+msgstr "Сudio"
+
+#: gui/editgamedialog.cpp:199
+msgid "Override global audio settings"
+msgstr "Substituir configuraчѕes gerais de сudio"
+
+#: gui/editgamedialog.cpp:201
+msgctxt "lowres"
+msgid "Override global audio settings"
+msgstr "Substituir configuraчѕes gerais de сudio"
+
+#: gui/editgamedialog.cpp:210 gui/options.cpp:1243
+msgid "Volume"
+msgstr "Volume"
+
+#: gui/editgamedialog.cpp:212 gui/options.cpp:1245
+msgctxt "lowres"
+msgid "Volume"
+msgstr "Volume"
+
+#: gui/editgamedialog.cpp:215
+msgid "Override global volume settings"
+msgstr "Substituir configuraчѕes gerais de volume"
+
+#: gui/editgamedialog.cpp:217
+msgctxt "lowres"
+msgid "Override global volume settings"
+msgstr "Substituir configuraчѕes gerais de volume"
+
+#: gui/editgamedialog.cpp:226 gui/options.cpp:1253
+msgid "MIDI"
+msgstr "MIDI"
+
+#: gui/editgamedialog.cpp:229
+msgid "Override global MIDI settings"
+msgstr "Substituir configuraчѕes gerais de MIDI"
+
+#: gui/editgamedialog.cpp:231
+msgctxt "lowres"
+msgid "Override global MIDI settings"
+msgstr "Substituir configuraчѕes gerais de MIDI"
+
+#: gui/editgamedialog.cpp:241 gui/options.cpp:1263
+msgid "MT-32"
+msgstr "MT-32"
+
+#: gui/editgamedialog.cpp:244
+msgid "Override global MT-32 settings"
+msgstr "Substituir configuraчѕes gerais de MT-32"
+
+#: gui/editgamedialog.cpp:246
+msgctxt "lowres"
+msgid "Override global MT-32 settings"
+msgstr "Substituir configuraчѕes gerais de MT-32"
+
+#: gui/editgamedialog.cpp:255 gui/options.cpp:1270
+msgid "Paths"
+msgstr "Caminhos"
+
+#: gui/editgamedialog.cpp:257 gui/options.cpp:1272
+msgctxt "lowres"
+msgid "Paths"
+msgstr "Caminhos"
+
+#: gui/editgamedialog.cpp:264
+msgid "Game Path:"
+msgstr "Caminho do Jogo:"
+
+#: gui/editgamedialog.cpp:266
+msgctxt "lowres"
+msgid "Game Path:"
+msgstr "Caminho do Jogo:"
+
+#: gui/editgamedialog.cpp:271 gui/options.cpp:1296
+msgid "Extra Path:"
+msgstr "Caminho de Extras:"
+
+#: gui/editgamedialog.cpp:271 gui/editgamedialog.cpp:273
+#: gui/editgamedialog.cpp:274
+msgid "Specifies path to additional data used by the game"
+msgstr "Especifica o caminho para dados adicionais usados pelo jogo"
+
+#: gui/editgamedialog.cpp:273 gui/options.cpp:1298
+msgctxt "lowres"
+msgid "Extra Path:"
+msgstr "Caminho de Extras:"
+
+#: gui/editgamedialog.cpp:280 gui/options.cpp:1280
+msgid "Save Path:"
+msgstr "Caminho para Salvar:"
+
+#: gui/editgamedialog.cpp:280 gui/editgamedialog.cpp:282
+#: gui/editgamedialog.cpp:283 gui/options.cpp:1280 gui/options.cpp:1282
+#: gui/options.cpp:1283
+msgid "Specifies where your saved games are put"
+msgstr "Especifica onde os jogos salvos sуo colocados"
+
+#: gui/editgamedialog.cpp:282 gui/options.cpp:1282
+msgctxt "lowres"
+msgid "Save Path:"
+msgstr "Caminho para Salvar:"
+
+#: gui/editgamedialog.cpp:301 gui/editgamedialog.cpp:398
+#: gui/editgamedialog.cpp:457 gui/editgamedialog.cpp:518 gui/options.cpp:1291
+#: gui/options.cpp:1299 gui/options.cpp:1308 gui/options.cpp:1488
+#: gui/options.cpp:1494 gui/options.cpp:1502 gui/options.cpp:1525
+#: gui/options.cpp:1554 gui/options.cpp:1560 gui/options.cpp:1567
+#: gui/options.cpp:1575 gui/options.cpp:1758 gui/options.cpp:1761
+#: gui/options.cpp:1768 gui/options.cpp:1778
+msgctxt "path"
+msgid "None"
+msgstr "Nenhum"
+
+#: gui/editgamedialog.cpp:306 gui/editgamedialog.cpp:404
+#: gui/editgamedialog.cpp:522 gui/options.cpp:1482 gui/options.cpp:1548
+#: gui/options.cpp:1764 backends/platform/wii/options.cpp:56
+msgid "Default"
+msgstr "Padrуo"
+
+#: gui/editgamedialog.cpp:450 gui/options.cpp:1772
+msgid "Select SoundFont"
+msgstr "Seleccione o SoundFont"
+
+#: gui/editgamedialog.cpp:489
+msgid "Select additional game directory"
+msgstr "Seleccione uma directoria adicional para o jogo"
+
+#: gui/editgamedialog.cpp:502 gui/options.cpp:1695
+msgid "Select directory for saved games"
+msgstr "Seleccione uma directoria para salvar o jogo"
+
+#: gui/editgamedialog.cpp:508
+msgid ""
+"Saved games sync feature doesn't work with non-default directories. If you "
+"want your saved games to sync, use default directory."
+msgstr ""
+"A funcionalidade de sincronizaчуo de jogos guardados nуo funciona com "
+"directorias que nуo sejam predefinidas. Se quiser que os seus jogos salvos "
+"sejam sincronizados, use a directoria padrуo."
+
+#: gui/editgamedialog.cpp:534
+msgid "This game ID is already taken. Please choose another one."
+msgstr ""
+"O cѓdigo deste jogo jс se encontra em utilizaчуo. Por favor, escolha outro "
+"cѓdigo."
+
+#: gui/editrecorddialog.cpp:58
+msgid "Author:"
+msgstr "Autor:"
+
+#: gui/editrecorddialog.cpp:60
+msgid "Notes:"
+msgstr "Notas:"
+
+#: gui/editrecorddialog.cpp:68 gui/predictivedialog.cpp:74
+msgid "Ok"
+msgstr "Ok"
+
+#: gui/filebrowser-dialog.cpp:49
+msgid "Choose file for loading"
+msgstr "Escolher ficheiro para carregar"
+
+#: gui/filebrowser-dialog.cpp:49
+msgid "Enter filename for saving"
+msgstr "Introduzir nome para salvar"
+
+#: gui/filebrowser-dialog.cpp:132
+msgid "Do you really want to overwrite the file?"
+msgstr "Deseja mesmo substituir o ficheiro?"
+
+#: gui/fluidsynth-dialog.cpp:68
+msgid "Reverb"
+msgstr "Reverberaчуo"
+
+#: gui/fluidsynth-dialog.cpp:70 gui/fluidsynth-dialog.cpp:102
+msgid "Active"
+msgstr "Activo"
+
+#: gui/fluidsynth-dialog.cpp:72
+msgid "Room:"
+msgstr "Espaчo:"
+
+#: gui/fluidsynth-dialog.cpp:79
+msgid "Damp:"
+msgstr "Supressуo:"
+
+#: gui/fluidsynth-dialog.cpp:86
+msgid "Width:"
+msgstr "Amplitude:"
+
+#: gui/fluidsynth-dialog.cpp:93 gui/fluidsynth-dialog.cpp:111
+msgid "Level:"
+msgstr "Nэvel:"
+
+#: gui/fluidsynth-dialog.cpp:100
+msgid "Chorus"
+msgstr "Coro"
+
+#: gui/fluidsynth-dialog.cpp:104
+msgid "N:"
+msgstr "N:"
+
+#: gui/fluidsynth-dialog.cpp:118
+msgid "Speed:"
+msgstr "Velocidade:"
+
+#: gui/fluidsynth-dialog.cpp:125
+msgid "Depth:"
+msgstr "Intensidade:"
+
+#: gui/fluidsynth-dialog.cpp:132
+msgid "Type:"
+msgstr "Tipo:"
+
+#: gui/fluidsynth-dialog.cpp:135
+msgid "Sine"
+msgstr "Seno"
+
+#: gui/fluidsynth-dialog.cpp:136
+msgid "Triangle"
+msgstr "Triтngulo"
+
+#: gui/fluidsynth-dialog.cpp:138 gui/options.cpp:1316
+msgid "Misc"
+msgstr "Vсrios"
+
+#: gui/fluidsynth-dialog.cpp:140
+msgid "Interpolation:"
+msgstr "Interpolaчуo:"
+
+#: gui/fluidsynth-dialog.cpp:143
+msgid "None (fastest)"
+msgstr "Nenhum (acelerado)"
+
+#: gui/fluidsynth-dialog.cpp:144
+msgid "Linear"
+msgstr "Linear"
+
+#: gui/fluidsynth-dialog.cpp:145
+msgid "Fourth-order"
+msgstr "Quarta"
+
+#: gui/fluidsynth-dialog.cpp:146
+msgid "Seventh-order"
+msgstr "Sщtima"
+
+#: gui/fluidsynth-dialog.cpp:150
+msgid "Reset"
+msgstr "Reiniciar"
+
+#: gui/fluidsynth-dialog.cpp:150
+msgid "Reset all FluidSynth settings to their default values."
+msgstr "Restaurar todas as configuraчѕes FluidSynth para os valores de origem."
+
+#: gui/fluidsynth-dialog.cpp:217
+msgid ""
+"Do you really want to reset all FluidSynth settings to their default values?"
+msgstr ""
+"Deseja mesmo restaurar todas as configuraчѕes FluidSynth para os valores de "
+"origem?"
+
+#: gui/gui-manager.cpp:119 backends/keymapper/remap-dialog.cpp:53
+#: engines/scumm/help.cpp:126 engines/scumm/help.cpp:141
+#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:192
+#: engines/scumm/help.cpp:210
+msgid "Close"
+msgstr "Fechar"
+
+#: gui/gui-manager.cpp:122
+msgid "Mouse click"
+msgstr "Clique do rato"
+
+#: gui/gui-manager.cpp:126 base/main.cpp:340
+msgid "Display keyboard"
+msgstr "Mostrar teclado"
+
+#: gui/gui-manager.cpp:130 base/main.cpp:344
+msgid "Remap keys"
+msgstr "Redefinir teclas"
+
+#: gui/gui-manager.cpp:133 base/main.cpp:347 engines/scumm/help.cpp:87
+msgid "Toggle fullscreen"
+msgstr "Mudar para ecrу inteiro"
+
+#: gui/KeysDialog.cpp:41
+msgid "Map"
+msgstr "Definir"
+
+#: gui/KeysDialog.cpp:49
+msgid "Select an action and click 'Map'"
+msgstr "Seleccione uma acчуo e clique 'Definir'"
+
+#: gui/KeysDialog.cpp:80 gui/KeysDialog.cpp:102 gui/KeysDialog.cpp:141
+#, c-format
+msgid "Associated key : %s"
+msgstr "Teclas associadas : %s"
+
+#: gui/KeysDialog.cpp:82 gui/KeysDialog.cpp:104 gui/KeysDialog.cpp:143
+#, c-format
+msgid "Associated key : none"
+msgstr "Teclas associadas : nenhuma"
+
+#: gui/KeysDialog.cpp:90
+msgid "Please select an action"
+msgstr "Por favor, seleccione uma acчуo"
+
+#: gui/KeysDialog.cpp:106
+msgid "Press the key to associate"
+msgstr "Pressione a tecla para associar"
+
+#: gui/KeysDialog.cpp:145 gui/KeysDialog.h:36
+msgid "Choose an action to map"
+msgstr "Escolha uma acчуo para definir"
+
+#: gui/launcher.cpp:141 engines/dialogs.cpp:111 engines/mohawk/dialogs.cpp:98
+msgid "~Q~uit"
+msgstr "~S~air"
+
+#: gui/launcher.cpp:141 backends/platform/sdl/macosx/appmenu_osx.mm:106
+msgid "Quit ScummVM"
+msgstr "Sair do ScummVM"
+
+#: gui/launcher.cpp:142
+msgid "A~b~out..."
+msgstr "So~b~re..."
+
+#: gui/launcher.cpp:142 backends/platform/sdl/macosx/appmenu_osx.mm:80
+msgid "About ScummVM"
+msgstr "Sobre o ScumnmVM"
+
+#: gui/launcher.cpp:143
+msgid "~O~ptions..."
+msgstr "~O~pчѕes..."
+
+#: gui/launcher.cpp:143
+msgid "Change global ScummVM options"
+msgstr "Alterar opчѕes gerais do ScummVM"
+
+#: gui/launcher.cpp:145
+msgid "~S~tart"
+msgstr "~I~niciar"
+
+#: gui/launcher.cpp:145
+msgid "Start selected game"
+msgstr "Iniciar jogo seleccionado"
+
+#: gui/launcher.cpp:148
+msgid "~L~oad..."
+msgstr "~C~arregar..."
+
+#: gui/launcher.cpp:148
+msgid "Load saved game for selected game"
+msgstr "Carregar jogo salvo do jogo selecionado"
+
+#: gui/launcher.cpp:153
+msgid "~A~dd Game..."
+msgstr "~A~dicionar Jogo..."
+
+#: gui/launcher.cpp:153 gui/launcher.cpp:160
+msgid "Hold Shift for Mass Add"
+msgstr "Pressionar Shift para Adiчуo em Massa"
+
+#: gui/launcher.cpp:155
+msgid "~E~dit Game..."
+msgstr "~E~ditar Jogo..."
+
+#: gui/launcher.cpp:155 gui/launcher.cpp:162
+msgid "Change game options"
+msgstr "Alterar opчѕes do jogo"
+
+#: gui/launcher.cpp:157
+msgid "~R~emove Game"
+msgstr "~R~emover Jogo"
+
+#: gui/launcher.cpp:157 gui/launcher.cpp:164
+msgid "Remove game from the list. The game data files stay intact"
+msgstr ""
+"Remover jogo da lista. Os ficheiros de dados do jogo permanecem intactos"
+
+#: gui/launcher.cpp:160
+msgctxt "lowres"
+msgid "~A~dd Game..."
+msgstr "~A~dicionar Jogo..."
+
+#: gui/launcher.cpp:162
+msgctxt "lowres"
+msgid "~E~dit Game..."
+msgstr "~E~ditar Jogo..."
+
+#: gui/launcher.cpp:164
+msgctxt "lowres"
+msgid "~R~emove Game"
+msgstr "~R~emover Jogo"
+
+#: gui/launcher.cpp:172
+msgid "Search in game list"
+msgstr "Pesquisar na lista de jogos"
+
+#: gui/launcher.cpp:176 gui/launcher.cpp:771
+msgid "Search:"
+msgstr "Pesquisar:"
+
+#: gui/launcher.cpp:200 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
+#: engines/mohawk/dialogs.cpp:103 engines/mohawk/riven.cpp:734
+#: engines/pegasus/pegasus.cpp:353 engines/tsage/scenes.cpp:601
+#: engines/wage/saveload.cpp:748
+msgid "Load game:"
+msgstr "Carregar jogo:"
+
+#: gui/launcher.cpp:200 engines/dialogs.cpp:115
+#: backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/cruise/menu.cpp:214 engines/mohawk/dialogs.cpp:103
+#: engines/mohawk/riven.cpp:734 engines/parallaction/saveload.cpp:194
+#: engines/pegasus/pegasus.cpp:353 engines/scumm/dialogs.cpp:185
+#: engines/tsage/scenes.cpp:601 engines/wage/saveload.cpp:748
+msgid "Load"
+msgstr "Carregar"
+
+#: gui/launcher.cpp:306
+msgid ""
+"Do you really want to run the mass game detector? This could potentially add "
+"a huge number of games."
+msgstr ""
+"Deseja mesmo executar o detector de adiчуo em massa? Tal poderс, "
+"potencialmente, adicionar um elevado nњmero de jogos."
+
+#: gui/launcher.cpp:365
+msgid "This directory cannot be used yet, it is being downloaded into!"
+msgstr ""
+"De momento, esta directoria nуo pode ser utilizada, existe uma descarga em "
+"curso!"
+
+#: gui/launcher.cpp:415
+msgid "Do you really want to remove this game configuration?"
+msgstr "Deseja mesmo remover a configuraчуo deste jogo?"
+
+#: gui/launcher.cpp:473
+msgid "Do you want to load saved game?"
+msgstr "Deseja carregar o jogo salvo?"
+
+#: gui/launcher.cpp:522
+msgid "This game does not support loading games from the launcher."
+msgstr "Este jogo nуo permite carregar jogos a partir do menu principal."
+
+#: gui/launcher.cpp:526
+msgid "ScummVM could not find any engine capable of running the selected game!"
+msgstr ""
+"O ScummVM nуo conseguiu encontrar nenhum motor de jogo capaz de correr o "
+"jogo seleccionado!"
+
+#: gui/launcher.cpp:577
+msgid "ScummVM could not find any game in the specified directory!"
+msgstr ""
+"O ScummVM nуo conseguiu encontrar nenhum jogo na directoria especificada!"
+
+#: gui/launcher.cpp:590
+msgid "Pick the game:"
+msgstr "Escolha o jogo:"
+
+#: gui/launcher.cpp:708
+msgid "Mass Add..."
+msgstr "Adiчуo em Massa..."
+
+#: gui/launcher.cpp:710
+msgid "Record..."
+msgstr "Gravar..."
+
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
+msgid "... progress ..."
+msgstr "... progressуo ..."
+
+#: gui/massadd.cpp:259
+msgid "Scan complete!"
+msgstr "Busca completa!"
+
+#: gui/massadd.cpp:262
+#, c-format
+msgid "Discovered %d new games, ignored %d previously added games."
+msgstr ""
+"Encontrado(s) %d novo(s) jogo(s), ignorado(s) %d jogo(s) adicionado(s) "
+"anteriormente."
+
+#: gui/massadd.cpp:266
+#, c-format
+msgid "Scanned %d directories ..."
+msgstr "Pesquisada(s) %d directoria(s) ..."
+
+#: gui/massadd.cpp:269
+#, c-format
+msgid "Discovered %d new games, ignored %d previously added games ..."
+msgstr ""
+"Encontrado(s) %d novo(s) jogo(s), ignorado(s) %d jogo(s) adicionado(s) "
+"anteriormente ..."
+
+#: gui/onscreendialog.cpp:101 gui/onscreendialog.cpp:103
+msgid "Stop"
+msgstr "Parar"
+
+#: gui/onscreendialog.cpp:106
+msgid "Edit record description"
+msgstr "Editar descriчуo da gravaчуo"
+
+#: gui/onscreendialog.cpp:108
+msgid "Switch to Game"
+msgstr "Mudar para o Jogo"
+
+#: gui/onscreendialog.cpp:110
+msgid "Fast replay"
+msgstr "Repetiчуo rсpida"
+
+#: gui/options.cpp:119 common/updates.cpp:56
+msgid "Never"
+msgstr "Nunca"
+
+#: gui/options.cpp:119
+msgid "every 5 mins"
+msgstr "a cada 5 mins"
+
+#: gui/options.cpp:119
+msgid "every 10 mins"
+msgstr "a cada 10 mins"
+
+#: gui/options.cpp:119
+msgid "every 15 mins"
+msgstr "a cada 15 mins"
+
+#: gui/options.cpp:119
+msgid "every 30 mins"
+msgstr "a cada 30 mins"
+
+#: gui/options.cpp:121
+msgid "8 kHz"
+msgstr "8 kHz"
+
+#: gui/options.cpp:121
+msgid "11 kHz"
+msgstr "11 kHz"
+
+#: gui/options.cpp:121
+msgid "22 kHz"
+msgstr "22 kHz"
+
+#: gui/options.cpp:121
+msgid "44 kHz"
+msgstr "44 kHz"
+
+#: gui/options.cpp:121
+msgid "48 kHz"
+msgstr "48 kHz"
+
+#: gui/options.cpp:289 gui/options.cpp:552 gui/options.cpp:657
+#: gui/options.cpp:726 gui/options.cpp:937
+msgctxt "soundfont"
+msgid "None"
+msgstr "Nenhuma"
+
+#: gui/options.cpp:456
+msgid "Failed to apply some of the graphic options changes:"
+msgstr "Falha ao aplicar algumas mudanчas nas opчѕes de grсficos:"
+
+#: gui/options.cpp:468
+msgid "the video mode could not be changed."
+msgstr "o modo de vэdeo nуo pєde ser alterado."
+
+#: gui/options.cpp:474
+msgid "the aspect ratio setting could not be changed"
+msgstr "a taxa de proporчуo nуo pєde ser alterada"
+
+#: gui/options.cpp:480
+msgid "the fullscreen setting could not be changed"
+msgstr "a configuraчуo de ecrу inteiro nуo pєde ser alterada"
+
+#: gui/options.cpp:486
+msgid "the filtering setting could not be changed"
+msgstr "a configuraчуo de filtragem nуo pєde ser alterada"
+
+#: gui/options.cpp:809
+msgid "Graphics mode:"
+msgstr "Modelo de grсficos:"
+
+#: gui/options.cpp:823
+msgid "Render mode:"
+msgstr "Renderizaчуo:"
+
+#: gui/options.cpp:823 gui/options.cpp:824
+msgid "Special dithering modes supported by some games"
+msgstr "Modos especiais de pontilhado suportados por alguns jogos"
+
+#: gui/options.cpp:835 backends/graphics/openglsdl/openglsdl-graphics.cpp:615
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2460
+msgid "Fullscreen mode"
+msgstr "Modo de ecrу inteiro"
+
+#: gui/options.cpp:838
+msgid "Filter graphics"
+msgstr "Filtros grсficos"
+
+#: gui/options.cpp:838
+msgid "Use linear filtering when scaling graphics"
+msgstr "Usar filtragem linear quando dimensionar grсficos"
+
+#: gui/options.cpp:841
+msgid "Aspect ratio correction"
+msgstr "Correчуo da taxa de proporчуo"
+
+#: gui/options.cpp:841
+msgid "Correct aspect ratio for 320x200 games"
+msgstr "Corrigir taxa de proporчуo em jogos de 320x200"
+
+#: gui/options.cpp:849
+msgid "Preferred Device:"
+msgstr ""
+
+#: gui/options.cpp:849
+msgid "Music Device:"
+msgstr ""
+
+#: gui/options.cpp:849 gui/options.cpp:851
+msgid "Specifies preferred sound device or sound card emulator"
+msgstr ""
+
+#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852
+msgid "Specifies output sound device or sound card emulator"
+msgstr ""
+
+#: gui/options.cpp:851
+msgctxt "lowres"
+msgid "Preferred Dev.:"
+msgstr ""
+
+#: gui/options.cpp:851
+msgctxt "lowres"
+msgid "Music Device:"
+msgstr ""
+
+#: gui/options.cpp:878
+msgid "AdLib emulator:"
+msgstr ""
+
+#: gui/options.cpp:878 gui/options.cpp:879
+msgid "AdLib is used for music in many games"
+msgstr ""
+
+#: gui/options.cpp:889
+msgid "Output rate:"
+msgstr ""
+
+#: gui/options.cpp:889 gui/options.cpp:890
+msgid ""
+"Higher value specifies better sound quality but may be not supported by your "
+"soundcard"
+msgstr ""
+
+#: gui/options.cpp:900
+msgid "GM Device:"
+msgstr ""
+
+#: gui/options.cpp:900
+msgid "Specifies default sound device for General MIDI output"
+msgstr ""
+
+#: gui/options.cpp:911
+msgid "Don't use General MIDI music"
+msgstr ""
+
+#: gui/options.cpp:922 gui/options.cpp:984
+msgid "Use first available device"
+msgstr ""
+
+#: gui/options.cpp:934
+msgid "SoundFont:"
+msgstr ""
+
+#: gui/options.cpp:934 gui/options.cpp:936 gui/options.cpp:937
+msgid "SoundFont is supported by some audio cards, FluidSynth and Timidity"
+msgstr ""
+
+#: gui/options.cpp:936
+msgctxt "lowres"
+msgid "SoundFont:"
+msgstr ""
+
+#: gui/options.cpp:942
+msgid "Mixed AdLib/MIDI mode"
+msgstr ""
+
+#: gui/options.cpp:942
+msgid "Use both MIDI and AdLib sound generation"
+msgstr ""
+
+#: gui/options.cpp:945
+msgid "MIDI gain:"
+msgstr ""
+
+#: gui/options.cpp:955
+msgid "MT-32 Device:"
+msgstr ""
+
+#: gui/options.cpp:955
+msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
+msgstr ""
+
+#: gui/options.cpp:960
+msgid "True Roland MT-32 (disable GM emulation)"
+msgstr ""
+
+#: gui/options.cpp:960 gui/options.cpp:962
+msgid ""
+"Check if you want to use your real hardware Roland-compatible sound device "
+"connected to your computer"
+msgstr ""
+
+#: gui/options.cpp:962
+msgctxt "lowres"
+msgid "True Roland MT-32 (no GM emulation)"
+msgstr ""
+
+#: gui/options.cpp:965
+msgid "Roland GS Device (enable MT-32 mappings)"
+msgstr ""
+
+#: gui/options.cpp:965
+msgid ""
+"Check if you want to enable patch mappings to emulate an MT-32 on a Roland "
+"GS device"
+msgstr ""
+
+#: gui/options.cpp:974
+msgid "Don't use Roland MT-32 music"
+msgstr ""
+
+#: gui/options.cpp:1001
+msgid "Text and Speech:"
+msgstr ""
+
+#: gui/options.cpp:1005 gui/options.cpp:1015
+msgid "Speech"
+msgstr ""
+
+#: gui/options.cpp:1006 gui/options.cpp:1016
+msgid "Subtitles"
+msgstr ""
+
+#: gui/options.cpp:1007
+msgid "Both"
+msgstr ""
+
+#: gui/options.cpp:1009
+msgid "Subtitle speed:"
+msgstr ""
+
+#: gui/options.cpp:1011
+msgctxt "lowres"
+msgid "Text and Speech:"
+msgstr ""
+
+#: gui/options.cpp:1015
+msgid "Spch"
+msgstr ""
+
+#: gui/options.cpp:1016
+msgid "Subs"
+msgstr ""
+
+#: gui/options.cpp:1017
+msgctxt "lowres"
+msgid "Both"
+msgstr ""
+
+#: gui/options.cpp:1017
+msgid "Show subtitles and play speech"
+msgstr ""
+
+#: gui/options.cpp:1019
+msgctxt "lowres"
+msgid "Subtitle speed:"
+msgstr ""
+
+#: gui/options.cpp:1035
+msgid "Music volume:"
+msgstr ""
+
+#: gui/options.cpp:1037
+msgctxt "lowres"
+msgid "Music volume:"
+msgstr ""
+
+#: gui/options.cpp:1044
+msgid "Mute All"
+msgstr ""
+
+#: gui/options.cpp:1047
+msgid "SFX volume:"
+msgstr ""
+
+#: gui/options.cpp:1047 gui/options.cpp:1049 gui/options.cpp:1050
+msgid "Special sound effects volume"
+msgstr ""
+
+#: gui/options.cpp:1049
+msgctxt "lowres"
+msgid "SFX volume:"
+msgstr ""
+
+#: gui/options.cpp:1057
+msgid "Speech volume:"
+msgstr ""
+
+#: gui/options.cpp:1059
+msgctxt "lowres"
+msgid "Speech volume:"
+msgstr ""
+
+#: gui/options.cpp:1257
+msgid "FluidSynth Settings"
+msgstr ""
+
+#: gui/options.cpp:1288
+msgid "Theme Path:"
+msgstr ""
+
+#: gui/options.cpp:1290
+msgctxt "lowres"
+msgid "Theme Path:"
+msgstr ""
+
+#: gui/options.cpp:1296 gui/options.cpp:1298 gui/options.cpp:1299
+msgid "Specifies path to additional data used by all games or ScummVM"
+msgstr ""
+
+#: gui/options.cpp:1305
+msgid "Plugins Path:"
+msgstr ""
+
+#: gui/options.cpp:1307
+msgctxt "lowres"
+msgid "Plugins Path:"
+msgstr ""
+
+#: gui/options.cpp:1318
+msgctxt "lowres"
+msgid "Misc"
+msgstr ""
+
+#: gui/options.cpp:1320
+msgid "Theme:"
+msgstr ""
+
+#: gui/options.cpp:1324
+msgid "GUI Renderer:"
+msgstr ""
+
+#: gui/options.cpp:1336
+msgid "Autosave:"
+msgstr ""
+
+#: gui/options.cpp:1338
+msgctxt "lowres"
+msgid "Autosave:"
+msgstr ""
+
+#: gui/options.cpp:1346
+msgid "Keys"
+msgstr ""
+
+#: gui/options.cpp:1353
+msgid "GUI Language:"
+msgstr ""
+
+#: gui/options.cpp:1353
+msgid "Language of ScummVM GUI"
+msgstr ""
+
+#: gui/options.cpp:1381
+msgid "Update check:"
+msgstr ""
+
+#: gui/options.cpp:1381
+msgid "How often to check ScummVM updates"
+msgstr ""
+
+#: gui/options.cpp:1393
+msgid "Check now"
+msgstr ""
+
+#: gui/options.cpp:1401
+msgid "Cloud"
+msgstr ""
+
+#: gui/options.cpp:1403
+msgctxt "lowres"
+msgid "Cloud"
+msgstr ""
+
+#: gui/options.cpp:1408
+msgid "Storage:"
+msgstr ""
+
+#: gui/options.cpp:1408
+msgid "Active cloud storage"
+msgstr ""
+
+#: gui/options.cpp:1415 gui/options.cpp:1972
+msgid "<none>"
+msgstr ""
+
+#: gui/options.cpp:1419 backends/platform/wii/options.cpp:114
+msgid "Username:"
+msgstr ""
+
+#: gui/options.cpp:1419
+msgid "Username used by this storage"
+msgstr ""
+
+#: gui/options.cpp:1422
+msgid "Used space:"
+msgstr ""
+
+#: gui/options.cpp:1422
+msgid "Space used by ScummVM's saved games on this storage"
+msgstr ""
+
+#: gui/options.cpp:1425
+msgid "Last sync time:"
+msgstr ""
+
+#: gui/options.cpp:1425
+msgid "When the last saved games sync for this storage occured"
+msgstr ""
+
+#: gui/options.cpp:1428 gui/storagewizarddialog.cpp:71
+msgid "Connect"
+msgstr ""
+
+#: gui/options.cpp:1428
+msgid "Open wizard dialog to connect your cloud storage account"
+msgstr ""
+
+#: gui/options.cpp:1429
+msgid "Refresh"
+msgstr ""
+
+#: gui/options.cpp:1429
+msgid "Refresh current cloud storage information (username and usage)"
+msgstr ""
+
+#: gui/options.cpp:1430
+msgid "Download"
+msgstr ""
+
+#: gui/options.cpp:1430
+msgid "Open downloads manager dialog"
+msgstr ""
+
+#: gui/options.cpp:1432
+msgid "Run server"
+msgstr ""
+
+#: gui/options.cpp:1432
+msgid "Run local webserver"
+msgstr ""
+
+#: gui/options.cpp:1433 gui/options.cpp:2082
+msgid "Not running"
+msgstr ""
+
+#: gui/options.cpp:1437
+msgid "/root/ Path:"
+msgstr ""
+
+#: gui/options.cpp:1437 gui/options.cpp:1439 gui/options.cpp:1440
+msgid "Specifies which directory the Files Manager can access"
+msgstr ""
+
+#: gui/options.cpp:1439
+msgctxt "lowres"
+msgid "/root/ Path:"
+msgstr ""
+
+#: gui/options.cpp:1449
+msgid "Server's port:"
+msgstr ""
+
+#: gui/options.cpp:1449
+msgid ""
+"Which port is used by the server\n"
+"Auth with server is not available with non-default port"
+msgstr ""
+
+#: gui/options.cpp:1462
+msgid "Apply"
+msgstr ""
+
+#: gui/options.cpp:1628
+msgid "Failed to change cloud storage!"
+msgstr ""
+
+#: gui/options.cpp:1631
+msgid "Another cloud storage is already active."
+msgstr ""
+
+#: gui/options.cpp:1667
+msgid ""
+"The theme you selected does not support your current language. If you want "
+"to use this theme you need to switch to another language first."
+msgstr ""
+
+#: gui/options.cpp:1702
+msgid "The chosen directory cannot be written to. Please select another one."
+msgstr ""
+
+#: gui/options.cpp:1711
+msgid "Select directory for GUI themes"
+msgstr ""
+
+#: gui/options.cpp:1721
+msgid "Select directory for extra files"
+msgstr ""
+
+#: gui/options.cpp:1732
+msgid "Select directory for plugins"
+msgstr ""
+
+#: gui/options.cpp:1744
+msgid "Select directory for Files Manager /root/"
+msgstr ""
+
+#: gui/options.cpp:1979
+#, c-format
+msgid "%llu bytes"
+msgstr ""
+
+#: gui/options.cpp:1987
+msgid "<right now>"
+msgstr ""
+
+#: gui/options.cpp:1989
+msgid "<never>"
+msgstr ""
+
+#: gui/options.cpp:2073
+msgid "Stop server"
+msgstr ""
+
+#: gui/options.cpp:2074
+msgid "Stop local webserver"
+msgstr ""
+
+#: gui/options.cpp:2163
+msgid ""
+"Request failed.\n"
+"Check your Internet connection."
+msgstr ""
+
+#. I18N: You must leave "#" as is, only word 'next' is translatable
+#: gui/predictivedialog.cpp:86
+msgid "# next"
+msgstr ""
+
+#: gui/predictivedialog.cpp:87
+msgid "add"
+msgstr ""
+
+#: gui/predictivedialog.cpp:92 gui/predictivedialog.cpp:167
+msgid "Delete char"
+msgstr ""
+
+#: gui/predictivedialog.cpp:97 gui/predictivedialog.cpp:171
+msgid "<"
+msgstr ""
+
+#. I18N: Pre means 'Predictive', leave '*' as is
+#: gui/predictivedialog.cpp:99 gui/predictivedialog.cpp:575
+msgid "* Pre"
+msgstr ""
+
+#. I18N: 'Num' means Numbers
+#: gui/predictivedialog.cpp:578
+msgid "* Num"
+msgstr ""
+
+#. I18N: 'Abc' means Latin alphabet input
+#: gui/predictivedialog.cpp:581
+msgid "* Abc"
+msgstr ""
+
+#: gui/recorderdialog.cpp:63
+msgid "Recorder or Playback Gameplay"
+msgstr ""
+
+#: gui/recorderdialog.cpp:68 gui/recorderdialog.cpp:155
+#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:443
+msgid "Delete"
+msgstr ""
+
+#: gui/recorderdialog.cpp:70
+msgid "Record"
+msgstr ""
+
+#: gui/recorderdialog.cpp:71
+msgid "Playback"
+msgstr ""
+
+#: gui/recorderdialog.cpp:73
+msgid "Edit"
+msgstr ""
+
+#: gui/recorderdialog.cpp:85 gui/recorderdialog.cpp:242
+#: gui/recorderdialog.cpp:252
+msgid "Author: "
+msgstr ""
+
+#: gui/recorderdialog.cpp:86 gui/recorderdialog.cpp:243
+#: gui/recorderdialog.cpp:253
+msgid "Notes: "
+msgstr ""
+
+#: gui/recorderdialog.cpp:154
+msgid "Do you really want to delete this record?"
+msgstr ""
+
+#: gui/recorderdialog.cpp:173
+msgid "Unknown Author"
+msgstr ""
+
+#: gui/remotebrowser.cpp:128
+msgid "ScummVM could not access the directory!"
+msgstr ""
+
+#: gui/saveload-dialog.cpp:334
+msgid "List view"
+msgstr ""
+
+#: gui/saveload-dialog.cpp:335
+msgid "Grid view"
+msgstr ""
+
+#: gui/saveload-dialog.cpp:378 gui/saveload-dialog.cpp:528
+msgid "No date saved"
+msgstr ""
+
+#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:529
+msgid "No time saved"
+msgstr ""
+
+#: gui/saveload-dialog.cpp:380 gui/saveload-dialog.cpp:530
+msgid "No playtime saved"
+msgstr ""
+
+#: gui/saveload-dialog.cpp:442
+msgid "Do you really want to delete this saved game?"
+msgstr ""
+
+#: gui/saveload-dialog.cpp:554 gui/saveload-dialog.cpp:1060
+msgid "Date: "
+msgstr ""
+
+#: gui/saveload-dialog.cpp:558 gui/saveload-dialog.cpp:1066
+msgid "Time: "
+msgstr ""
+
+#: gui/saveload-dialog.cpp:564 gui/saveload-dialog.cpp:1074
+msgid "Playtime: "
+msgstr ""
+
+#: gui/saveload-dialog.cpp:577 gui/saveload-dialog.cpp:665
+msgid "Untitled saved game"
+msgstr ""
+
+#: gui/saveload-dialog.cpp:718
+msgid "Next"
+msgstr ""
+
+#: gui/saveload-dialog.cpp:721
+msgid "Prev"
+msgstr ""
+
+#: gui/saveload-dialog.cpp:924
+msgid "New Save"
+msgstr ""
+
+#: gui/saveload-dialog.cpp:924
+msgid "Create a new saved game"
+msgstr ""
+
+#: gui/saveload-dialog.cpp:1053
+msgid "Name: "
+msgstr ""
+
+#: gui/saveload-dialog.cpp:1131
+#, c-format
+msgid "Enter a description for slot %d:"
+msgstr ""
+
+#: gui/storagewizarddialog.cpp:55
+#, c-format
+msgid "%s Storage Connection Wizard"
+msgstr ""
+
+#: gui/storagewizarddialog.cpp:58
+msgid "Navigate to the following URL:"
+msgstr ""
+
+#: gui/storagewizarddialog.cpp:61
+msgid "Obtain the code from the storage, enter it"
+msgstr ""
+
+#: gui/storagewizarddialog.cpp:62
+msgid "in the following field and press 'Connect':"
+msgstr ""
+
+#: gui/storagewizarddialog.cpp:69
+msgid "Open URL"
+msgstr ""
+
+#: gui/storagewizarddialog.cpp:70
+msgid "Paste"
+msgstr ""
+
+#: gui/storagewizarddialog.cpp:70
+msgid "Pastes clipboard contents into fields"
+msgstr ""
+
+#: gui/storagewizarddialog.cpp:78
+msgid "You will be directed to ScummVM's page where"
+msgstr ""
+
+#: gui/storagewizarddialog.cpp:79
+msgid "you should allow it to access your storage."
+msgstr ""
+
+#: gui/storagewizarddialog.cpp:112
+msgid "Another Storage is active. Do you want to interrupt it?"
+msgstr ""
+
+#: gui/storagewizarddialog.cpp:121
+msgid "Wait until current Storage finishes up and try again."
+msgstr ""
+
+#: gui/storagewizarddialog.cpp:182
+#, c-format
+msgid "Field %s has a mistake in it."
+msgstr ""
+
+#: gui/storagewizarddialog.cpp:184
+#, c-format
+msgid "Fields %s have mistakes in them."
+msgstr ""
+
+#: gui/storagewizarddialog.cpp:199
+msgid "All OK!"
+msgstr ""
+
+#: gui/storagewizarddialog.cpp:201
+msgid "Invalid code"
+msgstr ""
+
+#: gui/storagewizarddialog.cpp:209
+msgid ""
+"Failed to open URL!\n"
+"Please navigate to this page manually."
+msgstr ""
+
+#: gui/themebrowser.cpp:45
+msgid "Select a Theme"
+msgstr ""
+
+#: gui/ThemeEngine.cpp:452
+msgid "Disabled GFX"
+msgstr ""
+
+#: gui/ThemeEngine.cpp:452
+msgctxt "lowres"
+msgid "Disabled GFX"
+msgstr ""
+
+#: gui/ThemeEngine.cpp:453
+msgid "Standard Renderer"
+msgstr ""
+
+#: gui/ThemeEngine.cpp:453 engines/scumm/dialogs.cpp:659
+msgid "Standard"
+msgstr ""
+
+#: gui/ThemeEngine.cpp:455
+msgid "Antialiased Renderer"
+msgstr ""
+
+#: gui/ThemeEngine.cpp:455
+msgid "Antialiased"
+msgstr ""
+
+#: gui/updates-dialog.cpp:51
+msgid ""
+"ScummVM now supports automatic check for updates\n"
+"which requires access to the Internet.\n"
+"\n"
+"Would you like to enable this feature?"
+msgstr ""
+
+#: gui/updates-dialog.cpp:55
+msgid "(You can always enable it in the options dialog on the Misc tab)"
+msgstr ""
+
+#: gui/updates-dialog.cpp:92
+msgid "Check for updates automatically"
+msgstr ""
+
+#: gui/updates-dialog.cpp:111
+msgid "Proceed"
+msgstr ""
+
+#: gui/widget.cpp:366 gui/widget.cpp:368 gui/widget.cpp:374 gui/widget.cpp:376
+msgid "Clear value"
+msgstr ""
+
+#: base/main.cpp:253
+#, c-format
+msgid "Engine does not support debug level '%s'"
+msgstr ""
+
+#: base/main.cpp:327
+msgid "Menu"
+msgstr ""
+
+#: base/main.cpp:330 backends/platform/symbian/src/SymbianActions.cpp:45
+#: backends/platform/wince/CEActionsPocket.cpp:45
+#: backends/platform/wince/CEActionsSmartphone.cpp:46
+msgid "Skip"
+msgstr ""
+
+#: base/main.cpp:333 backends/platform/symbian/src/SymbianActions.cpp:50
+#: backends/platform/wince/CEActionsPocket.cpp:42
+msgid "Pause"
+msgstr ""
+
+#: base/main.cpp:336
+msgid "Skip line"
+msgstr ""
+
+#: base/main.cpp:547
+msgid "Error running game:"
+msgstr ""
+
+#: base/main.cpp:594
+msgid "Could not find any engine capable of running the selected game"
+msgstr ""
+
+#: common/error.cpp:38
+msgid "No error"
+msgstr ""
+
+#: common/error.cpp:40
+msgid "Game data not found"
+msgstr ""
+
+#: common/error.cpp:42
+msgid "Game id not supported"
+msgstr ""
+
+#: common/error.cpp:44
+msgid "Unsupported color mode"
+msgstr ""
+
+#: common/error.cpp:47
+msgid "Read permission denied"
+msgstr ""
+
+#: common/error.cpp:49
+msgid "Write permission denied"
+msgstr ""
+
+#: common/error.cpp:52
+msgid "Path does not exist"
+msgstr ""
+
+#: common/error.cpp:54
+msgid "Path not a directory"
+msgstr ""
+
+#: common/error.cpp:56
+msgid "Path not a file"
+msgstr ""
+
+#: common/error.cpp:59
+msgid "Cannot create file"
+msgstr ""
+
+#: common/error.cpp:61
+msgid "Reading data failed"
+msgstr ""
+
+#: common/error.cpp:63
+msgid "Writing data failed"
+msgstr ""
+
+#: common/error.cpp:66
+msgid "Could not find suitable engine plugin"
+msgstr ""
+
+#: common/error.cpp:68
+msgid "Engine plugin does not support saved games"
+msgstr ""
+
+#: common/error.cpp:71
+msgid "User canceled"
+msgstr ""
+
+#: common/error.cpp:75
+msgid "Unknown error"
+msgstr ""
+
+#. I18N: Hercules is graphics card name
+#: common/rendermode.cpp:35
+msgid "Hercules Green"
+msgstr ""
+
+#: common/rendermode.cpp:36
+msgid "Hercules Amber"
+msgstr ""
+
+#: common/rendermode.cpp:42
+msgid "PC-9821 (256 Colors)"
+msgstr ""
+
+#: common/rendermode.cpp:43
+msgid "PC-9801 (16 Colors)"
+msgstr ""
+
+#: common/rendermode.cpp:73
+msgctxt "lowres"
+msgid "Hercules Green"
+msgstr ""
+
+#: common/rendermode.cpp:74
+msgctxt "lowres"
+msgid "Hercules Amber"
+msgstr ""
+
+#: common/updates.cpp:58
+msgid "Daily"
+msgstr ""
+
+#: common/updates.cpp:60
+msgid "Weekly"
+msgstr ""
+
+#: common/updates.cpp:62
+msgid "Monthly"
+msgstr ""
+
+#: common/updates.cpp:64
+msgid "<Bad value>"
+msgstr ""
+
+#: engines/advancedDetector.cpp:335
+#, c-format
+msgid ""
+"The game in '%s' seems to be unknown.\n"
+"Please, report the following data to the ScummVM team along with name\n"
+"of the game you tried to add and its version, language, etc.:"
+msgstr ""
+
+#: engines/dialogs.cpp:85
+msgid "~R~esume"
+msgstr ""
+
+#: engines/dialogs.cpp:87 engines/mohawk/dialogs.cpp:96
+msgid "~L~oad"
+msgstr ""
+
+#: engines/dialogs.cpp:91 engines/mohawk/dialogs.cpp:97
+msgid "~S~ave"
+msgstr ""
+
+#: engines/dialogs.cpp:95
+msgid "~O~ptions"
+msgstr ""
+
+#: engines/dialogs.cpp:100
+msgid "~H~elp"
+msgstr ""
+
+#: engines/dialogs.cpp:102
+msgid "~A~bout"
+msgstr ""
+
+#: engines/dialogs.cpp:105 engines/dialogs.cpp:181
+msgid "~R~eturn to Launcher"
+msgstr ""
+
+#: engines/dialogs.cpp:107 engines/dialogs.cpp:183
+msgctxt "lowres"
+msgid "~R~eturn to Launcher"
+msgstr ""
+
+#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:761
+#: engines/avalanche/parser.cpp:1900 engines/cge/events.cpp:72
+#: engines/cge2/events.cpp:65 engines/cine/various.cpp:348
+#: engines/cruise/menu.cpp:212 engines/dm/loadsave.cpp:196
+#: engines/drascula/saveload.cpp:364 engines/dreamweb/saveload.cpp:262
+#: 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:892 engines/sci/engine/kfile.cpp:1168
+#: 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
+#: engines/wage/saveload.cpp:758 engines/zvision/file/save_manager.cpp:49
+msgid "Save game:"
+msgstr ""
+
+#: engines/dialogs.cpp:116 backends/platform/symbian/src/SymbianActions.cpp:44
+#: backends/platform/wince/CEActionsPocket.cpp:43
+#: backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:45
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/agi/saveload.cpp:761 engines/avalanche/parser.cpp:1900
+#: engines/cge/events.cpp:72 engines/cge2/events.cpp:65
+#: engines/cine/various.cpp:348 engines/cruise/menu.cpp:212
+#: engines/dm/loadsave.cpp:196 engines/drascula/saveload.cpp:364
+#: engines/dreamweb/saveload.cpp:262 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/parallaction/saveload.cpp:209 engines/pegasus/pegasus.cpp:377
+#: engines/sci/engine/kfile.cpp:892 engines/sci/engine/kfile.cpp:1168
+#: 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
+#: engines/wage/saveload.cpp:758 engines/zvision/file/save_manager.cpp:49
+msgid "Save"
+msgstr ""
+
+#: engines/dialogs.cpp:145
+msgid ""
+"Sorry, this engine does not currently provide in-game help. Please consult "
+"the README for basic information, and for instructions on how to obtain "
+"further assistance."
+msgstr ""
+
+#: engines/dialogs.cpp:234 engines/pegasus/pegasus.cpp:393
+#, c-format
+msgid ""
+"Failed to save game (%s)! Please consult the README for basic information, "
+"and for instructions on how to obtain further assistance."
+msgstr ""
+
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:100
+#: engines/tsage/dialogs.cpp:112
+msgid "~O~K"
+msgstr ""
+
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:101
+#: engines/tsage/dialogs.cpp:113
+msgid "~C~ancel"
+msgstr ""
+
+#: engines/dialogs.cpp:311
+msgid "~K~eys"
+msgstr ""
+
+#: engines/engine.cpp:346
+msgid "Could not initialize color format."
+msgstr ""
+
+#: engines/engine.cpp:354
+msgid "Could not switch to video mode: '"
+msgstr ""
+
+#: engines/engine.cpp:363
+msgid "Could not apply aspect ratio setting."
+msgstr ""
+
+#: engines/engine.cpp:368
+msgid "Could not apply fullscreen setting."
+msgstr ""
+
+#: engines/engine.cpp:373
+msgid "Could not apply filtering setting."
+msgstr ""
+
+#: engines/engine.cpp:473
+msgid ""
+"You appear to be playing this game directly\n"
+"from the CD. This is known to cause problems,\n"
+"and it is therefore recommended that you copy\n"
+"the data files to your hard disk instead.\n"
+"See the README file for details."
+msgstr ""
+
+#: engines/engine.cpp:484
+msgid ""
+"This game has audio tracks in its disk. These\n"
+"tracks need to be ripped from the disk using\n"
+"an appropriate CD audio extracting tool in\n"
+"order to listen to the game's music.\n"
+"See the README file for details."
+msgstr ""
+
+#: engines/engine.cpp:542
+#, c-format
+msgid ""
+"Failed to load saved game (%s)! Please consult the README for basic "
+"information, and for instructions on how to obtain further assistance."
+msgstr ""
+
+#: engines/engine.cpp:555
+msgid ""
+"WARNING: The game you are about to start is not yet fully supported by "
+"ScummVM. As such, it is likely to be unstable, and any saved game you make "
+"might not work in future versions of ScummVM."
+msgstr ""
+
+#: engines/engine.cpp:558
+msgid "Start anyway"
+msgstr ""
+
+#: audio/adlib.cpp:2290
+msgid "AdLib Emulator"
+msgstr ""
+
+#: audio/fmopl.cpp:62
+msgid "MAME OPL emulator"
+msgstr ""
+
+#: audio/fmopl.cpp:64
+msgid "DOSBox OPL emulator"
+msgstr ""
+
+#: audio/fmopl.cpp:67
+msgid "ALSA Direct FM"
+msgstr ""
+
+#: audio/mididrv.cpp:209
+#, c-format
+msgid ""
+"The selected audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+
+#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
+#: audio/mididrv.cpp:272
+msgid "Attempting to fall back to the next available device..."
+msgstr ""
+
+#: audio/mididrv.cpp:221
+#, c-format
+msgid ""
+"The selected audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+
+#: audio/mididrv.cpp:257
+#, c-format
+msgid ""
+"The preferred audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+
+#: audio/mididrv.cpp:272
+#, c-format
+msgid ""
+"The preferred audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+
+#: audio/mods/paula.cpp:196
+msgid "Amiga Audio Emulator"
+msgstr ""
+
+#: audio/null.h:44
+msgid "No music"
+msgstr ""
+
+#: audio/softsynth/appleiigs.cpp:33
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr ""
+
+#: audio/softsynth/cms.cpp:350
+msgid "Creative Music System Emulator"
+msgstr ""
+
+#: audio/softsynth/fmtowns_pc98/towns_pc98_plugins.cpp:33
+msgid "FM-Towns Audio"
+msgstr ""
+
+#: audio/softsynth/fmtowns_pc98/towns_pc98_plugins.cpp:58
+msgid "PC-98 Audio"
+msgstr ""
+
+#: audio/softsynth/mt32.cpp:197
+msgid "Initializing MT-32 Emulator"
+msgstr ""
+
+#: audio/softsynth/mt32.cpp:435
+msgid "MT-32 Emulator"
+msgstr ""
+
+#: audio/softsynth/pcspk.cpp:139
+msgid "PC Speaker Emulator"
+msgstr ""
+
+#: audio/softsynth/pcspk.cpp:158
+msgid "IBM PCjr Emulator"
+msgstr ""
+
+#: audio/softsynth/sid.cpp:1430
+msgid "C64 Audio Emulator"
+msgstr ""
+
+#: backends/cloud/storage.cpp:211
+msgid "Saved games sync complete."
+msgstr ""
+
+#: backends/cloud/storage.cpp:222
+msgid "Saved games sync was cancelled."
+msgstr ""
+
+#: backends/cloud/storage.cpp:224
+msgid ""
+"Saved games sync failed.\n"
+"Check your Internet connection."
+msgstr ""
+
+#: backends/cloud/storage.cpp:328
+#, c-format
+msgid ""
+"Download complete.\n"
+"Failed to download %u files."
+msgstr ""
+
+#: backends/cloud/storage.cpp:330
+msgid "Download complete."
+msgstr ""
+
+#: backends/cloud/storage.cpp:340
+msgid "Download failed."
+msgstr ""
+
+#: backends/events/default/default-events.cpp:196
+msgid "Do you really want to return to the Launcher?"
+msgstr ""
+
+#: backends/events/default/default-events.cpp:196
+msgid "Launcher"
+msgstr ""
+
+#: backends/events/default/default-events.cpp:218
+msgid "Do you really want to quit?"
+msgstr ""
+
+#: backends/events/default/default-events.cpp:218
+#: backends/platform/symbian/src/SymbianActions.cpp:52
+#: backends/platform/wince/CEActionsPocket.cpp:44
+#: backends/platform/wince/CEActionsSmartphone.cpp:52
+#: engines/scumm/dialogs.cpp:188 engines/scumm/help.cpp:83
+#: engines/scumm/help.cpp:85
+msgid "Quit"
+msgstr ""
+
+#: backends/events/gph/gph-events.cpp:385
+#: backends/events/gph/gph-events.cpp:428
+#: backends/events/openpandora/op-events.cpp:168
+msgid "Touchscreen 'Tap Mode' - Left Click"
+msgstr ""
+
+#: backends/events/gph/gph-events.cpp:387
+#: backends/events/gph/gph-events.cpp:430
+#: backends/events/openpandora/op-events.cpp:170
+msgid "Touchscreen 'Tap Mode' - Right Click"
+msgstr ""
+
+#: backends/events/gph/gph-events.cpp:389
+#: backends/events/gph/gph-events.cpp:432
+#: backends/events/openpandora/op-events.cpp:172
+msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
+msgstr ""
+
+#: backends/events/gph/gph-events.cpp:409
+msgid "Maximum Volume"
+msgstr ""
+
+#: backends/events/gph/gph-events.cpp:411
+msgid "Increasing Volume"
+msgstr ""
+
+#: backends/events/gph/gph-events.cpp:417
+msgid "Minimal Volume"
+msgstr ""
+
+#: backends/events/gph/gph-events.cpp:419
+msgid "Decreasing Volume"
+msgstr ""
+
+#: backends/events/maemosdl/maemosdl-events.cpp:180
+msgid "Clicking Enabled"
+msgstr ""
+
+#: backends/events/maemosdl/maemosdl-events.cpp:180
+msgid "Clicking Disabled"
+msgstr ""
+
+#: backends/events/openpandora/op-events.cpp:174
+msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
+msgstr ""
+
+#: backends/events/symbiansdl/symbiansdl-events.cpp:186
+msgid "Do you want to quit ?"
+msgstr ""
+
+#. I18N: Trackpad mode toggle status.
+#: backends/events/webossdl/webossdl-events.cpp:308
+msgid "Trackpad mode is now"
+msgstr ""
+
+#. I18N: Trackpad mode on or off.
+#. I18N: Auto-drag on or off.
+#: backends/events/webossdl/webossdl-events.cpp:311
+#: backends/events/webossdl/webossdl-events.cpp:338
+msgid "ON"
+msgstr ""
+
+#: backends/events/webossdl/webossdl-events.cpp:311
+#: backends/events/webossdl/webossdl-events.cpp:338
+msgid "OFF"
+msgstr ""
+
+#: backends/events/webossdl/webossdl-events.cpp:315
+msgid "Swipe two fingers to the right to toggle."
+msgstr ""
+
+#. I18N: Auto-drag toggle status.
+#: backends/events/webossdl/webossdl-events.cpp:335
+msgid "Auto-drag mode is now"
+msgstr ""
+
+#: backends/events/webossdl/webossdl-events.cpp:342
+msgid "Swipe three fingers to the right to toggle."
+msgstr ""
+
+#: backends/graphics/opengl/opengl-graphics.cpp:146
+msgid "OpenGL"
+msgstr ""
+
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:617
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2462
+msgid "Windowed mode"
+msgstr ""
+
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:710
+#, c-format
+msgid "Resolution: %dx%d"
+msgstr ""
+
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:731
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2338
+msgid "Enabled aspect ratio correction"
+msgstr ""
+
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:733
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2344
+msgid "Disabled aspect ratio correction"
+msgstr ""
+
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:753
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2362
+msgid "Filtering enabled"
+msgstr ""
+
+#: backends/graphics/openglsdl/openglsdl-graphics.cpp:755
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2364
+msgid "Filtering disabled"
+msgstr ""
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:47
+#: backends/graphics/wincesdl/wincesdl-graphics.cpp:88
+#: backends/graphics/wincesdl/wincesdl-graphics.cpp:95
+msgid "Normal (no scaling)"
+msgstr ""
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:66
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr ""
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2417
+msgid "Active graphics filter:"
+msgstr ""
+
+#: backends/keymapper/remap-dialog.cpp:48
+msgid "Keymap:"
+msgstr ""
+
+#: backends/keymapper/remap-dialog.cpp:67
+msgid " (Effective)"
+msgstr ""
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Active)"
+msgstr ""
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Blocked)"
+msgstr ""
+
+#: backends/keymapper/remap-dialog.cpp:120
+msgid " (Global)"
+msgstr ""
+
+#: backends/keymapper/remap-dialog.cpp:128
+msgid " (Game)"
+msgstr ""
+
+#: backends/midi/windows.cpp:165
+msgid "Windows MIDI"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:56
+#: engines/scumm/dialogs.cpp:287
+msgid "~C~lose"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:57
+msgid "ScummVM Main Menu"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:63
+msgid "~L~eft handed mode"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:64
+msgid "~I~ndy fight controls"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:65
+msgid "Show mouse cursor"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:66
+msgid "Snap to edges"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:68
+msgid "Touch X Offset"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:75
+msgid "Touch Y Offset"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:87
+msgid "Use laptop trackpad-style cursor control"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:88
+msgid "Tap for left click, double tap right click"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:90
+msgid "Sensitivity"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:99
+msgid "Initial top screen scale:"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:105
+msgid "Main screen scaling:"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:107
+msgid "Hardware scale (fast, but low quality)"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:108
+msgid "Software scale (good quality, but slower)"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:109
+msgid "Unscaled (you must scroll left and right)"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:111
+msgid "Brightness:"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:121
+msgid "High quality audio (slower) (reboot)"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:122
+msgid "Disable power off"
+msgstr ""
+
+#: backends/platform/ios7/ios7_osys_events.cpp:309
+#: backends/platform/ios7/ios7_osys_events.cpp:519
+#: backends/platform/iphone/osys_events.cpp:300
+msgid "Mouse-click-and-drag mode enabled."
+msgstr ""
+
+#: backends/platform/ios7/ios7_osys_events.cpp:311
+#: backends/platform/ios7/ios7_osys_events.cpp:521
+#: backends/platform/iphone/osys_events.cpp:302
+msgid "Mouse-click-and-drag mode disabled."
+msgstr ""
+
+#: backends/platform/ios7/ios7_osys_events.cpp:322
+#: backends/platform/ios7/ios7_osys_events.cpp:540
+#: backends/platform/iphone/osys_events.cpp:313
+msgid "Touchpad mode enabled."
+msgstr ""
+
+#: backends/platform/ios7/ios7_osys_events.cpp:324
+#: backends/platform/ios7/ios7_osys_events.cpp:542
+#: backends/platform/iphone/osys_events.cpp:315
+msgid "Touchpad mode disabled."
+msgstr ""
+
+#: backends/platform/maemo/maemo.cpp:208
+msgid "Click Mode"
+msgstr ""
+
+#: backends/platform/maemo/maemo.cpp:214
+#: backends/platform/symbian/src/SymbianActions.cpp:42
+#: backends/platform/tizen/form.cpp:275
+#: backends/platform/wince/CEActionsPocket.cpp:60
+#: backends/platform/wince/CEActionsSmartphone.cpp:43
+msgid "Left Click"
+msgstr ""
+
+#: backends/platform/maemo/maemo.cpp:217
+msgid "Middle Click"
+msgstr ""
+
+#: backends/platform/maemo/maemo.cpp:220
+#: backends/platform/symbian/src/SymbianActions.cpp:43
+#: backends/platform/tizen/form.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:44
+msgid "Right Click"
+msgstr ""
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:88
+msgid "Hide ScummVM"
+msgstr ""
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:93
+msgid "Hide Others"
+msgstr ""
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:98
+msgid "Show All"
+msgstr ""
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:120
+#: backends/platform/sdl/macosx/appmenu_osx.mm:131
+msgid "Window"
+msgstr ""
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:125
+msgid "Minimize"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:38
+#: backends/platform/wince/CEActionsSmartphone.cpp:39
+msgid "Up"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:39
+#: backends/platform/wince/CEActionsSmartphone.cpp:40
+msgid "Down"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:40
+#: backends/platform/wince/CEActionsSmartphone.cpp:41
+msgid "Left"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:41
+#: backends/platform/wince/CEActionsSmartphone.cpp:42
+msgid "Right"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:46
+#: backends/platform/wince/CEActionsSmartphone.cpp:47
+msgid "Zone"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: backends/platform/wince/CEActionsPocket.cpp:54
+#: backends/platform/wince/CEActionsSmartphone.cpp:48
+msgid "Multi Function"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:48
+msgid "Swap character"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:49
+msgid "Skip text"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:51
+msgid "Fast mode"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:53
+msgid "Debugger"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:54
+msgid "Global menu"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:55
+msgid "Virtual keyboard"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:56
+msgid "Key mapper"
+msgstr ""
+
+#: backends/platform/tizen/form.cpp:263
+msgid "Right Click Once"
+msgstr ""
+
+#: backends/platform/tizen/form.cpp:271
+msgid "Move Only"
+msgstr ""
+
+#: backends/platform/tizen/form.cpp:294
+msgid "Escape Key"
+msgstr ""
+
+#: backends/platform/tizen/form.cpp:299
+msgid "Game Menu"
+msgstr ""
+
+#: backends/platform/tizen/form.cpp:304
+msgid "Show Keypad"
+msgstr ""
+
+#: backends/platform/tizen/form.cpp:309
+msgid "Control Mouse"
+msgstr ""
+
+#: backends/platform/tizen/fs.cpp:259
+msgid "[ Data ]"
+msgstr ""
+
+#: backends/platform/tizen/fs.cpp:263
+msgid "[ Resources ]"
+msgstr ""
+
+#: backends/platform/tizen/fs.cpp:267
+msgid "[ SDCard ]"
+msgstr ""
+
+#: backends/platform/tizen/fs.cpp:271
+msgid "[ Media ]"
+msgstr ""
+
+#: backends/platform/tizen/fs.cpp:275
+msgid "[ Shared ]"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:51
+msgid "Video"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:54
+msgid "Current video mode:"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:56
+msgid "Double-strike"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:60
+msgid "Horizontal underscan:"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:66
+msgid "Vertical underscan:"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:71
+msgid "Input"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:74
+msgid "GC Pad sensitivity:"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:80
+msgid "GC Pad acceleration:"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:86
+msgid "DVD"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
+msgid "Status:"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
+msgid "Unknown"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:93
+msgid "Mount DVD"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:94
+msgid "Unmount DVD"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:98
+msgid "SMB"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:106
+msgid "Server:"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:110
+msgid "Share:"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:118
+msgid "Password:"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:121
+msgid "Init network"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:123
+msgid "Mount SMB"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:124
+msgid "Unmount SMB"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:143
+msgid "DVD Mounted successfully"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:146
+msgid "Error while mounting the DVD"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:148
+msgid "DVD not mounted"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:161
+msgid "Network up, share mounted"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:163
+msgid "Network up"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:166
+msgid ", error while mounting the share"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:168
+msgid ", share not mounted"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:174
+msgid "Network down"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:178
+msgid "Initializing network"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:182
+msgid "Timeout while initializing network"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:186
+#, c-format
+msgid "Network not initialized (%d)"
+msgstr ""
+
+#: backends/platform/wince/CEActionsPocket.cpp:46
+msgid "Hide Toolbar"
+msgstr ""
+
+#: backends/platform/wince/CEActionsPocket.cpp:47
+msgid "Show Keyboard"
+msgstr ""
+
+#: backends/platform/wince/CEActionsPocket.cpp:48
+msgid "Sound on/off"
+msgstr ""
+
+#: backends/platform/wince/CEActionsPocket.cpp:49
+msgid "Right click"
+msgstr ""
+
+#: backends/platform/wince/CEActionsPocket.cpp:50
+msgid "Show/Hide Cursor"
+msgstr ""
+
+#: backends/platform/wince/CEActionsPocket.cpp:51
+msgid "Free look"
+msgstr ""
+
+#: backends/platform/wince/CEActionsPocket.cpp:52
+msgid "Zoom up"
+msgstr ""
+
+#: backends/platform/wince/CEActionsPocket.cpp:53
+msgid "Zoom down"
+msgstr ""
+
+#: backends/platform/wince/CEActionsPocket.cpp:55
+#: backends/platform/wince/CEActionsSmartphone.cpp:49
+msgid "Bind Keys"
+msgstr ""
+
+#: backends/platform/wince/CEActionsPocket.cpp:56
+msgid "Cursor Up"
+msgstr ""
+
+#: backends/platform/wince/CEActionsPocket.cpp:57
+msgid "Cursor Down"
+msgstr ""
+
+#: backends/platform/wince/CEActionsPocket.cpp:58
+msgid "Cursor Left"
+msgstr ""
+
+#: backends/platform/wince/CEActionsPocket.cpp:59
+msgid "Cursor Right"
+msgstr ""
+
+#: backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
+msgid "Do you want to load or save the game?"
+msgstr ""
+
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+msgid " Are you sure you want to quit ? "
+msgstr ""
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:50
+msgid "Keyboard"
+msgstr ""
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:51
+msgid "Rotate"
+msgstr ""
+
+#: backends/platform/wince/CELauncherDialog.cpp:56
+msgid "Using SDL driver "
+msgstr ""
+
+#: backends/platform/wince/CELauncherDialog.cpp:60
+msgid "Display "
+msgstr ""
+
+#: backends/platform/wince/CELauncherDialog.cpp:83
+msgid "Do you want to perform an automatic scan ?"
+msgstr ""
+
+#: backends/platform/wince/wince-sdl.cpp:516
+msgid "Map right click action"
+msgstr ""
+
+#: backends/platform/wince/wince-sdl.cpp:520
+msgid "You must map a key to the 'Right Click' action to play this game"
+msgstr ""
+
+#: backends/platform/wince/wince-sdl.cpp:529
+msgid "Map hide toolbar action"
+msgstr ""
+
+#: backends/platform/wince/wince-sdl.cpp:533
+msgid "You must map a key to the 'Hide toolbar' action to play this game"
+msgstr ""
+
+#: backends/platform/wince/wince-sdl.cpp:542
+msgid "Map Zoom Up action (optional)"
+msgstr ""
+
+#: backends/platform/wince/wince-sdl.cpp:545
+msgid "Map Zoom Down action (optional)"
+msgstr ""
+
+#: backends/platform/wince/wince-sdl.cpp:553
+msgid ""
+"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
+msgstr ""
+
+#: backends/updates/macosx/macosx-updates.mm:79
+msgid "Check for Updates..."
+msgstr ""
+
+#: engines/adl/detection.cpp:45 engines/adl/detection.cpp:55
+msgid "Color mode"
+msgstr ""
+
+#: engines/adl/detection.cpp:46 engines/adl/detection.cpp:56
+msgid "Use color graphics"
+msgstr ""
+
+#: engines/adl/detection.cpp:65
+msgid "Scanlines"
+msgstr ""
+
+#: engines/adl/detection.cpp:66
+msgid "Show scanlines"
+msgstr ""
+
+#: engines/agi/detection.cpp:147 engines/cine/detection.cpp:70
+#: engines/drascula/detection.cpp:302 engines/dreamweb/detection.cpp:48
+#: engines/neverhood/detection.cpp:177 engines/sci/detection.cpp:430
+#: engines/sherlock/detection.cpp:71 engines/toltecs/detection.cpp:200
+#: engines/zvision/detection_tables.h:51
+msgid "Use original save/load screens"
+msgstr ""
+
+#: engines/agi/detection.cpp:148 engines/cine/detection.cpp:71
+#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
+#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:431
+#: engines/sherlock/detection.cpp:72 engines/toltecs/detection.cpp:201
+msgid "Use the original save/load screens instead of the ScummVM ones"
+msgstr ""
+
+#: engines/agi/detection.cpp:157
+msgid "Use an alternative palette"
+msgstr ""
+
+#: engines/agi/detection.cpp:158
+msgid ""
+"Use an alternative palette, common for all Amiga games. This was the old "
+"behavior"
+msgstr ""
+
+#: engines/agi/detection.cpp:167
+msgid "Mouse support"
+msgstr ""
+
+#: engines/agi/detection.cpp:168
+msgid ""
+"Enables mouse support. Allows to use mouse for movement and in game menus."
+msgstr ""
+
+#: engines/agi/detection.cpp:177
+msgid "Use Hercules hires font"
+msgstr ""
+
+#: engines/agi/detection.cpp:178
+msgid "Uses Hercules hires font, when font file is available."
+msgstr ""
+
+#: engines/agi/detection.cpp:187
+msgid "Pause when entering commands"
+msgstr ""
+
+#: engines/agi/detection.cpp:188
+msgid ""
+"Shows a command prompt window and pauses the game (like in SCI) instead of a "
+"real-time prompt."
+msgstr ""
+
+#: engines/agi/saveload.cpp:774 engines/avalanche/parser.cpp:1888
+#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
+#: engines/cine/various.cpp:359 engines/dm/dm.cpp:269
+#: 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:1011
+#: engines/sci/engine/kfile.cpp:1240 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:"
+msgstr ""
+
+#: engines/agi/saveload.cpp:774 engines/avalanche/parser.cpp:1888
+#: engines/cge/events.cpp:83 engines/cge2/events.cpp:76
+#: engines/cine/various.cpp:359 engines/dm/dm.cpp:269
+#: 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:1011
+#: engines/sci/engine/kfile.cpp:1240 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"
+msgstr ""
+
+#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2436
+#, c-format
+msgid ""
+"Failed to load saved game from file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2429
+#, c-format
+msgid ""
+"Failed to save game to file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2447
+#, c-format
+msgid ""
+"Successfully saved game in file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: engines/agos/animation.cpp:558
+#, c-format
+msgid "Cutscene file '%s' not found!"
+msgstr ""
+
+#: engines/cge/detection.cpp:105 engines/cge2/detection.cpp:101
+msgid "Color Blind Mode"
+msgstr ""
+
+#: engines/cge/detection.cpp:106 engines/cge2/detection.cpp:102
+msgid "Enable Color Blind Mode by default"
+msgstr ""
+
+#: engines/drascula/saveload.cpp:47
+msgid ""
+"ScummVM found that you have old saved games for Drascula that should be "
+"converted.\n"
+"The old saved game format is no longer supported, so you will not be able to "
+"load your games if you don't convert them.\n"
+"\n"
+"Press OK to convert them now, otherwise you will be asked again the next "
+"time you start the game.\n"
+msgstr ""
+
+#: engines/dreamweb/detection.cpp:58
+msgid "Use bright palette mode"
+msgstr ""
+
+#: engines/dreamweb/detection.cpp:59
+msgid "Display graphics using the game's bright palette"
+msgstr ""
+
+#: engines/gob/inter_playtoons.cpp:255 engines/gob/inter_v2.cpp:1467
+#: engines/gob/inter_geisha.cpp:232 engines/tinsel/saveload.cpp:532
+msgid "Failed to load saved game from file."
+msgstr ""
+
+#: engines/gob/inter_v2.cpp:1537 engines/gob/inter_geisha.cpp:263
+#: engines/tinsel/saveload.cpp:545
+msgid "Failed to save game to file."
+msgstr ""
+
+#: engines/gob/inter_v5.cpp:107
+msgid "Failed to delete file."
+msgstr ""
+
+#: engines/groovie/detection.cpp:312
+msgid "Fast movie speed"
+msgstr ""
+
+#: engines/groovie/detection.cpp:313
+msgid "Play movies at an increased speed"
+msgstr ""
+
+#: engines/groovie/script.cpp:407
+msgid "Failed to save game"
+msgstr ""
+
+#: engines/hopkins/detection.cpp:76 engines/hopkins/detection.cpp:86
+msgid "Gore Mode"
+msgstr ""
+
+#: engines/hopkins/detection.cpp:77 engines/hopkins/detection.cpp:87
+msgid "Enable Gore Mode when available"
+msgstr ""
+
+#. I18N: Studio audience adds an applause and cheering sounds whenever
+#. Malcolm makes a joke.
+#: engines/kyra/detection.cpp:62
+msgid "Studio audience"
+msgstr ""
+
+#: engines/kyra/detection.cpp:63
+msgid "Enable studio audience"
+msgstr ""
+
+#. I18N: This option allows the user to skip text and cutscenes.
+#: engines/kyra/detection.cpp:73
+msgid "Skip support"
+msgstr ""
+
+#: engines/kyra/detection.cpp:74
+msgid "Allow text and cutscenes to be skipped"
+msgstr ""
+
+#. I18N: Helium mode makes people sound like they've inhaled Helium.
+#: engines/kyra/detection.cpp:84
+msgid "Helium mode"
+msgstr ""
+
+#: engines/kyra/detection.cpp:85
+msgid "Enable helium mode"
+msgstr ""
+
+#. I18N: When enabled, this option makes scrolling smoother when
+#. changing from one screen to another.
+#: engines/kyra/detection.cpp:99
+msgid "Smooth scrolling"
+msgstr ""
+
+#: engines/kyra/detection.cpp:100
+msgid "Enable smooth scrolling when walking"
+msgstr ""
+
+#. I18N: When enabled, this option changes the cursor when it floats to the
+#. edge of the screen to a directional arrow. The player can then click to
+#. walk towards that direction.
+#: engines/kyra/detection.cpp:112
+msgid "Floating cursors"
+msgstr ""
+
+#: engines/kyra/detection.cpp:113
+msgid "Enable floating cursors"
+msgstr ""
+
+#. I18N: HP stands for Hit Points
+#: engines/kyra/detection.cpp:127
+msgid "HP bar graphs"
+msgstr ""
+
+#: engines/kyra/detection.cpp:128
+msgid "Enable hit point bar graphs"
+msgstr ""
+
+#: engines/kyra/eobcommon.cpp:331 engines/kyra/lol.cpp:481
+msgid "Move Forward"
+msgstr ""
+
+#: engines/kyra/eobcommon.cpp:332 engines/kyra/lol.cpp:482
+msgid "Move Back"
+msgstr ""
+
+#: engines/kyra/eobcommon.cpp:333
+msgid "Move Left"
+msgstr ""
+
+#: engines/kyra/eobcommon.cpp:334
+msgid "Move Right"
+msgstr ""
+
+#: engines/kyra/eobcommon.cpp:335 engines/kyra/lol.cpp:485
+#: engines/pegasus/pegasus.cpp:2509
+msgid "Turn Left"
+msgstr ""
+
+#: engines/kyra/eobcommon.cpp:336 engines/kyra/lol.cpp:486
+#: engines/pegasus/pegasus.cpp:2510
+msgid "Turn Right"
+msgstr ""
+
+#: engines/kyra/eobcommon.cpp:337
+msgid "Open/Close Inventory"
+msgstr ""
+
+#: engines/kyra/eobcommon.cpp:338
+msgid "Switch Inventory/Character screen"
+msgstr ""
+
+#: engines/kyra/eobcommon.cpp:339
+msgid "Camp"
+msgstr ""
+
+#: engines/kyra/eobcommon.cpp:340
+msgid "Cast Spell"
+msgstr ""
+
+#: engines/kyra/eobcommon.cpp:343
+msgid "Spell Level 1"
+msgstr ""
+
+#: engines/kyra/eobcommon.cpp:344
+msgid "Spell Level 2"
+msgstr ""
+
+#: engines/kyra/eobcommon.cpp:345
+msgid "Spell Level 3"
+msgstr ""
+
+#: engines/kyra/eobcommon.cpp:346
+msgid "Spell Level 4"
+msgstr ""
+
+#: engines/kyra/eobcommon.cpp:347
+msgid "Spell Level 5"
+msgstr ""
+
+#: engines/kyra/eobcommon.cpp:356
+msgid "Spell Level 6"
+msgstr ""
+
+#: engines/kyra/lol.cpp:478
+msgid "Attack 1"
+msgstr ""
+
+#: engines/kyra/lol.cpp:479
+msgid "Attack 2"
+msgstr ""
+
+#: engines/kyra/lol.cpp:480
+msgid "Attack 3"
+msgstr ""
+
+#: engines/kyra/lol.cpp:483
+msgid "Slide Left"
+msgstr ""
+
+#: engines/kyra/lol.cpp:484
+msgid "Slide Right"
+msgstr ""
+
+#: engines/kyra/lol.cpp:487
+msgid "Rest"
+msgstr ""
+
+#: engines/kyra/lol.cpp:488
+msgid "Options"
+msgstr ""
+
+#: engines/kyra/lol.cpp:489
+msgid "Choose Spell"
+msgstr ""
+
+#: engines/kyra/sound_midi.cpp:477
+msgid ""
+"You appear to be using a General MIDI device,\n"
+"but your game only supports Roland MT32 MIDI.\n"
+"We try to map the Roland MT32 instruments to\n"
+"General MIDI ones. It is still possible that\n"
+"some tracks sound incorrect."
+msgstr ""
+
+#: engines/kyra/saveload_eob.cpp:557
+#, c-format
+msgid ""
+"The following original saved game file has been found in your game path:\n"
+"\n"
+"%s %s\n"
+"\n"
+"Do you wish to use this saved game file with ScummVM?\n"
+"\n"
+msgstr ""
+
+#: engines/kyra/saveload_eob.cpp:590
+#, c-format
+msgid ""
+"A saved game file was found in the specified slot %d. Overwrite?\n"
+"\n"
+msgstr ""
+
+#: engines/kyra/saveload_eob.cpp:623
+#, c-format
+msgid ""
+"%d original saved games have been successfully imported into\n"
+"ScummVM. If you want to manually import original saved game later you will\n"
+"need to open the ScummVM debug console and use the command "
+"'import_savefile'.\n"
+"\n"
+msgstr ""
+
+#: engines/mads/detection.cpp:91
+msgid "Easy mouse interface"
+msgstr ""
+
+#: engines/mads/detection.cpp:92
+msgid "Shows object names when hovering the mouse over them"
+msgstr ""
+
+#: engines/mads/detection.cpp:101 engines/mads/detection.cpp:102
+msgid "Animated inventory items"
+msgstr ""
+
+#: engines/mads/detection.cpp:111 engines/mads/detection.cpp:112
+msgid "Animated game interface"
+msgstr ""
+
+#: engines/mads/detection.cpp:121 engines/mads/detection.cpp:122
+msgid "Naughty game mode"
+msgstr ""
+
+#: engines/mohawk/detection.cpp:169
+msgid "Play the Myst fly by movie"
+msgstr ""
+
+#: engines/mohawk/detection.cpp:170
+msgid "The Myst fly by movie was not played by the original engine."
+msgstr ""
+
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:181 engines/mohawk/dialogs.cpp:267
+msgid "~Z~ip Mode Activated"
+msgstr ""
+
+#: engines/mohawk/dialogs.cpp:182
+msgid "~T~ransitions Enabled"
+msgstr ""
+
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:184
+msgid "~D~rop Page"
+msgstr ""
+
+#: engines/mohawk/dialogs.cpp:188
+msgid "Show ~M~ap"
+msgstr ""
+
+#: engines/mohawk/dialogs.cpp:194
+msgid "Main Men~u~"
+msgstr ""
+
+#: engines/mohawk/dialogs.cpp:268
+msgid "~W~ater Effect Enabled"
+msgstr ""
+
+#: engines/mohawk/riven.cpp:150
+msgid ""
+"You're missing a Riven executable. The Windows executable is 'riven.exe' or "
+"'rivendmo.exe'. "
+msgstr ""
+
+#: engines/mohawk/riven.cpp:151
+msgid ""
+"Using the 'arcriven.z' installer file also works. In addition, you can use "
+"the Mac 'Riven' executable."
+msgstr ""
+
+#: engines/mohawk/riven.cpp:162
+msgid ""
+"You're missing 'extras.mhk'. Using the 'arcriven.z' installer file also "
+"works."
+msgstr ""
+
+#: engines/mohawk/riven_external.cpp:213
+msgid ""
+"Exploration beyond this point available only within the full version of\n"
+"the game."
+msgstr ""
+
+#: engines/mohawk/riven_external.cpp:655
+msgid ""
+"At this point, the Riven Demo would\n"
+"ask if you would like to open a web browser\n"
+"to bring you to the Red Orb store to buy\n"
+"the game. ScummVM cannot do that and\n"
+"the site no longer exists."
+msgstr ""
+
+#: engines/mohawk/mohawk.cpp:61
+msgid "The game is paused. Press any key to continue."
+msgstr ""
+
+#: engines/neverhood/detection.cpp:184
+msgid "Skip the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:185
+msgid "Allows the player to skip past the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:191
+msgid "Scale the making of videos to full screen"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:192
+msgid "Scale the making of videos, so that they use the whole screen"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:130
+#, c-format
+msgid ""
+"Can't save game in slot %i\n"
+"\n"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:194
+msgid "Load file"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:201
+msgid "Loading game..."
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:209
+msgid "Save file"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:216
+msgid "Saving game..."
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:269
+msgid ""
+"ScummVM found that you have old saved games for Nippon Safes that should be "
+"renamed.\n"
+"The old names are no longer supported, so you will not be able to load your "
+"games if you don't convert them.\n"
+"\n"
+"Press OK to convert them now, otherwise you will be asked next time.\n"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:316
+msgid "ScummVM successfully converted all your saved games."
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:318
+msgid ""
+"ScummVM printed some warnings in your console window and can't guarantee all "
+"your files have been converted.\n"
+"\n"
+"Please report to the team."
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:714
+msgid "Invalid file name for saving"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2507
+msgid "Up/Zoom In/Move Forward/Open Doors"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2508
+msgid "Down/Zoom Out"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2511
+msgid "Display/Hide Inventory Tray"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2512
+msgid "Display/Hide Biochip Tray"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2513
+msgid "Action/Select"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2514
+msgid "Toggle Center Data Display"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2515
+msgid "Display/Hide Info Screen"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2516
+msgid "Display/Hide Pause Menu"
+msgstr ""
+
+#: engines/queen/detection.cpp:56
+msgid "Alternative intro"
+msgstr ""
+
+#: engines/queen/detection.cpp:57
+msgid "Use an alternative game intro (CD version only)"
+msgstr ""
+
+#: engines/sci/detection.cpp:390
+msgid "Skip EGA dithering pass (full color backgrounds)"
+msgstr ""
+
+#: engines/sci/detection.cpp:391
+msgid "Skip dithering pass in EGA games, graphics are shown with full colors"
+msgstr ""
+
+#: engines/sci/detection.cpp:400
+msgid "Enable high resolution graphics"
+msgstr ""
+
+#: engines/sci/detection.cpp:401
+msgid "Enable high resolution graphics/content"
+msgstr ""
+
+#: engines/sci/detection.cpp:410
+msgid "Enable black-lined video"
+msgstr ""
+
+#: engines/sci/detection.cpp:411
+msgid "Draw black lines over videos to increase their apparent sharpness"
+msgstr ""
+
+#: engines/sci/detection.cpp:420
+msgid "Prefer digital sound effects"
+msgstr ""
+
+#: engines/sci/detection.cpp:421
+msgid "Prefer digital sound effects instead of synthesized ones"
+msgstr ""
+
+#: engines/sci/detection.cpp:440
+msgid "Use IMF/Yamaha FB-01 for MIDI output"
+msgstr ""
+
+#: engines/sci/detection.cpp:441
+msgid ""
+"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
+"output"
+msgstr ""
+
+#: engines/sci/detection.cpp:451
+msgid "Use CD audio"
+msgstr ""
+
+#: engines/sci/detection.cpp:452
+msgid "Use CD audio instead of in-game audio, if available"
+msgstr ""
+
+#: engines/sci/detection.cpp:462
+msgid "Use Windows cursors"
+msgstr ""
+
+#: engines/sci/detection.cpp:463
+msgid ""
+"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
+msgstr ""
+
+#: engines/sci/detection.cpp:473
+msgid "Use silver cursors"
+msgstr ""
+
+#: engines/sci/detection.cpp:474
+msgid ""
+"Use the alternate set of silver cursors instead of the normal golden ones"
+msgstr ""
+
+#: engines/scumm/detection.cpp:1120
+msgid ""
+"Your game version appears to be unknown. If this is *NOT* a fan-modified\n"
+"version (in particular, not a fan-made translation), please, report the\n"
+"following data to the ScummVM team along with the name of the game you "
+"tried\n"
+"to add and its version, language, etc.:\n"
+msgstr ""
+
+#: engines/scumm/detection.cpp:1138
+msgid ""
+"The Lite version of Putt-Putt Saves the Zoo iOS is not supported to avoid "
+"piracy.\n"
+"The full version is available for purchase from the iTunes Store."
+msgstr ""
+
+#: engines/scumm/detection.cpp:1341
+msgid "Show Object Line"
+msgstr ""
+
+#: engines/scumm/detection.cpp:1342
+msgid "Show the names of objects at the bottom of the screen"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:172
+#, c-format
+msgid "Insert Disk %c and Press Button to Continue."
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:173
+#, c-format
+msgid "Unable to Find %s, (%c%d) Press Button."
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:174
+#, c-format
+msgid "Error reading disk %c, (%c%d) Press Button."
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:175
+msgid "Game Paused. Press SPACE to Continue."
+msgstr ""
+
+#. I18N: You may specify 'Yes' symbol at the end of the line, like this:
+#. "Moechten Sie wirklich neu starten? (J/N)J"
+#. Will react to J as 'Yes'
+#: engines/scumm/dialogs.cpp:179
+msgid "Are you sure you want to restart? (Y/N)Y"
+msgstr ""
+
+#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
+#: engines/scumm/dialogs.cpp:181
+msgid "Are you sure you want to quit? (Y/N)Y"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:186
+msgid "Play"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:190
+msgid "Insert save/load game disk"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:191
+msgid "You must enter a name"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:192
+msgid "The game was NOT saved (disk full?)"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:193
+msgid "The game was NOT loaded"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:194
+#, c-format
+msgid "Saving '%s'"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:195
+#, c-format
+msgid "Loading '%s'"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:196
+msgid "Name your SAVE game"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:197
+msgid "Select a game to LOAD"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:198
+msgid "Game title)"
+msgstr ""
+
+#. I18N: Previous page button
+#: engines/scumm/dialogs.cpp:284
+msgid "~P~revious"
+msgstr ""
+
+#. I18N: Next page button
+#: engines/scumm/dialogs.cpp:286
+msgid "~N~ext"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:598
+msgid "Speech Only"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:599
+msgid "Speech and Subtitles"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:600
+msgid "Subtitles Only"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:608
+msgctxt "lowres"
+msgid "Speech & Subs"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:654
+msgid "Select a Proficiency Level."
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:656
+msgid "Refer to your Loom(TM) manual for help."
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:660
+msgid "Practice"
+msgstr ""
+
+#: engines/scumm/dialogs.cpp:661
+msgid "Expert"
+msgstr ""
+
+#: engines/scumm/help.cpp:74
+msgid "Common keyboard commands:"
+msgstr ""
+
+#: engines/scumm/help.cpp:75
+msgid "Save / Load dialog"
+msgstr ""
+
+#: engines/scumm/help.cpp:77
+msgid "Skip line of text"
+msgstr ""
+
+#: engines/scumm/help.cpp:78
+msgid "Esc"
+msgstr ""
+
+#: engines/scumm/help.cpp:78
+msgid "Skip cutscene"
+msgstr ""
+
+#: engines/scumm/help.cpp:79
+msgid "Space"
+msgstr ""
+
+#: engines/scumm/help.cpp:79
+msgid "Pause game"
+msgstr ""
+
+#: engines/scumm/help.cpp:80 engines/scumm/help.cpp:85
+#: engines/scumm/help.cpp:96 engines/scumm/help.cpp:97
+#: engines/scumm/help.cpp:98 engines/scumm/help.cpp:99
+#: engines/scumm/help.cpp:100 engines/scumm/help.cpp:101
+#: engines/scumm/help.cpp:102 engines/scumm/help.cpp:103
+msgid "Ctrl"
+msgstr ""
+
+#: engines/scumm/help.cpp:80
+msgid "Load saved game 1-10"
+msgstr ""
+
+#: engines/scumm/help.cpp:81 engines/scumm/help.cpp:85
+#: engines/scumm/help.cpp:87 engines/scumm/help.cpp:101
+#: engines/scumm/help.cpp:102 engines/scumm/help.cpp:103
+msgid "Alt"
+msgstr ""
+
+#: engines/scumm/help.cpp:81
+msgid "Save game 1-10"
+msgstr ""
+
+#: engines/scumm/help.cpp:87 engines/scumm/help.cpp:90
+msgid "Enter"
+msgstr ""
+
+#: engines/scumm/help.cpp:88
+msgid "Music volume up / down"
+msgstr ""
+
+#: engines/scumm/help.cpp:89
+msgid "Text speed slower / faster"
+msgstr ""
+
+#: engines/scumm/help.cpp:90
+msgid "Simulate left mouse button"
+msgstr ""
+
+#: engines/scumm/help.cpp:91
+msgid "Tab"
+msgstr ""
+
+#: engines/scumm/help.cpp:91
+msgid "Simulate right mouse button"
+msgstr ""
+
+#: engines/scumm/help.cpp:94
+msgid "Special keyboard commands:"
+msgstr ""
+
+#: engines/scumm/help.cpp:95
+msgid "Show / Hide console"
+msgstr ""
+
+#: engines/scumm/help.cpp:96
+msgid "Start the debugger"
+msgstr ""
+
+#: engines/scumm/help.cpp:97
+msgid "Show memory consumption"
+msgstr ""
+
+#: engines/scumm/help.cpp:98
+msgid "Run in fast mode (*)"
+msgstr ""
+
+#: engines/scumm/help.cpp:99
+msgid "Run in really fast mode (*)"
+msgstr ""
+
+#: engines/scumm/help.cpp:100
+msgid "Toggle mouse capture"
+msgstr ""
+
+#: engines/scumm/help.cpp:101
+msgid "Switch between graphics filters"
+msgstr ""
+
+#: engines/scumm/help.cpp:102
+msgid "Increase / Decrease scale factor"
+msgstr ""
+
+#: engines/scumm/help.cpp:103
+msgid "Toggle aspect-ratio correction"
+msgstr ""
+
+#: engines/scumm/help.cpp:108
+msgid "* Note that using ctrl-f and"
+msgstr ""
+
+#: engines/scumm/help.cpp:109
+msgid " ctrl-g are not recommended"
+msgstr ""
+
+#: engines/scumm/help.cpp:110
+msgid " since they may cause crashes"
+msgstr ""
+
+#: engines/scumm/help.cpp:111
+msgid " or incorrect game behavior."
+msgstr ""
+
+#: engines/scumm/help.cpp:115
+msgid "Spinning drafts on the keyboard:"
+msgstr ""
+
+#: engines/scumm/help.cpp:117
+msgid "Main game controls:"
+msgstr ""
+
+#: engines/scumm/help.cpp:122 engines/scumm/help.cpp:137
+#: engines/scumm/help.cpp:162
+msgid "Push"
+msgstr ""
+
+#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138
+#: engines/scumm/help.cpp:163
+msgid "Pull"
+msgstr ""
+
+#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139
+#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:198
+#: engines/scumm/help.cpp:208
+msgid "Give"
+msgstr ""
+
+#: engines/scumm/help.cpp:125 engines/scumm/help.cpp:140
+#: engines/scumm/help.cpp:165 engines/scumm/help.cpp:191
+#: engines/scumm/help.cpp:209
+msgid "Open"
+msgstr ""
+
+#: engines/scumm/help.cpp:127
+msgid "Go to"
+msgstr ""
+
+#: engines/scumm/help.cpp:128
+msgid "Get"
+msgstr ""
+
+#: engines/scumm/help.cpp:129 engines/scumm/help.cpp:153
+#: engines/scumm/help.cpp:171 engines/scumm/help.cpp:199
+#: engines/scumm/help.cpp:214 engines/scumm/help.cpp:225
+#: engines/scumm/help.cpp:251
+msgid "Use"
+msgstr ""
+
+#: engines/scumm/help.cpp:130 engines/scumm/help.cpp:142
+msgid "Read"
+msgstr ""
+
+#: engines/scumm/help.cpp:131 engines/scumm/help.cpp:148
+msgid "New kid"
+msgstr ""
+
+#: engines/scumm/help.cpp:132 engines/scumm/help.cpp:154
+#: engines/scumm/help.cpp:172
+msgid "Turn on"
+msgstr ""
+
+#: engines/scumm/help.cpp:133 engines/scumm/help.cpp:155
+#: engines/scumm/help.cpp:173
+msgid "Turn off"
+msgstr ""
+
+#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168
+#: engines/scumm/help.cpp:195
+msgid "Walk to"
+msgstr ""
+
+#: engines/scumm/help.cpp:144 engines/scumm/help.cpp:169
+#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:211
+#: engines/scumm/help.cpp:228
+msgid "Pick up"
+msgstr ""
+
+#: engines/scumm/help.cpp:145 engines/scumm/help.cpp:170
+msgid "What is"
+msgstr ""
+
+#: engines/scumm/help.cpp:147
+msgid "Unlock"
+msgstr ""
+
+#: engines/scumm/help.cpp:150
+msgid "Put on"
+msgstr ""
+
+#: engines/scumm/help.cpp:151
+msgid "Take off"
+msgstr ""
+
+#: engines/scumm/help.cpp:157
+msgid "Fix"
+msgstr ""
+
+#: engines/scumm/help.cpp:159
+msgid "Switch"
+msgstr ""
+
+#: engines/scumm/help.cpp:167 engines/scumm/help.cpp:229
+msgid "Look"
+msgstr ""
+
+#: engines/scumm/help.cpp:174 engines/scumm/help.cpp:224
+msgid "Talk"
+msgstr ""
+
+#: engines/scumm/help.cpp:175
+msgid "Travel"
+msgstr ""
+
+#: engines/scumm/help.cpp:176
+msgid "To Henry / To Indy"
+msgstr ""
+
+#. I18N: These are different musical notes
+#: engines/scumm/help.cpp:180
+msgid "play C minor on distaff"
+msgstr ""
+
+#: engines/scumm/help.cpp:181
+msgid "play D on distaff"
+msgstr ""
+
+#: engines/scumm/help.cpp:182
+msgid "play E on distaff"
+msgstr ""
+
+#: engines/scumm/help.cpp:183
+msgid "play F on distaff"
+msgstr ""
+
+#: engines/scumm/help.cpp:184
+msgid "play G on distaff"
+msgstr ""
+
+#: engines/scumm/help.cpp:185
+msgid "play A on distaff"
+msgstr ""
+
+#: engines/scumm/help.cpp:186
+msgid "play B on distaff"
+msgstr ""
+
+#: engines/scumm/help.cpp:187
+msgid "play C major on distaff"
+msgstr ""
+
+#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215
+msgid "puSh"
+msgstr ""
+
+#: engines/scumm/help.cpp:194 engines/scumm/help.cpp:216
+msgid "pull (Yank)"
+msgstr ""
+
+#: engines/scumm/help.cpp:197 engines/scumm/help.cpp:213
+#: engines/scumm/help.cpp:249
+msgid "Talk to"
+msgstr ""
+
+#: engines/scumm/help.cpp:200 engines/scumm/help.cpp:212
+msgid "Look at"
+msgstr ""
+
+#: engines/scumm/help.cpp:201
+msgid "turn oN"
+msgstr ""
+
+#: engines/scumm/help.cpp:202
+msgid "turn oFf"
+msgstr ""
+
+#: engines/scumm/help.cpp:218
+msgid "KeyUp"
+msgstr ""
+
+#: engines/scumm/help.cpp:218
+msgid "Highlight prev dialogue"
+msgstr ""
+
+#: engines/scumm/help.cpp:219
+msgid "KeyDown"
+msgstr ""
+
+#: engines/scumm/help.cpp:219
+msgid "Highlight next dialogue"
+msgstr ""
+
+#: engines/scumm/help.cpp:223
+msgid "Walk"
+msgstr ""
+
+#: engines/scumm/help.cpp:226 engines/scumm/help.cpp:235
+#: engines/scumm/help.cpp:242 engines/scumm/help.cpp:250
+msgid "Inventory"
+msgstr ""
+
+#: engines/scumm/help.cpp:227
+msgid "Object"
+msgstr ""
+
+#: engines/scumm/help.cpp:230
+msgid "Black and White / Color"
+msgstr ""
+
+#: engines/scumm/help.cpp:233
+msgid "Eyes"
+msgstr ""
+
+#: engines/scumm/help.cpp:234
+msgid "Tongue"
+msgstr ""
+
+#: engines/scumm/help.cpp:236
+msgid "Punch"
+msgstr ""
+
+#: engines/scumm/help.cpp:237
+msgid "Kick"
+msgstr ""
+
+#: engines/scumm/help.cpp:240 engines/scumm/help.cpp:248
+msgid "Examine"
+msgstr ""
+
+#: engines/scumm/help.cpp:241
+msgid "Regular cursor"
+msgstr ""
+
+#. I18N: Comm is a communication device
+#: engines/scumm/help.cpp:244
+msgid "Comm"
+msgstr ""
+
+#: engines/scumm/help.cpp:247
+msgid "Save / Load / Options"
+msgstr ""
+
+#: engines/scumm/help.cpp:256
+msgid "Other game controls:"
+msgstr ""
+
+#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:268
+msgid "Inventory:"
+msgstr ""
+
+#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275
+msgid "Scroll list up"
+msgstr ""
+
+#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:276
+msgid "Scroll list down"
+msgstr ""
+
+#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:269
+msgid "Upper left item"
+msgstr ""
+
+#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271
+msgid "Lower left item"
+msgstr ""
+
+#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:272
+msgid "Upper right item"
+msgstr ""
+
+#: engines/scumm/help.cpp:264 engines/scumm/help.cpp:274
+msgid "Lower right item"
+msgstr ""
+
+#: engines/scumm/help.cpp:270
+msgid "Middle left item"
+msgstr ""
+
+#: engines/scumm/help.cpp:273
+msgid "Middle right item"
+msgstr ""
+
+#: engines/scumm/help.cpp:280 engines/scumm/help.cpp:285
+msgid "Switching characters:"
+msgstr ""
+
+#: engines/scumm/help.cpp:282
+msgid "Second kid"
+msgstr ""
+
+#: engines/scumm/help.cpp:283
+msgid "Third kid"
+msgstr ""
+
+#: engines/scumm/help.cpp:292
+msgid "Toggle Inventory/IQ Points display"
+msgstr ""
+
+#: engines/scumm/help.cpp:293
+msgid "Toggle Keyboard/Mouse Fighting (*)"
+msgstr ""
+
+#: engines/scumm/help.cpp:295
+msgid "* Keyboard Fighting is always on,"
+msgstr ""
+
+#: engines/scumm/help.cpp:296
+msgid " so despite the in-game message this"
+msgstr ""
+
+#: engines/scumm/help.cpp:297
+msgid " actually toggles Mouse Fighting Off/On"
+msgstr ""
+
+#: engines/scumm/help.cpp:304
+msgid "Fighting controls (numpad):"
+msgstr ""
+
+#: engines/scumm/help.cpp:305 engines/scumm/help.cpp:306
+#: engines/scumm/help.cpp:307
+msgid "Step back"
+msgstr ""
+
+#: engines/scumm/help.cpp:308
+msgid "Block high"
+msgstr ""
+
+#: engines/scumm/help.cpp:309
+msgid "Block middle"
+msgstr ""
+
+#: engines/scumm/help.cpp:310
+msgid "Block low"
+msgstr ""
+
+#: engines/scumm/help.cpp:311
+msgid "Punch high"
+msgstr ""
+
+#: engines/scumm/help.cpp:312
+msgid "Punch middle"
+msgstr ""
+
+#: engines/scumm/help.cpp:313
+msgid "Punch low"
+msgstr ""
+
+#: engines/scumm/help.cpp:315
+msgid "Sucker punch"
+msgstr ""
+
+#: engines/scumm/help.cpp:318
+msgid "These are for Indy on left."
+msgstr ""
+
+#: engines/scumm/help.cpp:319
+msgid "When Indy is on the right,"
+msgstr ""
+
+#: engines/scumm/help.cpp:320
+msgid "7, 4, and 1 are switched with"
+msgstr ""
+
+#: engines/scumm/help.cpp:321
+msgid "9, 6, and 3, respectively."
+msgstr ""
+
+#: engines/scumm/help.cpp:328
+msgid "Biplane controls (numpad):"
+msgstr ""
+
+#: engines/scumm/help.cpp:329
+msgid "Fly to upper left"
+msgstr ""
+
+#: engines/scumm/help.cpp:330
+msgid "Fly to left"
+msgstr ""
+
+#: engines/scumm/help.cpp:331
+msgid "Fly to lower left"
+msgstr ""
+
+#: engines/scumm/help.cpp:332
+msgid "Fly upwards"
+msgstr ""
+
+#: engines/scumm/help.cpp:333
+msgid "Fly straight"
+msgstr ""
+
+#: engines/scumm/help.cpp:334
+msgid "Fly down"
+msgstr ""
+
+#: engines/scumm/help.cpp:335
+msgid "Fly to upper right"
+msgstr ""
+
+#: engines/scumm/help.cpp:336
+msgid "Fly to right"
+msgstr ""
+
+#: engines/scumm/help.cpp:337
+msgid "Fly to lower right"
+msgstr ""
+
+#: engines/scumm/input.cpp:578
+msgid "Snap scroll on"
+msgstr ""
+
+#: engines/scumm/input.cpp:580
+msgid "Snap scroll off"
+msgstr ""
+
+#: engines/scumm/input.cpp:593
+msgid "Music volume: "
+msgstr ""
+
+#: engines/scumm/input.cpp:610
+msgid "Subtitle speed: "
+msgstr ""
+
+#: engines/scumm/scumm.cpp:1880
+#, c-format
+msgid ""
+"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
+"but %s is missing. Using AdLib instead."
+msgstr ""
+
+#: engines/scumm/scumm.cpp:2733
+msgid ""
+"Usually, Maniac Mansion would start now. But for that to work, the game "
+"files for Maniac Mansion have to be in the 'Maniac' directory inside the "
+"Tentacle game directory, and the game has to be added to ScummVM."
+msgstr ""
+
+#: engines/scumm/players/player_v3m.cpp:129
+msgid ""
+"Could not find the 'Loom' Macintosh executable to read the\n"
+"instruments from. Music will be disabled."
+msgstr ""
+
+#: engines/scumm/players/player_v5m.cpp:107
+msgid ""
+"Could not find the 'Monkey Island' Macintosh executable to read the\n"
+"instruments from. Music will be disabled."
+msgstr ""
+
+#: engines/sherlock/detection.cpp:81
+msgid "Pixellated scene transitions"
+msgstr ""
+
+#: engines/sherlock/detection.cpp:82
+msgid "When changing scenes, a randomized pixel transition is done"
+msgstr ""
+
+#: engines/sherlock/detection.cpp:91
+msgid "Don't show hotspots when moving mouse"
+msgstr ""
+
+#: engines/sherlock/detection.cpp:92
+msgid ""
+"Only show hotspot names after you actually click on a hotspot or action "
+"button"
+msgstr ""
+
+#: engines/sherlock/detection.cpp:101
+msgid "Show character portraits"
+msgstr ""
+
+#: engines/sherlock/detection.cpp:102
+msgid "Show portraits for the characters when conversing"
+msgstr ""
+
+#: engines/sherlock/detection.cpp:111
+msgid "Slide dialogs into view"
+msgstr ""
+
+#: engines/sherlock/detection.cpp:112
+msgid "Slide UI dialogs into view, rather than simply showing them immediately"
+msgstr ""
+
+#: engines/sherlock/detection.cpp:121
+msgid "Transparent windows"
+msgstr ""
+
+#: engines/sherlock/detection.cpp:122
+msgid "Show windows with a partially transparent background"
+msgstr ""
+
+#: engines/sky/compact.cpp:130
+msgid ""
+"Unable to find \"sky.cpt\" file!\n"
+"Please download it from www.scummvm.org"
+msgstr ""
+
+#: engines/sky/compact.cpp:141
+msgid ""
+"The \"sky.cpt\" file has an incorrect size.\n"
+"Please (re)download it from www.scummvm.org"
+msgstr ""
+
+#: engines/sky/detection.cpp:44
+msgid "Floppy intro"
+msgstr ""
+
+#: engines/sky/detection.cpp:45
+msgid "Use the floppy version's intro (CD version only)"
+msgstr ""
+
+#: engines/sword1/animation.cpp:524
+#, c-format
+msgid "PSX stream cutscene '%s' cannot be played in paletted mode"
+msgstr ""
+
+#: engines/sword1/animation.cpp:545 engines/sword2/animation.cpp:445
+msgid "DXA cutscenes found but ScummVM has been built without zlib"
+msgstr ""
+
+#: engines/sword1/animation.cpp:561 engines/sword2/animation.cpp:461
+msgid ""
+"MPEG-2 cutscenes found but ScummVM has been built without MPEG-2 support"
+msgstr ""
+
+#: engines/sword1/animation.cpp:568 engines/sword2/animation.cpp:470
+#, c-format
+msgid "Cutscene '%s' not found"
+msgstr ""
+
+#: engines/sword1/control.cpp:863
+msgid ""
+"ScummVM found that you have old saved games for Broken Sword 1 that should "
+"be converted.\n"
+"The old saved game format is no longer supported, so you will not be able to "
+"load your games if you don't convert them.\n"
+"\n"
+"Press OK to convert them now, otherwise you will be asked again the next "
+"time you start the game.\n"
+msgstr ""
+
+#: engines/sword1/control.cpp:1232
+#, c-format
+msgid ""
+"Target new saved game already exists!\n"
+"Would you like to keep the old saved game (%s) or the new one (%s)?\n"
+msgstr ""
+
+#: engines/sword1/control.cpp:1235
+msgid "Keep the old one"
+msgstr ""
+
+#: engines/sword1/control.cpp:1235
+msgid "Keep the new one"
+msgstr ""
+
+#: engines/sword1/logic.cpp:1633
+msgid "This is the end of the Broken Sword 1 Demo"
+msgstr ""
+
+#: engines/sword2/animation.cpp:425
+msgid ""
+"PSX cutscenes found but ScummVM has been built without RGB color support"
+msgstr ""
+
+#: engines/sword2/sword2.cpp:79
+msgid "Show object labels"
+msgstr ""
+
+#: engines/sword2/sword2.cpp:80
+msgid "Show labels for objects on mouse hover"
+msgstr ""
+
+#: engines/sword25/detection.cpp:46
+msgid "Use English speech"
+msgstr ""
+
+#: engines/sword25/detection.cpp:47
+msgid ""
+"Use English speech instead of German for every language other than German"
+msgstr ""
+
+#: engines/teenagent/resources.cpp:96
+msgid ""
+"You're missing the 'teenagent.dat' file. Get it from the ScummVM website"
+msgstr ""
+
+#: engines/teenagent/resources.cpp:117
+msgid ""
+"The teenagent.dat file is compressed and zlib hasn't been included in this "
+"executable. Please decompress it"
+msgstr ""
+
+#: engines/toon/toon.cpp:222
+#, c-format
+msgid "Saved game in slot #%d "
+msgstr ""
+
+#: engines/toon/toon.cpp:226
+#, c-format
+msgid "Could not quick save into slot #%d"
+msgstr ""
+
+#: engines/toon/toon.cpp:239
+#, c-format
+msgid "Saved game #%d quick loaded"
+msgstr ""
+
+#: engines/toon/toon.cpp:243
+#, c-format
+msgid "Could not quick load the saved game #%d"
+msgstr ""
+
+#: engines/toon/toon.cpp:4917
+msgid "You're missing the 'toon.dat' file. Get it from the ScummVM website"
+msgstr ""
+
+#: engines/toon/toon.cpp:4929
+msgid "File 'toon.dat' is corrupt. Get it from the ScummVM website"
+msgstr ""
+
+#: engines/toon/toon.cpp:4939
+#, c-format
+msgid ""
+"File 'toon.dat' is wrong version. Expected %d.%d but got %d.%d. Get it from "
+"the ScummVM website"
+msgstr ""
+
+#: engines/wintermute/detection.cpp:58
+msgid "Show FPS-counter"
+msgstr ""
+
+#: engines/wintermute/detection.cpp:59
+msgid "Show the current number of frames per second in the upper left corner"
+msgstr ""
+
+#: engines/zvision/detection_tables.h:52
+msgid "Use the original save/load screens instead of the ScummVM interface"
+msgstr ""
+
+#: engines/zvision/detection_tables.h:61
+msgid "Double FPS"
+msgstr ""
+
+#: engines/zvision/detection_tables.h:62
+msgid "Increase framerate from 30 to 60 FPS"
+msgstr ""
+
+#: engines/zvision/detection_tables.h:71
+msgid "Enable Venus"
+msgstr ""
+
+#: engines/zvision/detection_tables.h:72
+msgid "Enable the Venus help system"
+msgstr ""
+
+#: engines/zvision/detection_tables.h:81
+msgid "Disable animation while turning"
+msgstr ""
+
+#: engines/zvision/detection_tables.h:82
+msgid "Disable animation while turning in panorama mode"
+msgstr ""
+
+#: engines/zvision/detection_tables.h:91
+msgid "Use high resolution MPEG video"
+msgstr ""
+
+#: engines/zvision/detection_tables.h:92
+msgid "Use MPEG video from the DVD version instead of lower resolution AVI"
+msgstr ""
+
+#: engines/zvision/file/save_manager.cpp:220
+#, c-format
+msgid ""
+"This saved game uses version %u, but this engine only supports up to version "
+"%d. You will need an updated version of the engine to use this saved game."
+msgstr ""
diff --git a/po/ru_RU.po b/po/ru_RU.po
index 04b433918e..5d62bf297d 100644
--- a/po/ru_RU.po
+++ b/po/ru_RU.po
@@ -8,16 +8,16 @@ msgstr ""
"Project-Id-Version: ScummVM 1.8.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.scummvm.org\n"
"POT-Creation-Date: 2016-11-29 23:17+0100\n"
-"PO-Revision-Date: 2016-11-29 18:44+0000\n"
-"Last-Translator: Ivan Lukyanov <lid-gr@tut.by>\n"
-"Language-Team: Russian <https://translations.scummvm.org/projects/scummvm/"
-"scummvm/ru/>\n"
+"PO-Revision-Date: 2016-12-12 08:25+0000\n"
+"Last-Translator: Eugene Sandulenko <sev@scummvm.org>\n"
+"Language-Team: Russian "
+"<https://translations.scummvm.org/projects/scummvm/scummvm/ru/>\n"
"Language: ru_RU\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-5\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<="
+"4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 2.9\n"
"X-Language-name: Russian\n"
@@ -1459,7 +1459,6 @@ msgid "Playtime: "
msgstr "Время игры: "
#: gui/saveload-dialog.cpp:577 gui/saveload-dialog.cpp:665
-#, fuzzy
msgid "Untitled saved game"
msgstr "Сохранение без имени"
@@ -1701,9 +1700,8 @@ msgid "Could not find suitable engine plugin"
msgstr "Не могу найти подходящий плагин для движка"
#: common/error.cpp:68
-#, fuzzy
msgid "Engine plugin does not support saved games"
-msgstr "Движок не поддерживает сохранения"
+msgstr "Движок не поддерживает сохранение игр"
#: common/error.cpp:71
msgid "User canceled"
@@ -1757,7 +1755,7 @@ msgid "<Bad value>"
msgstr "<Неправильное значение>"
#: engines/advancedDetector.cpp:335
-#, fuzzy, c-format
+#, c-format
msgid ""
"The game in '%s' seems to be unknown.\n"
"Please, report the following data to the ScummVM team along with name\n"
@@ -1848,7 +1846,7 @@ msgstr ""
"инструкциями о том, как получить дальнейшую помощь."
#: engines/dialogs.cpp:234 engines/pegasus/pegasus.cpp:393
-#, fuzzy, c-format
+#, c-format
msgid ""
"Failed to save game (%s)! Please consult the README for basic information, "
"and for instructions on how to obtain further assistance."
@@ -1921,12 +1919,12 @@ msgstr ""
"файле README."
#: engines/engine.cpp:542
-#, fuzzy, c-format
+#, c-format
msgid ""
"Failed to load saved game (%s)! Please consult the README for basic "
"information, and for instructions on how to obtain further assistance."
msgstr ""
-"Не удалось прочитать сохранение игры (%s)! Пожалуйста, обратитесь в файл "
+"Не удалось прочитать сохранённую игру (%s)! Пожалуйста, обратитесь в файл "
"README за базовой информацией, а также инструкциями о том, как получить "
"дальнейшую помощь."
@@ -2775,7 +2773,6 @@ msgstr "Использовать оригинальные экраны записи/чтения игры"
#: engines/drascula/detection.cpp:303 engines/dreamweb/detection.cpp:49
#: engines/neverhood/detection.cpp:178 engines/sci/detection.cpp:431
#: engines/sherlock/detection.cpp:72 engines/toltecs/detection.cpp:201
-#, fuzzy
msgid "Use the original save/load screens instead of the ScummVM ones"
msgstr ""
"Использовать оригинальные экраны чтения и сохранения игры вместо сделанных в "
@@ -2852,7 +2849,7 @@ msgid "Restore"
msgstr "Восстановить"
#: engines/agos/saveload.cpp:159 engines/scumm/scumm.cpp:2436
-#, fuzzy, c-format
+#, c-format
msgid ""
"Failed to load saved game from file:\n"
"\n"
@@ -2863,7 +2860,7 @@ msgstr ""
"%s"
#: engines/agos/saveload.cpp:194 engines/scumm/scumm.cpp:2429
-#, fuzzy, c-format
+#, c-format
msgid ""
"Failed to save game to file:\n"
"\n"
@@ -2874,7 +2871,7 @@ msgstr ""
"%s"
#: engines/agos/saveload.cpp:202 engines/scumm/scumm.cpp:2447
-#, fuzzy, c-format
+#, c-format
msgid ""
"Successfully saved game in file:\n"
"\n"
@@ -2898,7 +2895,6 @@ msgid "Enable Color Blind Mode by default"
msgstr "Включить режим для людей со слабым восприятием цвета"
#: engines/drascula/saveload.cpp:47
-#, fuzzy
msgid ""
"ScummVM found that you have old saved games for Drascula that should be "
"converted.\n"
@@ -2926,13 +2922,11 @@ msgstr "Рисует графику с использованием яркой палитры игры"
#: engines/gob/inter_playtoons.cpp:255 engines/gob/inter_v2.cpp:1467
#: engines/gob/inter_geisha.cpp:232 engines/tinsel/saveload.cpp:532
-#, fuzzy
msgid "Failed to load saved game from file."
msgstr "Не удалось загрузить сохранённую игру из файла."
#: engines/gob/inter_v2.cpp:1537 engines/gob/inter_geisha.cpp:263
#: engines/tinsel/saveload.cpp:545
-#, fuzzy
msgid "Failed to save game to file."
msgstr "Не удалось сохранить игру в файл."
@@ -3159,7 +3153,7 @@ msgstr ""
"\n"
#: engines/kyra/saveload_eob.cpp:623
-#, fuzzy, c-format
+#, c-format
msgid ""
"%d original saved games have been successfully imported into\n"
"ScummVM. If you want to manually import original saved game later you will\n"
@@ -3167,8 +3161,10 @@ msgid ""
"'import_savefile'.\n"
"\n"
msgstr ""
-"%d оригинальных файлов сохранения были успешно импортированы в ScummVM.\n"
-"Если вы захотите импортировать оригинальные сохранения, вам нужно будет\n"
+"%d оригинальных файлов сохранённых игр были успешно импортированы в ScummVM."
+"\n"
+"Если вы захотите импортировать оригинальные сохранённые игры, вам нужно "
+"будет\n"
"открыть отладочную консоль ScummVM и ввести команду 'import_savefile'.\n"
"\n"
@@ -3316,7 +3312,6 @@ msgid "Saving game..."
msgstr "Сохраняю игру..."
#: engines/parallaction/saveload.cpp:269
-#, fuzzy
msgid ""
"ScummVM found that you have old saved games for Nippon Safes that should be "
"renamed.\n"
@@ -3325,18 +3320,17 @@ msgid ""
"\n"
"Press OK to convert them now, otherwise you will be asked next time.\n"
msgstr ""
-"ScummVM обнаружил у вас старые сохранения игры Nippon Safes, которые "
+"ScummVM обнаружил у вас старые сохранённые игры Nippon Safes, которые "
"необходимо переименовать.\n"
"Старые названия больше не поддерживаются, и поэтому вы не сможете загрузить "
-"сохранения, если не переименуете их.\n"
+"сохранённые игры, если не переименуете их.\n"
"\n"
"Нажмите ОК, чтобы переименовать их сейчас, в противном случае это же "
"сообщение появится при следующем запуске игры.\n"
#: engines/parallaction/saveload.cpp:316
-#, fuzzy
msgid "ScummVM successfully converted all your saved games."
-msgstr "ScummVM успешно преобразовал все ваши сохранения игр."
+msgstr "ScummVM успешно преобразовал все ваши сохранённые игры."
#: engines/parallaction/saveload.cpp:318
msgid ""
@@ -3351,9 +3345,8 @@ msgstr ""
"Пожалуйста, сообщите об этом команде ScummVM."
#: engines/pegasus/pegasus.cpp:714
-#, fuzzy
msgid "Invalid file name for saving"
-msgstr "Введите имя файла для записи"
+msgstr "Неверное имя файла для записи"
#: engines/pegasus/pegasus.cpp:2507
msgid "Up/Zoom In/Move Forward/Open Doors"
@@ -3469,14 +3462,12 @@ msgid "Use silver cursors"
msgstr "Использовать серебряные курсоры"
#: engines/sci/detection.cpp:474
-#, fuzzy
msgid ""
"Use the alternate set of silver cursors instead of the normal golden ones"
msgstr ""
"Использовать альтернативный набор серебряных курсоров вместо обычных золотых"
#: engines/scumm/detection.cpp:1120
-#, fuzzy
msgid ""
"Your game version appears to be unknown. If this is *NOT* a fan-modified\n"
"version (in particular, not a fan-made translation), please, report the\n"
@@ -3659,7 +3650,6 @@ msgid "Ctrl"
msgstr "Ctrl"
#: engines/scumm/help.cpp:80
-#, fuzzy
msgid "Load saved game 1-10"
msgstr "Загрузить игру 1-10"
@@ -3670,7 +3660,6 @@ msgid "Alt"
msgstr "Alt"
#: engines/scumm/help.cpp:81
-#, fuzzy
msgid "Save game 1-10"
msgstr "Сохранить игру 1-10"
@@ -4298,7 +4287,6 @@ msgid "Cutscene '%s' not found"
msgstr "Заставка '%s' не найдена"
#: engines/sword1/control.cpp:863
-#, fuzzy
msgid ""
"ScummVM found that you have old saved games for Broken Sword 1 that should "
"be converted.\n"
@@ -4308,10 +4296,10 @@ msgid ""
"Press OK to convert them now, otherwise you will be asked again the next "
"time you start the game.\n"
msgstr ""
-"ScummVM обнаружил у вас сохранения игры \"Сломанный меч 1\" в старом "
+"ScummVM обнаружил у вас сохранённые игры \"Сломанный меч 1\" в старом "
"формате.\n"
-"Старый формат больше не поддерживается, и, чтобы загрузить сохранения, они "
-"должны быть переведены в новый формат.\n"
+"Старый формат больше не поддерживается, и, чтобы загрузить сохранённые игры, "
+"они должны быть переведены в новый формат.\n"
"\n"
"Нажмите ОК, чтобы перевести их в новый формат сейчас, в противном случае это "
"сообщение появится снова при следующем запуске игры.\n"
@@ -4388,12 +4376,12 @@ msgid "Could not quick save into slot #%d"
msgstr "Не удалось сделать быстрое сохранение игры в слот №%d"
#: engines/toon/toon.cpp:239
-#, fuzzy, c-format
+#, c-format
msgid "Saved game #%d quick loaded"
msgstr "Сохранённая игра №%d загружена"
#: engines/toon/toon.cpp:243
-#, fuzzy, c-format
+#, c-format
msgid "Could not quick load the saved game #%d"
msgstr "Не удалось быстро загрузить сохранённую игру №%d"
@@ -4457,20 +4445,20 @@ msgid "Use high resolution MPEG video"
msgstr "Использовать видео MPEG высокого разрешения"
#: engines/zvision/detection_tables.h:92
-#, fuzzy
msgid "Use MPEG video from the DVD version instead of lower resolution AVI"
msgstr ""
"Использовать MPEG-видео из DVD-версии вместо видео низкого разрешения в "
"формате AVI"
#: engines/zvision/file/save_manager.cpp:220
-#, fuzzy, c-format
+#, c-format
msgid ""
"This saved game uses version %u, but this engine only supports up to version "
"%d. You will need an updated version of the engine to use this saved game."
msgstr ""
-"Этот файл сохранения имеет версию %u, но движок поддерживает только версии "
-"не выше %d. Для использования этого файла необходима свежая версия движка."
+"Этот файл сохранённной игры имеет версию %u, но движок поддерживает только "
+"версии не выше %d. Для использования этого файла необходима свежая версия "
+"движка."
#~ msgid "Invalid save file name"
#~ msgstr "Неверное имя файла сохранения"
diff --git a/video/avi_decoder.cpp b/video/avi_decoder.cpp
index 7041f428ab..fc73cfaeac 100644
--- a/video/avi_decoder.cpp
+++ b/video/avi_decoder.cpp
@@ -458,6 +458,8 @@ void AVIDecoder::handleNextPacket(TrackStatus &status) {
// Seek to where we shall start searching
_fileStream->seek(status.chunkSearchOffset);
+ bool isReversed = false;
+ AVIVideoTrack *videoTrack = nullptr;
for (;;) {
// If there's no more to search, bail out
@@ -511,7 +513,8 @@ void AVIDecoder::handleNextPacket(TrackStatus &status) {
if (!shouldQueueAudio(status))
break;
} else {
- AVIVideoTrack *videoTrack = (AVIVideoTrack *)status.track;
+ videoTrack = (AVIVideoTrack *)status.track;
+ isReversed = videoTrack->isReversed();
if (getStreamType(nextTag) == kStreamTypePaletteChange) {
// Palette Change
@@ -524,8 +527,15 @@ void AVIDecoder::handleNextPacket(TrackStatus &status) {
}
}
- // Start us off in this position next time
- status.chunkSearchOffset = _fileStream->pos();
+ if (!isReversed) {
+ // Start us off in this position next time
+ status.chunkSearchOffset = _fileStream->pos();
+ } else {
+ // Seek to the prior frame
+ assert(videoTrack);
+ Audio::Timestamp time = videoTrack->getFrameTime(getCurFrame());
+ seekIntern(time);
+ }
}
bool AVIDecoder::shouldQueueAudio(TrackStatus& status) {
@@ -566,6 +576,8 @@ uint AVIDecoder::getVideoTrackOffset(uint trackIndex, uint frameNumber) {
}
bool AVIDecoder::seekIntern(const Audio::Timestamp &time) {
+ uint frame;
+
// Can't seek beyond the end
if (time > getDuration())
return false;
@@ -574,19 +586,23 @@ bool AVIDecoder::seekIntern(const Audio::Timestamp &time) {
AVIVideoTrack *videoTrack = (AVIVideoTrack *)_videoTracks[0].track;
uint32 videoIndex = _videoTracks[0].index;
- // If we seek directly to the end, just mark the tracks as over
if (time == getDuration()) {
videoTrack->setCurFrame(videoTrack->getFrameCount() - 1);
- for (TrackListIterator it = getTrackListBegin(); it != getTrackListEnd(); it++)
- if ((*it)->getTrackType() == Track::kTrackTypeAudio)
- ((AVIAudioTrack *)*it)->resetStream();
+ if (!videoTrack->isReversed()) {
+ // Since we're at the end, just mark the tracks as over
+ for (TrackListIterator it = getTrackListBegin(); it != getTrackListEnd(); it++)
+ if ((*it)->getTrackType() == Track::kTrackTypeAudio)
+ ((AVIAudioTrack *)*it)->resetStream();
- return true;
- }
+ return true;
+ }
- // Get the frame we should be on at this time
- uint frame = videoTrack->getFrameAtTime(time);
+ frame = videoTrack->getFrameCount() - 1;
+ } else {
+ // Get the frame we should be on at this time
+ frame = videoTrack->getFrameAtTime(time);
+ }
// Reset any palette, if necessary
videoTrack->useInitialPalette();
@@ -821,6 +837,7 @@ AVIDecoder::AVIVideoTrack::AVIVideoTrack(int frameCount, const AVIStreamHeader &
_videoCodec = createCodec();
_lastFrame = 0;
_curFrame = -1;
+ _reversed = false;
useInitialPalette();
}
@@ -840,7 +857,12 @@ void AVIDecoder::AVIVideoTrack::decodeFrame(Common::SeekableReadStream *stream)
}
delete stream;
- _curFrame++;
+
+ if (!_reversed) {
+ _curFrame++;
+ } else {
+ _curFrame--;
+ }
}
Graphics::PixelFormat AVIDecoder::AVIVideoTrack::getPixelFormat() const {
@@ -923,6 +945,23 @@ bool AVIDecoder::AVIVideoTrack::hasDirtyPalette() const {
return _dirtyPalette;
}
+bool AVIDecoder::AVIVideoTrack::setReverse(bool reverse) {
+ if (isRewindable()) {
+ // Track is rewindable, so reversing is allowed
+ _reversed = reverse;
+ return true;
+ }
+
+ return !reverse;
+}
+
+bool AVIDecoder::AVIVideoTrack::endOfTrack() const {
+ if (_reversed)
+ return _curFrame < 0;
+
+ return _curFrame >= (getFrameCount() - 1);
+}
+
bool AVIDecoder::AVIVideoTrack::canDither() const {
return _videoCodec && _videoCodec->canDither(Image::Codec::kDitherTypeVFW);
}
diff --git a/video/avi_decoder.h b/video/avi_decoder.h
index 4bba07e98f..cc5c2c4d42 100644
--- a/video/avi_decoder.h
+++ b/video/avi_decoder.h
@@ -210,6 +210,25 @@ protected:
bool isRewindable() const { return true; }
bool rewind();
+ /**
+ * Set the video track to play in reverse or forward.
+ *
+ * By default, a VideoTrack must decode forward.
+ *
+ * @param reverse true for reverse, false for forward
+ * @return true for success, false for failure
+ */
+ virtual bool setReverse(bool reverse);
+
+ /**
+ * Is the video track set to play in reverse?
+ */
+ virtual bool isReversed() const { return _reversed; }
+
+ /**
+ * Returns true if at the end of the video track
+ */
+ virtual bool endOfTrack() const;
protected:
Common::Rational getFrameRate() const { return Common::Rational(_vidsHeader.rate, _vidsHeader.scale); }
@@ -220,6 +239,7 @@ protected:
byte *_initialPalette;
mutable bool _dirtyPalette;
int _frameCount, _curFrame;
+ bool _reversed;
Image::Codec *_videoCodec;
const Graphics::Surface *_lastFrame;